Whoa! I get what the derivedmesh is about! :P

Fixed bugreport on crashing vertex duplicators in editmode. Apparently it
was not coded with new mesh/modifier support. And now it does, quite fun!

One day picture for quick people:
http://www.blender.org/bf/rt.jpg

Daniel; could you check the commit diff below?
This commit is contained in:
Ton Roosendaal
2005-10-11 22:10:17 +00:00
parent 7e09c71c8b
commit d85bbbdf20

View File

@@ -325,24 +325,56 @@ void frames_duplilist(Object *ob)
do_ob_ipo(ob);
}
struct vertexDupliData {
float pmat[4][4];
Object *ob, *par;
};
static void vertex_dupli__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
{
struct vertexDupliData *vdd= userData;
Object *newob;
float vec[3], *q2, mat[3][3], tmat[4][4];
VECCOPY(vec, co);
Mat4MulVecfl(vdd->pmat, vec);
VecSubf(vec, vec, vdd->pmat[3]);
VecAddf(vec, vec, vdd->ob->obmat[3]);
newob= new_dupli_object(&duplilist, vdd->ob, vdd->par);
VECCOPY(newob->obmat[3], vec);
if(vdd->par->transflag & OB_DUPLIROT) {
vec[0]= -no_f[0]; vec[1]= -no_f[1]; vec[2]= -no_f[2];
q2= vectoquat(vec, vdd->ob->trackflag, vdd->ob->upflag);
QuatToMat3(q2, mat);
Mat4CpyMat4(tmat, newob->obmat);
Mat4MulMat43(newob->obmat, tmat, mat);
}
}
void vertex_duplilist(Scene *sce, Object *par)
{
Object *ob, *newob;
Object *ob;
Base *base;
float vec[3], pmat[4][4], mat[3][3], tmat[4][4];
float *q2;
float vec[3], no[3], pmat[4][4];
int lay, totvert, a;
int dmNeedsFree;
DerivedMesh *dm;
Mat4CpyMat4(pmat, par->obmat);
Mat4One(tmat);
lay= G.scene->lay;
dm = mesh_get_derived_deform(par, &dmNeedsFree);
if(par==G.obedit)
dm= editmesh_get_derived_cage(&dmNeedsFree);
else
dm = mesh_get_derived_deform(par, &dmNeedsFree);
totvert = dm->getNumVerts(dm);
base= sce->base.first;
@@ -352,31 +384,28 @@ void vertex_duplilist(Scene *sce, Object *par)
ob= base->object->parent;
while(ob) {
if(ob==par) {
struct vertexDupliData vdd;
ob= base->object;
vdd.ob= ob;
vdd.par= par;
Mat4CpyMat4(vdd.pmat, pmat);
/* mballs have a different dupli handling */
if(ob->type!=OB_MBALL) ob->flag |= OB_DONE; /* doesnt render */
for(a=0; a<totvert; a++) {
dm->getVertCo(dm, a, vec);
Mat4MulVecfl(pmat, vec);
VecSubf(vec, vec, pmat[3]);
VecAddf(vec, vec, ob->obmat[3]);
newob= new_dupli_object(&duplilist, ob, par);
VECCOPY(newob->obmat[3], vec);
if(par->transflag & OB_DUPLIROT) {
dm->getVertNo(dm, a, vec);
vec[0]= -vec[0]; vec[1]= -vec[1]; vec[2]= -vec[2];
if(par==G.obedit) {
dm->foreachMappedVert(dm, vertex_dupli__mapFunc, (void*) &vdd);
}
else {
for(a=0; a<totvert; a++) {
dm->getVertCo(dm, a, vec);
dm->getVertNo(dm, a, no);
q2= vectoquat(vec, ob->trackflag, ob->upflag);
QuatToMat3(q2, mat);
Mat4CpyMat4(tmat, newob->obmat);
Mat4MulMat43(newob->obmat, tmat, mat);
vertex_dupli__mapFunc(&vdd, a, vec, no, NULL);
}
}
break;
}
ob= ob->parent;