Ejemplo n.º 1
0
Matrix4 mat4RotationZ(float rad, const Vector3& center)
{
    return mat4Translation(center) * mat4RotationZ(rad) * mat4Translation(-center);
}
Ejemplo n.º 2
0
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;
}