Revision: 74319
http://sourceforge.net/p/brlcad/code/74319
Author: starseeker
Date: 2019-11-09 19:21:14 +0000 (Sat, 09 Nov 2019)
Log Message:
-----------
Do need the map - edge splitting introduces vertices
Modified Paths:
--------------
brlcad/trunk/src/libbrep/cdt_ovlps.cpp
Modified: brlcad/trunk/src/libbrep/cdt_ovlps.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_ovlps.cpp 2019-11-09 18:45:30 UTC (rev
74318)
+++ brlcad/trunk/src/libbrep/cdt_ovlps.cpp 2019-11-09 19:21:14 UTC (rev
74319)
@@ -279,7 +279,6 @@
fMax[1] = v->bb.Max().y;
fMax[2] = v->bb.Max().z;
vtree.Insert(fMin, fMax, v->p_id);
-
rebuild_vtree();
}
@@ -1772,8 +1771,8 @@
(*v2->omesh->fmesh->pnts[v2->p_id]) = s2_p;
(*v2->omesh->fmesh->normals[v2->omesh->fmesh->nmap[v2->p_id]]) = s2_n;
- v1->omesh->add_vtree_vert(v1);
- v2->omesh->add_vtree_vert(v2);
+ v1->omesh->vupdate(v1);
+ v2->omesh->vupdate(v2);
// We just changed the vertex point values - need to update all the
// edge edges which might be impacted...
@@ -1942,7 +1941,8 @@
int
ovlp_split_edge(
std::set<cdt_mesh::bedge_seg_t *> *nsegs,
- cdt_mesh::bedge_seg_t *eseg, double t
+ cdt_mesh::bedge_seg_t *eseg, double t,
+ std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap
)
{
int replaced_tris = 0;
@@ -2038,6 +2038,8 @@
ftris.insert(f2_tris.begin(), f2_tris.end());
np_id = fmesh_f1.pnts.size() - 1;
fmesh_f1.ep.insert(np_id);
+ omesh_t *om = f2omap[&fmesh_f1];
+ om->vert_add(np_id);
for (tr_it = ftris.begin(); tr_it != ftris.end(); tr_it++) {
replace_edge_split_tri(fmesh_f1, *tr_it, np_id, ue);
replaced_tris++;
@@ -2045,11 +2047,15 @@
} else {
np_id = fmesh_f1.pnts.size() - 1;
fmesh_f1.ep.insert(np_id);
+ omesh_t *om1 = f2omap[&fmesh_f1];
+ om1->vert_add(np_id);
replace_edge_split_tri(fmesh_f1, *f1_tris.begin(), np_id, ue1);
replaced_tris++;
np_id = fmesh_f2.pnts.size() - 1;
fmesh_f2.ep.insert(np_id);
+ omesh_t *om2 = f2omap[&fmesh_f2];
+ om2->vert_add(np_id);
replace_edge_split_tri(fmesh_f2, *f2_tris.begin(), np_id, ue2);
replaced_tris++;
}
@@ -2061,7 +2067,8 @@
int
bedge_split_at_t(
cdt_mesh::bedge_seg_t *eseg, double t,
- std::set<cdt_mesh::bedge_seg_t *> *nsegs
+ std::set<cdt_mesh::bedge_seg_t *> *nsegs,
+ std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap
)
{
int replaced_tris = 0;
@@ -2080,7 +2087,7 @@
int f_id2 =
s_cdt_edge->brep->m_T[eseg->tseg2->trim_ind].Face()->m_face_index;
#endif
- int rtris = ovlp_split_edge(nsegs, eseg, t);
+ int rtris = ovlp_split_edge(nsegs, eseg, t, f2omap);
if (rtris >= 0) {
replaced_tris += rtris;
#if 0
@@ -2108,7 +2115,8 @@
int
bedge_split_near_pnt(
cdt_mesh::bedge_seg_t *eseg, ON_3dPoint &p,
- std::set<cdt_mesh::bedge_seg_t *> *nsegs
+ std::set<cdt_mesh::bedge_seg_t *> *nsegs,
+ std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap
)
{
ON_NurbsCurve *nc = eseg->nc;
@@ -2115,7 +2123,7 @@
ON_Interval domain(eseg->edge_start, eseg->edge_end);
double t;
ON_NurbsCurve_GetClosestPoint(&t, nc, p, 0.0, &domain);
- return bedge_split_at_t(eseg, t, nsegs);
+ return bedge_split_at_t(eseg, t, nsegs, f2omap);
}
// Find the point on the edge nearest to the vert point. (TODO - need to
think about how to
@@ -2123,7 +2131,8 @@
// and see if splitting clears the others...)
int
bedge_split_near_vert(
- std::map<cdt_mesh::bedge_seg_t *, overt_t *> &edge_vert
+ std::map<cdt_mesh::bedge_seg_t *, overt_t *> &edge_vert,
+ std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap
)
{
int replaced_tris = 0;
@@ -2132,7 +2141,7 @@
cdt_mesh::bedge_seg_t *eseg = ev_it->first;
overt_t *v = ev_it->second;
ON_3dPoint p = v->vpnt();
- replaced_tris += bedge_split_near_pnt(eseg, p, NULL);
+ replaced_tris += bedge_split_near_pnt(eseg, p, NULL, f2omap);
}
return replaced_tris;
}
@@ -2139,7 +2148,8 @@
int
bedge_split_near_verts(
- std::map<cdt_mesh::bedge_seg_t *, std::set<overt_t *>> &edge_verts
+ std::map<cdt_mesh::bedge_seg_t *, std::set<overt_t *>> &edge_verts,
+ std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap
)
{
int replaced_tris = 0;
@@ -2177,7 +2187,7 @@
}
std::set<cdt_mesh::bedge_seg_t *> nsegs;
- int ntri_cnt = bedge_split_at_t(eseg_split, split_t, &nsegs);
+ int ntri_cnt = bedge_split_at_t(eseg_split, split_t, &nsegs,
f2omap);
if (ntri_cnt) {
segs.erase(eseg_split);
replaced_tris += ntri_cnt;
@@ -2268,7 +2278,8 @@
int
split_brep_face_edges_near_verts(
std::set<struct ON_Brep_CDT_State *> &a_cdt,
- std::set<std::pair<omesh_t *, omesh_t *>> &check_pairs
+ std::set<std::pair<omesh_t *, omesh_t *>> &check_pairs,
+ std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap
)
{
std::map<long, cdt_mesh::bedge_seg_t *> b_edges;
@@ -2333,13 +2344,14 @@
}
fclose(plot_file);
- int ret = bedge_split_near_vert(edge_vert);
+ int ret = bedge_split_near_vert(edge_vert, f2omap);
return ret;
}
void
refine_omeshes(
- std::set<std::pair<omesh_t *, omesh_t *>> &check_pairs
+ std::set<std::pair<omesh_t *, omesh_t *>> &check_pairs,
+ std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap
)
{
std::set<omesh_t *> omeshes;
@@ -2379,7 +2391,7 @@
cdt_mesh::bedge_seg_t *bseg = *brep_edges_to_split.begin();
brep_edges_to_split.erase(brep_edges_to_split.begin());
double tmid = (bseg->edge_start + bseg->edge_end) * 0.5;
- int rtris = ovlp_split_edge(NULL, bseg, tmid);
+ int rtris = ovlp_split_edge(NULL, bseg, tmid, f2omap);
if (rtris <= 0) {
std::cout << "edge split failed!\n";
}
@@ -2428,7 +2440,8 @@
bool
last_ditch_edge_splits(
- std::set<std::pair<omesh_t *, omesh_t *>> &check_pairs
+ std::set<std::pair<omesh_t *, omesh_t *>> &check_pairs,
+ std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap
)
{
std::set<std::pair<omesh_t *, omesh_t *>>::iterator cp_it;
@@ -2501,7 +2514,7 @@
}
if (done) return false;
- refine_omeshes(check_pairs);
+ refine_omeshes(check_pairs, f2omap);
return true;
}
@@ -2726,7 +2739,7 @@
a_cdt.insert((struct ON_Brep_CDT_State *)p_it->first->p_cdt);
a_cdt.insert((struct ON_Brep_CDT_State *)p_it->second->p_cdt);
}
- int sbfvtri_cnt = split_brep_face_edges_near_verts(a_cdt, ocheck_pairs);
+ int sbfvtri_cnt = split_brep_face_edges_near_verts(a_cdt, ocheck_pairs,
f2omap);
if (sbfvtri_cnt) {
std::cout << "Replaced " << sbfvtri_cnt << " triangles by splitting
edges near vertices\n";
check_faces_validity(check_pairs);
@@ -2792,7 +2805,7 @@
std::cout << "Edge curve has " << e_it->second.size() << "
verts\n";
}
- bedge_split_near_verts(edge_verts);
+ bedge_split_near_verts(edge_verts, f2omap);
iterations++;
continue;
}
@@ -2809,7 +2822,7 @@
// Anything that has lasted this far, just chop all its edges in half
for the next
// iteration
- if (last_ditch_edge_splits(ocheck_pairs)) {
+ if (last_ditch_edge_splits(ocheck_pairs, f2omap)) {
std::cout << "Not done yet\n";
check_faces_validity(check_pairs);
face_ov_cnt = face_omesh_ovlps(ocheck_pairs);
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