Revision: 65337
          http://sourceforge.net/p/brlcad/code/65337
Author:   ejno
Date:     2015-06-16 21:15:55 +0000 (Tue, 16 Jun 2015)
Log Message:
-----------
check matrices in find_walls()

Modified Paths:
--------------
    brlcad/trunk/src/libgcv/conv/fastgen4/fastgen4_write.cpp

Modified: brlcad/trunk/src/libgcv/conv/fastgen4/fastgen4_write.cpp
===================================================================
--- brlcad/trunk/src/libgcv/conv/fastgen4/fastgen4_write.cpp    2015-06-16 
21:06:48 UTC (rev 65336)
+++ brlcad/trunk/src/libgcv/conv/fastgen4/fastgen4_write.cpp    2015-06-16 
21:15:55 UTC (rev 65337)
@@ -1458,9 +1458,11 @@
 }
 
 
+typedef std::map<const directory *, const fastf_t *> LeafMap;
+
+
 HIDDEN void
-get_unioned(const db_i &db, const tree *tree,
-           std::set<const directory *> &results)
+get_unioned(const db_i &db, const tree *tree, LeafMap &results)
 {
     RT_CK_DBI(&db);
 
@@ -1479,7 +1481,7 @@
                break;
            }
 
-           results.insert(dir);
+           results.insert(std::make_pair(dir, tree->tr_l.tl_mat));
            break;
        }
 
@@ -1499,8 +1501,7 @@
 
 
 HIDDEN void
-get_intersected(const db_i &db, const tree *tree,
-               std::set<const directory *> &results)
+get_intersected(const db_i &db, const tree *tree, LeafMap &results)
 {
     RT_CK_DBI(&db);
 
@@ -1533,8 +1534,7 @@
 
 
 HIDDEN void
-get_subtracted(const db_i &db, const tree *tree,
-              std::set<const directory *> &results)
+get_subtracted(const db_i &db, const tree *tree, LeafMap &results)
 {
     RT_CK_DBI(&db);
 
@@ -1579,7 +1579,7 @@
                                            
(parent_region_internal.get().idb_ptr);
     RT_CK_COMB(&parent_region);
 
-    std::set<const directory *> leaves;
+    LeafMap leaves;
     get_intersected(db, parent_region.tree, leaves);
 
     if (leaves.count(&half_dir))
@@ -1599,13 +1599,14 @@
 // - set of regions that are joined to the region by a WALL
 // - set of members to ignore
 HIDDEN std::pair<std::set<const directory *>, std::set<const directory *> >
-find_walls(const db_i &db, const directory &region_dir)
+find_walls(const db_i &db, const directory &region_dir, const bn_tol &tol)
 {
     RT_CK_DBI(&db);
     RT_CK_DIR(&region_dir);
+    BN_CK_TOL(&tol);
 
     std::pair<std::set<const directory *>, std::set<const directory *> > 
results;
-    std::set<const directory *> subtracted;
+    LeafMap subtracted;
     {
        DBInternal region_db_internal(db, region_dir);
        const rt_comb_internal &region = *static_cast<rt_comb_internal *>
@@ -1629,16 +1630,38 @@
                                             (region_db_internal.get().idb_ptr);
            RT_CK_COMB(&region);
 
-           std::set<const directory *> leaves;
+           LeafMap leaves;
            get_unioned(db, region.tree, leaves);
            get_intersected(db, region.tree, leaves);
 
-           if (!leaves.empty()
-               && std::includes(subtracted.begin(), subtracted.end(), 
leaves.begin(),
-                                leaves.end())) {
-               std::copy(leaves.begin(), leaves.end(), 
std::inserter(results.second,
-                         results.second.begin()));
+           if (leaves.empty())
+               continue;
+
+           bool subset = true;
+
+           for (LeafMap::const_iterator it = leaves.begin(); it != 
leaves.end(); ++it) {
+               const LeafMap::const_iterator subtracted_it = 
subtracted.find(it->first);
+
+               if (subtracted_it == subtracted.end()) {
+                   subset = false;
+                   break;
+               }
+
+               const mat_t identity = MAT_INIT_IDN;
+               const fastf_t *mat_a = it->second ? it->second : identity;
+               const fastf_t *mat_b = subtracted_it->second ? 
subtracted_it->second : identity;
+
+               if (!bn_mat_is_equal(mat_a, mat_b, &tol)) {
+                   subset = false;
+                   break;
+               }
+           }
+
+           if (subset) {
                results.first.insert(region_dirs.ptr[i]);
+
+               for (LeafMap::const_iterator it = leaves.begin(); it != 
leaves.end(); ++it)
+                   results.second.insert(it->first);
            }
        }
     }
@@ -1676,7 +1699,7 @@
 class FastgenConversion::RegionManager
 {
 public:
-    RegionManager(const db_i &db, const directory &region_dir);
+    RegionManager(const db_i &db, const directory &region_dir, const bn_tol 
&tol);
     ~RegionManager();
 
     std::vector<FastgenWriter::SectionID> write(FastgenWriter &writer) const;
@@ -1711,10 +1734,10 @@
 
 
 FastgenConversion::RegionManager::RegionManager(const db_i &db,
-       const directory &region_dir) :
+       const directory &region_dir, const bn_tol &tol) :
     m_enabled(true),
     m_compsplt(false, 0.0),
-    m_walls(find_walls(db, region_dir)),
+    m_walls(find_walls(db, region_dir, tol)),
     m_sections()
 {}
 
@@ -1925,7 +1948,8 @@
     // create a RegionManager for all regions in the database
     try {
        for (std::size_t i = 0; i < num_regions; ++i)
-           m_regions[region_dirs.ptr[i]] = new RegionManager(m_db, 
*region_dirs.ptr[i]);
+           m_regions[region_dirs.ptr[i]] = new RegionManager(m_db, 
*region_dirs.ptr[i],
+                   m_tol);
     } catch (...) {
        for (std::map<const directory *, RegionManager *>::iterator it =
                 m_regions.begin(); it != m_regions.end(); ++it)

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to