Matrix4 mat4RotationZ(float rad, const Vector3& center) { return mat4Translation(center) * mat4RotationZ(rad) * mat4Translation(-center); }
int main() { GLFWwindow* window = initGlfwWindow(); if (window == NULL) { printf("Window init failed"); return 1; } initGlew(); GLuint mainVertexShader = createShader(GL_VERTEX_SHADER, mainVertexSource); GLuint mainFragmentShader = createShader(GL_FRAGMENT_SHADER, mainFragmentSource); GLuint mainShaderProgram = createShaderProgram(mainVertexShader, mainFragmentShader); GLuint boxVao; GLuint floorVao; glGenVertexArrays(1, &floorVao); glGenVertexArrays(1, &boxVao); createMainBufferObjects(boxVao, floorVao, mainShaderProgram); GLuint gridVertexShader = createShader(GL_VERTEX_SHADER, gridVertexSource); GLuint gridFragmentShader = createShader(GL_FRAGMENT_SHADER, gridFragmentSource); GLuint gridShaderProgram = createShaderProgram(gridVertexShader, gridFragmentShader); GLuint gridBoxVao; glGenVertexArrays(1, &gridBoxVao); createGridBufferObject(gridBoxVao, boxVertices, sizeof(boxVertices), gridShaderProgram); //Create texture loadBoxTexture(mainShaderProgram); //Enable depth test glEnable(GL_DEPTH_TEST); TransformationMatrix transformationMatrix; setupTransformationMatrix(&transformationMatrix); GLint uniTransf = glGetUniformLocation(mainShaderProgram, "transf"); GLint uniColor = glGetUniformLocation(mainShaderProgram, "overrideColor"); GLint uniTransfGrid = glGetUniformLocation(gridShaderProgram, "transf"); glUseProgram(0); float currentTime; while (!glfwWindowShouldClose(window)) { glfwPollEvents(); //Clear the screen to white glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); currentTime = (float) glfwGetTime(); amat4_identity(&transformationMatrix.model); mat4RotationZ(&transformationMatrix.model, currentTime * 0.2f * degreesToRadians(180.0f)); calculateTransformationMatrix(&transformationMatrix); glUseProgram(mainShaderProgram); glUniformMatrix4fv(uniTransf, 1, GL_FALSE, &transformationMatrix.transf.mat[0]); //Start with drawing functions glBindVertexArray(boxVao); glDrawArrays(GL_TRIANGLES, 0, 36); glBindVertexArray(0); if (drawGrid) { glUseProgram(gridShaderProgram); glUniformMatrix4fv(uniTransfGrid, 1, GL_FALSE, &transformationMatrix.transf.mat[0]); glUniform3f(uniColor, 1.0f, 0.0f, 0.0f); glBindVertexArray(gridBoxVao); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glDrawArrays(GL_TRIANGLES, 0, 36); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glBindVertexArray(0); glUseProgram(mainShaderProgram); } // glEnable(GL_STENCIL_TEST); // Draw floor glStencilFunc(GL_ALWAYS, 1, 0xFF); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); glStencilMask(0xFF); glDepthMask(GL_FALSE); glClear(GL_STENCIL_BUFFER_BIT); glBindVertexArray(floorVao); glDrawArrays(GL_TRIANGLES, 0, 6); glBindVertexArray(0); //Draw refelction glStencilFunc(GL_EQUAL, 1, 0xFF); glStencilMask(0x00); glDepthMask(GL_TRUE); mat4 transl, scaling; amat4_translation(&transl, 0.0f, 0.0f, -1.0f); amat4_scaling(&scaling, 1.0f, 1.0f, -1.0f); mat4Multiply(&transformationMatrix.model, &transformationMatrix.model, &transl); mat4Multiply(&transformationMatrix.model, &transformationMatrix.model, &scaling); calculateTransformationMatrix(&transformationMatrix); glUniformMatrix4fv(uniTransfGrid, 1, GL_FALSE, &transformationMatrix.transf.mat[0]); glUniform3f(uniColor, 0.3f, 0.3f, 0.3f); glBindVertexArray(boxVao); glDrawArrays(GL_TRIANGLES, 0, 36); glBindVertexArray(0); glUniform3f(uniColor, 1.0f, 1.0f, 1.0f); // glDisable(GL_STENCIL_TEST); glfwSwapBuffers(window); } glfwTerminate(); return 0; }