- Ifc: minor code cleanup.

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@1306 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
pull/6/merge
aramis_acg 2012-10-16 20:55:19 +00:00
parent 11a22b671b
commit 39d13faf9a
1 changed files with 15 additions and 17 deletions

View File

@ -1349,8 +1349,8 @@ void CleanupWindowContours(std::vector< std::vector<IfcVector2> >& contours)
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
void CleanupOuterContour(const std::vector<IfcVector2>& contour_flat, TempMesh& curmesh, void CleanupOuterContour(const std::vector<IfcVector2>& contour_flat, TempMesh& curmesh,
const IfcMatrix3& minv, const IfcMatrix3& minv,
const IfcVector2& vmin, const IfcVector2& scale,
const IfcVector2& vmax, const IfcVector2& offset,
IfcFloat coord, IfcFloat coord,
const std::vector<IfcVector2>& outflat) const std::vector<IfcVector2>& outflat)
{ {
@ -1398,8 +1398,8 @@ void CleanupOuterContour(const std::vector<IfcVector2>& contour_flat, TempMesh&
iold.push_back(ex.outer.size()); iold.push_back(ex.outer.size());
BOOST_FOREACH(const ClipperLib::IntPoint& point, ex.outer) { BOOST_FOREACH(const ClipperLib::IntPoint& point, ex.outer) {
vold.push_back( minv * IfcVector3( vold.push_back( minv * IfcVector3(
vmin.x + from_int64(point.X) * vmax.x, offset.x + from_int64(point.X) * scale.x,
vmin.y + from_int64(point.Y) * vmax.y, offset.y + from_int64(point.Y) * scale.y,
coord)); coord));
} }
} }
@ -1419,7 +1419,7 @@ void CleanupOuterContour(const std::vector<IfcVector2>& contour_flat, TempMesh&
iold.resize(outflat.size()/4,4); iold.resize(outflat.size()/4,4);
BOOST_FOREACH(const IfcVector2& vproj, outflat) { BOOST_FOREACH(const IfcVector2& vproj, outflat) {
const IfcVector3 v3 = minv * IfcVector3(vmin.x + vproj.x * vmax.x, vmin.y + vproj.y * vmax.y,coord); const IfcVector3 v3 = minv * IfcVector3(offset.x + vproj.x * scale.x, offset.y + vproj.y * scale.y,coord);
vold.push_back(v3); vold.push_back(v3);
} }
} }
@ -1452,7 +1452,7 @@ bool TryAddOpenings_Quadrulate(const std::vector<TempOpening>& openings,
// Move all points into the new coordinate system, collecting min/max verts on the way // Move all points into the new coordinate system, collecting min/max verts on the way
BOOST_FOREACH(IfcVector3& x, out) { BOOST_FOREACH(IfcVector3& x, out) {
const IfcVector3 vv = m * x; const IfcVector3& vv = m * x;
// keep Z offset in the plane coordinate system. Ignoring precision issues // keep Z offset in the plane coordinate system. Ignoring precision issues
// (which are present, of course), this should be the same value for // (which are present, of course), this should be the same value for
@ -1464,7 +1464,6 @@ bool TryAddOpenings_Quadrulate(const std::vector<TempOpening>& openings,
// if(coord != -1.0f) { // if(coord != -1.0f) {
// assert(fabs(coord - vv.z) < 1e-3f); // assert(fabs(coord - vv.z) < 1e-3f);
// } // }
coord = vv.z; coord = vv.z;
vmin = std::min(IfcVector2(vv.x, vv.y), vmin); vmin = std::min(IfcVector2(vv.x, vv.y), vmin);
vmax = std::max(IfcVector2(vv.x, vv.y), vmax); vmax = std::max(IfcVector2(vv.x, vv.y), vmax);
@ -1474,7 +1473,7 @@ bool TryAddOpenings_Quadrulate(const std::vector<TempOpening>& openings,
// With the current code in DerivePlaneCoordinateSpace, // With the current code in DerivePlaneCoordinateSpace,
// vmin,vmax should always be the 0...1 rectangle (+- numeric inaccuracies) // vmin,vmax should always be the 0...1 rectangle (+- numeric inaccuracies)
// but here we won't rely on this. // but here we really need this to be accurate, so normalize again.
vmax -= vmin; vmax -= vmin;
BOOST_FOREACH(IfcVector2& vv, contour_flat) { BOOST_FOREACH(IfcVector2& vv, contour_flat) {
@ -1482,16 +1481,13 @@ bool TryAddOpenings_Quadrulate(const std::vector<TempOpening>& openings,
vv.y = (vv.y - vmin.y) / vmax.y; vv.y = (vv.y - vmin.y) / vmax.y;
} }
// project all points into the coordinate system defined by the p+sv*tu plane // project all openings into the coordinate system defined by the p+sv*tu plane
// and compute bounding boxes for them // and compute bounding boxes for them
std::vector< BoundingBox > bbs; std::vector< BoundingBox > bbs;
std::vector< std::vector<IfcVector2> > contours; std::vector< std::vector<IfcVector2> > contours;
size_t c = 0; size_t c = 0;
BOOST_FOREACH(const TempOpening& t,openings) { BOOST_FOREACH(const TempOpening& t,openings) {
const IfcVector3& outernor = nors[c++];
const IfcFloat dot = nor * outernor;
std::vector<IfcVector3> profile_verts = t.profileMesh->verts; std::vector<IfcVector3> profile_verts = t.profileMesh->verts;
std::vector<unsigned int> profile_vertcnts = t.profileMesh->vertcnt; std::vector<unsigned int> profile_vertcnts = t.profileMesh->vertcnt;
if(profile_verts.size() <= 2) { if(profile_verts.size() <= 2) {
@ -1501,6 +1497,8 @@ bool TryAddOpenings_Quadrulate(const std::vector<TempOpening>& openings,
IfcVector2 vpmin,vpmax; IfcVector2 vpmin,vpmax;
MinMaxChooser<IfcVector2>()(vpmin,vpmax); MinMaxChooser<IfcVector2>()(vpmin,vpmax);
// the opening meshes are real 3D meshes so skip over all faces
// clearly facing into the wrong direction.
std::vector<IfcVector2> contour; std::vector<IfcVector2> contour;
for (size_t f = 0, vi_total = 0, fend = profile_vertcnts.size(); f < fend; ++f) { for (size_t f = 0, vi_total = 0, fend = profile_vertcnts.size(); f < fend; ++f) {
@ -1516,7 +1514,7 @@ bool TryAddOpenings_Quadrulate(const std::vector<TempOpening>& openings,
for (unsigned int vi = 0, vend = profile_vertcnts[f]; vi < vend; ++vi, ++vi_total) { for (unsigned int vi = 0, vend = profile_vertcnts[f]; vi < vend; ++vi, ++vi_total) {
const IfcVector3& x = profile_verts[vi_total]; const IfcVector3& x = profile_verts[vi_total];
const IfcVector3 v = m * x; const IfcVector3& v = m * x;
IfcVector2 vv(v.x, v.y); IfcVector2 vv(v.x, v.y);
// rescale // rescale
@ -1563,7 +1561,7 @@ bool TryAddOpenings_Quadrulate(const std::vector<TempOpening>& openings,
break; break;
} }
else { else {
IFCImporter::LogDebug("merging oberlapping openings, this should not happen"); IFCImporter::LogDebug("merging overlapping openings, this should not happen");
contour.clear(); contour.clear();
BOOST_FOREACH(const ClipperLib::IntPoint& point, poly[0].outer) { BOOST_FOREACH(const ClipperLib::IntPoint& point, poly[0].outer) {
@ -1581,7 +1579,7 @@ bool TryAddOpenings_Quadrulate(const std::vector<TempOpening>& openings,
++it; ++it;
} }
if(contour.size()) { if(!contour.empty()) {
contours.push_back(contour); contours.push_back(contour);
bbs.push_back(bb); bbs.push_back(bb);
} }
@ -1604,10 +1602,10 @@ bool TryAddOpenings_Quadrulate(const std::vector<TempOpening>& openings,
QuadrifyPart(IfcVector2(0.f,0.f),IfcVector2(1.f,1.f),field,bbs,outflat); QuadrifyPart(IfcVector2(0.f,0.f),IfcVector2(1.f,1.f),field,bbs,outflat);
ai_assert(!(outflat.size() % 4)); ai_assert(!(outflat.size() % 4));
CleanupOuterContour(contour_flat, curmesh, minv, vmin, vmax, coord, outflat); CleanupOuterContour(contour_flat, curmesh, minv, vmax, vmin, coord, outflat);
CleanupWindowContours(contours); CleanupWindowContours(contours);
InsertWindowContours(bbs,contours,openings, minv,vmax, vmin, coord, curmesh); InsertWindowContours(bbs,contours,openings, minv,vmax, vmin, coord, curmesh);
return true; return true;
} }