summaryrefslogtreecommitdiffstats
path: root/src/ShadowVolume.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ShadowVolume.cpp')
-rw-r--r--src/ShadowVolume.cpp36
1 files changed, 31 insertions, 5 deletions
diff --git a/src/ShadowVolume.cpp b/src/ShadowVolume.cpp
index b0c25ca..67a44db 100644
--- a/src/ShadowVolume.cpp
+++ b/src/ShadowVolume.cpp
@@ -20,19 +20,19 @@
#include "ShadowVolume.h"
#include "MathUtil.h"
+#include "gl.h"
+
namespace Zoom {
-ShadowVolume::ShadowVolume(const Triangle &t, const vmml::vec3f &lightPos) {
+ShadowVolume::ShadowVolume(const Triangle &t, const vmml::vec3f &lightPos) : visible(true) {
MathUtil::Plane trianglePlane(t);
for(int i = 0; i < 3; ++i) {
rays[i].p = t.getVertex(i);
}
- if(trianglePlane.isBehind(lightPos)) {
- for(int i = 0; i < 3; ++i) {
- rays[i].dir = vmml::vec3f::ZERO;
- }
+ if(trianglePlane.isInFront(lightPos)) {
+ visible = false;
return;
}
@@ -42,4 +42,30 @@ ShadowVolume::ShadowVolume(const Triangle &t, const vmml::vec3f &lightPos) {
}
}
+void ShadowVolume::render() const {
+ if(!visible)
+ return;
+
+ glVertex3fv(rays[0].p.array);
+ glVertex3fv(rays[1].p.array);
+ glVertex3fv(rays[2].p.array);
+
+ for(int i = 0; i < 3; ++i) {
+ const Ray &r1 = rays[i];
+ const Ray &r2 = rays[(i+1)%3];
+
+ glVertex3fv(r1.p.array);
+ glVertex4fv(vmml::vec4f(r1.dir, 0).array);
+ glVertex3fv(r2.p.array);
+
+ glVertex3fv(r2.p.array);
+ glVertex4fv(vmml::vec4f(r1.dir, 0).array);
+ glVertex4fv(vmml::vec4f(r2.dir, 0).array);
+ }
+
+ glVertex4fv(vmml::vec4f(rays[2].dir, 0).array);
+ glVertex4fv(vmml::vec4f(rays[1].dir, 0).array);
+ glVertex4fv(vmml::vec4f(rays[0].dir, 0).array);
+}
+
}