Revision: 26410
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26410
Author: kjym3
Date: 2010-01-30 02:36:12 +0100 (Sat, 30 Jan 2010)
Log Message:
-----------
Improvements of mesh importing.
Previously mesh vertices imported from vlak nodes were transformed
from the camera coordinate system to the object local coordinate
system. This causes a difficulty in recovering object local vertices
when mesh deforming modifiers (e.g., curve, cloth, and soft body) have
been applied. Now the view map creation is done based on mesh
vertices in the camera coordinate system. Advantages of this approach
includes: 1) faster mesh importing because of less matrix-based
transformations; and 2) proper handling of meshes with deforming
modifiers.
Modified Paths:
--------------
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
Modified:
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
===================================================================
---
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
2010-01-30 01:25:02 UTC (rev 26409)
+++
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
2010-01-30 01:36:12 UTC (rev 26410)
@@ -207,32 +207,10 @@
void BlenderFileLoader::insertShapeNode(ObjectRen *obr, int id)
{
+ // We parse vlak nodes and count the number of faces after the clipping
by
+ // the near and far view planes is applied (Note: mesh vertices are in
the
+ // camera coordinate system).
VlakRen *vlr;
-
- // Mesh *mesh = (Mesh *)ob->data;
- //---------------------
- // mesh => obr
-
- // We invert the matrix in order to be able to retrieve the shape's
coordinates in its local coordinates system (origin is the iNode pivot)
- // Lib3dsMatrix M;
- // lib3ds_matrix_copy(M, mesh->matrix);
- // lib3ds_matrix_inv(M);
- //---------------------
- // M allows to recover world coordinates from camera coordinates
- // M => obr->ob->imat * obr->obmat (multiplication from left to right)
- float M[4][4];
- mul_m4_m4m4(M, obr->ob->imat, obr->ob->obmat);
-
- // We compute a normal per vertex and manages the smoothing of the
shape:
- // Lib3dsVector
*normalL=(Lib3dsVector*)malloc(3*sizeof(Lib3dsVector)*mesh->faces);
- // lib3ds_mesh_calculate_normals(mesh, normalL);
- // mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mface,
mesh->totface, NULL);
- //---------------------
- // already calculated and availabe in vlak ?
-// printf("%s\n", obr->ob->id.name + 2);
-
- // We build the rep:
- IndexedFaceSet *rep;
unsigned numFaces = 0;
int clip_1[3], clip_2[3];
for(int a=0; a < obr->totvlak; a++) {
@@ -250,6 +228,7 @@
if (numFaces == 0)
return;
+ // We allocate memory for the meshes to be imported
NodeTransform *currentMesh = new NodeTransform;
NodeShape * shape = new NodeShape;
@@ -283,11 +262,9 @@
ls.currentMIndex = 0;
FrsMaterial tmpMat;
-
- // we want to find the min and max coordinates as we build the rep.
- // We initialize the min and max values whith the first vertex.
- //lib3ds_vector_transform(pvtmp, M,
mesh->pointL[mesh->faceL[0].points[0]].pos);
+ // We parse the vlak nodes again and import meshes while applying the
clipping
+ // by the near and far view planes.
int p;
for(p=0; p < obr->totvlak; ++p) // we parse the faces of the mesh
{
@@ -344,10 +321,6 @@
if (numTris_1 > 0) {
clipTriangle(numTris_1, triCoords, vlr->v1,
vlr->v2, vlr->v3, clip_1);
- for (i = 0; i < 2 + numTris_1; i++) {
- mul_m4_v3(M, triCoords[i]); // camera
to world
-// printf("%d %f, %f, %f\n", i,
triCoords[i][0], triCoords[i][1], triCoords[i][2]);
- }
for (i = 0; i < numTris_1; i++) {
addTriangle(&ls, triCoords[0],
triCoords[i+1], triCoords[i+2]);
_numFacesRead++;
@@ -356,10 +329,6 @@
if (numTris_2 > 0) {
clipTriangle(numTris_2, triCoords, vlr->v1,
vlr->v3, vlr->v4, clip_2);
- for (i = 0; i < 2 + numTris_2; i++) {
- mul_m4_v3(M, triCoords[i]); // camera
to world
-// printf("%d %f, %f, %f\n", i,
triCoords[i][0], triCoords[i][1], triCoords[i][2]);
- }
for (i = 0; i < numTris_2; i++) {
addTriangle(&ls, triCoords[0],
triCoords[i+1], triCoords[i+2]);
_numFacesRead++;
@@ -406,6 +375,7 @@
delete [] NIndices;
// Create the IndexedFaceSet with the retrieved attributes
+ IndexedFaceSet *rep;
rep = new IndexedFaceSet(cleanVertices, cvSize,
cleanNormals, cnSize,
marray, meshFrsMaterials.size(),
Modified:
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
===================================================================
---
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
2010-01-30 01:25:02 UTC (rev 26409)
+++
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
2010-01-30 01:36:12 UTC (rev 26410)
@@ -94,16 +94,17 @@
}
void init_camera(Render* re){
- Object* maincam_obj = re->scene->camera;
- // Camera *cam = (Camera*) maincam_obj->data;
+ // It is assumed that imported meshes are in the camera
coordinate system.
+ // Therefore, the view point (i.e., camera position) is at the
origin, and
+ // the the model-view matrix is simply the identity matrix.
+
+ freestyle_viewpoint[0] = 0.0;
+ freestyle_viewpoint[1] = 0.0;
+ freestyle_viewpoint[2] = 0.0;
- freestyle_viewpoint[0] = maincam_obj->obmat[3][0];
- freestyle_viewpoint[1] = maincam_obj->obmat[3][1];
- freestyle_viewpoint[2] = maincam_obj->obmat[3][2];
-
for( int i = 0; i < 4; i++ )
for( int j = 0; j < 4; j++ )
- freestyle_mv[i][j] = re->viewmat[i][j];
+ freestyle_mv[i][j] = (i == j) ? 1.0 : 0.0;
for( int i = 0; i < 4; i++ )
for( int j = 0; j < 4; j++ )
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs