void recursiveRender(context *scene) {// bind the texture mvpStack.push(); mvpStack->matrix() *= scene->transformation.matrix(); if (scene->texture != 0) { glUniform1i(glGetUniformLocation(shader.id(),"ColorTex"), 0); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,textures[scene->texture]); // draw the texture glBindVertexArray(vertexArrayID); glUniformMatrix4fv(glGetUniformLocation(shader.id(), "mvp"), 1, GL_FALSE, mvpStack->data()); glDrawArrays(GL_TRIANGLE_STRIP,0,4); } for (std::list<context*>::iterator it = scene->subcontexts.begin(); it!=scene->subcontexts.end(); ++it) { recursiveRender(*it); } mvpStack.pop(); }
//============================================================================= // wyświetlenie sceny //============================================================================= void display(void) { // czyszczenie bufora koloru glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // załadowanie macierzy jednostkowej do macierzy widoku modelu modelView.setIdentity(); // użycie obiektu shadera glUseProgram(simplyShader); // kierunek źródła światła GLfloat lightDir[4] = {4.0f, 6.0f, 3.0f, 1.0f}; // załadowanie do shadera wektora położenia światła (w aktualnym układzie współrzędnych) glUniform3fv(glGetUniformLocation(simplyShader, "inLightDir"), 1, lightDir); // załadownanie do shadera bieżącego stanu macierzy projekcji - wystarczy raz, bo jest tu niezmienna glUniformMatrix4fv(glGetUniformLocation(simplyShader, "projectionMatrix"), 1, GL_TRUE, projection.get()); modelView.rotate(angWorldX, 1.0f, 0.0f, 0.0f); modelView.rotate(angWorldY, 0.0f, 1.0f, 0.0f); modelView.rotate(angWorldZ, 0.0f, 0.0f, 1.0f); modelView.translate(translWorld[0], translWorld[1], translWorld[2]); modelViewStack.put(&modelView); modelView.translate(transObject[0], transObject[1], transObject[2]); modelView.rotate(angX, 1.0f, 0.0f, 0.0f); modelView.rotate(angY, 0.0f, 1.0f, 0.0f); modelView.rotate(angZ, 0.0f, 0.0f, 1.0f); // załadowanie do shadera wektora koloru obiektu glUniform4fv(glGetUniformLocation(simplyShader, "inColor"), 1, objectColor); glUniformMatrix4fv(glGetUniformLocation(simplyShader, "modelViewMatrix"), 1, GL_TRUE, modelView.get()); // narysowanie danych zawartych w tablicy glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glDrawElements(GL_TRIANGLES, 3*6*2, GL_UNSIGNED_INT, 0); // włączenie tablicy wierzchołków .obj glBindVertexArray(objVertexArray); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // narysowanie danych zawartych w tablicy wierzchołków .obj glDrawElements(GL_TRIANGLES, 3*obj.nFaces, GL_UNSIGNED_INT, 0); // pobranie macierzy widoku modelu ze stosu modelViewStack.pop(&modelView); modelViewStack.put(&modelView); modelView.translate(0.5f, 0.0f, 0.5f); modelView.rotate(-2.5f, 1.0f, 0.0f, 0.0f); modelView.rotate(0.0f, 0.0f, 1.0f, 0.0f); modelView.rotate(3.0f, 0.0f, 0.0f, 1.0f); // włączenie tablicy wierzchołków sześcianu glBindVertexArray(cubeVertexArray1); // załadownanie do shadera bieżącego stanu macierzy widoku modelu glUniformMatrix4fv(glGetUniformLocation(simplyShader, "modelViewMatrix"), 1, GL_TRUE, modelView.get()); // załadowanie do shadera wektora koloru obiektu glUniform4fv(glGetUniformLocation(simplyShader, "inColor"), 1, redColor); // narysowanie danych zawartych w tablicy glPolygonMode(GL_FRONT, GL_FILL); glDrawElements(GL_TRIANGLES, 3*6*2, GL_UNSIGNED_INT, 0); // pobranie macierzy widoku modelu ze stosu modelViewStack.pop(&modelView); modelViewStack.put(&modelView); modelView.translate(-0.5f, 0.5f, -0.5f); modelView.rotate(-2.5f, 1.0f, 0.0f, 0.0f); modelView.rotate(0.0f, 0.0f, 1.0f, 0.0f); modelView.rotate(3.0f, 0.0f, 0.0f, 1.0f); // włączenie tablicy wierzchołków sześcianu glBindVertexArray(cubeVertexArray2); // załadownanie do shadera bieżącego stanu macierzy widoku modelu glUniformMatrix4fv(glGetUniformLocation(simplyShader, "modelViewMatrix"), 1, GL_TRUE, modelView.get()); // załadowanie do shadera wektora koloru obiektu glUniform4fv(glGetUniformLocation(simplyShader, "inColor"), 1, blueColor); // narysowanie danych zawartych w tablicy glPolygonMode(GL_FRONT, GL_FILL); glDrawElements(GL_TRIANGLES, 3*6*2, GL_UNSIGNED_INT, 0); // pobranie macierzy widoku modelu ze stosu modelViewStack.pop(&modelView); modelViewStack.put(&modelView); modelView.translate(-0.5f, 0.0f, 0.5f); modelView.rotate(-2.5f, 1.0f, 0.0f, 0.0f); modelView.rotate(0.0f, 0.0f, 1.0f, 0.0f); modelView.rotate(3.0f, 0.0f, 0.0f, 1.0f); // włączenie tablicy wierzchołków sześcianu glBindVertexArray(cubeVertexArray3); // załadownanie do shadera bieżącego stanu macierzy widoku modelu glUniformMatrix4fv(glGetUniformLocation(simplyShader, "modelViewMatrix"), 1, GL_TRUE, modelView.get()); // załadowanie do shadera wektora koloru obiektu glUniform4fv(glGetUniformLocation(simplyShader, "inColor"), 1, greenColor); // narysowanie danych zawartych w tablicy glPolygonMode(GL_FRONT, GL_FILL); glDrawElements(GL_TRIANGLES, 3*6*2, GL_UNSIGNED_INT, 0); // pobranie macierzy widoku modelu ze stosu modelViewStack.pop(&modelView); modelViewStack.put(&modelView); modelView.translate(0.5f, 0.5f, -0.5f); modelView.rotate(-2.5f, 1.0f, 0.0f, 0.0f); modelView.rotate(0.0f, 0.0f, 1.0f, 0.0f); modelView.rotate(3.0f, 0.0f, 0.0f, 1.0f); // włączenie tablicy wierzchołków sześcianu glBindVertexArray(cubeVertexArray4); // załadownanie do shadera bieżącego stanu macierzy widoku modelu glUniformMatrix4fv(glGetUniformLocation(simplyShader, "modelViewMatrix"), 1, GL_TRUE, modelView.get()); // załadowanie do shadera wektora koloru obiektu glUniform4fv(glGetUniformLocation(simplyShader, "inColor"), 1, yellowColor); // narysowanie danych zawartych w tablicy glPolygonMode(GL_FRONT, GL_FILL); glDrawElements(GL_TRIANGLES, 3*6*2, GL_UNSIGNED_INT, 0); // pobranie macierzy widoku modelu ze stosu modelViewStack.pop(&modelView); // wyłączenie tablic wierzhołków glBindVertexArray(0); // wyłączenie shadera glUseProgram(0); // wyrenderowanie sceny glFlush(); glutSwapBuffers(); }