Moved source files to src; sort triangles by texture.

This commit is contained in:
Matthias Schiffer 2009-12-15 19:37:12 +01:00
parent a4fa46a4fd
commit d9f44af7ae
18 changed files with 68 additions and 45 deletions

View file

@ -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}) include_directories(${Boost_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR} ${GLEW_INCLUDE_DIR} ${GLPNG_INCLUDE_DIR} ${LIBXML2_INCLUDE_DIR})
add_executable(zoom add_subdirectory(src)
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})

13
src/CMakeLists.txt Normal file
View file

@ -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})

View file

@ -23,6 +23,7 @@
#include "Shader.h" #include "Shader.h"
#include "Triangle.h" #include "Triangle.h"
#include "gl.h" #include "gl.h"
#include <algorithm>
namespace Zoom { namespace Zoom {
@ -62,6 +63,8 @@ Game::Game(bool multisample) : angle(0), lightPos(0) {
Shader::loadProgram("default.vert", "default.frag"); Shader::loadProgram("default.vert", "default.frag");
loadLevel("level.xml"); 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) { bool Game::loadLevel(const std::string &name) {
@ -104,17 +107,21 @@ void Game::render() {
light[2] = -8.0; light[2] = -8.0;
} }
glLightfv(GL_LIGHT0, GL_POSITION, light); /*std::vector<BSPTree::TriangleRecord> 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); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix(); glPushMatrix();
//glRotatef(10, 1, 2, 1); glRotatef(15, 1, 2, 1);
/*glRotatef(5*angle, 0, -1, 2); /*glRotatef(5*angle, 0, -1, 2);
glRotatef(7*angle, 2, -1, 0); glRotatef(7*angle, 2, -1, 0);
glRotatef(11*angle, 2, -1, 2);*/ glRotatef(11*angle, 2, -1, 2);*/
renderer.render(level->getRooms().front().walls); glLightfv(GL_LIGHT0, GL_POSITION, light);
//renderer.render(std::list<BSPTree::TriangleRecord>(triangles.begin(), triangles.end()));
renderer.render(triangles);
glPopMatrix(); glPopMatrix();
} }

View file

@ -40,7 +40,9 @@ class Game {
private: private:
Renderer renderer; Renderer renderer;
boost::shared_ptr<Level> level; boost::shared_ptr<Level> level;
std::vector<BSPTree::TriangleRecord> triangles;
float angle; float angle;
int lightPos; int lightPos;

View file

@ -18,8 +18,6 @@
*/ */
#include "Renderer.h" #include "Renderer.h"
#include "BSPTree.h"
#include "gl.h"
namespace Zoom { namespace Zoom {
@ -37,33 +35,12 @@ void Renderer::render(const BSPTree &tree) {
} }
void Renderer::render(const std::list<BSPTree::TriangleRecord> &triangles) {
glBegin(GL_TRIANGLES);
for(std::list<BSPTree::TriangleRecord>::const_iterator t = triangles.begin(); t != triangles.end(); ++t) {
renderTriangle(t->triangle);
}
glEnd();
}
void Renderer::renderTriangle(const Triangle &t) { void Renderer::renderTriangle(const Triangle &t) {
glColor4fv(t.getColor().array); glColor4fv(t.getColor().array);
if(t.getTexture() != lastTexture) { if(t.getTexture() != activeTexture) {
glEnd(); glEnd();
useTexture(t.getTexture());
if(t.getTexture()) {
glBindTexture(GL_TEXTURE_2D, t.getTexture());
if(!lastTexture) {
glEnable(GL_TEXTURE_2D);
}
}
else {
glDisable(GL_TEXTURE_2D);
}
lastTexture = t.getTexture();
glBegin(GL_TRIANGLES); 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;
}
} }

View file

@ -21,18 +21,40 @@
#define ZOOM_RENDERER_H_ #define ZOOM_RENDERER_H_
#include "BSPTree.h" #include "BSPTree.h"
#include "gl.h"
namespace Zoom { namespace Zoom {
class Renderer { class Renderer {
public: public:
Renderer() : lastTexture(0), renderVisitor(this) {} Renderer() : activeTexture(0), renderVisitor(this) {}
void render(const BSPTree &tree); void render(const BSPTree &tree);
void render(const std::list<BSPTree::TriangleRecord> &triangles);
template <typename T>
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: private:
void renderTriangle(const Triangle &t); void renderTriangle(const Triangle &t);
void useTexture(unsigned texture);
class RenderVisitor { class RenderVisitor {
public: public:
@ -46,7 +68,7 @@ class Renderer {
Renderer *renderer; Renderer *renderer;
}; };
unsigned lastTexture; unsigned activeTexture;
const RenderVisitor renderVisitor; const RenderVisitor renderVisitor;
}; };

View file