#include #include #include "tri_mesh.h" #include "ray_intersect.h" static double infinity = -log(0); void tri_mesh::load(const char*file) { FILE*F = fopen(file, "r"); if(!F) return; char buff[1000]; while(!feof(F)) { fgets(buff, sizeof buff, F); if(*buff == 'v') { double x, y, z; if(sscanf(buff, "v %lg %lg %lg", &x, &y, &z) == 3) { pts.push_back(vector3d(x, y, z)); } } else if(*buff == 'f') { int x, y, z; if(sscanf(buff, "f %d %d %d", &x, &y, &z) == 3) { tris.push_back(tri_struct(x-1, y-1, z-1)); } } } fclose(F); CalcNorms(); } void tri_mesh::CalcNorms() { for(size_t i=0; i 0) continue; double t = intersect_triangle_ray(ray, pts[ts.a], pts[ts.b], pts[ts.c], aa, bb); if(t > 0 && t < min_t) { min_t = t; min_index = i; baa = aa; bbb = bb; } } RayIntersect ri; ri.special0 = baa; ri.special1 = bbb; if(min_t < infinity) { ri.param_t = min_t; ri.E = this; ri.special = min_index; } else { ri.param_t = -1; ri.E = 0; ri.special = -1; } return ri; } void tri_mesh::PathCompress(const Transform&T, queue >&Q, vector&V) { tri_mesh * tm = new tri_mesh; tm->tris = tris; tm->phong = phong; tm->kd = kd; tm->ks = ks; tm->ka = ka; tm->n = n; for(size_t i=0; ipts.push_back(T * pts[i]); tm->CalcNorms(); V.push_back(tm); } int tri_mesh::IntersectionTest(Ray ray) { for(size_t i=0; i 0) continue; double t = intersect_triangle_ray(ray, pts[ts.a], pts[ts.b], pts[ts.c], aa, bb); if(t > 1e-1) return 1; } return 0; }