From d9f44af7aee41a111a3d7427d8735bc821f1824f Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 15 Dec 2009 19:37:12 +0100 Subject: [PATCH] Moved source files to src; sort triangles by texture. --- CMakeLists.txt | 15 +----------- BSPTree.cpp => src/BSPTree.cpp | 0 BSPTree.h => src/BSPTree.h | 0 src/CMakeLists.txt | 13 ++++++++++ Game.cpp => src/Game.cpp | 13 +++++++--- Game.h => src/Game.h | 2 ++ Level.cpp => src/Level.cpp | 0 Level.h => src/Level.h | 0 Renderer.cpp => src/Renderer.cpp | 42 +++++++++++++------------------- Renderer.h => src/Renderer.h | 28 ++++++++++++++++++--- Shader.cpp => src/Shader.cpp | 0 Shader.h => src/Shader.h | 0 Texture.cpp => src/Texture.cpp | 0 Texture.h => src/Texture.h | 0 Triangle.h => src/Triangle.h | 0 config.h => src/config.h | 0 gl.h => src/gl.h | 0 zoom.cpp => src/zoom.cpp | 0 18 files changed, 68 insertions(+), 45 deletions(-) rename BSPTree.cpp => src/BSPTree.cpp (100%) rename BSPTree.h => src/BSPTree.h (100%) create mode 100644 src/CMakeLists.txt rename Game.cpp => src/Game.cpp (82%) rename Game.h => src/Game.h (95%) rename Level.cpp => src/Level.cpp (100%) rename Level.h => src/Level.h (100%) rename Renderer.cpp => src/Renderer.cpp (71%) rename Renderer.h => src/Renderer.h (65%) rename Shader.cpp => src/Shader.cpp (100%) rename Shader.h => src/Shader.h (100%) rename Texture.cpp => src/Texture.cpp (100%) rename Texture.h => src/Texture.h (100%) rename Triangle.h => src/Triangle.h (100%) rename config.h => src/config.h (100%) rename gl.h => src/gl.h (100%) rename zoom.cpp => src/zoom.cpp (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 305c938..7a57452 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,17 +11,4 @@ find_package(LibXml2 REQUIRED) include_directories(${Boost_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR} ${GLEW_INCLUDE_DIR} ${GLPNG_INCLUDE_DIR} ${LIBXML2_INCLUDE_DIR}) -add_executable(zoom - BSPTree.cpp BSPTree.h - Game.cpp Game.h - config.h - gl.h - Level.cpp Level.h - Renderer.cpp Renderer.h - Shader.cpp Shader.h - Texture.cpp Texture.h - Triangle.h - zoom.cpp -) - -target_link_libraries(zoom ${Boost_LIBRARIES} ${OPENGL_LIBRARIES} ${GLEW_LIBRARY} ${GLPNG_LIBRARY} ${LIBXML2_LIBRARIES}) +add_subdirectory(src) diff --git a/BSPTree.cpp b/src/BSPTree.cpp similarity index 100% rename from BSPTree.cpp rename to src/BSPTree.cpp diff --git a/BSPTree.h b/src/BSPTree.h similarity index 100% rename from BSPTree.h rename to src/BSPTree.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..e1c9378 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,13 @@ +add_executable(zoom + BSPTree.cpp BSPTree.h + Game.cpp Game.h + config.h + gl.h + Level.cpp Level.h + Renderer.cpp Renderer.h + Shader.cpp Shader.h + Texture.cpp Texture.h + Triangle.h + zoom.cpp +) +target_link_libraries(zoom ${Boost_LIBRARIES} ${OPENGL_LIBRARIES} ${GLEW_LIBRARY} ${GLPNG_LIBRARY} ${LIBXML2_LIBRARIES}) diff --git a/Game.cpp b/src/Game.cpp similarity index 82% rename from Game.cpp rename to src/Game.cpp index d948b2f..c738080 100644 --- a/Game.cpp +++ b/src/Game.cpp @@ -23,6 +23,7 @@ #include "Shader.h" #include "Triangle.h" #include "gl.h" +#include namespace Zoom { @@ -62,6 +63,8 @@ Game::Game(bool multisample) : angle(0), lightPos(0) { Shader::loadProgram("default.vert", "default.frag"); loadLevel("level.xml"); + triangles.insert(triangles.end(), level->getRooms().front().walls.begin(), level->getRooms().front().walls.end()); + std::sort(triangles.begin(), triangles.end(), Renderer::TextureSorter()); } bool Game::loadLevel(const std::string &name) { @@ -104,17 +107,21 @@ void Game::render() { light[2] = -8.0; } - glLightfv(GL_LIGHT0, GL_POSITION, light); + /*std::vector triangles(level->getRooms().front().walls.begin(), + level->getRooms().front().walls.end()); + std::sort(triangles.begin(), triangles.end(), Renderer::TextureSorter());*/ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); - //glRotatef(10, 1, 2, 1); + glRotatef(15, 1, 2, 1); /*glRotatef(5*angle, 0, -1, 2); glRotatef(7*angle, 2, -1, 0); glRotatef(11*angle, 2, -1, 2);*/ - renderer.render(level->getRooms().front().walls); + glLightfv(GL_LIGHT0, GL_POSITION, light); + //renderer.render(std::list(triangles.begin(), triangles.end())); + renderer.render(triangles); glPopMatrix(); } diff --git a/Game.h b/src/Game.h similarity index 95% rename from Game.h rename to src/Game.h index f651125..0fe7233 100644 --- a/Game.h +++ b/src/Game.h @@ -40,7 +40,9 @@ class Game { private: Renderer renderer; + boost::shared_ptr level; + std::vector triangles; float angle; int lightPos; diff --git a/Level.cpp b/src/Level.cpp similarity index 100% rename from Level.cpp rename to src/Level.cpp diff --git a/Level.h b/src/Level.h similarity index 100% rename from Level.h rename to src/Level.h diff --git a/Renderer.cpp b/src/Renderer.cpp similarity index 71% rename from Renderer.cpp rename to src/Renderer.cpp index 558e415..ad4849b 100644 --- a/Renderer.cpp +++ b/src/Renderer.cpp @@ -18,8 +18,6 @@ */ #include "Renderer.h" -#include "BSPTree.h" -#include "gl.h" namespace Zoom { @@ -37,33 +35,12 @@ void Renderer::render(const BSPTree &tree) { } -void Renderer::render(const std::list &triangles) { - glBegin(GL_TRIANGLES); - for(std::list::const_iterator t = triangles.begin(); t != triangles.end(); ++t) { - renderTriangle(t->triangle); - } - glEnd(); -} - void Renderer::renderTriangle(const Triangle &t) { glColor4fv(t.getColor().array); - if(t.getTexture() != lastTexture) { + if(t.getTexture() != activeTexture) { glEnd(); - - if(t.getTexture()) { - glBindTexture(GL_TEXTURE_2D, t.getTexture()); - - if(!lastTexture) { - glEnable(GL_TEXTURE_2D); - } - } - else { - glDisable(GL_TEXTURE_2D); - } - - lastTexture = t.getTexture(); - + useTexture(t.getTexture()); glBegin(GL_TRIANGLES); } @@ -74,4 +51,19 @@ void Renderer::renderTriangle(const Triangle &t) { } } +void Renderer::useTexture(unsigned texture) { + if(texture) { + glBindTexture(GL_TEXTURE_2D, texture); + + if(activeTexture) { + glEnable(GL_TEXTURE_2D); + } + } + else { + glDisable(GL_TEXTURE_2D); + } + + activeTexture = texture; +} + } diff --git a/Renderer.h b/src/Renderer.h similarity index 65% rename from Renderer.h rename to src/Renderer.h index d72b5bb..fb98e38 100644 --- a/Renderer.h +++ b/src/Renderer.h @@ -21,18 +21,40 @@ #define ZOOM_RENDERER_H_ #include "BSPTree.h" +#include "gl.h" namespace Zoom { class Renderer { public: - Renderer() : lastTexture(0), renderVisitor(this) {} + Renderer() : activeTexture(0), renderVisitor(this) {} void render(const BSPTree &tree); - void render(const std::list &triangles); + + template + void render(const T &triangles) { + typename T::const_iterator t = triangles.begin(); + if(t == triangles.end()) + return; + + useTexture(t->triangle.getTexture()); + + glBegin(GL_TRIANGLES); + for(; t != triangles.end(); ++t) { + renderTriangle(t->triangle); + } + glEnd(); + } + + struct TextureSorter { + bool operator() (const BSPTree::TriangleRecord &t1, const BSPTree::TriangleRecord &t2) { + return (t1.triangle.getTexture() < t2.triangle.getTexture()); + } + }; private: void renderTriangle(const Triangle &t); + void useTexture(unsigned texture); class RenderVisitor { public: @@ -46,7 +68,7 @@ class Renderer { Renderer *renderer; }; - unsigned lastTexture; + unsigned activeTexture; const RenderVisitor renderVisitor; }; diff --git a/Shader.cpp b/src/Shader.cpp similarity index 100% rename from Shader.cpp rename to src/Shader.cpp diff --git a/Shader.h b/src/Shader.h similarity index 100% rename from Shader.h rename to src/Shader.h diff --git a/Texture.cpp b/src/Texture.cpp similarity index 100% rename from Texture.cpp rename to src/Texture.cpp diff --git a/Texture.h b/src/Texture.h similarity index 100% rename from Texture.h rename to src/Texture.h diff --git a/Triangle.h b/src/Triangle.h similarity index 100% rename from Triangle.h rename to src/Triangle.h diff --git a/config.h b/src/config.h similarity index 100% rename from config.h rename to src/config.h diff --git a/gl.h b/src/gl.h similarity index 100% rename from gl.h rename to src/gl.h diff --git a/zoom.cpp b/src/zoom.cpp similarity index 100% rename from zoom.cpp rename to src/zoom.cpp