Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/freestyle')
-rwxr-xr-xsource/blender/freestyle/intern/application/Controller.cpp1
-rwxr-xr-xsource/blender/freestyle/intern/view_map/FEdgeXDetector.cpp36
-rwxr-xr-xsource/blender/freestyle/intern/view_map/FEdgeXDetector.h3
-rwxr-xr-xsource/blender/freestyle/intern/view_map/ViewMapBuilder.cpp24
-rwxr-xr-xsource/blender/freestyle/intern/view_map/ViewMapBuilder.h2
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);
}