From 6d3965b35edf5f03cd065d42af31867acf1f4637 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Thu, 24 Dec 2009 02:47:35 +0100 Subject: Make shadow volumes visible --- src/ShadowVolume.cpp | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) (limited to 'src/ShadowVolume.cpp') 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); +} + } -- cgit v1.2.3