X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=blobdiff_plain;f=src%2Fmetascene.cc;h=a45bfec2f57dd0e511cec7a64e027a2ec12bd999;hp=a85b65ef6711d8988c41bb8c45c06b3c0893d9a1;hb=9480e20f4de41693ebd1f22e63d3bcecde878f70;hpb=82367657a8ac442b29c1dad51c91e64a48e0671d diff --git a/src/metascene.cc b/src/metascene.cc index a85b65e..a45bfec 100644 --- a/src/metascene.cc +++ b/src/metascene.cc @@ -203,7 +203,7 @@ Scene *MetaScene::extract_nodes(const char *qstr) int MetaScene::calc_mirror_planes() { - std::vector world_planes; + FlatMirror *planes = 0; int num_mirrors = 0; while(mirrors) { @@ -241,33 +241,44 @@ int MetaScene::calc_mirror_planes() } else { int plane_idx = obj->mtl.flat_mirror - MTL_MIRROR_AABB_PX; mir->plane = obj->get_aabox().get_plane(plane_idx); - debug_log("mirror plane: p(%f %f %f) n(%f %f %f)\n", mir->plane.pt.x, mir->plane.pt.y, - mir->plane.pt.z, mir->plane.normal.x, mir->plane.normal.y, mir->plane.normal.z); } - float pdist = dot(mir->plane.normal, mir->plane.pt); - Vec4 plane_eq = Vec4(mir->plane.normal.x, mir->plane.normal.y, mir->plane.normal.z, pdist); - + mir->wplane = mir->plane; if(obj->node) { - plane_eq = obj->node->get_matrix() * plane_eq; + const Mat4 &xform = obj->node->get_matrix(); + mir->wplane.pt = xform * mir->wplane.pt; + mir->wplane.normal = normalize(xform.upper3x3() * mir->wplane.normal); } // check to see if we have found this mirror plane already bool found = false; - int nplanes = world_planes.size(); - for(int k=0; kwplane.normal, mir->wplane.pt); + float d2 = dot(node->wplane.normal, node->wplane.pt); + + if(1.0f - dot(mir->wplane.normal, node->wplane.normal) < 1e-4f && + fabs(d1 - d2) < 1e-4) { found = true; break; } + node = node->next; } + debug_log("[%s@%s] mirror plane: local(%g %g %g %g), world(%g %g %g %g)%s\n", + obj->get_name(), obj->node ? obj->node->get_name() : "", + mir->plane.normal.x, mir->plane.normal.y, mir->plane.normal.z, + dot(mir->plane.normal, mir->plane.pt), mir->wplane.normal.x, mir->wplane.normal.y, + mir->wplane.normal.z, dot(mir->wplane.normal, mir->wplane.pt), found ? " duplicate" : ""); + if(!found) { mir->next = mirrors; mirrors = mir; - world_planes.push_back(plane_eq); + node = new FlatMirror; + node->wplane = mir->wplane; + node->next = planes; + planes = node; mir->objects.push_back(obj); objmirror[obj] = mir; // associate with object @@ -279,6 +290,12 @@ int MetaScene::calc_mirror_planes() } } + while(planes) { + FlatMirror *tmp = planes; + planes = planes->next; + delete tmp; + } + return num_mirrors; }