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:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2010-02-01 01:56:19 +0300
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2010-02-01 01:56:19 +0300
commit107667d20a15593f5c94437cc57fe786bcb92f7a (patch)
tree996e7c61419c8e4927ceae5bc39625c969843273 /source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp
parente307cb1c8c636a5c9290feaeb58b8f5c22072d43 (diff)
Added support for orthographic camera.
The FEdgeXDetector class for silhouette edge detection and the ViewMapBuilder class for view map creation are enhanced. All changes are related to view point handling (i.e., the camera location). In the perspective projection, the visibility of feature edges and edge types (e.g., borders and crease lines) are computed based on a fixed view point, whereas the view point in the orthographic projection is an arbitrary point on the XY plane at the origin and is determined so that a line segment from the view point to a point in the 3D space is perpendicular to the XY plane. All view point related portions of the class definitions were modified so as to deal with the two different camera modes.
Diffstat (limited to 'source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp')
-rwxr-xr-xsource/blender/freestyle/intern/view_map/FEdgeXDetector.cpp36
1 files changed, 29 insertions, 7 deletions
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;