diff options
Diffstat (limited to 'source/blender/freestyle')
5 files changed, 55 insertions, 11 deletions
diff --git a/source/blender/freestyle/intern/application/Controller.cpp b/source/blender/freestyle/intern/application/Controller.cpp index 46f45f139fe..ad48b30d744 100755 --- a/source/blender/freestyle/intern/application/Controller.cpp +++ b/source/blender/freestyle/intern/application/Controller.cpp @@ -450,6 +450,7 @@ void Controller::ComputeViewMap() _Chrono.start(); edgeDetector.setViewpoint(Vec3r(vp)); + edgeDetector.enableOrthographicProjection(proj[3][3] != 0.0); edgeDetector.enableRidgesAndValleysFlag(_ComputeRidges); edgeDetector.enableSuggestiveContours(_ComputeSuggestive); edgeDetector.setSphereRadius(_sphereRadius); diff --git a/source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp b/source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp index d7086e4baff..0551fd3ac15 100755 --- a/source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp +++ b/source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp @@ -129,14 +129,23 @@ void FEdgeXDetector::preProcessFace(WXFace *iFace){ Vec3r N = iFace->GetNormal(); // Compute the dot product between V (=_Viewpoint - firstPoint) and N: - Vec3r V(_Viewpoint - firstPoint); + Vec3r V; + if (_orthographicProjection) { + V = Vec3r(0.0, 0.0, _Viewpoint.z() - firstPoint.z()); + } else { + V = Vec3r(_Viewpoint - firstPoint); + } N.normalize(); V.normalize(); iFace->setDotP(N * V); // compute the distance between the face center and the viewpoint: - Vec3r dist_vec(iFace->center() - _Viewpoint); - iFace->setZ(dist_vec.norm()); + if (_orthographicProjection) { + iFace->setZ(iFace->center().z() - _Viewpoint.z()); + } else { + Vec3r dist_vec(iFace->center() - _Viewpoint); + iFace->setZ(dist_vec.norm()); + } } void FEdgeXDetector::computeCurvatures(WXVertex *vertex){ @@ -181,7 +190,11 @@ void FEdgeXDetector::computeCurvatures(WXVertex *vertex){ // compute radial curvature : n = C->e1 ^ C->e2; - v = _Viewpoint - vertex->GetVertex(); + if (_orthographicProjection) { + v = Vec3r(0.0, 0.0, _Viewpoint.z() - vertex->GetVertex().z()); + } else { + v = Vec3r(_Viewpoint - vertex->GetVertex()); + } C->er = v - (v * n) * n; C->er.normalize(); e1 = C->e1; @@ -243,14 +256,23 @@ void FEdgeXDetector::ProcessSilhouetteFace(WXFace *iFace) for(int i=0; i<numVertices; i++){ point = iFace->GetVertex(i)->GetVertex(); normal = iFace->GetVertexNormal(i); - Vec3r V(_Viewpoint - point); normal.normalize(); + Vec3r V; + if (_orthographicProjection) { + V = Vec3r(0.0, 0.0, _Viewpoint.z() - point.z()); + } else { + V = Vec3r(_Viewpoint - point); + } V.normalize(); real d = normal * V; faceLayer->PushDotP(d); // Find the point the closest to the viewpoint - Vec3r dist_vec(point - _Viewpoint); - dist = dist_vec.norm(); + if (_orthographicProjection) { + dist = point.z() - _Viewpoint.z(); + } else { + Vec3r dist_vec(point - _Viewpoint); + dist = dist_vec.norm(); + } if(dist < minDist) { minDist = dist; closestPointId = i; diff --git a/source/blender/freestyle/intern/view_map/FEdgeXDetector.h b/source/blender/freestyle/intern/view_map/FEdgeXDetector.h index 5e6788c6ff8..28034f3f42b 100755 --- a/source/blender/freestyle/intern/view_map/FEdgeXDetector.h +++ b/source/blender/freestyle/intern/view_map/FEdgeXDetector.h @@ -56,6 +56,7 @@ public: _computeRidgesAndValleys = true; _computeSuggestiveContours = true; _sphereRadius = 1.0; + _orthographicProjection = false; _changes = false; _kr_derivative_epsilon = 0.0; } @@ -107,6 +108,7 @@ public: /*! Sets the current viewpoint */ inline void setViewpoint(const Vec3r& ivp) {_Viewpoint = ivp;} + inline void enableOrthographicProjection(bool b) {_orthographicProjection = b;} inline void enableRidgesAndValleysFlag(bool b) {_computeRidgesAndValleys = b;} inline void enableSuggestiveContours(bool b) {_computeSuggestiveContours = b;} /*! Sets the radius of the geodesic sphere around each vertex (for the curvature computation) @@ -136,6 +138,7 @@ protected: real _maxKr; unsigned _nPoints; real _meanEdgeSize; + bool _orthographicProjection; bool _computeRidgesAndValleys; bool _computeSuggestiveContours; diff --git a/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp b/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp index 9c7a084c204..585d44d9c28 100755 --- a/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp +++ b/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp @@ -103,7 +103,12 @@ void ViewMapBuilder::computeCusps(ViewMap *ioViewMap){ Vec3r m((A+B)/2.0); Vec3r crossP(AB^(fes)->normal()); crossP.normalize(); - Vec3r viewvector(m-_viewpoint); + Vec3r viewvector; + if (_orthographicProjection) { + viewvector = Vec3r(0.0, 0.0, m.z()-_viewpoint.z()); + } else { + viewvector = Vec3r(m-_viewpoint); + } viewvector.normalize(); if(first){ if(((crossP)*(viewvector)) > 0) @@ -583,7 +588,12 @@ void ViewMapBuilder::FindOccludee(FEdge *fe, Grid* iGrid, real epsilon, Polygon3 A = Vec3r(((fe)->vertexA()->point3D() + (fe)->vertexB()->point3D())/2.0); edge = Vec3r((fe)->vertexB()->point3D()-(fe)->vertexA()->point3D()); origin = Vec3r((fe)->vertexA()->point3D()); - Vec3r u(_viewpoint-A); + Vec3r u; + if (_orthographicProjection) { + u = Vec3r(0.0, 0.0, _viewpoint.z()-A.z()); + } else { + u = Vec3r(_viewpoint-A); + } u.normalize(); if(A < iGrid->getOrigin()) cerr << "Warning: point is out of the grid for fedge " << fe->getId().getFirst() << "-" << fe->getId().getSecond() << endl; @@ -637,13 +647,19 @@ int ViewMapBuilder::ComputeRayCastingVisibility(FEdge *fe, Grid* iGrid, real eps // //return 0; // } - Vec3r u(_viewpoint - center); + Vec3r vp; + if (_orthographicProjection) { + vp = Vec3r(center.x(), center.y(), _viewpoint.z()); + } else { + vp = Vec3r(_viewpoint); + } + Vec3r u(vp - center); real raylength = u.norm(); u.normalize(); //cout << "grid origin " << iGrid->getOrigin().x() << "," << iGrid->getOrigin().y() << "," << iGrid->getOrigin().z() << endl; //cout << "center " << center.x() << "," << center.y() << "," << center.z() << endl; - iGrid->castRay(center, Vec3r(_viewpoint), occluders, timestamp); + iGrid->castRay(center, vp, occluders, timestamp); WFace *face = 0; if(fe->isSmooth()){ diff --git a/source/blender/freestyle/intern/view_map/ViewMapBuilder.h b/source/blender/freestyle/intern/view_map/ViewMapBuilder.h index 5ac100bae15..aad9aa245b7 100755 --- a/source/blender/freestyle/intern/view_map/ViewMapBuilder.h +++ b/source/blender/freestyle/intern/view_map/ViewMapBuilder.h @@ -58,6 +58,7 @@ private: //SilhouetteGeomEngine _GeomEngine; ProgressBar *_pProgressBar; Vec3r _viewpoint; + bool _orthographicProjection; Grid* _Grid; ViewEdgeXBuilder *_pViewEdgeBuilder; bool _EnableQI; @@ -129,6 +130,7 @@ public: real iFocalLength, real iAspect, real iFovy) { + _orthographicProjection = (iProjectionMatrix[3][3] != 0.0); SilhouetteGeomEngine::setTransform(iModelViewMatrix, iProjectionMatrix, iViewport, iFocalLength); } |