summaryrefslogtreecommitdiffstats
path: root/src/Renderer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Renderer.h')
-rw-r--r--src/Renderer.h63
1 files changed, 49 insertions, 14 deletions
diff --git a/src/Renderer.h b/src/Renderer.h
index eed65bb..8c531a5 100644
--- a/src/Renderer.h
+++ b/src/Renderer.h
@@ -23,6 +23,7 @@
#include "gl.h"
#include "BSPTree.h"
#include "Shader.h"
+#include "ShadowVolume.h"
#include <limits>
@@ -36,38 +37,72 @@ class Renderer {
template <typename T>
void render(const T &triangles, const vmml::vec3f &lightPos) {
+ if(triangles.empty())
+ return;
+
+ // Create shadow volumes
+ std::vector<ShadowVolume> shadowVolumes;
+ for(typename T::const_iterator t = triangles.begin(); t != triangles.end(); ++t) {
+ shadowVolumes.push_back(ShadowVolume(t->triangle, lightPos));
+ }
+
+
glLightfv(GL_LIGHT0, GL_POSITION, vmml::vec4f(lightPos, 1).array);
+ // Render with ambient light
Shader::enable(ambientShader);
glBlendFunc(GL_ONE, GL_ZERO);
glDepthFunc(GL_LEQUAL);
- //glStencilFunc(GL_ALWAYS, 0, std::numeric_limits<GLuint>::max());
- //glStencilOp(GL_KEEP, GL_INCR, GL_KEEP);
+ glStencilFunc(GL_ALWAYS, 0, std::numeric_limits<GLuint>::max());
+ glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
- typename T::const_iterator t = triangles.begin();
- if(t == triangles.end())
- return;
-
- useTexture(t->triangle.getTexture());
+ useTexture(triangles.front().triangle.getTexture());
glBegin(GL_TRIANGLES);
- for(; t != triangles.end(); ++t) {
+ for(typename T::const_iterator t = triangles.begin(); t != triangles.end(); ++t) {
renderTriangle(t->triangle);
}
glEnd();
+ // Render shadow volumes
+ glClear(GL_STENCIL_BUFFER_BIT);
+ glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+ glDepthMask(GL_FALSE);
+ Shader::disable();
+
+ glFrontFace(GL_CCW);
+ glStencilOp(GL_KEEP, GL_INCR_WRAP, GL_KEEP);
+
+ glBegin(GL_TRIANGLES);
+ for(std::vector<ShadowVolume>::iterator v = shadowVolumes.begin(); v != shadowVolumes.end(); ++v) {
+ v->render();
+ }
+ glEnd();
+
+ glFrontFace(GL_CW);
+ glStencilOp(GL_KEEP, GL_DECR_WRAP, GL_KEEP);
+
+ glBegin(GL_TRIANGLES);
+ for(std::vector<ShadowVolume>::iterator v = shadowVolumes.begin(); v != shadowVolumes.end(); ++v) {
+ v->render();
+ }
+ glEnd();
+
+ glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ glDepthMask(GL_TRUE);
+ glFrontFace(GL_CCW);
+
+ // Render with point light
Shader::enable(lightShader);
glBlendFunc(GL_ONE, GL_ONE);
glDepthFunc(GL_EQUAL);
- //glStencilFunc(GL_EQUAL, 0, std::numeric_limits<GLuint>::max());
- //glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
-
- t = triangles.begin();
+ glStencilFunc(GL_EQUAL, 0, std::numeric_limits<GLuint>::max());
+ glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
- useTexture(t->triangle.getTexture());
+ useTexture(triangles.front().triangle.getTexture());
glBegin(GL_TRIANGLES);
- for(; t != triangles.end(); ++t) {
+ for(typename T::const_iterator t = triangles.begin(); t != triangles.end(); ++t) {
renderTriangle(t->triangle);
}
glEnd();