Revision: 65389
http://sourceforge.net/p/brlcad/code/65389
Author: ejno
Date: 2015-06-18 17:48:53 +0000 (Thu, 18 Jun 2015)
Log Message:
-----------
facetize regions that contain an incompatible boolean operation
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-18
16:43:00 UTC (rev 65388)
+++ brlcad/trunk/src/libgcv/conv/fastgen4/fastgen4_write.cpp 2015-06-18
17:48:53 UTC (rev 65389)
@@ -1672,7 +1672,8 @@
const db_i &m_db;
const bn_tol &m_tol;
- std::set<const directory *> m_recorded_cutouts;
+ std::set<const directory *> m_recorded_cutouts, m_failed_regions,
+ m_facetize_regions;
Section m_toplevels;
@@ -1929,6 +1930,8 @@
m_db(db),
m_tol(tol),
m_recorded_cutouts(),
+ m_failed_regions(),
+ m_facetize_regions(),
m_toplevels(true),
m_regions(),
m_writer(path)
@@ -2014,7 +2017,7 @@
HIDDEN bool
convert_primitive(FastgenConversion &data, const db_full_path &path,
- const rt_db_internal &internal)
+ const rt_db_internal &internal, bool subtracted)
{
RT_CK_FULL_PATH(&path);
RT_CK_DB_INTERNAL(&internal);
@@ -2042,13 +2045,13 @@
if (internal.idb_type != ID_SPH && !ell_is_sphere(ell))
return false;
- if (path.fp_len < 2
- || !find_csphere_cutout(section, data.m_db,
get_parent_path(path),
- data.m_recorded_cutouts)) {
- section.write_name(DB_FULL_PATH_CUR_DIR(&path)->d_namep);
- section.write_sphere(ell.v, MAGNITUDE(ell.a));
- }
+ if (path.fp_len > 1
+ && find_csphere_cutout(section, data.m_db,
get_parent_path(path),
+ data.m_recorded_cutouts))
+ return true;
+ section.write_name(DB_FULL_PATH_CUR_DIR(&path)->d_namep);
+ section.write_sphere(ell.v, MAGNITUDE(ell.a));
break;
}
@@ -2060,15 +2063,15 @@
if (internal.idb_type != ID_REC && !tgc_is_ccone2(tgc))
return false;
- if (path.fp_len < 2
- || !find_ccone2_cutout(section, data.m_db,
get_parent_path(path),
- data.m_recorded_cutouts)) {
- point_t v2;
- VADD2(v2, tgc.v, tgc.h);
- section.write_name(DB_FULL_PATH_CUR_DIR(&path)->d_namep);
- section.write_cone(tgc.v, v2, MAGNITUDE(tgc.a),
MAGNITUDE(tgc.c), 0.0, 0.0);
- }
+ if (path.fp_len > 1
+ && find_ccone2_cutout(section, data.m_db, get_parent_path(path),
+ data.m_recorded_cutouts))
+ return true;
+ point_t v2;
+ VADD2(v2, tgc.v, tgc.h);
+ section.write_name(DB_FULL_PATH_CUR_DIR(&path)->d_namep);
+ section.write_cone(tgc.v, v2, MAGNITUDE(tgc.a), MAGNITUDE(tgc.c),
0.0, 0.0);
break;
}
@@ -2099,17 +2102,14 @@
(internal.idb_ptr);
RT_HALF_CK_MAGIC(&half);
- if (!find_compsplt(data, path, half))
- return false;
- else
- break;
+ return find_compsplt(data, path, half);
}
default:
return false;
}
- return true;
+ return !subtracted;
}
@@ -2175,6 +2175,8 @@
RT_CK_DB_INTERNAL(internal);
FastgenConversion &data = *static_cast<FastgenConversion *>(client_data);
+ const bool subtracted = tree_state->ts_sofar & (TS_SOFAR_MINUS |
+ TS_SOFAR_INTER);
const directory *region_dir = NULL;
bool converted = false;
@@ -2182,14 +2184,20 @@
region_dir = &get_region_dir(data.m_db, *path);
} catch (const std::invalid_argument &) {}
+ const bool facetize = region_dir &&
data.m_facetize_regions.count(region_dir);
+
if (region_dir
&& data.get_region(*region_dir).member_ignored(get_parent_dir(*path)))
converted = true;
- else
- converted = convert_primitive(data, *path, *internal);
+ else if (!facetize)
+ converted = convert_primitive(data, *path, *internal, subtracted);
- if (!converted)
- return nmg_booltree_leaf_tess(tree_state, path, internal, client_data);
+ if (!converted) {
+ if (!facetize && subtracted)
+ data.m_failed_regions.insert(region_dir);
+ else
+ return nmg_booltree_leaf_tess(tree_state, path, internal,
client_data);
+ }
tree *result;
RT_GET_TREE(result, tree_state->ts_resp);
@@ -2226,15 +2234,15 @@
}
-HIDDEN int
-gcv_fastgen4_write(const char *path, struct db_i *dbip,
- const struct gcv_opts *UNUSED(options))
+HIDDEN std::set<const directory *>
+do_conversion(db_i &db, const std::string &path,
+ const std::set<const directory *> &failed_regions =
+ std::set<const directory *>())
{
- RT_CK_DBI(dbip);
+ RT_CK_DBI(&db);
const rt_tess_tol ttol = {RT_TESS_TOL_MAGIC, 0.0, 1.0e-2, 0.0};
const bn_tol tol = {BN_TOL_MAGIC, BN_TOL_DIST, BN_TOL_DIST * BN_TOL_DIST,
1.0e-6, 1.0 - 1.0e-6};
- FastgenConversion data(path, *dbip, tol);
AutoPtr<model, nmg_km> vmodel;
db_tree_state initial_tree_state = rt_initial_tree_state;
@@ -2242,18 +2250,36 @@
initial_tree_state.ts_ttol = &ttol;
initial_tree_state.ts_m = &vmodel.ptr;
- db_update_nref(dbip, &rt_uniresource);
+ db_update_nref(&db, &rt_uniresource);
AutoPtr<directory *> toplevel_dirs;
- const std::size_t num_objects = db_ls(dbip, DB_LS_TOPS, NULL,
+ const std::size_t num_objects = db_ls(&db, DB_LS_TOPS, NULL,
&toplevel_dirs.ptr);
AutoPtr<char *> object_names(db_dpv_to_argv(toplevel_dirs.ptr));
toplevel_dirs.free();
vmodel.ptr = nmg_mm();
- db_walk_tree(dbip, static_cast<int>(num_objects),
+ FastgenConversion data(path, db, tol);
+ data.m_facetize_regions = failed_regions;
+ db_walk_tree(&db, static_cast<int>(num_objects),
const_cast<const char **>(object_names.ptr), 1,
&initial_tree_state,
convert_region_start, convert_region_end, convert_leaf, &data);
+ return data.m_failed_regions;
+}
+
+
+HIDDEN int
+gcv_fastgen4_write(const char *path, struct db_i *dbip,
+ const gcv_opts *UNUSED(options))
+{
+ RT_CK_DBI(dbip);
+
+ std::set<const directory *> failed_regions = do_conversion(*dbip, path);
+
+ if (!failed_regions.empty())
+ if (!do_conversion(*dbip, path, failed_regions).empty())
+ throw std::runtime_error("failed to convert all regions");
+
return 1;
}
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