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})
|
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
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 "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();
|
||||||
}
|
}
|
|
@ -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;
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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;
|
||||||
};
|
};
|
Reference in a new issue