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:
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp20
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h11
-rw-r--r--source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp4
-rwxr-xr-xsource/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp41
-rwxr-xr-xsource/blender/freestyle/intern/view_map/ViewMapBuilder.cpp10
5 files changed, 77 insertions, 9 deletions
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
index 114dd1bc7e2..6efa80431fc 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
+++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
@@ -21,8 +21,20 @@ NodeGroup* BlenderFileLoader::Load()
cout << "\n=== Importing triangular meshes into Blender ===" << endl;
- // creation of the scene root node
- _Scene = new NodeGroup;
+ // creation of the scene root node
+ _Scene = new NodeGroup;
+
+ _viewplane_left= _re->viewplane.xmin;
+ _viewplane_right= _re->viewplane.xmax;
+ _viewplane_bottom= _re->viewplane.ymin;
+ _viewplane_top= _re->viewplane.ymax;
+ _z_near= _re->clipsta;
+ _z_far= _re->clipend;
+#if 0
+ cout << "frustrum: l " << _viewplane_left << " r " << _viewplane_right
+ << " b " << _viewplane_bottom << " t " << _viewplane_top
+ << " n " << _z_near << " f " << _z_far << endl;
+#endif
int id = 0;
for(obi= (ObjectInstanceRen *) _re->instancetable.first; obi; obi=obi->next) {
@@ -37,8 +49,8 @@ NodeGroup* BlenderFileLoader::Load()
cout << " Sorry, only vlak-based shapes are supported." << endl;
}
- //Returns the built scene.
- return _Scene;
+ //Returns the built scene.
+ return _Scene;
}
void BlenderFileLoader::insertShapeNode(ObjectRen *obr, int id)
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h
index 8068eaf1bcf..29acbfc203f 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h
+++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h
@@ -55,9 +55,14 @@ protected:
protected:
Render* _re;
SceneRenderLayer* _srl;
- NodeGroup* _Scene;
- unsigned _numFacesRead;
- real _minEdgeSize;
+ NodeGroup* _Scene;
+ unsigned _numFacesRead;
+ real _minEdgeSize;
+ float _viewplane_left;
+ float _viewplane_right;
+ float _viewplane_bottom;
+ float _viewplane_top;
+ float _z_near, _z_far;
};
#endif // BLENDER_FILE_LOADER_H
diff --git a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
index 393cd1b2dd9..4ef3abe54d8 100644
--- a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
+++ b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
@@ -19,6 +19,7 @@ extern "C" {
#include "BKE_main.h"
#include "BLI_blenlib.h"
+#include "BLI_math.h"
#include "BPY_extern.h"
#include "renderpipeline.h"
@@ -106,6 +107,9 @@ extern "C" {
for( int i = 0; i < 4; i++ )
for( int j = 0; j < 4; j++ )
freestyle_proj[i][j] = re->winmat[i][j];
+
+ //print_m4("mv", freestyle_mv);
+ //print_m4("proj", freestyle_proj);
}
diff --git a/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp b/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp
index ecb0a4979f0..bb9ef5d574b 100755
--- a/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp
+++ b/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp
@@ -155,6 +155,7 @@ real SilhouetteGeomEngine::ImageToWorldParameter(FEdge *fe, real t)
// we need to compute for each parameter t the corresponding
// parameter T which gives the intersection in 3D.
+#if 0
//currentEdge = (*fe);
Vec3r A = (fe)->vertexA()->point3D();
Vec3r B = (fe)->vertexB()->point3D();
@@ -175,6 +176,46 @@ real SilhouetteGeomEngine::ImageToWorldParameter(FEdge *fe, real t)
real T;
T = (Ic[2]*Ac[1] - Ic[1]*Ac[2])/(Ic[1]*(Bc[2]-Ac[2])-Ic[2]*(Bc[1]-Ac[1]));
+#else
+ // suffix w for world, i for image
+ Vec3r Aw = (fe)->vertexA()->point3D();
+ Vec3r Bw = (fe)->vertexB()->point3D();
+ Vec3r Ai = (fe)->vertexA()->point2D();
+ Vec3r Bi = (fe)->vertexB()->point2D();
+ Vec3r Ii = Ai + t * (Bi - Ai); // the intersection point in 2D
+ Vec3r Pw, Pi;
+ real T_sta = 0.0;
+ real T_end = 1.0;
+ real T;
+ real delta_x, delta_y, dist, dist_threshold = 1e-6;
+ int i, max_iters = 100;
+ for (i = 0; i < max_iters; i++) {
+ T = T_sta + 0.5 * (T_end - T_sta);
+ Pw = Aw + T * (Bw - Aw);
+ GeomUtils::fromWorldToImage(Pw, Pi, _transform, _viewport);
+ delta_x = Ii[0] - Pi[0];
+ delta_y = Ii[1] - Pi[1];
+ dist = sqrt(delta_x * delta_x + delta_y * delta_y);
+ if (dist < dist_threshold)
+ break;
+ if (Ai[0] < Bi[0]) {
+ if (Pi[0] < Ii[0])
+ T_sta = T;
+ else
+ T_end = T;
+ } else {
+ if (Pi[0] > Ii[0])
+ T_sta = T;
+ else
+ T_end = T;
+ }
+ }
+#if 0
+ printf("SilhouetteGeomEngine::ImageToWorldParameter(): #iters = %d, dist = %e\n", i, dist);
+#endif
+ if (i == max_iters)
+ printf("SilhouetteGeomEngine::ImageToWorldParameter(): reached to max_iters (dist = %e)\n", dist);
+#endif
return T;
}
diff --git a/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp b/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp
index 3a4d86ea16f..9c7a084c204 100755
--- a/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp
+++ b/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp
@@ -946,14 +946,20 @@ void ViewMapBuilder::ComputeSweepLineIntersections(ViewMap *ioViewMap, real epsi
real tb = (*i)->tB;
if((ta < -epsilon) || (ta > 1+epsilon))
- cerr << "Warning: intersection out of range for edge " << fA->vertexA()->getId() << " - " << fA->vertexB()->getId() << endl;
+ cerr << "Warning: 2D intersection out of range for edge " << fA->vertexA()->getId() << " - " << fA->vertexB()->getId() << endl;
if((tb < -epsilon) || (tb > 1+epsilon))
- cerr << "Warning: intersection out of range for edge " << fB->vertexA()->getId() << " - " << fB->vertexB()->getId() << endl;
+ cerr << "Warning: 2D intersection out of range for edge " << fB->vertexA()->getId() << " - " << fB->vertexB()->getId() << endl;
real Ta = SilhouetteGeomEngine::ImageToWorldParameter(fA, ta);
real Tb = SilhouetteGeomEngine::ImageToWorldParameter(fB, tb);
+ if((Ta < -epsilon) || (Ta > 1+epsilon))
+ cerr << "Warning: 3D intersection out of range for edge " << fA->vertexA()->getId() << " - " << fA->vertexB()->getId() << endl;
+
+ if((Tb < -epsilon) || (Tb > 1+epsilon))
+ cerr << "Warning: 3D intersection out of range for edge " << fB->vertexA()->getId() << " - " << fB->vertexB()->getId() << endl;
+
TVertex * tvertex = ioViewMap->CreateTVertex(Vec3r(A1 + Ta*(A2-A1)), Vec3r(a1 + ta*(a2-a1)), fA,
Vec3r(B1 + Tb*(B2-B1)), Vec3r(b1 + tb*(b2-b1)), fB, id);