Revision: 73077
http://sourceforge.net/p/brlcad/code/73077
Author: starseeker
Date: 2019-05-16 22:26:26 +0000 (Thu, 16 May 2019)
Log Message:
-----------
Checkpoint. Brute force shoving of the necessary vertex point/normal info to
the place where we will need it. Needs to make determination based on uv
points and do this more cleanly.
Modified Paths:
--------------
brlcad/trunk/src/libbrep/cdt.cpp
Modified: brlcad/trunk/src/libbrep/cdt.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt.cpp 2019-05-16 20:40:25 UTC (rev 73076)
+++ brlcad/trunk/src/libbrep/cdt.cpp 2019-05-16 22:26:26 UTC (rev 73077)
@@ -181,6 +181,10 @@
std::vector<ON_3dPoint *> *w3dnorms;
std::map<int, ON_3dPoint *> *vert_norms;
+ /* singular trim info */
+ std::map<int, std::map<int,ON_3dPoint *>> *strim_pnts;
+ std::map<int, std::map<int,ON_3dPoint *>> *strim_norms;
+
/* Poly2Tri data */
p2t::CDT **p2t_faces;
std::vector<p2t::Triangle *> **p2t_extra_faces;
@@ -789,6 +793,9 @@
struct cdt_surf_info {
const ON_Surface *s;
+ const ON_BrepFace *f;
+ std::map<int, std::map<int,ON_3dPoint *>> *strim_pnts;
+ std::map<int, std::map<int,ON_3dPoint *>> *strim_norms;
double u1, u2, v1, v2;
fastf_t ulen;
fastf_t u_lower_3dlen;
@@ -1009,6 +1016,27 @@
return;
}
+ // If we have singular trims on this face, surface evaluations won't be
enough
+ ON_3dPoint *vnorm = NULL;
+ if (sinfo->strim_pnts->find(sinfo->f->m_face_index) !=
sinfo->strim_pnts->end()) {
+ bu_log("Face %d has singular trims\n", sinfo->f->m_face_index);
+ std::map<int, ON_3dPoint *>::iterator m_it;
+ for (m_it = (*sinfo->strim_pnts)[sinfo->f->m_face_index].begin(); m_it
!= (*sinfo->strim_pnts)[sinfo->f->m_face_index].end(); m_it++) {
+ bu_log(" trim %d\n", (*m_it).first);
+ ON_Interval trim_dom =
sinfo->f->Brep()->m_T[(*m_it).first].Domain();
+ ON_2dPoint p2d1 =
sinfo->f->Brep()->m_T[(*m_it).first].PointAt(trim_dom.m_t[0]);
+ ON_2dPoint p2d2 =
sinfo->f->Brep()->m_T[(*m_it).first].PointAt(trim_dom.m_t[0]);
+ bu_log(" points: %f,%f -> %f,%f\n", p2d1.x, p2d1.y, p2d2.x,
p2d2.y);
+ if (sinfo->strim_norms->find(sinfo->f->m_face_index) !=
sinfo->strim_norms->end()) {
+ if
((*sinfo->strim_pnts)[sinfo->f->m_face_index].find((*m_it).first) !=
(*sinfo->strim_pnts)[sinfo->f->m_face_index].end()) {
+ vnorm =
(*sinfo->strim_pnts)[sinfo->f->m_face_index][(*m_it).first];
+ bu_log(" normal: %f, %f, %f\n", vnorm->x, vnorm->y,
vnorm->z);
+ }
+ }
+ }
+ }
+
+
if ((surface_EvNormal(sinfo->s, u1, v1, p[0], norm[0]))
&& (surface_EvNormal(sinfo->s, u2, v1, p[1], norm[1])) // for u
&& (surface_EvNormal(sinfo->s, u2, v2, p[2], norm[2]))
@@ -1020,10 +1048,39 @@
ON_Line line2(p[1], p[3]);
double dist = mid.DistanceTo(line1.ClosestPointTo(mid));
V_MAX(dist, mid.DistanceTo(line2.ClosestPointTo(mid)));
-
+
+ // TODO - find 3D point and normal associated with trim based on uv
coords - hard-coded single
+ // lookup above won't generalize
for (int i = 0; i < 4; i++) {
if (ON_DotProduct(norm[i], norm_mid) < 0) {
bu_log("norm[%d] backwards\n", i);
+ if (i == 0) {
+ bu_log(" at 0 point %f,%f\n", u1, v1);
+ if (ON_DotProduct(*vnorm, norm_mid) > 0) {
+ bu_log("vert norm works\n");
+ }
+ }
+ if (i == 1) {
+ bu_log(" at 1 point %f,%f\n", u2, v1);
+ if (ON_DotProduct(*vnorm, norm_mid) > 0) {
+ bu_log("vert norm works\n");
+ }
+
+ }
+ if (i == 2) {
+ bu_log(" at 2 point %f,%f\n", u2, v2);
+ if (ON_DotProduct(*vnorm, norm_mid) > 0) {
+ bu_log("vert norm works\n");
+ }
+
+ }
+ if (i == 3) {
+ bu_log(" at 3 point %f,%f\n", u1, v2);
+ if (ON_DotProduct(*vnorm, norm_mid) > 0) {
+ bu_log("vert norm works\n");
+ }
+
+ }
}
}
@@ -1264,6 +1321,9 @@
struct cdt_surf_info sinfo;
sinfo.s = s;
+ sinfo.f = &face;
+ sinfo.strim_pnts = s_cdt->strim_pnts;
+ sinfo.strim_norms = s_cdt->strim_norms;
double t1, t2;
s->GetDomain(0, &t1, &t2);
sinfo.ulen = fabs(t2 - t1);
@@ -1832,6 +1892,11 @@
BrepTrimPoint btp;
const ON_BrepVertex& v1 = face.Brep()->m_V[trim->m_vi[0]];
ON_3dPoint *p3d = (*s_cdt->vert_pnts)[v1.m_vertex_index];
+
(*s_cdt->strim_pnts)[face.m_face_index].insert(std::make_pair(trim->m_trim_index,
p3d));
+ ON_3dPoint *n3d = (*s_cdt->vert_norms)[v1.m_vertex_index];
+ if (n3d) {
+
(*s_cdt->strim_norms)[face.m_face_index].insert(std::make_pair(trim->m_trim_index,
n3d));
+ }
double delta = trim->Domain().Length() / 10.0;
ON_Interval trim_dom = trim->Domain();
@@ -2400,6 +2465,8 @@
cdt->vert_pnts = new std::map<int, ON_3dPoint *>;
cdt->w3dnorms = new std::vector<ON_3dPoint *>;
cdt->vert_norms = new std::map<int, ON_3dPoint *>;
+ cdt->strim_pnts = new std::map<int,std::map<int, ON_3dPoint *> >;
+ cdt->strim_norms = new std::map<int,std::map<int, ON_3dPoint *> >;
cdt->vert_to_on = new std::map<int, ON_3dPoint *>;
cdt->edge_pnts = new std::set<ON_3dPoint *>;
cdt->brep_face_loop_points = (ON_SimpleArray<BrepTrimPoint>
**)bu_calloc(brep->m_F.Count(), sizeof(std::map<p2t::Point *, BrepTrimPoint *>
*), "face loop pnts");
@@ -2458,6 +2525,8 @@
delete s_cdt->vert_pnts;
delete s_cdt->w3dnorms;
delete s_cdt->vert_norms;
+ delete s_cdt->strim_pnts;
+ delete s_cdt->strim_norms;
delete s_cdt->vert_to_on;
delete s_cdt->edge_pnts;
delete s_cdt->p2t_extra_faces;
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