From 3ab974ca583806d7f814f3d797b0498c84152f97 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Sun, 17 Jul 2005 09:49:02 +0000 Subject: [PATCH] Bugfix #2836 Crash in Vertex-duplicator when there's an empty Mesh. Simply added check for dm pointer. :) --- source/blender/blenkernel/intern/anim.c | 63 +++++++++++++------------ 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index e7a33c1ca92..d96f5a957a9 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -342,48 +342,49 @@ void vertex_duplilist(Scene *sce, Object *par) lay= G.scene->lay; dm = mesh_get_derived_deform(par, &dmNeedsFree); - totvert = dm->getNumVerts(dm); + if(dm) { + totvert = dm->getNumVerts(dm); - base= sce->base.first; - while(base) { + base= sce->base.first; + while(base) { - if(base->object->type>0 && (lay & base->lay) && G.obedit!=base->object) { - ob= base->object->parent; - while(ob) { - if(ob==par) { - ob= base->object; - /* mballs have a different dupli handling */ - if(ob->type!=OB_MBALL) ob->flag |= OB_DONE; /* doesnt render */ + if(base->object->type>0 && (lay & base->lay) && G.obedit!=base->object) { + ob= base->object->parent; + while(ob) { + if(ob==par) { + ob= base->object; + /* mballs have a different dupli handling */ + if(ob->type!=OB_MBALL) ob->flag |= OB_DONE; /* doesnt render */ - for(a=0; agetVertCo(dm, a, vec); + for(a=0; agetVertCo(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]; + Mat4MulVecfl(pmat, vec); + VecSubf(vec, vec, pmat[3]); + VecAddf(vec, vec, ob->obmat[3]); - q2= vectoquat(vec, ob->trackflag, ob->upflag); - - QuatToMat3(q2, mat); - Mat4CpyMat4(tmat, newob->obmat); - Mat4MulMat43(newob->obmat, tmat, mat); + 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]; + + q2= vectoquat(vec, ob->trackflag, ob->upflag); + + QuatToMat3(q2, mat); + Mat4CpyMat4(tmat, newob->obmat); + Mat4MulMat43(newob->obmat, tmat, mat); + } } + break; } - break; + ob= ob->parent; } - ob= ob->parent; } + base= base->next; } - base= base->next; } - if (dmNeedsFree) dm->release(dm); }