void MeshViewer :: addMeshToVertexBufferObject(const ntk::Mesh& mesh, const Pose3D& pose, MeshViewerMode mode) { #if defined(NESTK_USE_GLEW) || defined(USE_GLEW) GLuint vbo_id = -1, vbo_faces_id = -1; glGenBuffersARB(1, &vbo_id); if (mesh.hasFaces()) glGenBuffersARB(1, &vbo_faces_id); VertexBufferObject vbo; pose.cvCameraTransform().copyTo(vbo.model_view_matrix); // Transpose the matrix for OpenGL column-major. vbo.model_view_matrix = vbo.model_view_matrix.t(); vbo.nb_faces = 0; vbo.vertex_id = vbo_id; vbo.faces_id = vbo_faces_id; vbo.has_faces = mesh.hasFaces(); vbo.has_color = mesh.hasColors(); vbo.has_texcoords = mesh.hasTexcoords(); vbo.has_normals = mesh.hasNormals(); vbo.rendering_mode = mode; vbo.color_offset = mesh.vertices.size()*sizeof(Vec3f); vbo.normals_offset = vbo.color_offset + mesh.colors.size()*sizeof(Vec3b); vbo.texture_offset = vbo.normals_offset + mesh.normals.size() * sizeof(Vec3f); vbo.nb_vertices = mesh.vertices.size(); glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo.vertex_id); glBufferDataARB(GL_ARRAY_BUFFER_ARB, mesh.colors.size() * sizeof(Vec3b) + mesh.normals.size() * sizeof(Vec3f) + mesh.vertices.size() * sizeof(Vec3f) + mesh.texcoords.size() * sizeof(Point2f), // size 0, // null pointer: just allocate memory GL_STATIC_DRAW_ARB); glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, mesh.vertices.size()*sizeof(Vec3f), &mesh.vertices[0]); if (vbo.has_color) glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, vbo.color_offset, mesh.colors.size()*sizeof(Vec3b), &mesh.colors[0]); if (vbo.has_normals) glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, vbo.normals_offset, mesh.normals.size()*sizeof(Vec3f), &mesh.normals[0]); if (vbo.has_texcoords) glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, vbo.texture_offset, mesh.texcoords.size()*sizeof(Point2f), &mesh.texcoords[0]); if (vbo.has_faces) { vbo.nb_faces = mesh.faces.size(); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vbo.faces_id); glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, mesh.faces.size() * 3 * sizeof(GLuint), // size (GLuint*)&mesh.faces[0], GL_STATIC_DRAW_ARB); } m_upcoming_vertex_buffer_objects.push_back(vbo); #endif }
void MeshViewer :: addMeshToDisplayList(const ntk::Mesh& mesh, const Pose3D& pose, MeshViewerMode mode) { int new_list_index = glGenLists(1); glNewList(new_list_index, GL_COMPILE); if (mesh.texture.data) { // Last texture id was just created GLuint texture = m_upcoming_textures[m_upcoming_textures.size()-1]; glEnable(GL_TEXTURE_2D); glBindTexture( GL_TEXTURE_2D, texture ); } else { glDisable(GL_TEXTURE_2D); } glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslatef(pose.cvTranslation()[0], pose.cvTranslation()[1], pose.cvTranslation()[2]); Vec3f euler_angles = pose.cvEulerRotation(); glRotatef(rad_to_deg(euler_angles[0]), 1, 0, 0); glRotatef(rad_to_deg(euler_angles[1]), 0, 1, 0); glRotatef(rad_to_deg(euler_angles[2]), 0, 0, 1); if (mode & WIREFRAME) { glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); } else { glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); } int64 point_start_time = ntk::Time::getMillisecondCounter(); if (mesh.faces.size() == 0) { glBegin(GL_POINTS); for (int i = 0; i < mesh.vertices.size(); ++i) { const Point3f& v = mesh.vertices[i]; // if (i % 1000 == 0) // ntk_dbg_print(v, 1); if (mesh.hasColors()) glColor3f(mesh.colors[i][0]/255.0, mesh.colors[i][1]/255.0, mesh.colors[i][2]/255.0); glVertex3f(v.x, v.y, v.z); } glEnd(); } int64 point_end_time = ntk::Time::getMillisecondCounter(); ntk_dbg_print(point_end_time-point_start_time, 1); { glBegin(GL_TRIANGLES); for (int i = 0; i < mesh.faces.size(); ++i) { int i1 = mesh.faces[i].indices[0]; int i2 = mesh.faces[i].indices[1]; int i3 = mesh.faces[i].indices[2]; const Point3f& v1 = mesh.vertices[i1]; const Point3f& v2 = mesh.vertices[i2]; const Point3f& v3 = mesh.vertices[i3]; Vec3f nm = (Vec3f(v2-v1).cross(v3-v2)); normalize(nm); if (!mesh.hasColors()) glColor3f(1.0f, 0.0f, 0.0f); if (mesh.hasColors()) glColor3f(mesh.colors[i1][0]/255.0, mesh.colors[i1][1]/255.0, mesh.colors[i1][2]/255.0); if (mesh.hasTexcoords()) glTexCoord2f(mesh.texcoords[i1].x, mesh.texcoords[i1].y); glVertex3f(v1.x, v1.y, v1.z); glNormal3f(nm[0], nm[1], nm[2]); if (mesh.hasColors()) glColor3f(mesh.colors[i2][0]/255.0, mesh.colors[i2][1]/255.0, mesh.colors[i2][2]/255.0); if (mesh.hasTexcoords()) glTexCoord2f(mesh.texcoords[i2].x, mesh.texcoords[i2].y); glVertex3f(v2.x, v2.y, v2.z); glNormal3f(nm[0], nm[1], nm[2]); if (mesh.hasColors()) glColor3f(mesh.colors[i3][0]/255.0, mesh.colors[i3][1]/255.0, mesh.colors[i3][2]/255.0); if (mesh.hasTexcoords()) glTexCoord2f(mesh.texcoords[i3].x, mesh.texcoords[i3].y); glVertex3f(v3.x, v3.y, v3.z); glNormal3f(nm[0], nm[1], nm[2]); } glEnd(); } glMatrixMode(GL_MODELVIEW); glPopMatrix(); glEndList(); m_upcoming_display_lists.push_back(new_list_index); }