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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2008-01-17 02:08:19 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2008-01-17 02:08:19 +0300
commit4e4e69050c3bedd2e9378beaddc4305e42da411e (patch)
tree55d523bf2f1ef1824f9b9ecb05691ebad90a264a /source/blender/blenkernel/intern/anim.c
parent77a6809bd7a66a29d2a679c410c27a681b556d74 (diff)
Dupli Bugfixes!
It seems everytime I try to fix something here I break something else, but anyway, another try at getting this to work properly. Fixes for: - Getting dupliverts/faces derivedmesh with orco caused wrong results on meshes in linked dupligroups with proxy, because modifier stack was revaluated with wrong object matrix, now gets orco another way. - Fix render instances being hidden when original object was not added to the object render list. - Changed the way object instances find their original objects, now works the other way around, original objects look for their instances instead. There's probably issues still with recursive dupligroups..
Diffstat (limited to 'source/blender/blenkernel/intern/anim.c')
-rw-r--r--source/blender/blenkernel/intern/anim.c36
1 files changed, 20 insertions, 16 deletions
diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c
index 933cf1f2e3b..a776f2eab80 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -65,6 +65,7 @@
#include "BKE_key.h"
#include "BKE_lattice.h"
#include "BKE_main.h"
+#include "BKE_mesh.h"
#include "BKE_object.h"
#include "BKE_particle.h"
#include "BKE_utildefines.h"
@@ -423,6 +424,7 @@ static void vertex_dupli__mapFunc(void *userData, int index, float *co, float *n
static void vertex_duplilist(ListBase *lb, ID *id, Object *par, float par_space_mat[][4], int level)
{
Object *ob, *ob_iter;
+ Mesh *me;
Base *base = NULL;
float vec[3], no[3], pmat[4][4];
int lay, totvert, a, oblay;
@@ -431,23 +433,22 @@ static void vertex_duplilist(ListBase *lb, ID *id, Object *par, float par_space_
Scene *sce = NULL;
Group *group = NULL;
GroupObject * go = NULL;
- CustomDataMask dataMask = CD_MASK_BAREMESH;
Mat4CpyMat4(pmat, par->obmat);
/* simple preventing of too deep nested groups */
if(level>MAX_DUPLI_RECUR) return;
- if(G.rendering)
- dataMask |= CD_MASK_ORCO;
-
if(par==G.obedit)
- dm= editmesh_get_derived_cage(dataMask);
+ dm= editmesh_get_derived_cage(CD_MASK_BAREMESH);
else
- dm= mesh_get_derived_deform(par, dataMask);
+ dm= mesh_get_derived_deform(par, CD_MASK_BAREMESH);
- if(G.rendering)
- vdd.orco= dm->getVertDataArray(dm, CD_ORCO);
+ if(G.rendering) {
+ me= par->data;
+ vdd.orco= (float(*)[3])get_mesh_orco_verts(par);
+ transform_mesh_orco_verts(me, vdd.orco, me->totvert, 0);
+ }
else
vdd.orco= NULL;
@@ -521,6 +522,8 @@ static void vertex_duplilist(ListBase *lb, ID *id, Object *par, float par_space_
else go= go->next; /* group loop */
}
+ if(vdd.orco)
+ MEM_freeN(vdd.orco);
dm->release(dm);
}
@@ -534,25 +537,21 @@ static void face_duplilist(ListBase *lb, ID *id, Object *par, float par_space_ma
MTFace *mtface;
MFace *mface;
MVert *mvert;
- float pmat[4][4], imat[3][3], (*orco)[3], w;
+ float pmat[4][4], imat[3][3], (*orco)[3] = NULL, w;
int lay, oblay, totface, a;
Scene *sce = NULL;
Group *group = NULL;
GroupObject *go = NULL;
- CustomDataMask dataMask = CD_MASK_BAREMESH;
float ob__obmat[4][4]; /* needed for groups where the object matrix needs to be modified */
/* simple preventing of too deep nested groups */
if(level>MAX_DUPLI_RECUR) return;
- if(G.rendering)
- dataMask |= CD_MASK_ORCO;
-
Mat4CpyMat4(pmat, par->obmat);
if(par==G.obedit) {
int totvert;
- dm= editmesh_get_derived_cage(dataMask);
+ dm= editmesh_get_derived_cage(CD_MASK_BAREMESH);
totface= dm->getNumFaces(dm);
mface= MEM_mallocN(sizeof(MFace)*totface, "mface temp");
@@ -562,7 +561,7 @@ static void face_duplilist(ListBase *lb, ID *id, Object *par, float par_space_ma
dm->copyVertArray(dm, mvert);
}
else {
- dm = mesh_get_derived_deform(par, dataMask);
+ dm = mesh_get_derived_deform(par, CD_MASK_BAREMESH);
totface= dm->getNumFaces(dm);
mface= dm->getFaceArray(dm);
@@ -571,7 +570,9 @@ static void face_duplilist(ListBase *lb, ID *id, Object *par, float par_space_ma
if(G.rendering) {
me= (Mesh*)par->data;
- orco= dm->getVertDataArray(dm, CD_ORCO);
+
+ orco= (float(*)[3])get_mesh_orco_verts(par);
+ transform_mesh_orco_verts(me, orco, me->totvert, 0);
mtface= me->mtface;
}
else {
@@ -711,6 +712,9 @@ static void face_duplilist(ListBase *lb, ID *id, Object *par, float par_space_ma
MEM_freeN(mface);
MEM_freeN(mvert);
}
+
+ if(orco)
+ MEM_freeN(orco);
dm->release(dm);
}