simple ubershader system, reflection debugging
[laserbrain_demo] / src / metascene.cc
index a85b65e..a45bfec 100644 (file)
@@ -203,7 +203,7 @@ Scene *MetaScene::extract_nodes(const char *qstr)
 
 int MetaScene::calc_mirror_planes()
 {
-       std::vector<Vec4> 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; k<nplanes; k++) {
-                                       if(1.0f - dot(plane_eq.xyz(), world_planes[k].xyz()) < 1e-4f &&
-                                                       fabs(plane_eq.w - world_planes[k].w) < 1e-4) {
+                               FlatMirror *node = planes;
+                               while(node) {
+                                       float d1 = dot(mir->wplane.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() : "<no-node>",
+                                               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;
 }