X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=blobdiff_plain;f=src%2Fmetascene.cc;h=ba05bce159a0f1cf5b4af4c8dccff5165a0b4dc4;hp=6805fae2038a078327abf00c623cfc82585405cd;hb=1c6f12ce97d5cd85925a4b9ecab7591172f16ca1;hpb=844f36f03073c5db86a8acd2cf7cd1a89e1a16b9 diff --git a/src/metascene.cc b/src/metascene.cc index 6805fae..ba05bce 100644 --- a/src/metascene.cc +++ b/src/metascene.cc @@ -108,7 +108,7 @@ void MetaScene::update(float dt) static bool once; if(!once) { float x = ImGui::GetColumnOffset(1); - ImGui::SetColumnOffset(1, x * 1.7); + ImGui::SetColumnOffset(1, x * 1.55); once = true; } } @@ -180,7 +180,7 @@ std::list MetaScene::match_nodes(const char *qstr) const res.splice(res.end(), tmp); } } - return std::move(res); + return res; // hopefully it'll be moved } Scene *MetaScene::extract_nodes(const char *qstr) @@ -203,8 +203,6 @@ Scene *MetaScene::extract_nodes(const char *qstr) int MetaScene::calc_mirror_planes() { - std::vector world_planes; - int num_mirrors = 0; while(mirrors) { FlatMirror *m = mirrors; @@ -241,38 +239,45 @@ 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); - mir->objects.push_back(obj); objmirror[obj] = mir; // associate with object ++num_mirrors; } else { + node->objects.push_back(obj); delete mir; } }