void GradientField::createTriangleModel() { vector<ofVec3f> verts; vector<ofIndexType> indices; float centerSize = 30; float rad = getHeight()/2 - centerSize; ofVec3f cornerVec(0, -centerSize); ofVec3f triangleVec(0, -rad); ofVec3f center(getWidth()/2, getHeight()/2, 0); ofVec3f triangleCorners[3][3]; triangleCorners[0][0] = center + cornerVec.getRotated(120, ofVec3f(0, 0, 1)); triangleCorners[0][1] = triangleCorners[0][0] + triangleVec.getRotated(60, ofVec3f(0, 0, 1)); triangleCorners[0][2] = triangleCorners[0][0] + triangleVec.getRotated(180, ofVec3f(0, 0, 1)); triangleCorners[1][0] = center + cornerVec.getRotated(240, ofVec3f(0, 0, 1)); triangleCorners[1][1] = triangleCorners[1][0] + triangleVec.getRotated(180, ofVec3f(0, 0, 1)); triangleCorners[1][2] = triangleCorners[1][0] + triangleVec.getRotated(-60, ofVec3f(0, 0, 1)); triangleCorners[2][0] = center + cornerVec; triangleCorners[2][1] = triangleCorners[2][0] + triangleVec.getRotated(-60, ofVec3f(0, 0, 1)); triangleCorners[2][2] = triangleCorners[2][0] + triangleVec.getRotated(60, ofVec3f(0, 0, 1)); for (int t=0; t<3; t++) { for (int i=0; i<3; i++) { verts.push_back(triangleCorners[t][i]); } } indices.push_back(0); indices.push_back(0); indices.push_back(0); indices.push_back(0); indices.push_back(0); indices.push_back(0); indices.push_back(0); indices.push_back(0); indices.push_back(0); indices.push_back(0); indices.push_back(0); indices.push_back(0); indices.push_back(0); indices.push_back(0); indices.push_back(0); indices.push_back(0); indices.push_back(0); indices.push_back(0); }
// Cubelet-corner sampling function. void CubePolygonizer::evaluateCubelet(float cubeValues[8]) { assert(sampler != 0); assert(currCube != 0); // Loop unrolled to avoid bizarre table lookup weirdness... it's more readable this way, honest! // Lookup table from MarchingCube.h: // 0: (0,0,0) // 1: (1,0,0) // 2: (1,1,0) // 3: (0,1,0) // 4: (0,0,1) // 5: (1,0,1) // 6: (1,1,1) // 7: (0,1,1) IntVector cornerVec(currCube->getLocation().cell); float* valueFind; Vector v0; // Corner 0 if ((valueFind = cornerValueCache.find(cornerVec.cell[0], cornerVec.cell[1], cornerVec.cell[2])) == 0) { v0 = Vector(currCube->getCorner(0)[0], currCube->getCorner(0)[1], currCube->getCorner(0)[2]); cubeValues[0] = sampler->getValueAt(v0); cornerValueCache.insert(cornerVec.cell[0], cornerVec.cell[1], cornerVec.cell[2], cubeValues[0]); } else { cubeValues[0] = *valueFind; } // Corner 1 cornerVec.cell[0]++; if ((valueFind = cornerValueCache.find(cornerVec.cell[0], cornerVec.cell[1], cornerVec.cell[2])) == 0) { v0 = Vector(currCube->getCorner(1)[0], currCube->getCorner(1)[1], currCube->getCorner(1)[2]); cubeValues[1] = sampler->getValueAt(v0); cornerValueCache.insert(cornerVec.cell[0], cornerVec.cell[1], cornerVec.cell[2], cubeValues[1]); } else { cubeValues[1] = *valueFind; } // Corner 2 cornerVec.cell[1]++; if ((valueFind = cornerValueCache.find(cornerVec.cell[0], cornerVec.cell[1], cornerVec.cell[2])) == 0) { v0 = Vector(currCube->getCorner(2)[0], currCube->getCorner(2)[1], currCube->getCorner(2)[2]); cubeValues[2] = sampler->getValueAt(v0); cornerValueCache.insert(cornerVec.cell[0], cornerVec.cell[1], cornerVec.cell[2], cubeValues[2]); } else { cubeValues[2] = *valueFind; } // Corner 3 cornerVec.cell[0]--; if ((valueFind = cornerValueCache.find(cornerVec.cell[0], cornerVec.cell[1], cornerVec.cell[2])) == 0) { v0 = Vector(currCube->getCorner(3)[0], currCube->getCorner(3)[1], currCube->getCorner(3)[2]); cubeValues[3] = sampler->getValueAt(v0); cornerValueCache.insert(cornerVec.cell[0], cornerVec.cell[1], cornerVec.cell[2], cubeValues[3]); } else { cubeValues[3] = *valueFind; } // Corner 4 cornerVec.cell[1]--; cornerVec.cell[2]++; if ((valueFind = cornerValueCache.find(cornerVec.cell[0], cornerVec.cell[1], cornerVec.cell[2])) == 0) { v0 = Vector(currCube->getCorner(4)[0], currCube->getCorner(4)[1], currCube->getCorner(4)[2]); cubeValues[4] = sampler->getValueAt(v0); cornerValueCache.insert(cornerVec.cell[0], cornerVec.cell[1], cornerVec.cell[2], cubeValues[4]); } else { cubeValues[4] = *valueFind; } // Corner 5 cornerVec.cell[0]++; if ((valueFind = cornerValueCache.find(cornerVec.cell[0], cornerVec.cell[1], cornerVec.cell[2])) == 0) { v0 = Vector(currCube->getCorner(5)[0], currCube->getCorner(5)[1], currCube->getCorner(5)[2]); cubeValues[5] = sampler->getValueAt(v0); cornerValueCache.insert(cornerVec.cell[0], cornerVec.cell[1], cornerVec.cell[2], cubeValues[5]); } else { cubeValues[5] = *valueFind; } // Corner 6 cornerVec.cell[1]++; if ((valueFind = cornerValueCache.find(cornerVec.cell[0], cornerVec.cell[1], cornerVec.cell[2])) == 0) { v0 = Vector(currCube->getCorner(6)[0], currCube->getCorner(6)[1], currCube->getCorner(6)[2]); cubeValues[6] = sampler->getValueAt(v0); cornerValueCache.insert(cornerVec.cell[0], cornerVec.cell[1], cornerVec.cell[2], cubeValues[6]); } else { cubeValues[6] = *valueFind; } // Corner 7 cornerVec.cell[0]--; if ((valueFind = cornerValueCache.find(cornerVec.cell[0], cornerVec.cell[1], cornerVec.cell[2])) == 0) { v0 = Vector(currCube->getCorner(7)[0], currCube->getCorner(7)[1], currCube->getCorner(7)[2]); cubeValues[7] = sampler->getValueAt(v0); cornerValueCache.insert(cornerVec.cell[0], cornerVec.cell[1], cornerVec.cell[2], cubeValues[7]); } else { cubeValues[7] = *valueFind; } }