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 ®ion_dir)
+find_walls(const db_i &db, const directory ®ion_dir, const bn_tol &tol)
{
RT_CK_DBI(&db);
RT_CK_DIR(®ion_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 ®ion = *static_cast<rt_comb_internal *>
@@ -1629,16 +1630,38 @@
(region_db_internal.get().idb_ptr);
RT_CK_COMB(®ion);
- 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 ®ion_dir);
+ RegionManager(const db_i &db, const directory ®ion_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 ®ion_dir) :
+ const directory ®ion_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