mirror planes detection needs work
[laserbrain_demo] / src / metascene.cc
index 82cf669..6805fae 100644 (file)
@@ -203,6 +203,8 @@ Scene *MetaScene::extract_nodes(const char *qstr)
 
 int MetaScene::calc_mirror_planes()
 {
+       std::vector<Vec4> world_planes;
+
        int num_mirrors = 0;
        while(mirrors) {
                FlatMirror *m = mirrors;
@@ -226,6 +228,7 @@ int MetaScene::calc_mirror_planes()
 
                                FlatMirror *mir = new FlatMirror;
                                mir->reflect = obj->mtl.reflect;
+                               mir->node = obj->node;
 
                                if(obj->mtl.flat_mirror == MTL_MIRROR_AUTO) {
                                        // grab the first triangle and make a plane
@@ -237,31 +240,36 @@ int MetaScene::calc_mirror_planes()
                                        mir->plane.normal = face.normal;
                                } else {
                                        int plane_idx = obj->mtl.flat_mirror - MTL_MIRROR_AABB_PX;
-                                       if(obj->node) {
-                                               mir->plane = obj->node->get_bounds().get_plane(plane_idx);
-                                       } else {
-                                               mir->plane = obj->get_aabox().get_plane(plane_idx);
-                                       }
+                                       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);
+
+                               if(obj->node) {
+                                       plane_eq = obj->node->get_matrix() * plane_eq;
+                               }
+
                                // check to see if we have found this mirror plane already
                                bool found = false;
-                               FlatMirror *node = mirrors;
-                               while(node) {
-                                       if(1.0f - dot(mir->plane.normal, node->plane.normal) < 1e-4f &&
-                                                       fabs(dot(mir->plane.normal, normalize(mir->plane.pt - node->plane.pt))) < 1e-4) {
+                               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) {
                                                found = true;
                                                break;
                                        }
-                                       node = node->next;
                                }
 
                                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 {
@@ -523,13 +531,13 @@ static bool proc_mtledit(MetaScene *mscn, MaterialEdit *med, struct ts_node *nod
 
                                        switch(tolower(caxis)) {
                                        case 'x':
-                                               plane = caxis == '+' ? MTL_MIRROR_AABB_PX : MTL_MIRROR_AABB_NX;
+                                               plane = csign == '+' ? MTL_MIRROR_AABB_PX : MTL_MIRROR_AABB_NX;
                                                break;
                                        case 'y':
-                                               plane = caxis == '+' ? MTL_MIRROR_AABB_PY : MTL_MIRROR_AABB_NY;
+                                               plane = csign == '+' ? MTL_MIRROR_AABB_PY : MTL_MIRROR_AABB_NY;
                                                break;
                                        case 'z':
-                                               plane = caxis == '+' ? MTL_MIRROR_AABB_PZ : MTL_MIRROR_AABB_NZ;
+                                               plane = csign == '+' ? MTL_MIRROR_AABB_PZ : MTL_MIRROR_AABB_NZ;
                                                break;
                                        default:
                                                error_log("invalid reflect plane specifier: %s\n", aplane->val.str);