void CubeViewer:: draw_scene(DrawMode _draw_mode) { // clear screen glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //glEnable(GL_CULL_FACE); // first bind the shader m_cubeShader.bind(); // set parameters to send to the shader m_cubeShader.setMatrix4x4Uniform("WorldCameraTransform", m_camera.getTransformation().Inverse()); m_cubeShader.setMatrix3x3Uniform("WorldCameraNormalTransform", m_camera.getTransformation().Transpose()); m_cubeShader.setMatrix4x4Uniform("ProjectionMatrix", m_camera.getProjectionMatrix()); for (std::vector<Mesh3D*>::iterator mIt = m_meshes.begin(); mIt != m_meshes.end(); ++mIt) { Mesh3D *cube = *mIt; // besides during we can apply transformations just before rendering: // save the original transformation of the cube Matrix4 originalTransformation = cube->getTransformation(); // rotate the cube before rendering cube->rotateObject(Vector3(0,1,0), M_PI/4); // send the model parameters to the shader m_cubeShader.setMatrix4x4Uniform("ModelWorldTransform", cube->getTransformation() ); m_cubeShader.setMatrix3x3Uniform("ModelWorldNormalTransform", cube->getTransformation().Inverse().Transpose()); // render the cube draw_mesh(cube); // ((( Exercise 3.6 ))) // then reset the original transformation cube->setTransformation( originalTransformation ); } // for illustration render a small sphere at the world center Matrix4 ident; ident.loadIdentity(); m_cubeShader.setMatrix4x4Uniform("ModelWorldTransform", ident ); m_cubeShader.setMatrix3x3Uniform("ModelWorldNormalTransform", ident ); glColor3f(1.0,1.0,1.0); // set sphere color to white glutSolidSphere( 0.05, 10, 10 ); // finally, unbind the shader m_cubeShader.unbind(); }
void SolarViewer::draw_object(Shader& sh, Mesh3D& mesh, bool showTexture) { sh.setMatrix4x4Uniform("modelworld", mesh.getTransformation() ); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); if(showTexture) glEnableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer( 3, GL_DOUBLE, 0, mesh.getVertexPointer() ); glNormalPointer( GL_DOUBLE, 0, mesh.getNormalPointer() ); if(showTexture) glTexCoordPointer( 2, GL_DOUBLE, 0, mesh.getUvTextureCoordPointer() ); for(unsigned int i = 0; i < mesh.getNumberOfParts(); i++) { sh.setIntUniform("useTexture", showTexture && mesh.getMaterial(i).hasDiffuseTexture()); sh.setVector3Uniform("diffuseColor", mesh.getMaterial(i).m_diffuseColor.x, mesh.getMaterial(i).m_diffuseColor.y, mesh.getMaterial(i).m_diffuseColor.z ); sh.setFloatUniform("specularExp", mesh.getMaterial(i).m_specularExp); if(showTexture && mesh.getMaterial(i).hasDiffuseTexture()) { mesh.getMaterial(i).m_diffuseTexture.bind(); sh.setIntUniform("texture", mesh.getMaterial(i).m_diffuseTexture.getLayer()); } glDrawElements( GL_TRIANGLES, mesh.getNumberOfFaces(i)*3, GL_UNSIGNED_INT, mesh.getVertexIndicesPointer(i) ); if(showTexture && mesh.getMaterial(i).hasDiffuseTexture()) { mesh.getMaterial(i).m_diffuseTexture.unbind(); } } glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); if(showTexture) glDisableClientState(GL_TEXTURE_COORD_ARRAY); }
void SolarViewer::draw_object(Shader& sh, Mesh3D& mesh) { sh.setMatrix4x4Uniform("modelworld", mesh.getTransformation() ); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer( 3, GL_DOUBLE, 0, mesh.getVertexPointer() ); glNormalPointer( GL_DOUBLE, 0, mesh.getNormalPointer() ); glTexCoordPointer( 2, GL_DOUBLE, 0, mesh.getUvTextureCoordPointer() ); for(unsigned int i = 0; i < mesh.getNumberOfParts(); i++) { glDrawElements( GL_TRIANGLES, mesh.getNumberOfFaces(i)*3, GL_UNSIGNED_INT, mesh.getVertexIndicesPointer(i) ); } glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); }