Revision: 65323
http://sourceforge.net/p/brlcad/code/65323
Author: ejno
Date: 2015-06-16 13:47:31 +0000 (Tue, 16 Jun 2015)
Log Message:
-----------
write WALL records
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
02:29:03 UTC (rev 65322)
+++ brlcad/trunk/src/libgcv/conv/fastgen4/fastgen4_write.cpp 2015-06-16
13:47:31 UTC (rev 65323)
@@ -1513,6 +1513,8 @@
case OP_INTERSECT:
get_unioned(db, tree->tr_b.tb_left, results);
get_unioned(db, tree->tr_b.tb_right, results);
+ get_intersected(db, tree->tr_b.tb_left, results);
+ get_intersected(db, tree->tr_b.tb_right, results);
break;
case OP_UNION:
@@ -1593,14 +1595,14 @@
}
-// returns set of members to ignore
-HIDDEN std::set<const directory *>
+// returns set of unioned Section regions and 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)
{
RT_CK_DBI(&db);
RT_CK_DIR(®ion_dir);
- std::set<const directory *> results;
+ std::pair<std::set<const directory *>, std::set<const directory *> >
results;
std::set<const directory *> subtracted;
{
DBInternal region_db_internal(db, region_dir);
@@ -1632,9 +1634,9 @@
if (!leaves.empty()
&& std::includes(subtracted.begin(), subtracted.end(),
leaves.begin(),
leaves.end())) {
- std::copy(leaves.begin(), leaves.end(), std::inserter(results,
- results.begin()));
- // TODO: write WALL records
+ std::copy(leaves.begin(), leaves.end(),
std::inserter(results.second,
+ results.second.begin()));
+ results.first.insert(region_dirs.ptr[i]);
}
}
}
@@ -1674,8 +1676,12 @@
RegionManager(const db_i &db, const directory ®ion_dir);
~RegionManager();
- void write(FastgenWriter &writer) const;
+ std::vector<FastgenWriter::SectionID> write(FastgenWriter &writer) const;
+ void write_walls(FastgenWriter &writer,
+ const std::map<const directory *,
std::vector<FastgenWriter::SectionID> > &ids,
+ const directory ®ion_dir) const;
+
// don't write these Sections
void disable();
@@ -1695,7 +1701,8 @@
bool m_enabled;
std::pair<bool, fastf_t> m_compsplt;
- const std::set<const directory *> m_ignored_members;
+ const std::pair<std::set<const directory *>, std::set<const directory *> >
+ m_walls;
std::map<std::string, Section *> m_sections;
};
@@ -1704,7 +1711,7 @@
const directory ®ion_dir) :
m_enabled(true),
m_compsplt(false, 0.0),
- m_ignored_members(find_walls(db, region_dir)),
+ m_walls(find_walls(db, region_dir)),
m_sections()
{}
@@ -1717,16 +1724,18 @@
}
-void
+std::vector<FastgenWriter::SectionID>
FastgenConversion::RegionManager::write(FastgenWriter &writer) const
{
+ std::vector<FastgenWriter::SectionID> results;
+
if (!m_enabled)
- return;
+ return results;
for (std::map<std::string, Section *>::const_iterator it =
m_sections.begin();
it != m_sections.end(); ++it) {
if (it->second->empty())
- continue;
+ return results;
const FastgenWriter::SectionID id = writer.take_next_section_id();
@@ -1741,11 +1750,36 @@
}
it->second->write(writer, id);
+ results.push_back(id);
}
+
+ return results;
}
void
+FastgenConversion::RegionManager::write_walls(FastgenWriter &writer,
+ const std::map<const directory *, std::vector<FastgenWriter::SectionID>
> &ids,
+ const directory ®ion_dir)
+const
+{
+ const std::vector<FastgenWriter::SectionID> &this_ids =
ids.at(®ion_dir);
+
+ for (std::vector<FastgenWriter::SectionID>::const_iterator it =
+ this_ids.begin(); it != this_ids.end(); ++it) {
+ for (std::set<const directory *>::const_iterator wall_it =
+ m_walls.first.begin(); wall_it != m_walls.first.end();
++wall_it) {
+ for (std::vector<FastgenWriter::SectionID>::const_iterator
wall_section_it =
+ ids.at(*wall_it).begin(); wall_section_it !=
ids.at(*wall_it).end();
+ ++wall_section_it) {
+ writer.write_boolean(FastgenWriter::WALL, *it,
*wall_section_it);
+ }
+ }
+ }
+}
+
+
+void
FastgenConversion::RegionManager::disable()
{
if (!m_enabled)
@@ -1772,7 +1806,7 @@
{
RT_CK_DIR(&member_dir);
- return m_ignored_members.count(&member_dir);
+ return m_walls.second.count(&member_dir);
}
@@ -1900,10 +1934,15 @@
FastgenConversion::~FastgenConversion()
{
+ std::map<const directory *, std::vector<FastgenWriter::SectionID> > ids;
+
+ for (std::map<const directory *, RegionManager *>::const_iterator it =
+ m_regions.begin(); it != m_regions.end(); ++it)
+ ids[it->first] = it->second->write(m_writer);
+
for (std::map<const directory *, RegionManager *>::iterator it =
m_regions.begin(); it != m_regions.end(); ++it) {
- it->second->write(m_writer);
-
+ it->second->write_walls(m_writer, ids, *it->first);
delete it->second;
}
}
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