Moved source files to src; sort triangles by texture.
This commit is contained in:
parent
a4fa46a4fd
commit
d9f44af7ae
18 changed files with 68 additions and 45 deletions
|
@ -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)
|
||||
|
|
13
src/CMakeLists.txt
Normal file
13
src/CMakeLists.txt
Normal 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})
|
|
@ -23,6 +23,7 @@
|
|||
#include "Shader.h"
|
||||
#include "Triangle.h"
|
||||
#include "gl.h"
|
||||
#include <algorithm>
|
||||
|
||||
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<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);
|
||||
|
||||
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<BSPTree::TriangleRecord>(triangles.begin(), triangles.end()));
|
||||
renderer.render(triangles);
|
||||
|
||||
glPopMatrix();
|
||||
}
|
|
@ -40,7 +40,9 @@ class Game {
|
|||
|
||||
private:
|
||||
Renderer renderer;
|
||||
|
||||
boost::shared_ptr<Level> level;
|
||||
std::vector<BSPTree::TriangleRecord> triangles;
|
||||
|
||||
float angle;
|
||||
int lightPos;
|
|
@ -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<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) {
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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<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:
|
||||
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;
|
||||
};
|
Reference in a new issue