Thread: [brlcad-commits] SF.net SVN: brlcad:[34723] brlcad/trunk/src/librt/primitives/brep/brep.cpp (Page 2)
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <sta...@us...> - 2009-06-12 21:56:18
|
Revision: 34723 http://brlcad.svn.sourceforge.net/brlcad/?rev=34723&view=rev Author: starseeker Date: 2009-06-12 21:55:17 +0000 (Fri, 12 Jun 2009) Log Message: ----------- When an odd nurbs hit point shows up, print out the nirt commands that will fire just that ray (make debugging 'em simpler) Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-12 18:54:45 UTC (rev 34722) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-12 21:55:17 UTC (rev 34723) @@ -1972,9 +1972,11 @@ // hits.erase(new_end, hits.end()); if (hits.size() > 1 && (hits.size() % 2) != 0) { - cerr << "**** ERROR odd number of hits: " << hits.size() << " hit_count: " << hit_count << "\n"; + cerr << "**** ERROR odd number of hits: " << hits.size() << "\n"; + bu_log("xyz %f %f %f \n", rp->r_pt[0], rp->r_pt[1], rp->r_pt[2]); + bu_log("dir %f %f %f \n", rp->r_dir[0], rp->r_dir[1], rp->r_dir[2]); + point_t last_point; - TRACE2("ray origin: " << rp->r_pt[0] << "," << rp->r_pt[1] << "," << rp->r_pt[2]); int hitCount = 0; for (HitList::iterator i = hits.begin(); i != hits.end(); ++i) { if (hitCount == 0) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2009-06-15 17:35:58
|
Revision: 34725 http://brlcad.svn.sourceforge.net/brlcad/?rev=34725&view=rev Author: starseeker Date: 2009-06-15 17:35:16 +0000 (Mon, 15 Jun 2009) Log Message: ----------- Add mechanism to do corner evals for nurbs solving only when the ray is 'close' to parallel with the surface normal plane - still need to base 'close' on some function of the flatness criteria. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-13 00:57:12 UTC (rev 34724) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-15 17:35:16 UTC (rev 34725) @@ -1183,7 +1183,7 @@ int -utah_newton_4corner_solver(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged) +utah_newton_4corner_solver(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged, int docorners) { int i; int intersects = 0; @@ -1201,7 +1201,8 @@ ON_3dPoint S; ON_3dVector Su, Sv; ON_2dPoint uv; - + + if (docorners) { for( int iu = 0; iu < 2; iu++) { for( int iv = 0; iv < 2; iv++) { @@ -1282,6 +1283,10 @@ } } } + + } + + if (true) { uv.x = sbv->m_u.Mid(); uv.y = sbv->m_v.Mid(); @@ -1594,8 +1599,18 @@ int found = BREP_INTERSECT_ROOT_DIVERGED; bool converged = false; int numhits; - - numhits = utah_newton_4corner_solver( sbv, surf, ray, ouv, t, N, converged); + + ON_3dPoint center_pt; + ON_3dVector normal; + surf->EvNormal(sbv->m_u.Mid(), sbv->m_v.Mid(), center_pt, normal); + + double grazing_float = normal * ray.m_dir; + + if (fabs(grazing_float) < 0.1) { + numhits = utah_newton_4corner_solver( sbv, surf, ray, ouv, t, N, converged, 1); + } else { + numhits = utah_newton_4corner_solver( sbv, surf, ray, ouv, t, N, converged, 0); + } //utah_newton_4corner_solver(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* &N, bool& converged) /* * DDR. The utah people are using this t_min which represents the This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2009-06-22 21:22:34
|
Revision: 34846 http://brlcad.svn.sourceforge.net/brlcad/?rev=34846&view=rev Author: starseeker Date: 2009-06-22 21:21:33 +0000 (Mon, 22 Jun 2009) Log Message: ----------- Try to add a printout message that will detail the type of odd hit count behavior being observed - for reasons not quite clear, the reporting isn't doing what I expected it to - it's not reporting close points at all and only occasionally reporting entering/leaving status. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-22 20:25:58 UTC (rev 34845) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-22 21:21:33 UTC (rev 34846) @@ -1076,8 +1076,8 @@ bool trimmed; bool closeToEdge; bool oob; - enum hit_type hit; - enum hit_direction direction; + enum hit_type hit; + enum hit_direction direction; // XXX - calculate the dot of the dir with the normal here! SubsurfaceBBNode const * sbv; @@ -2153,6 +2153,16 @@ if (hits.size() > 1 && (hits.size() % 2) != 0) { cerr << "**** ERROR odd number of hits: " << hits.size() << "\n"; + for (HitList::iterator i = hits.begin(); i != hits.end(); ++i) { + cerr << "("; + if (i->hit == brep_hit::CLEAN_HIT) cerr << "H"; + if ( (i->hit == brep_hit::NEAR_HIT) || (i->hit == brep_hit::NEAR_MISS) ) cerr << "c"; + if (i->direction == brep_hit::ENTERING) cerr << "+"; + if (i->direction == brep_hit::LEAVING) cerr << "-"; + cerr << ")"; + } + cerr << "\n"; + bu_log("xyz %f %f %f \n", rp->r_pt[0], rp->r_pt[1], rp->r_pt[2]); bu_log("dir %f %f %f \n", rp->r_dir[0], rp->r_dir[1], rp->r_dir[2]); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ind...@us...> - 2009-06-23 02:53:08
|
Revision: 34848 http://brlcad.svn.sourceforge.net/brlcad/?rev=34848&view=rev Author: indianlarry Date: 2009-06-23 01:57:23 +0000 (Tue, 23 Jun 2009) Log Message: ----------- added new variables to brep_hit copy constructor Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-22 21:39:25 UTC (rev 34847) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-23 01:57:23 UTC (rev 34848) @@ -1097,6 +1097,12 @@ VMOVE(point, h.point); VMOVE(normal, h.normal); move(uv, h.uv); + trimmed = h.trimmed; + closeToEdge = h.closeToEdge; + oob = h.oob; + sbv = h.sbv; + hit = h.hit; + direction = h.direction; } brep_hit& operator=(const brep_hit& h) @@ -2086,7 +2092,21 @@ // sort the hits hits.sort(); - +//////////////////////// + if (hits.size() > 1) { + bu_log("**** Hits: %d\n",hits.size()); + for (HitList::iterator i = hits.begin(); i != hits.end(); ++i) { + brep_hit&out = *i; + bu_log("("); + if (out.hit == brep_hit::CLEAN_HIT) bu_log("H"); + if ( (out.hit == brep_hit::NEAR_HIT) || (out.hit == brep_hit::NEAR_MISS) ) bu_log("c"); + if (out.direction == brep_hit::ENTERING) bu_log("+"); + if (out.direction == brep_hit::LEAVING) bu_log("-"); + bu_log(")"); + } + bu_log("\n**********************\n"); + } +//////////////////////// TRACE("---"); int num = 0; for (HitList::iterator i = hits.begin(); i != hits.end(); ++i) { @@ -2152,16 +2172,17 @@ // hits.erase(new_end, hits.end()); if (hits.size() > 1 && (hits.size() % 2) != 0) { - cerr << "**** ERROR odd number of hits: " << hits.size() << "\n"; + bu_log("**** ERROR odd number of hits: %d\n",hits.size()); for (HitList::iterator i = hits.begin(); i != hits.end(); ++i) { - cerr << "("; - if (i->hit == brep_hit::CLEAN_HIT) cerr << "H"; - if ( (i->hit == brep_hit::NEAR_HIT) || (i->hit == brep_hit::NEAR_MISS) ) cerr << "c"; - if (i->direction == brep_hit::ENTERING) cerr << "+"; - if (i->direction == brep_hit::LEAVING) cerr << "-"; - cerr << ")"; + brep_hit&out = *i; + bu_log("("); + if (out.hit == brep_hit::CLEAN_HIT) bu_log("H"); + if ( (out.hit == brep_hit::NEAR_HIT) || (out.hit == brep_hit::NEAR_MISS) ) bu_log("c"); + if (out.direction == brep_hit::ENTERING) bu_log("+"); + if (out.direction == brep_hit::LEAVING) bu_log("-"); + bu_log(")"); } - cerr << "\n"; + bu_log("\n"); bu_log("xyz %f %f %f \n", rp->r_pt[0], rp->r_pt[1], rp->r_pt[2]); bu_log("dir %f %f %f \n", rp->r_dir[0], rp->r_dir[1], rp->r_dir[2]); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2009-06-25 21:12:28
|
Revision: 34882 http://brlcad.svn.sourceforge.net/brlcad/?rev=34882&view=rev Author: starseeker Date: 2009-06-25 21:12:17 +0000 (Thu, 25 Jun 2009) Log Message: ----------- Clean up 4corner newton solver code - remove logic duplication. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-25 19:20:56 UTC (rev 34881) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-25 21:12:17 UTC (rev 34882) @@ -1340,9 +1340,8 @@ } - int -utah_newton_4corner_solver(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged, int docorners) +utah_newton_solver_test(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged, ON_2dPoint* suv, int iu, int iv) { int i; int intersects = 0; @@ -1359,171 +1358,116 @@ ON_3dPoint S; ON_3dVector Su, Sv; + ON_2dPoint uv; - if (docorners) { - for( int iu = 0; iu < 2; iu++) { - for( int iv = 0; iv < 2; iv++) { + uv.x = suv->x; + uv.y = suv->y; + + ON_2dPoint uv0(uv); + surf->Ev1Der(uv.x, uv.y, S, Su, Sv); + + utah_F(S, p1, p1d, p2, p2d, f, g); + rootdist = fabs(f) + fabs(g); + + for (i = 0; i < BREP_MAX_ITERATIONS; i++) { + utah_Fu(Su, p1, p2, j11, j21); + utah_Fv(Sv, p1, p2, j12, j22); + + J = (j11 * j22 - j12 * j21); + + if (NEAR_ZERO(J, BREP_INTERSECTION_ROOT_EPSILON)) { + // perform jittered perturbation in parametric domain.... + uv.x = uv.x + .1 * drand48() * (uv0.x - uv.x); + uv.y = uv.y + .1 * drand48() * (uv0.y - uv.y); + continue; + } + + invdetJ = 1. / J; + + + du = -invdetJ * (j22 * f - j12 * g); + dv = -invdetJ * (j11 * g - j21 * f); - uv.x = sbv->m_u[iu]; - uv.y = sbv->m_v[iv]; - - ON_2dPoint uv0(uv); - surf->Ev1Der(uv.x, uv.y, S, Su, Sv); - - utah_F(S, p1, p1d, p2, p2d, f, g); - rootdist = fabs(f) + fabs(g); - - for (i = 0; i < BREP_MAX_ITERATIONS; i++) { - utah_Fu(Su, p1, p2, j11, j21); - utah_Fv(Sv, p1, p2, j12, j22); - - J = (j11 * j22 - j12 * j21); - - if (NEAR_ZERO(J, BREP_INTERSECTION_ROOT_EPSILON)) { - // perform jittered perturbation in parametric domain.... - uv.x = uv.x + .1 * drand48() * (uv0.x - uv.x); - uv.y = uv.y + .1 * drand48() * (uv0.y - uv.y); - continue; - } - - invdetJ = 1. / J; - - - du = -invdetJ * (j22 * f - j12 * g); - dv = -invdetJ * (j11 * g - j21 * f); - + if ( i == 0 ) { + if (((iu == 0) && (du < 0.0)) || ((iu==1) && (du > 0.0))) break; //head out of U bounds + if (((iv == 0) && (dv < 0.0)) || ((iv==1) && (dv > 0.0))) break; //head out of V bounds + } - if ( i == 0 ) { - if (((iu == 0) && (du < 0.0)) || - ((iu==1) && (du > 0.0))) - break; //head out of U bounds - if (((iv == 0) && (dv < 0.0)) || - ((iv==1) && (dv > 0.0))) - break; //head out of V bounds - } - - - uv.x -= invdetJ * (j22 * f - j12 * g); - uv.y -= invdetJ * (j11 * g - j21 * f); - - utah_pushBack(surf, uv); - - surf->Ev1Der(uv.x, uv.y, S, Su, Sv); - utah_F(S, p1, p1d, p2, p2d, f, g); - oldrootdist = rootdist; - rootdist = fabs(f) + fabs(g); - - if (oldrootdist < rootdist) break; - - if (rootdist < ROOT_TOL) { - if (sbv->m_u.Includes(uv.x) && sbv->m_v.Includes(uv.y)) { - bool new_point = true; - for(int j=0;j<intersects;j++) { - if (NEAR_ZERO(uv.x - ouv[j].x, 0.0001) && NEAR_ZERO(uv.y - ouv[j].y, 0.0001)) { - new_point = false; - } - } - if (new_point) { - //bu_log("New Hit Point:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); - t[intersects] = utah_calc_t(r, S); - N[intersects] = ON_CrossProduct(Su, Sv); - N[intersects].Unitize(); - ouv[intersects].x = uv.x; - ouv[intersects].y = uv.y; - intersects++; - converged = true; - } - } //else { - //bu_log("OOB Point Hit:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); - //} - break; - } - } + uv.x -= invdetJ * (j22 * f - j12 * g); + uv.y -= invdetJ * (j11 * g - j21 * f); + + utah_pushBack(surf, uv); + + surf->Ev1Der(uv.x, uv.y, S, Su, Sv); + utah_F(S, p1, p1d, p2, p2d, f, g); + oldrootdist = rootdist; + rootdist = fabs(f) + fabs(g); + + if (oldrootdist < rootdist) break; + + if (rootdist < ROOT_TOL) { + if (sbv->m_u.Includes(uv.x) && sbv->m_v.Includes(uv.y)) { + bool new_point = true; + for(int j=0;j<intersects;j++) { + if (NEAR_ZERO(uv.x - ouv[j].x, 0.0001) && NEAR_ZERO(uv.y - ouv[j].y, 0.0001)) { + new_point = false; + } } + if (new_point) { + //bu_log("New Hit Point:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); + t[intersects] = utah_calc_t(r, S); + N[intersects] = ON_CrossProduct(Su, Sv); + N[intersects].Unitize(); + ouv[intersects].x = uv.x; + ouv[intersects].y = uv.y; + intersects++; + converged = true; + } + } //else { + //bu_log("OOB Point Hit:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); + //} + break; } + } + return intersects; +} + +int +utah_newton_4corner_solver(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged, int docorners) +{ + int i; + int intersects = 0; + double j11, j12, j21, j22; + double f, g; + double rootdist, oldrootdist; + double J, invdetJ; + double du,dv; + + ON_3dVector p1, p2; + double p1d = 0, p2d = 0; + converged = false; + utah_ray_planes(r, p1, p1d, p2, p2d); + + ON_3dPoint S; + ON_3dVector Su, Sv; + ON_2dPoint uv; + + if (docorners) { + for( int iu = 0; iu < 2; iu++) { + for( int iv = 0; iv < 2; iv++) { + uv.x = sbv->m_u[iu]; + uv.y = sbv->m_v[iv]; + intersects += utah_newton_solver_test( sbv, surf, r, ouv, t, N, converged, &uv, iu, iv); + } } + } - - if (true) { - uv.x = sbv->m_u.Mid(); - uv.y = sbv->m_v.Mid(); - - ON_2dPoint uv0(uv); - surf->Ev1Der(uv.x, uv.y, S, Su, Sv); - - utah_F(S, p1, p1d, p2, p2d, f, g); - rootdist = fabs(f) + fabs(g); - - for (i = 0; i < BREP_MAX_ITERATIONS; i++) { - utah_Fu(Su, p1, p2, j11, j21); - utah_Fv(Sv, p1, p2, j12, j22); - - J = (j11 * j22 - j12 * j21); - - if (NEAR_ZERO(J, BREP_INTERSECTION_ROOT_EPSILON)) { - // perform jittered perturbation in parametric domain.... - uv.x = uv.x + .1 * drand48() * (uv0.x - uv.x); - uv.y = uv.y + .1 * drand48() * (uv0.y - uv.y); - continue; - } - - invdetJ = 1. / J; - - /* - du = -invdetJ * (j22 * f - j12 * g); - dv = -invdetJ * (j11 * g - j21 * f); - - - if ( i == 0 ) { - if (((iu == 0) && (du < 0.0)) || - ((iu==1) && (du > 0.0))) - break; //head out of U bounds - if (((iv == 0) && (dv < 0.0)) || - ((iv==1) && (dv > 0.0))) - break; //head out of V bounds - } - */ - - uv.x -= invdetJ * (j22 * f - j12 * g); - uv.y -= invdetJ * (j11 * g - j21 * f); - - utah_pushBack(surf, uv); - - surf->Ev1Der(uv.x, uv.y, S, Su, Sv); - utah_F(S, p1, p1d, p2, p2d, f, g); - oldrootdist = rootdist; - rootdist = fabs(f) + fabs(g); - - if (oldrootdist < rootdist) break; - - if (rootdist < ROOT_TOL) { - if (sbv->m_u.Includes(uv.x) && sbv->m_v.Includes(uv.y)) { - bool new_point = true; - for(int j=0;j<intersects;j++) { - if (NEAR_ZERO(uv.x - ouv[j].x, 0.0001) && NEAR_ZERO(uv.y - ouv[j].y, 0.0001)) { - new_point = false; - } - } - if (new_point) { - //bu_log("New Hit Point:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); - t[intersects] = utah_calc_t(r, S); - N[intersects] = ON_CrossProduct(Su, Sv); - N[intersects].Unitize(); - ouv[intersects].x = uv.x; - ouv[intersects].y = uv.y; - intersects++; - converged = true; - } - } //else { - //bu_log("OOB Point Hit:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); - //} - break; - } - } - } - return intersects; + uv.x = sbv->m_u.Mid(); + uv.y = sbv->m_v.Mid(); + intersects += utah_newton_solver_test( sbv, surf, r, ouv, t, N, converged, &uv, -1, -1); + return intersects; } void This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2009-06-25 21:49:53
|
Revision: 34883 http://brlcad.svn.sourceforge.net/brlcad/?rev=34883&view=rev Author: starseeker Date: 2009-06-25 21:49:09 +0000 (Thu, 25 Jun 2009) Log Message: ----------- Doggone it, somehow that broke some of the raytracing. Tweaks to get it closer to original behavior, but still missing something. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-25 21:12:17 UTC (rev 34882) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-25 21:49:09 UTC (rev 34883) @@ -1341,10 +1341,9 @@ int -utah_newton_solver_test(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged, ON_2dPoint* suv, int iu, int iv) +utah_newton_solver_test(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged, ON_2dPoint* suv, int intersects, int iu, int iv) { int i; - int intersects = 0; double j11, j12, j21, j22; double f, g; double rootdist, oldrootdist; @@ -1353,7 +1352,6 @@ ON_3dVector p1, p2; double p1d = 0, p2d = 0; - converged = false; utah_ray_planes(r, p1, p1d, p2, p2d); ON_3dPoint S; @@ -1385,13 +1383,14 @@ invdetJ = 1. / J; - - du = -invdetJ * (j22 * f - j12 * g); - dv = -invdetJ * (j11 * g - j21 * f); - - if ( i == 0 ) { - if (((iu == 0) && (du < 0.0)) || ((iu==1) && (du > 0.0))) break; //head out of U bounds - if (((iv == 0) && (dv < 0.0)) || ((iv==1) && (dv > 0.0))) break; //head out of V bounds + if ((iu != -1) && (iv != -1)) { + du = -invdetJ * (j22 * f - j12 * g); + dv = -invdetJ * (j11 * g - j21 * f); + + if ( i == 0 ) { + if (((iu == 0) && (du < 0.0)) || ((iu==1) && (du > 0.0))) break; //head out of U bounds + if (((iv == 0) && (dv < 0.0)) || ((iv==1) && (dv > 0.0))) break; //head out of V bounds + } } uv.x -= invdetJ * (j22 * f - j12 * g); @@ -1437,36 +1436,23 @@ int utah_newton_4corner_solver(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged, int docorners) { - int i; - int intersects = 0; - double j11, j12, j21, j22; - double f, g; - double rootdist, oldrootdist; - double J, invdetJ; - double du,dv; - - ON_3dVector p1, p2; - double p1d = 0, p2d = 0; + int intersects = 0; converged = false; - utah_ray_planes(r, p1, p1d, p2, p2d); - - ON_3dPoint S; - ON_3dVector Su, Sv; - ON_2dPoint uv; - if (docorners) { for( int iu = 0; iu < 2; iu++) { for( int iv = 0; iv < 2; iv++) { + ON_2dPoint uv; uv.x = sbv->m_u[iu]; uv.y = sbv->m_v[iv]; - intersects += utah_newton_solver_test( sbv, surf, r, ouv, t, N, converged, &uv, iu, iv); + intersects += utah_newton_solver_test(sbv, surf, r, ouv, t, N, converged, &uv, intersects, iu, iv); } } } + ON_2dPoint uv; uv.x = sbv->m_u.Mid(); uv.y = sbv->m_v.Mid(); - intersects += utah_newton_solver_test( sbv, surf, r, ouv, t, N, converged, &uv, -1, -1); + intersects += utah_newton_solver_test( sbv, surf, r, ouv, t, N, converged, &uv, intersects, -1, -1); return intersects; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2009-06-25 23:07:04
|
Revision: 34884 http://brlcad.svn.sourceforge.net/brlcad/?rev=34884&view=rev Author: starseeker Date: 2009-06-25 23:07:02 +0000 (Thu, 25 Jun 2009) Log Message: ----------- Oops - don't pass intersect count between multiple solver runs. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-25 21:49:09 UTC (rev 34883) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-25 23:07:02 UTC (rev 34884) @@ -1341,9 +1341,10 @@ int -utah_newton_solver_test(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged, ON_2dPoint* suv, int intersects, int iu, int iv) +utah_newton_solver_test(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged, ON_2dPoint* suv, int iu, int iv) { int i; + int intersects = 0; double j11, j12, j21, j22; double f, g; double rootdist, oldrootdist; @@ -1444,7 +1445,7 @@ ON_2dPoint uv; uv.x = sbv->m_u[iu]; uv.y = sbv->m_v[iv]; - intersects += utah_newton_solver_test(sbv, surf, r, ouv, t, N, converged, &uv, intersects, iu, iv); + intersects += utah_newton_solver_test(sbv, surf, r, ouv, t, N, converged, &uv, iu, iv); } } } @@ -1452,7 +1453,7 @@ ON_2dPoint uv; uv.x = sbv->m_u.Mid(); uv.y = sbv->m_v.Mid(); - intersects += utah_newton_solver_test( sbv, surf, r, ouv, t, N, converged, &uv, intersects, -1, -1); + intersects += utah_newton_solver_test( sbv, surf, r, ouv, t, N, converged, &uv, -1, -1); return intersects; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2009-06-25 23:42:13
|
Revision: 34886 http://brlcad.svn.sourceforge.net/brlcad/?rev=34886&view=rev Author: starseeker Date: 2009-06-25 23:42:06 +0000 (Thu, 25 Jun 2009) Log Message: ----------- For reasons not immediately clear, still getting more visual artifacts with breakout of solver logic. In the interm, restore previous version - need to figure out what the difference is. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-25 23:28:05 UTC (rev 34885) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-25 23:42:06 UTC (rev 34886) @@ -1340,11 +1340,12 @@ } + int -utah_newton_solver_test(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged, ON_2dPoint* suv, int iu, int iv) +utah_newton_4corner_solver(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged, int docorners) { int i; - int intersects = 0; + int intersects = 0; double j11, j12, j21, j22; double f, g; double rootdist, oldrootdist; @@ -1353,108 +1354,176 @@ ON_3dVector p1, p2; double p1d = 0, p2d = 0; + converged = false; utah_ray_planes(r, p1, p1d, p2, p2d); ON_3dPoint S; ON_3dVector Su, Sv; - ON_2dPoint uv; - uv.x = suv->x; - uv.y = suv->y; - - ON_2dPoint uv0(uv); - surf->Ev1Der(uv.x, uv.y, S, Su, Sv); - - utah_F(S, p1, p1d, p2, p2d, f, g); - rootdist = fabs(f) + fabs(g); - - for (i = 0; i < BREP_MAX_ITERATIONS; i++) { - utah_Fu(Su, p1, p2, j11, j21); - utah_Fv(Sv, p1, p2, j12, j22); - - J = (j11 * j22 - j12 * j21); - - if (NEAR_ZERO(J, BREP_INTERSECTION_ROOT_EPSILON)) { - // perform jittered perturbation in parametric domain.... - uv.x = uv.x + .1 * drand48() * (uv0.x - uv.x); - uv.y = uv.y + .1 * drand48() * (uv0.y - uv.y); - continue; - } - - invdetJ = 1. / J; - - if ((iu != -1) && (iv != -1)) { - du = -invdetJ * (j22 * f - j12 * g); - dv = -invdetJ * (j11 * g - j21 * f); - - if ( i == 0 ) { - if (((iu == 0) && (du < 0.0)) || ((iu==1) && (du > 0.0))) break; //head out of U bounds - if (((iv == 0) && (dv < 0.0)) || ((iv==1) && (dv > 0.0))) break; //head out of V bounds - } - } + if (docorners) { + for( int iu = 0; iu < 2; iu++) { + for( int iv = 0; iv < 2; iv++) { - uv.x -= invdetJ * (j22 * f - j12 * g); - uv.y -= invdetJ * (j11 * g - j21 * f); - - utah_pushBack(surf, uv); - - surf->Ev1Der(uv.x, uv.y, S, Su, Sv); - utah_F(S, p1, p1d, p2, p2d, f, g); - oldrootdist = rootdist; - rootdist = fabs(f) + fabs(g); - - if (oldrootdist < rootdist) break; - - if (rootdist < ROOT_TOL) { - if (sbv->m_u.Includes(uv.x) && sbv->m_v.Includes(uv.y)) { - bool new_point = true; - for(int j=0;j<intersects;j++) { - if (NEAR_ZERO(uv.x - ouv[j].x, 0.0001) && NEAR_ZERO(uv.y - ouv[j].y, 0.0001)) { - new_point = false; - } + uv.x = sbv->m_u[iu]; + uv.y = sbv->m_v[iv]; + + ON_2dPoint uv0(uv); + surf->Ev1Der(uv.x, uv.y, S, Su, Sv); + + utah_F(S, p1, p1d, p2, p2d, f, g); + rootdist = fabs(f) + fabs(g); + + for (i = 0; i < BREP_MAX_ITERATIONS; i++) { + utah_Fu(Su, p1, p2, j11, j21); + utah_Fv(Sv, p1, p2, j12, j22); + + J = (j11 * j22 - j12 * j21); + + if (NEAR_ZERO(J, BREP_INTERSECTION_ROOT_EPSILON)) { + // perform jittered perturbation in parametric domain.... + uv.x = uv.x + .1 * drand48() * (uv0.x - uv.x); + uv.y = uv.y + .1 * drand48() * (uv0.y - uv.y); + continue; + } + + invdetJ = 1. / J; + + + du = -invdetJ * (j22 * f - j12 * g); + dv = -invdetJ * (j11 * g - j21 * f); + + + if ( i == 0 ) { + if (((iu == 0) && (du < 0.0)) || + ((iu==1) && (du > 0.0))) + break; //head out of U bounds + if (((iv == 0) && (dv < 0.0)) || + ((iv==1) && (dv > 0.0))) + break; //head out of V bounds + } + + + uv.x -= invdetJ * (j22 * f - j12 * g); + uv.y -= invdetJ * (j11 * g - j21 * f); + + utah_pushBack(surf, uv); + + surf->Ev1Der(uv.x, uv.y, S, Su, Sv); + utah_F(S, p1, p1d, p2, p2d, f, g); + oldrootdist = rootdist; + rootdist = fabs(f) + fabs(g); + + if (oldrootdist < rootdist) break; + + if (rootdist < ROOT_TOL) { + if (sbv->m_u.Includes(uv.x) && sbv->m_v.Includes(uv.y)) { + bool new_point = true; + for(int j=0;j<intersects;j++) { + if (NEAR_ZERO(uv.x - ouv[j].x, 0.0001) && NEAR_ZERO(uv.y - ouv[j].y, 0.0001)) { + new_point = false; + } + } + if (new_point) { + //bu_log("New Hit Point:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); + t[intersects] = utah_calc_t(r, S); + N[intersects] = ON_CrossProduct(Su, Sv); + N[intersects].Unitize(); + ouv[intersects].x = uv.x; + ouv[intersects].y = uv.y; + intersects++; + converged = true; + } + } //else { + //bu_log("OOB Point Hit:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); + //} + break; + } + } } - if (new_point) { - //bu_log("New Hit Point:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); - t[intersects] = utah_calc_t(r, S); - N[intersects] = ON_CrossProduct(Su, Sv); - N[intersects].Unitize(); - ouv[intersects].x = uv.x; - ouv[intersects].y = uv.y; - intersects++; - converged = true; - } - } //else { - //bu_log("OOB Point Hit:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); - //} - break; } - } - return intersects; -} - -int -utah_newton_4corner_solver(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged, int docorners) -{ - int intersects = 0; - converged = false; - if (docorners) { - for( int iu = 0; iu < 2; iu++) { - for( int iv = 0; iv < 2; iv++) { - ON_2dPoint uv; - uv.x = sbv->m_u[iu]; - uv.y = sbv->m_v[iv]; - intersects += utah_newton_solver_test(sbv, surf, r, ouv, t, N, converged, &uv, iu, iv); - } } - } - ON_2dPoint uv; - uv.x = sbv->m_u.Mid(); - uv.y = sbv->m_v.Mid(); - intersects += utah_newton_solver_test( sbv, surf, r, ouv, t, N, converged, &uv, -1, -1); - return intersects; + + if (true) { + uv.x = sbv->m_u.Mid(); + uv.y = sbv->m_v.Mid(); + + ON_2dPoint uv0(uv); + surf->Ev1Der(uv.x, uv.y, S, Su, Sv); + + utah_F(S, p1, p1d, p2, p2d, f, g); + rootdist = fabs(f) + fabs(g); + + for (i = 0; i < BREP_MAX_ITERATIONS; i++) { + utah_Fu(Su, p1, p2, j11, j21); + utah_Fv(Sv, p1, p2, j12, j22); + + J = (j11 * j22 - j12 * j21); + + if (NEAR_ZERO(J, BREP_INTERSECTION_ROOT_EPSILON)) { + // perform jittered perturbation in parametric domain.... + uv.x = uv.x + .1 * drand48() * (uv0.x - uv.x); + uv.y = uv.y + .1 * drand48() * (uv0.y - uv.y); + continue; + } + + invdetJ = 1. / J; + + /* + du = -invdetJ * (j22 * f - j12 * g); + dv = -invdetJ * (j11 * g - j21 * f); + + + if ( i == 0 ) { + if (((iu == 0) && (du < 0.0)) || + ((iu==1) && (du > 0.0))) + break; //head out of U bounds + if (((iv == 0) && (dv < 0.0)) || + ((iv==1) && (dv > 0.0))) + break; //head out of V bounds + } + */ + + uv.x -= invdetJ * (j22 * f - j12 * g); + uv.y -= invdetJ * (j11 * g - j21 * f); + + utah_pushBack(surf, uv); + + surf->Ev1Der(uv.x, uv.y, S, Su, Sv); + utah_F(S, p1, p1d, p2, p2d, f, g); + oldrootdist = rootdist; + rootdist = fabs(f) + fabs(g); + + if (oldrootdist < rootdist) break; + + if (rootdist < ROOT_TOL) { + if (sbv->m_u.Includes(uv.x) && sbv->m_v.Includes(uv.y)) { + bool new_point = true; + for(int j=0;j<intersects;j++) { + if (NEAR_ZERO(uv.x - ouv[j].x, 0.0001) && NEAR_ZERO(uv.y - ouv[j].y, 0.0001)) { + new_point = false; + } + } + if (new_point) { + //bu_log("New Hit Point:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); + t[intersects] = utah_calc_t(r, S); + N[intersects] = ON_CrossProduct(Su, Sv); + N[intersects].Unitize(); + ouv[intersects].x = uv.x; + ouv[intersects].y = uv.y; + intersects++; + converged = true; + } + } //else { + //bu_log("OOB Point Hit:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); + //} + break; + } + } + } + return intersects; } void This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2009-06-26 17:58:48
|
Revision: 34887 http://brlcad.svn.sourceforge.net/brlcad/?rev=34887&view=rev Author: starseeker Date: 2009-06-26 17:57:37 +0000 (Fri, 26 Jun 2009) Log Message: ----------- Ah ha. DID need to pass in the count of previous intersects to ensure correct assignments to t, N and ouv. Results should be identical now. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-25 23:42:06 UTC (rev 34886) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-26 17:57:37 UTC (rev 34887) @@ -1340,190 +1340,119 @@ } - int -utah_newton_4corner_solver(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged, int docorners) +utah_newton_solver_test(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged, ON_2dPoint* suv, int count, int iu, int iv) { int i; - int intersects = 0; + int intersects = 0; double j11, j12, j21, j22; double f, g; double rootdist, oldrootdist; double J, invdetJ; - double du,dv; + double du,dv; ON_3dVector p1, p2; double p1d = 0, p2d = 0; - converged = false; utah_ray_planes(r, p1, p1d, p2, p2d); ON_3dPoint S; ON_3dVector Su, Sv; + ON_2dPoint uv; - if (docorners) { - for( int iu = 0; iu < 2; iu++) { - for( int iv = 0; iv < 2; iv++) { + uv.x = suv->x; + uv.y = suv->y; + + ON_2dPoint uv0(uv); + surf->Ev1Der(uv.x, uv.y, S, Su, Sv); + + utah_F(S, p1, p1d, p2, p2d, f, g); + rootdist = fabs(f) + fabs(g); + + for (i = 0; i < BREP_MAX_ITERATIONS; i++) { + utah_Fu(Su, p1, p2, j11, j21); + utah_Fv(Sv, p1, p2, j12, j22); + + J = (j11 * j22 - j12 * j21); + + if (NEAR_ZERO(J, BREP_INTERSECTION_ROOT_EPSILON)) { + // perform jittered perturbation in parametric domain.... + uv.x = uv.x + .1 * drand48() * (uv0.x - uv.x); + uv.y = uv.y + .1 * drand48() * (uv0.y - uv.y); + continue; + } + + invdetJ = 1. / J; + + if ((iu != -1) && (iv != -1)) { + du = -invdetJ * (j22 * f - j12 * g); + dv = -invdetJ * (j11 * g - j21 * f); + + if ( i == 0 ) { + if (((iu == 0) && (du < 0.0)) || ((iu==1) && (du > 0.0))) return intersects; //head out of U bounds + if (((iv == 0) && (dv < 0.0)) || ((iv==1) && (dv > 0.0))) return intersects; //head out of V bounds + } + } - uv.x = sbv->m_u[iu]; - uv.y = sbv->m_v[iv]; - - ON_2dPoint uv0(uv); - surf->Ev1Der(uv.x, uv.y, S, Su, Sv); - - utah_F(S, p1, p1d, p2, p2d, f, g); - rootdist = fabs(f) + fabs(g); - - for (i = 0; i < BREP_MAX_ITERATIONS; i++) { - utah_Fu(Su, p1, p2, j11, j21); - utah_Fv(Sv, p1, p2, j12, j22); - - J = (j11 * j22 - j12 * j21); - - if (NEAR_ZERO(J, BREP_INTERSECTION_ROOT_EPSILON)) { - // perform jittered perturbation in parametric domain.... - uv.x = uv.x + .1 * drand48() * (uv0.x - uv.x); - uv.y = uv.y + .1 * drand48() * (uv0.y - uv.y); - continue; - } - - invdetJ = 1. / J; - - - du = -invdetJ * (j22 * f - j12 * g); - dv = -invdetJ * (j11 * g - j21 * f); - - - if ( i == 0 ) { - if (((iu == 0) && (du < 0.0)) || - ((iu==1) && (du > 0.0))) - break; //head out of U bounds - if (((iv == 0) && (dv < 0.0)) || - ((iv==1) && (dv > 0.0))) - break; //head out of V bounds - } - - - uv.x -= invdetJ * (j22 * f - j12 * g); - uv.y -= invdetJ * (j11 * g - j21 * f); - - utah_pushBack(surf, uv); - - surf->Ev1Der(uv.x, uv.y, S, Su, Sv); - utah_F(S, p1, p1d, p2, p2d, f, g); - oldrootdist = rootdist; - rootdist = fabs(f) + fabs(g); - - if (oldrootdist < rootdist) break; - - if (rootdist < ROOT_TOL) { - if (sbv->m_u.Includes(uv.x) && sbv->m_v.Includes(uv.y)) { - bool new_point = true; - for(int j=0;j<intersects;j++) { - if (NEAR_ZERO(uv.x - ouv[j].x, 0.0001) && NEAR_ZERO(uv.y - ouv[j].y, 0.0001)) { - new_point = false; - } - } - if (new_point) { - //bu_log("New Hit Point:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); - t[intersects] = utah_calc_t(r, S); - N[intersects] = ON_CrossProduct(Su, Sv); - N[intersects].Unitize(); - ouv[intersects].x = uv.x; - ouv[intersects].y = uv.y; - intersects++; - converged = true; - } - } //else { - //bu_log("OOB Point Hit:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); - //} - break; - } - } + uv.x -= invdetJ * (j22 * f - j12 * g); + uv.y -= invdetJ * (j11 * g - j21 * f); + + utah_pushBack(surf, uv); + + surf->Ev1Der(uv.x, uv.y, S, Su, Sv); + utah_F(S, p1, p1d, p2, p2d, f, g); + oldrootdist = rootdist; + rootdist = fabs(f) + fabs(g); + + if (oldrootdist < rootdist) return intersects; + + if (rootdist < ROOT_TOL) { + if (sbv->m_u.Includes(uv.x) && sbv->m_v.Includes(uv.y)) { + bool new_point = true; + for(int j=0;j<count;j++) { + if (NEAR_ZERO(uv.x - ouv[j].x, 0.0001) && NEAR_ZERO(uv.y - ouv[j].y, 0.0001)) { + new_point = false; + } } + if (new_point) { + //bu_log("New Hit Point:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); + t[count] = utah_calc_t(r, S); + N[count] = ON_CrossProduct(Su, Sv); + N[count].Unitize(); + ouv[count].x = uv.x; + ouv[count].y = uv.y; + intersects++; + converged = true; + } + } + return intersects; } + } + return intersects; +} + +int +utah_newton_4corner_solver(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged, int docorners) +{ + int intersects = 0; + converged = false; + if (docorners) { + for( int iu = 0; iu < 2; iu++) { + for( int iv = 0; iv < 2; iv++) { + ON_2dPoint uv; + uv.x = sbv->m_u[iu]; + uv.y = sbv->m_v[iv]; + intersects += utah_newton_solver_test(sbv, surf, r, ouv, t, N, converged, &uv, intersects, iu, iv); + } } + } - - if (true) { - uv.x = sbv->m_u.Mid(); - uv.y = sbv->m_v.Mid(); - - ON_2dPoint uv0(uv); - surf->Ev1Der(uv.x, uv.y, S, Su, Sv); - - utah_F(S, p1, p1d, p2, p2d, f, g); - rootdist = fabs(f) + fabs(g); - - for (i = 0; i < BREP_MAX_ITERATIONS; i++) { - utah_Fu(Su, p1, p2, j11, j21); - utah_Fv(Sv, p1, p2, j12, j22); - - J = (j11 * j22 - j12 * j21); - - if (NEAR_ZERO(J, BREP_INTERSECTION_ROOT_EPSILON)) { - // perform jittered perturbation in parametric domain.... - uv.x = uv.x + .1 * drand48() * (uv0.x - uv.x); - uv.y = uv.y + .1 * drand48() * (uv0.y - uv.y); - continue; - } - - invdetJ = 1. / J; - - /* - du = -invdetJ * (j22 * f - j12 * g); - dv = -invdetJ * (j11 * g - j21 * f); - - - if ( i == 0 ) { - if (((iu == 0) && (du < 0.0)) || - ((iu==1) && (du > 0.0))) - break; //head out of U bounds - if (((iv == 0) && (dv < 0.0)) || - ((iv==1) && (dv > 0.0))) - break; //head out of V bounds - } - */ - - uv.x -= invdetJ * (j22 * f - j12 * g); - uv.y -= invdetJ * (j11 * g - j21 * f); - - utah_pushBack(surf, uv); - - surf->Ev1Der(uv.x, uv.y, S, Su, Sv); - utah_F(S, p1, p1d, p2, p2d, f, g); - oldrootdist = rootdist; - rootdist = fabs(f) + fabs(g); - - if (oldrootdist < rootdist) break; - - if (rootdist < ROOT_TOL) { - if (sbv->m_u.Includes(uv.x) && sbv->m_v.Includes(uv.y)) { - bool new_point = true; - for(int j=0;j<intersects;j++) { - if (NEAR_ZERO(uv.x - ouv[j].x, 0.0001) && NEAR_ZERO(uv.y - ouv[j].y, 0.0001)) { - new_point = false; - } - } - if (new_point) { - //bu_log("New Hit Point:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); - t[intersects] = utah_calc_t(r, S); - N[intersects] = ON_CrossProduct(Su, Sv); - N[intersects].Unitize(); - ouv[intersects].x = uv.x; - ouv[intersects].y = uv.y; - intersects++; - converged = true; - } - } //else { - //bu_log("OOB Point Hit:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); - //} - break; - } - } - } - return intersects; + ON_2dPoint uv; + uv.x = sbv->m_u.Mid(); + uv.y = sbv->m_v.Mid(); + intersects += utah_newton_solver_test( sbv, surf, r, ouv, t, N, converged, &uv, intersects, -1, -1); + return intersects; } void This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <d_r...@us...> - 2009-07-03 08:16:04
|
Revision: 34939 http://brlcad.svn.sourceforge.net/brlcad/?rev=34939&view=rev Author: d_rossberg Date: 2009-07-03 08:16:03 +0000 (Fri, 03 Jul 2009) Log Message: ----------- fixed crash in MS Windows decrementing an iterator and testing for end() does not make much sense the algorithm needs probably a review Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-07-03 08:04:55 UTC (rev 34938) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-07-03 08:16:03 UTC (rev 34939) @@ -1904,9 +1904,9 @@ while (curr != hits.end()) { brep_hit &curr_hit = *curr; if (curr_hit.hit == brep_hit::NEAR_MISS) { - prev = curr; - prev--; - if (prev != hits.end()) { + if (curr != hits.begin()) { + prev = curr; + prev--; brep_hit &prev_hit = (*prev); if ((prev_hit.hit != brep_hit::NEAR_MISS) && (prev_hit.direction == curr_hit.direction)) { //remove current miss @@ -1952,9 +1952,9 @@ while (curr != hits.end()) { brep_hit &curr_hit = *curr; if (curr_hit.hit == brep_hit::NEAR_MISS) { - prev = curr; - prev--; - if (prev != hits.end()) { + if (curr != hits.begin()) { + prev = curr; + prev--; brep_hit &prev_hit = (*prev); if ((prev_hit.hit == brep_hit::NEAR_MISS) && (prev_hit.direction == curr_hit.direction)) { //remove current miss @@ -2043,9 +2043,9 @@ while (curr != hits.end()) { brep_hit &curr_hit = *curr; if (curr_hit.hit == brep_hit::NEAR_HIT) { - prev = curr; - prev--; - if (prev != hits.end()) { + if (curr != hits.begin()) { + prev = curr; + prev--; brep_hit &prev_hit = (*prev); if ((prev_hit.hit != brep_hit::NEAR_HIT) && (prev_hit.direction == curr_hit.direction)) { //remove current miss @@ -2070,9 +2070,9 @@ while (curr != hits.end()) { brep_hit &curr_hit = *curr; if (curr_hit.hit == brep_hit::NEAR_HIT) { - prev = curr; - prev--; - if (prev != hits.end()) { + if (curr != hits.begin()) { + prev = curr; + prev--; brep_hit &prev_hit = (*prev); if ((prev_hit.hit == brep_hit::NEAR_HIT) && (prev_hit.direction == curr_hit.direction)) { //remove current near hit This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <d_r...@us...> - 2009-07-10 09:32:07
|
Revision: 35051 http://brlcad.svn.sourceforge.net/brlcad/?rev=35051&view=rev Author: d_rossberg Date: 2009-07-10 09:32:06 +0000 (Fri, 10 Jul 2009) Log Message: ----------- fixed crash on MS Windows with brlcad.dll and nurbs_test.g Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-07-10 09:30:40 UTC (rev 35050) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-07-10 09:32:06 UTC (rev 35051) @@ -2146,7 +2146,9 @@ } i = hits.erase(i); - if (i != hits.begin()) + if (i == hits.end()) + break; + else if (i != hits.begin()) --i; continue; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ind...@us...> - 2009-07-13 02:50:04
|
Revision: 35080 http://brlcad.svn.sourceforge.net/brlcad/?rev=35080&view=rev Author: indianlarry Date: 2009-07-13 02:49:59 +0000 (Mon, 13 Jul 2009) Log Message: ----------- added adjacent face code to curve trims, also added cleanup of face hitlist for cases where multiple INs/OUTs of faces encountered Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-07-11 19:34:20 UTC (rev 35079) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-07-13 02:49:59 UTC (rev 35080) @@ -688,6 +688,7 @@ return -1; } + int orientation = brep->SolidOrientation(); bs->bvh = new BBNode(brep->BoundingBox()); /* need to extract faces, and build bounding boxes for each face, @@ -893,6 +894,7 @@ bool oob; enum hit_type hit; enum hit_direction direction; + int m_adj_face_index; // XXX - calculate the dot of the dir with the normal here! SubsurfaceBBNode const * sbv; @@ -1510,12 +1512,20 @@ ON_3dPoint _pt; ON_3dVector _norm(N[i]); _pt = ray.m_origin + (ray.m_dir*t[i]); - if (face->m_bRev) _norm.Reverse(); + if (face->m_bRev) { + //bu_log("Reversing normal for Face:%d\n",face->m_face_index); + _norm.Reverse(); + } hit_count += 1; uv[0] = ouv[i].x; uv[1] = ouv[i].y; brep_hit bh(*face,(const fastf_t*)ray.m_origin,(const fastf_t*)_pt,(const fastf_t*)_norm, uv); bh.trimmed = false; + if (trimBR != NULL) { + bh.m_adj_face_index = trimBR->m_adj_face_index; + } else { + bh.m_adj_face_index = -99; + } if (fabs(closesttrim) < BREP_EDGE_MISS_TOLERANCE) { bh.closeToEdge = true; bh.hit = brep_hit::NEAR_HIT; @@ -1536,13 +1546,21 @@ ON_3dPoint _pt; ON_3dVector _norm(N[i]); _pt = ray.m_origin + (ray.m_dir*t[i]); - if (face->m_bRev) _norm.Reverse(); + if (face->m_bRev) { + //bu_log("Reversing normal for Face:%d\n",face->m_face_index); + _norm.Reverse(); + } hit_count += 1; uv[0] = ouv[i].x; uv[1] = ouv[i].y; brep_hit bh(*face,(const fastf_t*)ray.m_origin,(const fastf_t*)_pt,(const fastf_t*)_norm, uv); bh.trimmed = true; bh.closeToEdge = true; + if (trimBR != NULL) { + bh.m_adj_face_index = trimBR->m_adj_face_index; + } else { + bh.m_adj_face_index = -99; + } bh.hit = brep_hit::NEAR_MISS; if (VDOT(ray.m_dir,_norm) < 0.0 ) bh.direction = brep_hit::ENTERING; @@ -1902,6 +1920,7 @@ if ((prev_hit.hit != brep_hit::NEAR_MISS) && (prev_hit.direction == curr_hit.direction)) { //remove current miss curr=hits.erase(curr); + curr=hits.begin(); //rewind and start again continue; } } @@ -1912,6 +1931,7 @@ if ((next_hit.hit != brep_hit::NEAR_MISS) && ( next_hit.direction == curr_hit.direction )) { //remove current miss curr=hits.erase(curr); + curr=hits.begin(); //rewind and start again continue; } } @@ -1939,6 +1959,7 @@ bu_log(")"); } #endif + // check for crack hits between adjacent faces curr = hits.begin(); while (curr != hits.end()) { brep_hit &curr_hit = *curr; @@ -1963,6 +1984,34 @@ } curr++; } + // check for CH double enter or double leave between adjacent faces(represents overlapping faces) + curr = hits.begin(); + while (curr != hits.end()) { + brep_hit &curr_hit = *curr; + if (curr_hit.hit == brep_hit::CLEAN_HIT) { + if (curr != hits.begin()) { + prev = curr; + prev--; + brep_hit &prev_hit = (*prev); + if ((prev_hit.hit == brep_hit::CLEAN_HIT) && + (prev_hit.direction == curr_hit.direction) && + (prev_hit.face.m_face_index == curr_hit.m_adj_face_index)) { + // if "entering" remove first hit if "existing" remove second hit + // until we get good solids with known normal directions assume + // first hit direction is "entering" todo check solid status and normals + HitList::iterator first = hits.begin(); + brep_hit &first_hit = *first; + if (first_hit.direction == curr_hit.direction) { // assume "entering" + curr=hits.erase(prev); + } else { // assume "exiting" + curr=hits.erase(curr); + } + continue; + } + } + } + curr++; + } #if 0 //debugging print bu_log("**** After Pass2 Hits: %d\n",hits.size()); @@ -2146,9 +2195,7 @@ } i = hits.erase(i); - if (i == hits.end()) - break; - else if (i != hits.begin()) + if (i != hits.begin()) --i; continue; @@ -2185,6 +2232,53 @@ } } } + // remove multiple "INs" in a row assume last "IN" is the actual entering hit, for + // multiple "OUTs" in a row assume first "OUT" is the actual exiting hit, remove unused + // "INs/OUTs" from hit list. + //if ((hits.size() > 0) && ( (hits.size() % 2) != 0)) { + if (hits.size() > 0) { + // we should have "valid" points now, remove duplicates or grazes + HitList::iterator last = hits.begin(); + HitList::iterator i = hits.begin(); + ++i; + int entering=1; + while (i != hits.end()) { + double lastDot = VDOT(last->normal, rp->r_dir); + double iDot = VDOT(i->normal, rp->r_dir); + + if (i == hits.begin() ) { + //take this as the entering sign for now, should be checking solid for + // inward or outward facing normals and make determination there but to + // much unsolid geom right now. + entering = sign(iDot); + } + if (sign(lastDot) == sign(iDot)) { + if (sign(iDot) == entering) { + i = hits.erase(last); + last = i; + if (i != hits.end()) + ++i; + } else { //exiting + i = hits.erase(i); + } + + } else { + last = i; + ++i; + } + } + } + + if ((hits.size() > 1) && ( (hits.size() % 2) != 0)) { + brep_hit &first_hit = hits.front(); + brep_hit &last_hit = hits.back(); + double firstDot = VDOT(first_hit.normal, rp->r_dir); + double lastDot = VDOT(last_hit.normal, rp->r_dir); + if (sign(firstDot) == sign(lastDot)) { + hits.pop_back(); + } + } + /* if (hits.size() > 1 && (hits.size() % 2) != 0) { HitList::iterator i = hits.end(); @@ -2282,6 +2376,8 @@ LINE_PLOT(rp->r_pt, ray); } #endif + all_hits.clear(); + all_hits = hits; num = 0; MissList::iterator m = misses.begin(); @@ -2360,7 +2456,56 @@ } bool hit = false; - if (hits.size() > 0) { + if (hits.size() > 1) { + if (false) { + //TRACE2("screen xy: " << ap->a_x << "," << ap->a_y); + bu_log("**** ERROR odd number of hits: %d\n",hits.size()); + bu_log("xyz %g %g %g \n", rp->r_pt[0], rp->r_pt[1], rp->r_pt[2]); + bu_log("dir %g %g %g \n", rp->r_dir[0], rp->r_dir[1], rp->r_dir[2]); + bu_log("**** Current Hits: %d\n",hits.size()); + + for (HitList::iterator i = hits.begin(); i != hits.end(); ++i) { + point_t prev; + + brep_hit &out = *i; + + if (i != hits.begin() ) { + bu_log("<%g>",DIST_PT_PT(out.point, prev)); + } + bu_log("("); + if (out.hit == brep_hit::CRACK_HIT) bu_log("_CRACK_(%d)",out.face.m_face_index); + if (out.hit == brep_hit::CLEAN_HIT) bu_log("_CH_(%d)",out.face.m_face_index); + if (out.hit == brep_hit::NEAR_HIT) bu_log("_NH_(%d)",out.face.m_face_index); + if (out.hit == brep_hit::NEAR_MISS) bu_log("_NM_(%d)",out.face.m_face_index); + if (out.direction == brep_hit::ENTERING) bu_log("+"); + if (out.direction == brep_hit::LEAVING) bu_log("-"); + VMOVE(prev,out.point); + bu_log(")"); + } + bu_log("\n**** Orig Hits: %d\n",orig.size()); + + for (HitList::iterator i = orig.begin(); i != orig.end(); ++i) { + point_t prev; + + brep_hit &out = *i; + + if (i != orig.begin() ) { + bu_log("<%g>",DIST_PT_PT(out.point, prev)); + } + bu_log("("); + if (out.hit == brep_hit::CRACK_HIT) bu_log("_CRACK_(%d)",out.face.m_face_index); + if (out.hit == brep_hit::CLEAN_HIT) bu_log("_CH_(%d)",out.face.m_face_index); + if (out.hit == brep_hit::NEAR_HIT) bu_log("_NH_(%d)",out.face.m_face_index); + if (out.hit == brep_hit::NEAR_MISS) bu_log("_NM_(%d)",out.face.m_face_index); + if (out.direction == brep_hit::ENTERING) bu_log("+"); + if (out.direction == brep_hit::LEAVING) bu_log("-"); + bu_log("<%d>",out.sbv->m_face->m_bRev); + VMOVE(prev,out.point); + bu_log(")"); + } + + bu_log("\n**********************\n"); + } //#define KODDHIT #ifdef KODDHIT //ugly debugging hack to raytrace single surface and not worry about odd hits static fastf_t diststep = 0.0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2009-08-13 15:28:03
|
Revision: 35530 http://brlcad.svn.sourceforge.net/brlcad/?rev=35530&view=rev Author: starseeker Date: 2009-08-13 15:27:54 +0000 (Thu, 13 Aug 2009) Log Message: ----------- Start adding a little of the boilerplate for brep tesselation. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-08-12 21:40:27 UTC (rev 35529) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-08-13 15:27:54 UTC (rev 35530) @@ -2581,6 +2581,19 @@ rt_brep_tess(struct nmgregion **r, struct model *m, struct rt_db_internal *ip, const struct rt_tess_tol *ttol, const struct bn_tol *tol) { return -1; + struct rt_brep_internal *bi; + + struct shell *s; + struct vertex **verts; + struct faceuse **faces; + fastf_t *norms; + struct vertex **vertp[4]; + int nfaces; + + RT_CK_DB_INTERNAL(ip); + tip = (struct rt_brep_internal *)ip->idb_ptr; + RT_BREP_CK_MAGIC(tip); + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <n_...@us...> - 2009-08-13 18:45:31
|
Revision: 35531 http://brlcad.svn.sourceforge.net/brlcad/?rev=35531&view=rev Author: n_reed Date: 2009-08-13 18:45:19 +0000 (Thu, 13 Aug 2009) Log Message: ----------- fixed typo causing compile error Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-08-13 15:27:54 UTC (rev 35530) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-08-13 18:45:19 UTC (rev 35531) @@ -2591,8 +2591,8 @@ int nfaces; RT_CK_DB_INTERNAL(ip); - tip = (struct rt_brep_internal *)ip->idb_ptr; - RT_BREP_CK_MAGIC(tip); + bi = (struct rt_brep_internal *)ip->idb_ptr; + RT_BREP_CK_MAGIC(bi); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2009-09-21 16:01:03
|
Revision: 35969 http://brlcad.svn.sourceforge.net/brlcad/?rev=35969&view=rev Author: starseeker Date: 2009-09-21 16:00:55 +0000 (Mon, 21 Sep 2009) Log Message: ----------- Add a counter to the newton iterator - there are some cases where we start out in a bad direction and then 'straighten out' - rather than quitting the iteration on the first bad directional move, give it several tries to straighten out before killing it. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-09-21 15:52:19 UTC (rev 35968) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-09-21 16:00:55 UTC (rev 35969) @@ -901,6 +901,7 @@ ON_3dVector p1, p2; double p1d = 0, p2d = 0; + int errantcount = 0; utah_ray_planes(r, p1, p1d, p2, p2d); ON_3dPoint S; @@ -952,7 +953,13 @@ oldrootdist = rootdist; rootdist = fabs(f) + fabs(g); - if (oldrootdist < rootdist) return intersects; + if (oldrootdist < rootdist) { + if (errantcount > 3) { + return intersects; + } else { + errantcount++; + } + } if (rootdist < ROOT_TOL) { if (sbv->m_u.Includes(uv.x) && sbv->m_v.Includes(uv.y)) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-09-30 01:00:55
|
Revision: 36096 http://brlcad.svn.sourceforge.net/brlcad/?rev=36096&view=rev Author: brlcad Date: 2009-09-30 01:00:48 +0000 (Wed, 30 Sep 2009) Log Message: ----------- tighten up the bounding box check considerably from 1mm to the distance tolerance. history indicates this was arbitrarily 0.02mm then 1.0mm during testing. this is actually still not quite as tight as the other prims. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-09-30 00:33:11 UTC (rev 36095) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-09-30 01:00:48 UTC (rev 36096) @@ -473,6 +473,7 @@ */ struct rt_brep_internal* bi; struct brep_specific* bs; + const struct bn_tol *tol = &rtip->rti_tol; RT_CK_DB_INTERNAL(ip); bi = (struct rt_brep_internal*)ip->idb_ptr; @@ -493,12 +494,14 @@ /* Once a proper SurfaceTree is built, finalize the bounding * volumes */ + bs->bvh->GetBBox(stp->st_min, stp->st_max); + + // expand outer bounding box just a little bit point_t adjust; - VSETALL(adjust, 1); - bs->bvh->GetBBox(stp->st_min, stp->st_max); - // expand outer bounding box... + VSETALL(adjust, tol->dist < SMALL_FASTF ? SMALL_FASTF : tol->dist); VSUB2(stp->st_min, stp->st_min, adjust); VADD2(stp->st_max, stp->st_max, adjust); + VADD2SCALE(stp->st_center, stp->st_min, stp->st_max, 0.5); vect_t work; VSUB2SCALE(work, stp->st_max, stp->st_min, 0.5); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-09-30 04:00:34
|
Revision: 36100 http://brlcad.svn.sourceforge.net/brlcad/?rev=36100&view=rev Author: brlcad Date: 2009-09-30 04:00:27 +0000 (Wed, 30 Sep 2009) Log Message: ----------- brep_build_bvh doesn't use the rt_brep_internal Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-09-30 02:58:35 UTC (rev 36099) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-09-30 04:00:27 UTC (rev 36100) @@ -411,7 +411,7 @@ int -brep_build_bvh(struct brep_specific* bs, struct rt_brep_internal* bi) +brep_build_bvh(struct brep_specific* bs) { // First, run the openNURBS validity check on the brep in question ON_TextLog tl(stderr); @@ -488,7 +488,7 @@ /* The workhorse routines of BREP prep are called by brep_build_bvh */ - if (brep_build_bvh(bs, bi) < 0) { + if (brep_build_bvh(bs) < 0) { return -1; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ind...@us...> - 2009-10-15 15:34:54
|
Revision: 36190 http://brlcad.svn.sourceforge.net/brlcad/?rev=36190&view=rev Author: indianlarry Date: 2009-10-15 15:34:42 +0000 (Thu, 15 Oct 2009) Log Message: ----------- added code to make sure UV pullback solver keeps within current node bounding UV Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-10-15 03:51:55 UTC (rev 36189) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-10-15 15:34:42 UTC (rev 36190) @@ -729,6 +729,16 @@ break; } brep_newton_iterate(surf, pr, Rcurr, su, sv, nuv, new_uv); + //push answer back to within node bounds + if (new_uv[0] < node->m_u[0]) + new_uv[0] = node->m_u[0]; + else if (new_uv[0] > node->m_u[1]) + new_uv[0] = node->m_u[1]; + else if (new_uv[1] < node->m_v[0]) + new_uv[1] = node->m_v[0]; + else if (new_uv[1] > node->m_v[1]) + new_uv[1] = node->m_v[1]; + move(nuv, new_uv); Dlast = d; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ind...@us...> - 2009-11-05 21:22:27
|
Revision: 36418 http://brlcad.svn.sourceforge.net/brlcad/?rev=36418&view=rev Author: indianlarry Date: 2009-11-05 21:22:18 +0000 (Thu, 05 Nov 2009) Log Message: ----------- Added buffer around UV pushback for loose fitting edges may not need if we can tighten the 3D edge to shared surface. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-11-05 21:07:11 UTC (rev 36417) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-11-05 21:22:18 UTC (rev 36418) @@ -729,16 +729,25 @@ break; } brep_newton_iterate(surf, pr, Rcurr, su, sv, nuv, new_uv); + //push answer back to within node bounds - if (new_uv[0] < node->m_u[0]) + double ufluff = (node->m_u[1] - node->m_u[0])*0.01; + double vfluff = (node->m_v[1] - node->m_v[0])*0.01; + if (new_uv[0] < node->m_u[0] - ufluff) new_uv[0] = node->m_u[0]; - else if (new_uv[0] > node->m_u[1]) + else if (new_uv[0] > node->m_u[1] + ufluff) new_uv[0] = node->m_u[1]; - else if (new_uv[1] < node->m_v[0]) + + if (new_uv[1] < node->m_v[0] - vfluff) new_uv[1] = node->m_v[0]; - else if (new_uv[1] > node->m_v[1]) + else if (new_uv[1] > node->m_v[1] + vfluff) new_uv[1] = node->m_v[1]; + + surf->EvNormal(new_uv[0],new_uv[1],newpt,ray.m_dir); + ray.m_dir.Reverse(); + brep_get_plane_ray(ray,pr); + move(nuv, new_uv); Dlast = d; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-12-02 06:42:05
|
Revision: 36751 http://brlcad.svn.sourceforge.net/brlcad/?rev=36751&view=rev Author: brlcad Date: 2009-12-02 06:41:57 +0000 (Wed, 02 Dec 2009) Log Message: ----------- and therein is the problem it uncovers, that there is identical code copied into brep_debug that shouldn't be duplicated. rename for now. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-12-02 06:33:16 UTC (rev 36750) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-12-02 06:41:57 UTC (rev 36751) @@ -185,7 +185,7 @@ static FILE* plot = NULL; HIDDEN FILE* -_plot_file(const char *pname = NULL) +_brep_plot_file(const char *pname = NULL) { if (plot != NULL) { (void)fclose(plot); @@ -236,23 +236,23 @@ #define BLACK 0, 0, 0 #define WHITE 255, 255, 255 -#define M_COLOR_PLOT(c) pl_color(_plot_file(), c) -#define COLOR_PLOT(r, g, b) pl_color(_plot_file(), (r), (g), (b)) +#define M_COLOR_PLOT(c) pl_color(_brep_plot_file(), c) +#define COLOR_PLOT(r, g, b) pl_color(_brep_plot_file(), (r), (g), (b)) #define M_PT_PLOT(p) { \ point_t pp, ppp; \ vect_t grow; \ VSETALL(grow, 0.01); \ VADD2(pp, p, grow); \ VSUB2(ppp, p, grow); \ - pdv_3box(_plot_file(), pp, ppp); \ + pdv_3box(_brep_plot_file(), pp, ppp); \ } #define PT_PLOT(p) { \ point_t pp; \ VSCALE(pp, p, 1.001); \ - pdv_3box(_plot_file(), p, pp); \ + pdv_3box(_brep_plot_file(), p, pp); \ } -#define LINE_PLOT(p1, p2) pdv_3move(_plot_file(), p1); pdv_3line(_plot_file(), p1, p2) -#define BB_PLOT(p1, p2) pdv_3box(_plot_file(), p1, p2) +#define LINE_PLOT(p1, p2) pdv_3move(_brep_plot_file(), p1); pdv_3line(_brep_plot_file(), p1, p2) +#define BB_PLOT(p1, p2) pdv_3box(_brep_plot_file(), p1, p2) #endif /* PLOTTING */ double @@ -1550,7 +1550,7 @@ } #ifdef KDEBUGMISS - //(void)fclose(_plot_file()); + //(void)fclose(_brep_plot_file()); // plot = NULL; #endif HitList hits = all_hits; @@ -2082,7 +2082,7 @@ // draw bounding box BB_PLOT(i->sbv->m_node.m_min, i->sbv->m_node.m_max); - fflush(_plot_file()); + fflush(_brep_plot_file()); } #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ind...@us...> - 2009-12-10 21:04:00
|
Revision: 36869 http://brlcad.svn.sourceforge.net/brlcad/?rev=36869&view=rev Author: indianlarry Date: 2009-12-10 21:03:54 +0000 (Thu, 10 Dec 2009) Log Message: ----------- Added code to push 2d UV coordinates back into domain for closed surfaces that have wrapped past the seam. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-12-10 21:00:26 UTC (rev 36868) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-12-10 21:03:54 UTC (rev 36869) @@ -662,6 +662,11 @@ getSurfacePoint(const ON_3dPoint& pt, ON_2dPoint& uv , BBNode* node) { plane_ray pr; const ON_Surface *surf = node->m_face->SurfaceOf(); + double umin, umax; + double vmin, vmax; + surf->GetDomain(0,&umin, &umax); + surf->GetDomain(1,&vmin, &vmax); + ON_3dVector dir = node->m_normal; dir.Reverse(); ON_Ray ray((ON_3dPoint&)pt, dir); @@ -690,9 +695,30 @@ } brep_newton_iterate(surf, pr, Rcurr, su, sv, nuv, new_uv); + //Check for closed surface wrap around + if (surf->IsClosed(0)) { + if (new_uv[0] < umin) { + new_uv[0] = umin; + } else if (new_uv[0] > umax) { + new_uv[0] = umax; + } + } + if (surf->IsClosed(1)) { + if (new_uv[1] < vmin) { + new_uv[1] = vmin; + } else if (new_uv[1] > vmax) { + new_uv[1] = vmax; + } + } +#ifdef HOOD //push answer back to within node bounds double ufluff = (node->m_u[1] - node->m_u[0])*0.01; double vfluff = (node->m_v[1] - node->m_v[0])*0.01; +#else + //push answer back to within node bounds + double ufluff = 0.0; + double vfluff = 0.0; +#endif if (new_uv[0] < node->m_u[0] - ufluff) new_uv[0] = node->m_u[0]; else if (new_uv[0] > node->m_u[1] + ufluff) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2010-02-19 20:30:02
|
Revision: 37694 http://brlcad.svn.sourceforge.net/brlcad/?rev=37694&view=rev Author: starseeker Date: 2010-02-19 20:29:35 +0000 (Fri, 19 Feb 2010) Log Message: ----------- Need to fix IsValid test for extended openNURBS geometry (trims crossing seams is allowed in BRL-CAD now) Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2010-02-19 20:11:27 UTC (rev 37693) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2010-02-19 20:29:35 UTC (rev 37694) @@ -305,7 +305,7 @@ // First, run the openNURBS validity check on the brep in question ON_TextLog tl(stderr); ON_Brep* brep = bs->brep; - if (brep == NULL || !brep->IsValid(&tl)) { + if (brep == NULL /*|| !brep->IsValid(&tl)*/) { bu_log("brep is NOT valid"); return -1; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2010-02-19 22:05:26
|
Revision: 37695 http://brlcad.svn.sourceforge.net/brlcad/?rev=37695&view=rev Author: starseeker Date: 2010-02-19 22:05:20 +0000 (Fri, 19 Feb 2010) Log Message: ----------- Go ahead and run the validity test, but don't hault if it fails. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2010-02-19 20:29:35 UTC (rev 37694) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2010-02-19 22:05:20 UTC (rev 37695) @@ -305,9 +305,11 @@ // First, run the openNURBS validity check on the brep in question ON_TextLog tl(stderr); ON_Brep* brep = bs->brep; - if (brep == NULL /*|| !brep->IsValid(&tl)*/) { - bu_log("brep is NOT valid"); + if (brep == NULL) { + bu_log("NULL Brep"); return -1; + } else { + if (!brep->IsValid(&tl)) bu_log("brep is NOT valid\n"); } /* May want to do something about setting orientation? not used, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2010-03-14 16:27:35
|
Revision: 38034 http://brlcad.svn.sourceforge.net/brlcad/?rev=38034&view=rev Author: starseeker Date: 2010-03-14 16:27:26 +0000 (Sun, 14 Mar 2010) Log Message: ----------- size_t in use here - if we're now good with size_t, hopefully we can use %zu? Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2010-03-14 16:24:07 UTC (rev 38033) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2010-03-14 16:27:26 UTC (rev 38034) @@ -1679,7 +1679,7 @@ } ///////////// near hit end if (false) { //((hits.size() % 2) != 0) { - bu_log("**** After Pass3 Hits: %d\n", hits.size()); + bu_log("**** After Pass3 Hits: %zu\n", hits.size()); for (HitList::iterator i = hits.begin(); i != hits.end(); ++i) { point_t prev; @@ -1699,7 +1699,7 @@ VMOVE(prev, out.point); bu_log(")"); } - bu_log("\n**** Orig Hits: %d\n", orig.size()); + bu_log("\n**** Orig Hits: %zu\n", orig.size()); for (HitList::iterator i = orig.begin(); i != orig.end(); ++i) { point_t prev; @@ -2074,10 +2074,10 @@ hit = true; } else { //TRACE2("screen xy: " << ap->a_x << ", " << ap->a_y); - bu_log("**** ERROR odd number of hits: %d\n", hits.size()); + bu_log("**** ERROR odd number of hits: %zu\n", hits.size()); bu_log("xyz %g %g %g \n", rp->r_pt[0], rp->r_pt[1], rp->r_pt[2]); bu_log("dir %g %g %g \n", rp->r_dir[0], rp->r_dir[1], rp->r_dir[2]); - bu_log("**** Current Hits: %d\n", hits.size()); + bu_log("**** Current Hits: %zu\n", hits.size()); for (HitList::iterator i = hits.begin(); i != hits.end(); ++i) { point_t prev; @@ -2097,7 +2097,7 @@ VMOVE(prev, out.point); bu_log(")"); } - bu_log("\n**** Orig Hits: %d\n", orig.size()); + bu_log("\n**** Orig Hits: %zu\n", orig.size()); for (HitList::iterator i = orig.begin(); i != orig.end(); ++i) { point_t prev; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ind...@us...> - 2010-04-01 18:25:55
|
Revision: 38289 http://brlcad.svn.sourceforge.net/brlcad/?rev=38289&view=rev Author: indianlarry Date: 2010-04-01 18:25:47 +0000 (Thu, 01 Apr 2010) Log Message: ----------- Commented out "Prepping Face N:..." blather from brep prep. Also if brep is loaded with something other than an identity matrix push matrix down brep using opennurbs brep->Transform(). Modified Paths: -------------- brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2010-04-01 01:28:15 UTC (rev 38288) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2010-04-01 18:25:47 UTC (rev 38289) @@ -336,7 +336,9 @@ ON_BrepFaceArray& faces = brep->m_F; for (int i = 0; i < faces.Count(); i++) { ON_BrepFace& face = faces[i]; - bu_log("Prepping Face: %d of %d\n", i+1, faces.Count()); + /* + * bu_log("Prepping Face: %d of %d\n", i+1, faces.Count()); + */ SurfaceTree* st = new SurfaceTree(&face); face.m_face_user.p = st; bs->bvh->addChild(st->getRootNode()); @@ -2746,10 +2748,6 @@ ON::Begin(); TRACE1("rt_brep_import5"); - if (mat) { - bu_log("Importing with a matrix, but don't know what to do with it.. fix me in %s:%d\n", __FILE__, __LINE__); - } - struct rt_brep_internal* bi; if (dbip) RT_CK_DBI(dbip); BU_CK_EXTERNAL(ep); @@ -2773,6 +2771,21 @@ // XXX does openNURBS force us to copy? it seems the answer is // YES due to the const-ness bi->brep = ON_Brep::New(*ON_Brep::Cast(mo.m_object)); + if (mat) { + ON_Xform xform(mat); + + if (!xform.IsIdentity()) { + bu_log("Applying transformation matrix....\n"); + for(int row=0;row<4;row++) { + bu_log("%d - ", row); + for(int col=0;col<4;col++) { + bu_log(" %5f", xform.m_xform[row][col]); + } + bu_log("\n"); + } + bi->brep->Transform(xform); + } + } return 0; } else { return -1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |