void ObjMeshRender::renderNormals(double normalLength) { double diameter = mesh->getDiameter(); glBegin(GL_LINES); for(unsigned int i=0; i < mesh->getNumGroups(); i++) { const ObjMesh::Group * groupHandle = mesh->getGroupHandle(i); for(unsigned int iFace = 0; iFace < groupHandle->getNumFaces(); ++iFace) { ObjMesh::Face face = groupHandle->getFace(iFace); for(unsigned int iVertex = 0; iVertex < face.getNumVertices(); ++iVertex) { const ObjMesh::Vertex * vertexHandle = face.getVertexHandle(iVertex); Vec3d v = mesh->getPosition(*vertexHandle); glVertex3d(v[0], v[1], v[2]); // compute endpoint Vec3d vnormalOffset; if(vertexHandle->hasNormalIndex()) vnormalOffset = v + normalLength * diameter * mesh->getNormal(*vertexHandle); else vnormalOffset = v; glVertex3d(vnormalOffset[0], vnormalOffset[1], vnormalOffset[2]); } } } glEnd(); }
void ObjMeshRender::renderGroupEdges(const char * groupName) { //get the group string name(groupName); ObjMesh::Group group = mesh->getGroup(name); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glEnable(GL_POLYGON_OFFSET_LINE); glPolygonOffset(1.0, 1.0); for( unsigned int iFace = 0; iFace < group.getNumFaces(); ++iFace ) { ObjMesh::Face face = group.getFace(iFace); glBegin(GL_POLYGON); for( unsigned int iVertex = 0; iVertex < face.getNumVertices(); ++iVertex ) { const ObjMesh::Vertex * vertexHandle = face.getVertexHandle(iVertex); Vec3d v = mesh->getPosition(*vertexHandle); glVertex3d(v[0], v[1], v[2]); } glEnd(); } glDisable(GL_POLYGON_OFFSET_LINE); }
void ObjMeshRender::outputOpenGLRenderCode() { for(unsigned int i=0; i < mesh->getNumGroups(); i++) { const ObjMesh::Group * groupHandle = mesh->getGroupHandle(i); // set material ObjMesh::Material material = mesh->getMaterial(groupHandle->getMaterialIndex()); Vec3d Ka = material.getKa(); Vec3d Kd = material.getKd(); Vec3d Ks = material.getKs(); float shininess = material.getShininess(); printf("float ambient[4] = { %f, %f, %f, 1.0 };\n", Ka[0], Ka[1], Ka[2]); printf("float diffuse[4] = { %f, %f, %f, 1.0 };\n", Kd[0], Kd[1], Kd[2]); printf("float specular[4] = { %f, %f, %f, 1.0 };\n", Ks[0], Ks[1], Ks[2]); printf("glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);\n"); printf("glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse);\n"); printf("glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);\n"); printf("glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, %f);\n", shininess); for( unsigned int iFace = 0; iFace < groupHandle->getNumFaces(); ++iFace ) { ObjMesh::Face face = groupHandle->getFace(iFace); printf("glBegin(GL_POLYGON);\n"); for( unsigned int iVertex = 0; iVertex < face.getNumVertices(); ++iVertex ) { const ObjMesh::Vertex * vertexHandle = face.getVertexHandle(iVertex); Vec3d v = mesh->getPosition(*vertexHandle); // set normal if( vertexHandle->hasNormalIndex() ) { Vec3d normal = mesh->getNormal(*vertexHandle); printf("glNormal3d(%f,%f,%f);\n", normal[0], normal[1], normal[2]); } // set texture coordinate if(vertexHandle->hasTextureCoordinateIndex()) { Vec3d textureCoordinate = mesh->getTextureCoordinate(*vertexHandle); printf("glTexCoord2d(%f,%f);\n", textureCoordinate[0], textureCoordinate[1]); } printf("glVertex3d(%f,%f,%f);\n", v[0],v[1],v[2]); } printf("glEnd();\n"); } } }