void RenderVolumetricMesh::DetermineMaxMin(VolumetricMesh * volumetricMesh) { maxE = 0; maxnu = 0; maxDensity = 0; minE = DBL_MAX; minnu = DBL_MAX; minDensity = DBL_MAX; for(int i=0; i < volumetricMesh->getNumElements(); i++) { // set color based on Young's modulus, Poisson ratio, density VolumetricMesh::Material * material = volumetricMesh->getElementMaterial(i); double density = material->getDensity(); VolumetricMesh::ENuMaterial * eNuMaterial = downcastENuMaterial(material); double E; double nu; if (eNuMaterial == NULL) { E = 1E6; nu = 0.45; } else { E = eNuMaterial->getE(); nu = eNuMaterial->getNu(); } if (E > maxE) maxE = E; if (nu > maxnu) maxnu = nu; if(density>maxDensity) maxDensity = density; if (E < minE) minE = E; if (nu < minnu) minnu = nu; if (density<minDensity) minDensity = density; } printf("MaxE: %G MinE: %G\n",maxE,minE); printf("Maxnu: %G Minnu: %G\n",maxnu,minnu); printf("MaxDensity: %G MinDensity: %G\n",maxDensity,minDensity); }
void RenderVolumetricMesh::Render(VolumetricMesh * volumetricMesh, int wireframe, double * u) { glDisable(GL_LIGHTING); int meshType = 0; if (volumetricMesh->getElementType() == CubicMesh::elementType()) meshType = 1; if (volumetricMesh->getElementType() == TetMesh::elementType()) meshType = 2; if (renderingMode == RENDERVOLUMETRICMESH_RENDERINGMODE_DISCRETECOLORS) { if (volumetricMesh->getNumMaterials() == 0) { printf("Error: discrete color rendering mode in renderVolumetricMesh called with zero materials.\n"); } map<int,int> actualMaterials; for(int ss=0; ss < volumetricMesh->getNumRegions(); ss++) { int materialIndex = volumetricMesh->getRegion(ss)->getMaterialIndex(); int setIndex = volumetricMesh->getRegion(ss)->getSetIndex(); VolumetricMesh::Set * elementSet = volumetricMesh->getSet(setIndex); int numElements = elementSet->getNumElements(); map<int,int> :: iterator iter = actualMaterials.find(materialIndex); if (iter == actualMaterials.end()) { // new material actualMaterials.insert(make_pair(materialIndex, numElements)); } else { // existing material iter->second += numElements; } } int numActualMaterials = (int)actualMaterials.size(); multimap<int, int> materialOrderReverse; for(map<int, int> :: iterator iter = actualMaterials.begin(); iter != actualMaterials.end(); iter++) materialOrderReverse.insert(make_pair(iter->second, iter->first)); // sort by the number of elements map<int,int> materialOrder; int counter = 0; for(multimap<int, int> :: iterator iter = materialOrderReverse.begin(); iter != materialOrderReverse.end(); iter++) { materialOrder.insert(make_pair(iter->second, counter)); counter++; } double multiplicator = (numActualMaterials == 1 ? 1.0 : 1.0 / (numActualMaterials - 1)); for(int ss=0; ss < volumetricMesh->getNumRegions(); ss++) { VolumetricMesh::Region * region = volumetricMesh->getRegion(ss); int materialIndex = region->getMaterialIndex(); double color[3]; //JetColorMap(materialIndex * multiplicator, color); double gray = 1.0 - 0.5 * (numActualMaterials - 1 - materialOrder[materialIndex]) * multiplicator; color[0] = gray; color[1] = gray; color[2] = gray; int setIndex = region->getSetIndex(); VolumetricMesh::Set * elementSet = volumetricMesh->getSet(setIndex); set<int> elements; elementSet->getElements(elements); for(set<int> :: iterator iter = elements.begin(); iter != elements.end(); iter++) { if (wireframe) glColor4d(0, 0, 0, 0.8); else glColor3f(color[0], color[1], color[2]); int el = *iter; if (u == NULL) { if (meshType == 1) RenderCube(volumetricMesh, el, wireframe); if (meshType == 2) RenderTet(volumetricMesh, el, wireframe); } else { #define VER(j) (*volumetricMesh->getVertex(el,j))[0] + u[3*volumetricMesh->getVertexIndex(el, j)+0],\ (*volumetricMesh->getVertex(el,j))[1] + u[3*volumetricMesh->getVertexIndex(el, j)+1],\ (*volumetricMesh->getVertex(el,j))[2] + u[3*volumetricMesh->getVertexIndex(el, j)+2] if (wireframe) { if (meshType == 1) CubeWireframeDeformable(VER(0),VER(1),VER(2),VER(3), VER(4),VER(5),VER(6),VER(7)); if (meshType == 2) TetWireframeDeformable(VER(0),VER(1),VER(2),VER(3)); } else { if (meshType == 1) CubeDeformable(VER(0),VER(1),VER(2),VER(3), VER(4),VER(5),VER(6),VER(7)); if (meshType == 2) TetDeformable(VER(0),VER(1),VER(2),VER(3)); } } } } } else { for (int i=0; i < volumetricMesh->getNumElements(); i++) { // set color based on Young's modulus, Poisson ratio, density VolumetricMesh::Material * material = volumetricMesh->getElementMaterial(i); double density = material->getDensity(); VolumetricMesh::ENuMaterial * eNuMaterial = downcastENuMaterial(material); double E; double nu; if (eNuMaterial == NULL) { E = 1E6; nu = 0.45; } else { E = eNuMaterial->getE(); nu = eNuMaterial->getNu(); } double colorR=0.0, colorG=0.0, colorB=0.0; if (renderingMode == RENDERVOLUMETRICMESH_RENDERINGMODE_FLAT) { colorR = colorG = colorB = 1.0; } else if (renderingMode == RENDERVOLUMETRICMESH_RENDERINGMODE_GRADEDCOLORS) { if (maxE > minE + 1E-10) colorR = (E - minE) / (maxE - minE); else colorR = 1; if (maxnu > minnu + 1E-10) colorG = (nu - minnu) / (maxnu - minnu); else colorG = 1; if (maxDensity > minDensity + 1E-10) colorB = (density - minDensity) / (maxDensity - minDensity); else colorB = 1; } else { printf("Error: invalid rendering mode in renderVolumetricMesh!\n"); } if (wireframe) glColor4d(0, 0, 0, 0.8); else glColor3f(colorR, colorG, colorB); if (u == NULL) { if (meshType == 1) RenderCube(volumetricMesh, i, wireframe); if (meshType == 2) RenderTet(volumetricMesh, i, wireframe); } else { #define VERA(j) (*volumetricMesh->getVertex(i,j))[0] + u[3*volumetricMesh->getVertexIndex(i, j)+0],\ (*volumetricMesh->getVertex(i,j))[1] + u[3*volumetricMesh->getVertexIndex(i, j)+1],\ (*volumetricMesh->getVertex(i,j))[2] + u[3*volumetricMesh->getVertexIndex(i, j)+2] if (wireframe) { if (meshType == 1) CubeWireframeDeformable(VERA(0),VERA(1),VERA(2),VERA(3), VERA(4),VERA(5),VERA(6),VERA(7)); if (meshType == 2) TetWireframeDeformable(VERA(0),VERA(1),VERA(2),VERA(3)); } else { if (meshType == 1) CubeDeformable(VERA(0),VERA(1),VERA(2),VERA(3), VERA(4),VERA(5),VERA(6),VERA(7)); if (meshType == 2) TetDeformable(VERA(0),VERA(1),VERA(2),VERA(3)); } } } } }