Beispiel #1
0
void GameScreen::gameLoop()
{
    switch (_currentState)
    {
    case SHOWING_SPLASH_SCREEN:
    {
        showSplashScreen();
        _currentState = PLAYING;
    }
        break;
    case SHOWING_MENU:
    {
        showMenu();
    }
        break;
    case PLAYING:
    {
        inputHandling();
    }
        break;
    case PAUSED:
        break;
    case EXITING:
        break;
    default:
        break;
    }
}
void render(GLFWwindow* window)
{
    int width, height;
    glfwGetFramebufferSize(window, &width, &height);

    inputHandling(window);

    /********** Section camera view **********/

    glm::vec3 cameraPosition(0,2,7);

    glm::vec4 cameraPositionTransformed =
            glm::rotate(glm::mat4(1.0f), angleX, glm::vec3(0,1,0)) *
            glm::rotate(glm::mat4(1.0f), angleY, glm::vec3(1,0,0))* glm::vec4(cameraPosition, 1.0f);

    cameraPosition = glm::vec3(XYZ(cameraPositionTransformed));

    // come from http://www.opengl-tutorial.org/fr/beginners-tutorials/tutorial-3-matrices/

	glm::mat4 Projection = glm::perspective(glm::radians(45.0f), (float)width / (float)height, 0.1f, 50.0f);

     // Camera matrix
     glm::mat4 ViewCamera = glm::lookAt(
                    cameraPosition, // Camera is at (4,3,3), in World Space
                    glm::vec3(0,0,0), // and looks at the origin
                    glm::vec3(0,1,0)  // Head is up (set to 0,-1,0 to look upside-down)
                    );


     glm::mat4 Model = glm::mat4(1.0f);


     glm::mat4 mvpCamera = Projection * ViewCamera * Model; // Remember, matrix multiplication is the other way around

     //glProgramUniformMatrix4fv(gs.programView, 23, 1, GL_FALSE, &mvpCamera[0][0]);



    /********** Section lumière **********/

    glm::vec3 lightPosition(0, 5.f, 15.f);

    glm::vec4 lightPositionTransformed =
            glm::rotate(glm::mat4(1.0f), anglePhiLight, glm::vec3(0,1,0)) *
            glm::rotate(glm::mat4(1.0f), angleTetaLight, glm::vec3(1,0,0)) * glm::vec4(lightPosition,1.0f);

    /*** calcul du mvp de la caméra lumière (déplacement de la lumière donc calcule ici) ***/

    lightPosition = glm::vec3(XYZ(lightPositionTransformed));

	Projection = glm::perspective(glm::radians(45.0f), (float)width / (float)height, 0.1f, 50.0f);

    // Light Camera matrix
    glm::mat4 ViewLightCamera = glm::lookAt(
                   lightPosition, // Camera is at (4,3,3), in World Space
                   glm::vec3(0,0,0), // and looks at the origin
                   glm::vec3(0,1,0)  // Head is up (set to 0,-1,0 to look upside-down)
                   );

    // Our ModelViewProjection : multiplication of our 3 matrices
    glm::mat4 mvpLightCamera = Projection * ViewLightCamera * Model; // Remember, matrix multiplication is the other way around

    //glProgramUniformMatrix4fv(gs.programView, 22, 1, GL_FALSE, &mvpLightCamera[0][0]);



	float color[3] = { 0, 1, 0 };

	glProgramUniform3fv(gs.programView, 3, 1, color);
	glProgramUniform3fv(gs.programView, 4, 1, glm::value_ptr(lightPosition));


    
    glBindFramebuffer(GL_FRAMEBUFFER, gs.fbo);
	glViewport(0, 0, width, height);

	glClear(GL_COLOR_BUFFER_BIT);
	glClear(GL_DEPTH_BUFFER_BIT);

	glUseProgram(gs.programView);
	glBindVertexArray(gs.vao);

    {
		glProgramUniformMatrix4fv(gs.programView, 22, 1, GL_FALSE, &mvpLightCamera[0][0]);
		glProgramUniformMatrix4fv(gs.programView, 23, 1, GL_FALSE, &mvpLightCamera[0][0]);

		glProgramUniform3fv(gs.programView, 3, 1, color);
		glProgramUniform3fv(gs.programView, 4, 1, glm::value_ptr(lightPosition));

        glDrawArrays(GL_TRIANGLES, 0, nbVertex*4);
    }
	//glBindFramebuffer(GL_FRAMEBUFFER, 0);
    //glBindVertexArray(0);
    //glUseProgram(0);




    
	
    
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
	glViewport(0, 0, width, height);

	glClear(GL_COLOR_BUFFER_BIT);
	glClear(GL_DEPTH_BUFFER_BIT);

    //glUseProgram(gs.programView);
    //glBindVertexArray(gs.vao);
    {
		glProgramUniformMatrix4fv(gs.programView, 23, 1, GL_FALSE, &mvpCamera[0][0]);
		glProgramUniformMatrix4fv(gs.programView, 22, 1, GL_FALSE, &mvpLightCamera[0][0]);

		glProgramUniform3fv(gs.programView, 3, 1, color);
		glProgramUniform3fv(gs.programView, 4, 1, glm::value_ptr(lightPosition));

        glDrawArrays(GL_TRIANGLES, 0, nbVertex*4);
    }

    glBindVertexArray(0);
    glUseProgram(0);

}