X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;ds=inline;f=src%2F3dengfx%2Fsrc%2F3dengfx%2Fshadows.cpp;fp=src%2F3dengfx%2Fsrc%2F3dengfx%2Fshadows.cpp;h=b2d7bd22d1311ac4ad8438a6190a3ce7c7bb7fbc;hb=6e23259dbabaeb1711a2a5ca25b9cb421f693759;hp=0000000000000000000000000000000000000000;hpb=fe068fa879814784c45e0cb2e65dac489e8f5594;p=summerhack diff --git a/src/3dengfx/src/3dengfx/shadows.cpp b/src/3dengfx/src/3dengfx/shadows.cpp new file mode 100644 index 0000000..b2d7bd2 --- /dev/null +++ b/src/3dengfx/src/3dengfx/shadows.cpp @@ -0,0 +1,60 @@ +/* +This file is part of the 3dengfx, realtime visualization system. + +Copyright (c) 2004, 2005 John Tsiombikas + +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 +#include "shadows.hpp" + +std::vector *create_silhouette(const TriMesh *mesh, const Vector3 &pt) { + const GeometryArray *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 *edges = new std::vector; + + for(unsigned long i=0; iadjfaces[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 *edges) { + delete edges; +} +/* +TriMesh *create_shadow_volume(const TriMesh *mesh, const Vector3 &pt) { + +} +*/