added 3dengfx into the repo, probably not the correct version for this
[summerhack] / src / 3dengfx / src / 3dengfx / shadows.cpp
diff --git a/src/3dengfx/src/3dengfx/shadows.cpp b/src/3dengfx/src/3dengfx/shadows.cpp
new file mode 100644 (file)
index 0000000..b2d7bd2
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+This file is part of the 3dengfx, realtime visualization system.
+
+Copyright (c) 2004, 2005 John Tsiombikas <nuclear@siggraph.org>
+
+3dengfx is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+3dengfx is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with 3dengfx; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include <vector>
+#include "shadows.hpp"
+
+std::vector<Edge> *create_silhouette(const TriMesh *mesh, const Vector3 &pt) {
+       const GeometryArray<Edge> *mesh_edges = mesh->get_edge_array();
+       unsigned long ecount = mesh_edges->get_count();
+       const Edge *eptr = mesh_edges->get_data();
+
+       const Vertex *varray = mesh->get_vertex_array()->get_data();
+       const Triangle *tarray = mesh->get_triangle_array()->get_data();
+
+       std::vector<Edge> *edges = new std::vector<Edge>;
+
+       for(unsigned long i=0; i<ecount; i++) {
+               const Triangle *t1 = tarray + eptr->adjfaces[0];
+               const Triangle *t2 = tarray + eptr->adjfaces[1];
+               // XXX: assumption that the light direction for one of a triangle's vertices
+               // can be used as the light direction for the whole triangle.
+               Vector3 ldir1 = (pt - varray[t1->vertices[0]].pos).normalized();
+               Vector3 ldir2 = (pt - varray[t2->vertices[0]].pos).normalized();
+               scalar_t t1dot = dot_product(t1->normal, ldir1);
+               scalar_t t2dot = dot_product(t2->normal, ldir2);
+               
+               if((t1dot > 0 && t2dot < 0) || (t1dot < 0 && t2dot > 0)) {
+                       edges->push_back(*eptr);
+               }
+               eptr++;
+       }
+
+       return edges;
+}
+
+void destroy_silhouette(std::vector<Edge> *edges) {
+       delete edges;
+}
+/*
+TriMesh *create_shadow_volume(const TriMesh *mesh, const Vector3 &pt) {
+       
+}
+*/