void RenderManager::BuildModelViewMatrix(GameObject g) { Matrix4x4 mvMatrix; Matrix4x4 model = BuildModelMatrix(g); Matrix4x4 view = BuildViewMatrix(); mvMatrix = model * view; ConvertToOpenGLMatrix(mvMatrix, modelViewMatrix); float mv[3][3]; mv[0][0] = mvMatrix(0,0); mv[1][1] = mvMatrix(1,1); mv[2][2] = mvMatrix(2,2); mv[1][0] = mvMatrix(0,1); mv[2][0] = mvMatrix(0,2); mv[2][1] = mvMatrix(1,2); mv[0][1] = mvMatrix(1,0); mv[0][2] = mvMatrix(2,0); mv[1][2] = mvMatrix(2,1); float det = mv[0][0] * (mv[1][1]*mv[2][2] - mv[1][2]*mv[2][1]) - mv[0][1] * (mv[1][0] * mv[2][2] - mv[1][2] * mv[2][0]) + mv[0][2] * (mv[1][0] * mv[2][1] - mv[1][1] * mv[2][0]); mv[0][0] = (mv[1][1]*mv[2][2] - mv[1][2]*mv[2][1])/det; mv[0][1] = -(mv[1][0]*mv[2][2] - mv[1][2]*mv[2][0])/det; mv[0][2] = (mv[1][0]*mv[2][1] - mv[1][1]*mv[2][0])/det; mv[1][0] = -(mv[0][1]*mv[2][2] - mv[0][2]*mv[2][1])/det; mv[1][1] = (mv[0][0]*mv[2][2] - mv[0][2]*mv[2][0])/det; mv[1][2] = -(mv[0][0]*mv[2][1] - mv[0][1]*mv[2][0])/det; mv[2][0] = (mv[0][1]*mv[1][2] - mv[0][2]*mv[1][1])/det; mv[2][1] = -(mv[0][0]*mv[1][2] - mv[0][2]*mv[1][0])/det; mv[2][2] = (mv[0][0]*mv[1][1] - mv[0][1]*mv[1][0])/det; Matrix4x4 normMatrix(Matrix4x4::IDENTITY); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { normMatrix.elem[i][j] = mv[j][i]; } } ConvertToOpenGLMatrix(normMatrix, normalMatrix); }
void Scene::DrawObject(const Framework::Mesh *pMesh, const std::string &meshName, const ProgramData &prog, int materialBlockIndex, int mtlIx, const glutil::MatrixStack &modelMatrix) { glBindBufferRange(GL_UNIFORM_BUFFER, materialBlockIndex, m_materialUniformBuffer, mtlIx * m_sizeMaterialBlock, sizeof(MaterialBlock)); glm::mat3 normMatrix(modelMatrix.Top()); normMatrix = glm::transpose(glm::inverse(normMatrix)); glUseProgram(prog.theProgram); glUniformMatrix4fv(prog.modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(modelMatrix.Top())); glUniformMatrix3fv(prog.normalModelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(normMatrix)); pMesh->Render(meshName); glUseProgram(0); glBindBufferBase(GL_UNIFORM_BUFFER, materialBlockIndex, 0); }
Matrix callFunc(const char *funcName, ASTNode *argListNode){ /* sort out args */ ASTNode *argNode[10]; Matrix result; Number calcresult; MatList *p; if (strcmp(funcName, "eye")==0) { /* generate eye matrix */ argNode[0] = getNthArgFromArgList(argListNode,1); result = createEyeMatrix((int)readOneElementOfMatrix(argNode[0]->mat,1,1)); } else if(strcmp(funcName, "rand")==0){/*generate rand matrix*/ argNode[0] = getNthArgFromArgList(argListNode,1); argNode[1] = getNthArgFromArgList(argListNode,2); result = createRandMatrix((int)readOneElementOfMatrix(argNode[0]->mat,1,1),readOneElementOfMatrix(argNode[1]->mat,1,1)); } else if(strcmp(funcName, "zeros")==0){/*generate rand matrix*/ argNode[0] = getNthArgFromArgList(argListNode,1); argNode[1] = getNthArgFromArgList(argListNode,2); result = createZeroMatrix((int)readOneElementOfMatrix(argNode[0]->mat,1,1),readOneElementOfMatrix(argNode[1]->mat,1,1)); } else if(strcmp(funcName, "max")==0){/*calculate maximum of matrix*/ argNode[0] = getNthArgFromArgList(argListNode,1); calcresult = maxMatrix(argNode[0]->mat); result = createEyeMatrix(1); changeOneElementOfMatrix(result, 1, 1, calcresult); } else if(strcmp(funcName, "min")==0){/*calculate minimum of matrix*/ argNode[0] = getNthArgFromArgList(argListNode,1); calcresult = minMatrix(argNode[0]->mat); result = createEyeMatrix(1); changeOneElementOfMatrix(result, 1, 1, calcresult); } else if(strcmp(funcName, "sum")==0){/*calculate sum of matrix*/ argNode[0] = getNthArgFromArgList(argListNode,1); calcresult = sumMatrix(argNode[0]->mat); result = createEyeMatrix(1); changeOneElementOfMatrix(result, 1, 1, calcresult); } else if(strcmp(funcName, "round")==0){/*calculate round of matrix*/ argNode[0] = getNthArgFromArgList(argListNode,1); result = roundMatrix(argNode[0]->mat); } else if(strcmp(funcName, "upper")==0){/*calculate upper of matrix*/ argNode[0] = getNthArgFromArgList(argListNode,1); result = upperMatrix(argNode[0]->mat); } else if(strcmp(funcName, "lower")==0){/*calculate upper of matrix*/ argNode[0] = getNthArgFromArgList(argListNode,1); result = lowerMatrix(argNode[0]->mat); } else if(strcmp(funcName, "det")==0){/*calculate DeterminantCalc*/ argNode[0] = getNthArgFromArgList(argListNode,1); calcresult = DeterminantCalc(argNode[0]->mat.row, argNode[0]->mat); result = createEyeMatrix(1); changeOneElementOfMatrix(result, 1, 1, calcresult); } else if(strcmp(funcName, "turn")==0){/*calculate turn*/ argNode[0] = getNthArgFromArgList(argListNode,1); result = turnMatrix(argNode[0]->mat); } else if(strcmp(funcName, "power")==0){/*calculate power*/ argNode[0] = getNthArgFromArgList(argListNode,1); argNode[1] = getNthArgFromArgList(argListNode,2); result = powerMatrix(argNode[0]->mat,(int)readOneElementOfMatrix(argNode[1]->mat,1,1)); } else if(strcmp(funcName, "dot")==0){/*calculate dot*/ argNode[0] = getNthArgFromArgList(argListNode,1); argNode[1] = getNthArgFromArgList(argListNode,2); result = dotMatrix(argNode[0]->mat,argNode[1]->mat); } else if(strcmp(funcName, "norm")==0){/*calculate norm*/ argNode[0] = getNthArgFromArgList(argListNode,1); result = normMatrix(argNode[0]->mat); } else if(strcmp(funcName, "angle")==0){/*calculate norm*/ argNode[0] = getNthArgFromArgList(argListNode,1); argNode[1] = getNthArgFromArgList(argListNode,2); result = angleMatrix(argNode[0]->mat,argNode[1]->mat); } else{ if (get_submatrix == 1){ p = checkMatName(funcName); argNode[0] = getNthArgFromArgList(argListNode,1); argNode[1] = getNthArgFromArgList(argListNode,2); result = createSubMatrix(p->mat,argNode[0]->mat,argNode[1]->mat); get_submatrix = 0; } else{ p = checkMatName(funcName); argNode[0] = getNthArgFromArgList(argListNode,1); argNode[1] = getNthArgFromArgList(argListNode,2); calcresult = readOneElementOfMatrix(p->mat,(int)readOneElementOfMatrix(argNode[0]->mat,1,1),readOneElementOfMatrix(argNode[1]->mat,1,1)); result = createEyeMatrix(1); changeOneElementOfMatrix(result, 1, 1, calcresult); } } return result; }
//Called to update the display. //You should call glutSwapBuffers after all of your rendering to display what you rendered. //If you need continuous updates of the screen, call glutPostRedisplay() at the end of the function. void display() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if(g_pPlaneMesh && g_pCylinderMesh) { glutil::MatrixStack modelMatrix; modelMatrix.SetMatrix(g_viewPole.CalcMatrix()); glm::vec4 lightDirCameraSpace = modelMatrix.Top() * g_lightDirection; glUseProgram(g_WhiteDiffuseColor.theProgram); glUniform3fv(g_WhiteDiffuseColor.dirToLightUnif, 1, glm::value_ptr(lightDirCameraSpace)); glUseProgram(g_VertexDiffuseColor.theProgram); glUniform3fv(g_VertexDiffuseColor.dirToLightUnif, 1, glm::value_ptr(lightDirCameraSpace)); glUseProgram(0); { glutil::PushStack push(modelMatrix); //Render the ground plane. { glutil::PushStack push(modelMatrix); glUseProgram(g_WhiteDiffuseColor.theProgram); glUniformMatrix4fv(g_WhiteDiffuseColor.modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(modelMatrix.Top())); glm::mat3 normMatrix(modelMatrix.Top()); glUniformMatrix3fv(g_WhiteDiffuseColor.normalModelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(normMatrix)); glUniform4f(g_WhiteDiffuseColor.lightIntensityUnif, 1.0f, 1.0f, 1.0f, 1.0f); g_pPlaneMesh->Render(); glUseProgram(0); } //Render the Cylinder { glutil::PushStack push(modelMatrix); modelMatrix.ApplyMatrix(g_objtPole.CalcMatrix()); if(g_bScaleCyl) modelMatrix.Scale(1.0f, 1.0f, 0.2f); glUseProgram(g_VertexDiffuseColor.theProgram); glUniformMatrix4fv(g_VertexDiffuseColor.modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(modelMatrix.Top())); glm::mat3 normMatrix(modelMatrix.Top()); if(g_bDoInvTranspose) { normMatrix = glm::transpose(glm::inverse(normMatrix)); } glUniformMatrix3fv(g_VertexDiffuseColor.normalModelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(normMatrix)); glUniform4f(g_VertexDiffuseColor.lightIntensityUnif, 1.0f, 1.0f, 1.0f, 1.0f); g_pCylinderMesh->Render("lit-color"); glUseProgram(0); } } } glutSwapBuffers(); }
GLUSboolean display(GLUSfloat time) { g_LightTimer.Update(time); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glutil::MatrixStack modelMatrix; modelMatrix.SetMatrix(g_viewPole.CalcMatrix()); const glm::vec4 &worldLightPos = CalcLightPosition(); const glm::vec4 &lightPosCameraSpace = modelMatrix.Top() * worldLightPos; glUseProgram(g_MonoDiffuseProgram.program); glUniform4f(g_MonoDiffuseProgram.lightIntensityUnif, 0.8f, 0.8f, 0.8f, 1.0f); glUniform4f(g_MonoDiffuseProgram.ambientIntensityUnif, 0.2f, 0.2f, 0.2f, 1.0f); glUniform3fv(g_MonoDiffuseProgram.cameraSpaceLightPosUnif,1, glm::value_ptr(lightPosCameraSpace)); glUniform1f(g_MonoDiffuseProgram.lightAttenuationUnif, g_fLightAttenuation); glUniform1f(g_MonoDiffuseProgram.shininessFactorUnif, g_fGaussianRoughness); glUniform4fv(g_MonoDiffuseProgram.baseDiffuseColorUnif, 1, g_bDrawDark ? glm::value_ptr(g_darkColor) : glm::value_ptr(g_lightColor)); glUseProgram(g_ColorDiffuseProgram.program); glUniform4f(g_ColorDiffuseProgram.lightIntensityUnif, 0.8f, 0.8f, 0.8f, 1.0f); glUniform4f(g_ColorDiffuseProgram.ambientIntensityUnif, 0.2f, 0.2f, 0.2f, 1.0f); glUniform3fv(g_ColorDiffuseProgram.cameraSpaceLightPosUnif, 1, glm::value_ptr(lightPosCameraSpace)); glUniform1f(g_ColorDiffuseProgram.lightAttenuationUnif, g_fLightAttenuation); glUniform1f(g_ColorDiffuseProgram.shininessFactorUnif, g_fGaussianRoughness); glUseProgram(0); { glutil::PushStack push(modelMatrix); { glutil::PushStack push(modelMatrix); glm::mat3 normMatrix(modelMatrix.Top()); normMatrix = glm::transpose(glm::inverse(normMatrix)); glUseProgram(g_MonoDiffuseProgram.program); glUniformMatrix4fv(g_MonoDiffuseProgram.modelViewUnif, 1, GL_FALSE, glm::value_ptr(modelMatrix.Top())); glUniformMatrix3fv(g_MonoDiffuseProgram.modelViewForNormalUnif, 1, GL_FALSE, glm::value_ptr(normMatrix)); g_pPlaneMesh->render(); glUseProgram(0); } { glutil::PushStack push(modelMatrix); modelMatrix.ApplyMatrix(g_objtPole.CalcMatrix()); if (g_bScaleCyl) { modelMatrix.Scale(1.0f, 1.0f, 0.2f); } glm::mat3 normMatrix(modelMatrix.Top()); normMatrix = glm::transpose(glm::inverse(normMatrix)); ProgramData &prog = g_bDrawColoredCyl ? g_ColorDiffuseProgram : g_MonoDiffuseProgram; glUseProgram(prog.program); glUniformMatrix4fv(prog.modelViewUnif, 1, GL_FALSE, glm::value_ptr(modelMatrix.Top())); glUniformMatrix3fv(prog.modelViewForNormalUnif, 1, GL_FALSE, glm::value_ptr(normMatrix)); g_pCylinderMesh->render(g_bDrawColoredCyl ? "lit-color" : "lit"); glUseProgram(0); } if (g_bDrawLightSource) { glutil::PushStack push(modelMatrix); modelMatrix.Translate(glm::vec3(worldLightPos)); modelMatrix.Scale(0.1f, 0.1f, 0.1f); glUseProgram(g_UnlitProgram.program); glUniformMatrix4fv(g_UnlitProgram.modelViewUnif, 1, GL_FALSE, glm::value_ptr(modelMatrix.Top())); glUniform4f(g_UnlitProgram.objectColorUnif, 0.8078f, 0.8706f, 0.9922f, 1.0f); g_pCubeMesh->render("flat"); } } return GLUS_TRUE; }
void display() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if(g_pPlaneMesh && g_pCylinderMesh) { glutil::MatrixStack modelMatrix; modelMatrix.SetMatrix(g_viewPole.CalcMatrix()); glm::vec4 lightDirCameraSpace = modelMatrix.Top() * g_lightDirection; ProgramData &whiteDiffuse = g_bShowAmbient ? g_WhiteAmbDiffuseColor : g_WhiteDiffuseColor; ProgramData &vertexDiffuse = g_bShowAmbient ? g_VertexAmbDiffuseColor : g_VertexDiffuseColor; if(g_bShowAmbient) { glUseProgram(whiteDiffuse.theProgram); glUniform4f(whiteDiffuse.lightIntensityUnif, 0.8f, 0.8f, 0.8f, 1.0f); glUniform4f(whiteDiffuse.ambientIntensityUnif, 0.2f, 0.2f, 0.2f, 1.0f); glUseProgram(vertexDiffuse.theProgram); glUniform4f(vertexDiffuse.lightIntensityUnif, 0.8f, 0.8f, 0.8f, 1.0f); glUniform4f(vertexDiffuse.ambientIntensityUnif, 0.2f, 0.2f, 0.2f, 1.0f); } else { glUseProgram(whiteDiffuse.theProgram); glUniform4f(whiteDiffuse.lightIntensityUnif, 1.0f, 1.0f, 1.0f, 1.0f); glUseProgram(vertexDiffuse.theProgram); glUniform4f(vertexDiffuse.lightIntensityUnif, 1.0f, 1.0f, 1.0f, 1.0f); } glUseProgram(whiteDiffuse.theProgram); glUniform3fv(whiteDiffuse.dirToLightUnif, 1, glm::value_ptr(lightDirCameraSpace)); glUseProgram(vertexDiffuse.theProgram); glUniform3fv(vertexDiffuse.dirToLightUnif, 1, glm::value_ptr(lightDirCameraSpace)); glUseProgram(0); { glutil::PushStack push(modelMatrix); //Render the ground plane. { glutil::PushStack push(modelMatrix); glUseProgram(whiteDiffuse.theProgram); glUniformMatrix4fv(whiteDiffuse.modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(modelMatrix.Top())); glm::mat3 normMatrix(modelMatrix.Top()); glUniformMatrix3fv(whiteDiffuse.normalModelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(normMatrix)); g_pPlaneMesh->Render(); glUseProgram(0); } //Render the Cylinder { glutil::PushStack push(modelMatrix); modelMatrix.ApplyMatrix(g_objtPole.CalcMatrix()); if(g_bDrawColoredCyl) { glUseProgram(vertexDiffuse.theProgram); glUniformMatrix4fv(vertexDiffuse.modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(modelMatrix.Top())); glm::mat3 normMatrix(modelMatrix.Top()); glUniformMatrix3fv(vertexDiffuse.normalModelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(normMatrix)); g_pCylinderMesh->Render("lit-color"); } else { glUseProgram(whiteDiffuse.theProgram); glUniformMatrix4fv(whiteDiffuse.modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(modelMatrix.Top())); glm::mat3 normMatrix(modelMatrix.Top()); glUniformMatrix3fv(whiteDiffuse.normalModelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(normMatrix)); g_pCylinderMesh->Render("lit"); } glUseProgram(0); } } } glutSwapBuffers(); }