forked from bartvdbraak/blender
- split mesh_deform off from object_deform
- changed mesh_modifier, sbObjectStep, object_deform to take vertexCo argument instead of operating on mesh - fixed bug where a derived mesh would not be returned in editmode - removed object_wave, replaced by init_wave_deform and calc_wave_deform - moved cached DerivedMesh to Object, not Mesh... fixes heisenbugs with linked objects
This commit is contained in:
parent
8962195f21
commit
09b5272639
@ -40,7 +40,6 @@
|
||||
|
||||
struct Object;
|
||||
struct ListBase;
|
||||
struct MVert;
|
||||
struct bDeformGroup;
|
||||
|
||||
void copy_defgroups (struct ListBase *lb1, struct ListBase *lb2);
|
||||
@ -51,7 +50,7 @@ int get_defgroup_num (struct Object *ob, struct bDeformGroup *dg);
|
||||
void hook_object_deform(struct Object *ob, int index, float *vec);
|
||||
|
||||
int curve_modifier(struct Object *ob, char mode);
|
||||
void mesh_modifier(struct Object *ob, struct MVert **mvert_r);
|
||||
void mesh_modifier(struct Object *ob, float (**vertexCos_r)[3]);
|
||||
int lattice_modifier(struct Object *ob, char mode);
|
||||
|
||||
|
||||
|
@ -58,8 +58,8 @@ void particle_tex(struct MTex *mtex, struct PartEff *paf, float *co, float *no);
|
||||
void make_particle_keys(int depth, int nr, struct PartEff *paf, struct Particle *part, float *force, int deform, struct MTex *mtex, unsigned int par_layer);
|
||||
void init_mv_jit(float *jit, int num,int seed2);
|
||||
void build_particle_system(struct Object *ob);
|
||||
void init_wave_deform(struct WaveEff *wav);
|
||||
void calc_wave_deform(struct WaveEff *wav, float ctime, float *co);
|
||||
int object_wave(struct Object *ob);
|
||||
|
||||
/* particle deflector */
|
||||
#define PE_WIND_AS_SPEED 0x00000001
|
||||
|
@ -50,6 +50,7 @@ void calc_lat_fudu(int flag, int res, float *fu, float *du);
|
||||
void init_latt_deform(struct Object *oblatt, struct Object *ob);
|
||||
void calc_latt_deform(float *co);
|
||||
void end_latt_deform(void);
|
||||
int mesh_deform(struct Object *ob, float (*vertexCos)[3]);
|
||||
int object_deform(struct Object *ob);
|
||||
struct BPoint *latt_bp(struct Lattice *lt, int u, int v, int w);
|
||||
void outside_lattice(struct Lattice *lt);
|
||||
|
@ -56,8 +56,10 @@ extern struct SoftBody *sbNew(void);
|
||||
/* frees internal data and softbody itself */
|
||||
extern void sbFree(struct SoftBody *sb);
|
||||
|
||||
/* go one step in simulation, copy result in displist vertices */
|
||||
extern void sbObjectStep(struct Object *ob, float framnr);
|
||||
/* go one step in simulation, copy result in vertexCos for meshes, or
|
||||
* directly for lattices.
|
||||
*/
|
||||
extern void sbObjectStep(struct Object *ob, float framnr, float (*vertexCos)[3]);
|
||||
|
||||
/* makes totally fresh start situation, resets time */
|
||||
extern void sbObjectToSoftbody(struct Object *ob);
|
||||
|
@ -71,7 +71,7 @@ typedef struct {
|
||||
MVert *verts;
|
||||
float *nors;
|
||||
|
||||
int freeNors;
|
||||
int freeNors, freeVerts;
|
||||
} MeshDerivedMesh;
|
||||
|
||||
static DispListMesh *meshDM_convertToDispListMesh(DerivedMesh *dm)
|
||||
@ -446,7 +446,7 @@ static void meshDM_release(DerivedMesh *dm)
|
||||
MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
|
||||
|
||||
if (mdm->freeNors) MEM_freeN(mdm->nors);
|
||||
if (mdm->verts!=((Mesh*) mdm->me)->mvert) MEM_freeN(mdm->verts);
|
||||
if (mdm->freeVerts) MEM_freeN(mdm->verts);
|
||||
MEM_freeN(mdm);
|
||||
}
|
||||
|
||||
@ -505,6 +505,7 @@ static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, float (*vertCos)[3]
|
||||
mdm->verts = me->mvert;
|
||||
mdm->nors = NULL;
|
||||
mdm->freeNors = 0;
|
||||
mdm->freeVerts = 0;
|
||||
|
||||
if (vertCos) {
|
||||
int i;
|
||||
@ -517,6 +518,7 @@ static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, float (*vertCos)[3]
|
||||
}
|
||||
mesh_calc_normals(mdm->verts, me->totvert, me->mface, me->totface, &mdm->nors);
|
||||
mdm->freeNors = 1;
|
||||
mdm->freeVerts = 1;
|
||||
} else {
|
||||
mdm->nors = mesh_build_faceNormals(ob);
|
||||
mdm->freeNors = 1;
|
||||
@ -1018,22 +1020,7 @@ static void mesh_calc_modifiers(Mesh *me, Object *ob, float (*inputVertexCos)[3]
|
||||
*final_r = NULL;
|
||||
|
||||
if (useDeform && ob) {
|
||||
MVert *deformedMVerts;
|
||||
|
||||
mesh_modifier(ob, &deformedMVerts);
|
||||
if (deformedMVerts) {
|
||||
int i;
|
||||
|
||||
deformedVerts = MEM_mallocN(sizeof(*deformedVerts)*me->totvert, "deformedverts");
|
||||
|
||||
for (i=0; i<me->totvert; i++) {
|
||||
VECCOPY(deformedVerts[i], deformedMVerts[i].co);
|
||||
}
|
||||
|
||||
MEM_freeN(deformedMVerts);
|
||||
} else {
|
||||
deformedVerts = NULL;
|
||||
}
|
||||
mesh_modifier(ob, &deformedVerts);
|
||||
|
||||
if (deform_r) *deform_r = getMeshDerivedMesh(me, ob, deformedVerts);
|
||||
} else {
|
||||
@ -1053,22 +1040,70 @@ static void mesh_calc_modifiers(Mesh *me, Object *ob, float (*inputVertexCos)[3]
|
||||
|
||||
/***/
|
||||
|
||||
static void clear_and_build_mesh_data(Object *ob, int mustBuildForMesh)
|
||||
{
|
||||
float min[3], max[3];
|
||||
Mesh *me= ob->data;
|
||||
|
||||
if(ob->flag&OB_FROMDUPLI) return; // XXX is this needed
|
||||
|
||||
/* also serves as signal to remake texspace */
|
||||
if (me->bb) {
|
||||
MEM_freeN(me->bb);
|
||||
me->bb = NULL;
|
||||
}
|
||||
|
||||
freedisplist(&ob->disp);
|
||||
|
||||
if (ob->derivedFinal) {
|
||||
ob->derivedFinal->release(ob->derivedFinal);
|
||||
ob->derivedFinal= NULL;
|
||||
}
|
||||
if (ob->derivedDeform) {
|
||||
ob->derivedDeform->release(ob->derivedDeform);
|
||||
ob->derivedDeform= NULL;
|
||||
}
|
||||
|
||||
if (ob==G.obedit) {
|
||||
G.editMesh->derived= subsurf_make_derived_from_editmesh(G.editMesh, me->subdiv, me->subsurftype, G.editMesh->derived);
|
||||
}
|
||||
|
||||
if (ob!=G.obedit || mustBuildForMesh) {
|
||||
mesh_calc_modifiers(ob->data, ob, NULL, &ob->derivedDeform, &ob->derivedFinal, 0, 1);
|
||||
|
||||
INIT_MINMAX(min, max);
|
||||
|
||||
ob->derivedFinal->getMinMax(ob->derivedFinal, min, max);
|
||||
|
||||
boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max);
|
||||
|
||||
build_particle_system(ob);
|
||||
}
|
||||
}
|
||||
|
||||
void makeDispListMesh(Object *ob)
|
||||
{
|
||||
clear_and_build_mesh_data(ob, 0);
|
||||
}
|
||||
|
||||
/***/
|
||||
|
||||
DerivedMesh *mesh_get_derived_final(Object *ob, int *needsFree_r)
|
||||
{
|
||||
Mesh *me = ob->data;
|
||||
|
||||
if (!me->derived) {
|
||||
makeDispListMesh(ob);
|
||||
if (!ob->derivedFinal) {
|
||||
clear_and_build_mesh_data(ob, 1);
|
||||
}
|
||||
|
||||
*needsFree_r = 0;
|
||||
return me->derived;
|
||||
return ob->derivedFinal;
|
||||
}
|
||||
|
||||
DerivedMesh *mesh_get_derived_deform(Object *ob, int *needsFree_r)
|
||||
{
|
||||
if (!ob->derivedDeform) {
|
||||
makeDispListMesh(ob);
|
||||
clear_and_build_mesh_data(ob, 1);
|
||||
}
|
||||
|
||||
*needsFree_r = 0;
|
||||
@ -1141,46 +1176,3 @@ DerivedMesh *editmesh_get_derived_cage(int *needsFree_r)
|
||||
|
||||
return dm;
|
||||
}
|
||||
|
||||
/***/
|
||||
|
||||
void makeDispListMesh(Object *ob)
|
||||
{
|
||||
MVert *deformedMVerts = NULL;
|
||||
float min[3], max[3];
|
||||
Mesh *me;
|
||||
|
||||
if(ob->flag&OB_FROMDUPLI) return; // XXX is this needed
|
||||
me= ob->data;
|
||||
|
||||
/* also serves as signal to remake texspace */
|
||||
if (me->bb) {
|
||||
MEM_freeN(me->bb);
|
||||
me->bb = NULL;
|
||||
}
|
||||
|
||||
freedisplist(&ob->disp);
|
||||
|
||||
if (me->derived) {
|
||||
me->derived->release(me->derived);
|
||||
me->derived= NULL;
|
||||
}
|
||||
if (ob->derivedDeform) {
|
||||
ob->derivedDeform->release(ob->derivedDeform);
|
||||
ob->derivedDeform= NULL;
|
||||
}
|
||||
|
||||
if (ob==G.obedit) {
|
||||
G.editMesh->derived= subsurf_make_derived_from_editmesh(G.editMesh, me->subdiv, me->subsurftype, G.editMesh->derived);
|
||||
} else {
|
||||
mesh_calc_modifiers(ob->data, ob, NULL, &ob->derivedDeform, &me->derived, 0, 1);
|
||||
|
||||
INIT_MINMAX(min, max);
|
||||
|
||||
me->derived->getMinMax(me->derived, min, max);
|
||||
|
||||
boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max);
|
||||
|
||||
build_particle_system(ob);
|
||||
}
|
||||
}
|
||||
|
@ -275,6 +275,7 @@ static Object *new_dupli_object(ListBase *lb, Object *ob, Object *par)
|
||||
Object *newob;
|
||||
|
||||
newob= MEM_mallocN(sizeof(Object), "newobj dupli");
|
||||
|
||||
memcpy(newob, ob, sizeof(Object));
|
||||
newob->flag |= OB_FROMDUPLI;
|
||||
newob->id.newid= (ID *)par; /* store duplicator */
|
||||
|
@ -227,14 +227,14 @@ void hook_object_deform(Object *ob, int index, float *vec)
|
||||
}
|
||||
|
||||
|
||||
void mesh_modifier(Object *ob, MVert **mvert_r)
|
||||
void mesh_modifier(Object *ob, float (**vertexCos_r)[3])
|
||||
{
|
||||
MVert *origMVert=NULL;
|
||||
Mesh *me= ob->data;
|
||||
MVert *mv;
|
||||
int a, done=0;
|
||||
float (*vertexCos)[3];
|
||||
|
||||
*mvert_r = NULL;
|
||||
*vertexCos_r = NULL;
|
||||
|
||||
do_mesh_key(me);
|
||||
|
||||
@ -248,7 +248,10 @@ void mesh_modifier(Object *ob, MVert **mvert_r)
|
||||
|
||||
if(me->totvert==0) return;
|
||||
|
||||
origMVert= MEM_dupallocN(me->mvert);
|
||||
vertexCos = MEM_mallocN(sizeof(*vertexCos)*me->totvert, "vertexcos");
|
||||
for (a=0; a<me->totvert; a++) {
|
||||
VECCOPY(vertexCos[a], me->mvert[a].co);
|
||||
}
|
||||
|
||||
/* hooks */
|
||||
if(ob->hooks.first) {
|
||||
@ -257,29 +260,46 @@ void mesh_modifier(Object *ob, MVert **mvert_r)
|
||||
/* NULL signals initialize */
|
||||
hook_object_deform(ob, 0, NULL);
|
||||
|
||||
for(a=0, mv= me->mvert; a<me->totvert; a++, mv++) {
|
||||
hook_object_deform(ob, a, mv->co);
|
||||
for(a=0; a<me->totvert; a++) {
|
||||
hook_object_deform(ob, a, vertexCos[a]);
|
||||
}
|
||||
}
|
||||
|
||||
if(ob->effect.first) done |= object_wave(ob);
|
||||
if(ob->effect.first) {
|
||||
WaveEff *wav;
|
||||
float ctime = bsystem_time(ob, 0, (float)G.scene->r.cfra, 0.0);
|
||||
int a;
|
||||
|
||||
for (wav= ob->effect.first; wav; wav= wav->next) {
|
||||
if(wav->type==EFF_WAVE) {
|
||||
init_wave_deform(wav);
|
||||
|
||||
for(a=0; a<me->totvert; a++) {
|
||||
calc_wave_deform(wav, ctime, vertexCos[a]);
|
||||
}
|
||||
|
||||
done = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if((ob->softflag & OB_SB_ENABLE) && !(ob->softflag & OB_SB_POSTDEF)) {
|
||||
done= 1;
|
||||
sbObjectStep(ob, (float)G.scene->r.cfra);
|
||||
sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos);
|
||||
}
|
||||
|
||||
/* object_deform: output for mesh is in mesh->mvert */
|
||||
done |= object_deform(ob);
|
||||
done |= mesh_deform(ob, vertexCos);
|
||||
|
||||
if((ob->softflag & OB_SB_ENABLE) && (ob->softflag & OB_SB_POSTDEF)) {
|
||||
done= 1;
|
||||
sbObjectStep(ob, (float)G.scene->r.cfra);
|
||||
sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos);
|
||||
}
|
||||
|
||||
if (done) {
|
||||
*mvert_r = me->mvert;
|
||||
me->mvert = origMVert;
|
||||
*vertexCos_r = vertexCos;
|
||||
} else {
|
||||
MEM_freeN(vertexCos_r);
|
||||
}
|
||||
}
|
||||
|
||||
@ -390,7 +410,7 @@ int lattice_modifier(Object *ob, char mode)
|
||||
}
|
||||
|
||||
if((ob->softflag & OB_SB_ENABLE)) {
|
||||
sbObjectStep(ob, (float)G.scene->r.cfra);
|
||||
sbObjectStep(ob, (float)G.scene->r.cfra, NULL);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1418,6 +1418,11 @@ void build_particle_system(Object *ob)
|
||||
|
||||
/* ************* WAVE **************** */
|
||||
|
||||
void init_wave_deform(WaveEff *wav) {
|
||||
wav->minfac= (float)(1.0/exp(wav->width*wav->narrow*wav->width*wav->narrow));
|
||||
if(wav->damp==0) wav->damp= 10.0f;
|
||||
}
|
||||
|
||||
void calc_wave_deform(WaveEff *wav, float ctime, float *co)
|
||||
{
|
||||
/* co is in local coords */
|
||||
@ -1467,51 +1472,6 @@ void calc_wave_deform(WaveEff *wav, float ctime, float *co)
|
||||
}
|
||||
}
|
||||
|
||||
/* return 1 if deformed
|
||||
Note: it works on mvert now, so assumes to be callied in modifier stack \
|
||||
*/
|
||||
int object_wave(Object *ob)
|
||||
{
|
||||
WaveEff *wav;
|
||||
Mesh *me;
|
||||
MVert *mvert;
|
||||
float ctime;
|
||||
int a;
|
||||
|
||||
/* is there a wave */
|
||||
wav= ob->effect.first;
|
||||
while(wav) {
|
||||
if(wav->type==EFF_WAVE) break;
|
||||
wav= wav->next;
|
||||
}
|
||||
if(wav==NULL) return 0;
|
||||
|
||||
if(ob->type==OB_MESH) {
|
||||
|
||||
ctime= bsystem_time(ob, 0, (float)G.scene->r.cfra, 0.0);
|
||||
|
||||
me= ob->data;
|
||||
|
||||
wav= ob->effect.first;
|
||||
while(wav) {
|
||||
if(wav->type==EFF_WAVE) {
|
||||
|
||||
/* precalculate */
|
||||
wav->minfac= (float)(1.0/exp(wav->width*wav->narrow*wav->width*wav->narrow));
|
||||
if(wav->damp==0) wav->damp= 10.0f;
|
||||
|
||||
mvert= me->mvert;
|
||||
|
||||
for(a=0; a<me->totvert; a++, mvert++) {
|
||||
calc_wave_deform(wav, ctime, mvert->co);
|
||||
}
|
||||
}
|
||||
wav= wav->next;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int SoftBodyDetectCollision(float opco[3], float npco[3], float colco[3],
|
||||
float facenormal[3], float *damp, float force[3], int mode,
|
||||
float cur_time, unsigned int par_layer,struct Object *vertexowner)
|
||||
|
@ -516,70 +516,79 @@ static void calc_curve_deform(Object *par, float *co, short axis, CurveDeform *c
|
||||
|
||||
}
|
||||
|
||||
/* Mesh now applies on mesh itself, others do displist */
|
||||
int object_deform(Object *ob)
|
||||
int mesh_deform(Object *ob, float (*vertexCos)[3])
|
||||
{
|
||||
Mesh *me;
|
||||
Curve *cu;
|
||||
DispList *dl;
|
||||
MVert *mvert;
|
||||
float *fp;
|
||||
int a, tot, flag;
|
||||
Mesh *me = ob->data;
|
||||
int a;
|
||||
|
||||
if(ob->parent==NULL) return 0;
|
||||
if(ob->parent==NULL || ob->type!=OB_MESH || !me->totvert) return 0;
|
||||
|
||||
/* always try to do the entire deform in this function: apply! */
|
||||
|
||||
if(ob->parent->type==OB_CURVE) {
|
||||
if(ob->parent->type==OB_CURVE && ob->partype==PARSKEL) {
|
||||
Curve *cu = ob->parent->data;
|
||||
int flag = cu->flag;
|
||||
CurveDeform cd;
|
||||
|
||||
if (ob->partype != PARSKEL){
|
||||
return 0;
|
||||
}
|
||||
cu= ob->parent->data;
|
||||
flag= cu->flag;
|
||||
cu->flag |= (CU_PATH|CU_FOLLOW); // needed for path & bevlist
|
||||
|
||||
if(ob->type==OB_MESH) {
|
||||
|
||||
me= ob->data;
|
||||
if(me->totvert==0) return 0;
|
||||
|
||||
/* init deform */
|
||||
init_curve_deform(ob->parent, ob, &cd);
|
||||
|
||||
/* transformation to curve space, and min max*/
|
||||
INIT_MINMAX(cd.dmin, cd.dmax);
|
||||
|
||||
for(a=0, mvert=me->mvert; a<me->totvert; a++, mvert++) {
|
||||
Mat4MulVecfl(cd.curvespace, mvert->co);
|
||||
DO_MINMAX(mvert->co, cd.dmin, cd.dmax);
|
||||
for(a=0; a<me->totvert; a++) {
|
||||
Mat4MulVecfl(cd.curvespace, vertexCos[a]);
|
||||
DO_MINMAX(vertexCos[a], cd.dmin, cd.dmax);
|
||||
}
|
||||
|
||||
mvert= me->mvert;
|
||||
for(a=0; a<me->totvert; a++, mvert++) {
|
||||
calc_curve_deform(ob->parent, mvert->co, ob->trackflag, &cd);
|
||||
/* move coord back to objectspace */
|
||||
Mat4MulVecfl(cd.objectspace, mvert->co);
|
||||
for(a=0; a<me->totvert; a++) {
|
||||
calc_curve_deform(ob->parent, vertexCos[a], ob->trackflag, &cd);
|
||||
Mat4MulVecfl(cd.objectspace, vertexCos[a]); /* move coord back to objectspace */
|
||||
}
|
||||
}
|
||||
/* restore */
|
||||
|
||||
cu->flag = flag;
|
||||
|
||||
return 1;
|
||||
}
|
||||
else if(ob->parent->type==OB_LATTICE) {
|
||||
init_latt_deform(ob->parent, ob);
|
||||
if(ob->type==OB_MESH) {
|
||||
for(a=0; a<me->totvert; a++) {
|
||||
calc_latt_deform(vertexCos[a]);
|
||||
}
|
||||
}
|
||||
end_latt_deform();
|
||||
|
||||
return 1;
|
||||
}
|
||||
else if(ob->parent->type==OB_ARMATURE && ob->partype==PARSKEL) {
|
||||
if (ob->parent==G.obedit) // misleading making displists... very bad
|
||||
return 1;
|
||||
|
||||
init_armature_deform (ob->parent, ob);
|
||||
|
||||
for(a=0; a<me->totvert; a++) {
|
||||
calc_armature_deform(ob->parent, vertexCos[a], a);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int object_deform(Object *ob)
|
||||
{
|
||||
Curve *cu;
|
||||
DispList *dl;
|
||||
float *fp;
|
||||
int a, tot;
|
||||
|
||||
if(ob->parent==NULL) return 0;
|
||||
|
||||
if(ob->parent->type==OB_LATTICE) {
|
||||
init_latt_deform(ob->parent, ob);
|
||||
|
||||
if(ob->type==OB_MESH) {
|
||||
me= ob->data;
|
||||
|
||||
mvert= me->mvert;
|
||||
for(a=0; a<me->totvert; a++, mvert++) {
|
||||
calc_latt_deform(mvert->co);
|
||||
}
|
||||
}
|
||||
else if(ob->type==OB_MBALL) {
|
||||
if(ob->type==OB_MBALL) {
|
||||
dl=ob->disp.first;
|
||||
while(dl) {
|
||||
fp = dl->verts;
|
||||
@ -609,31 +618,6 @@ int object_deform(Object *ob)
|
||||
end_latt_deform();
|
||||
return 1;
|
||||
}
|
||||
else if(ob->parent->type==OB_ARMATURE) {
|
||||
if (ob->partype != PARSKEL)
|
||||
return 0;
|
||||
|
||||
if (ob->parent==G.obedit) // misleading making displists... very bad
|
||||
return 1;
|
||||
|
||||
init_armature_deform (ob->parent, ob);
|
||||
|
||||
switch (ob->type){
|
||||
case OB_MESH:
|
||||
me= ob->data;
|
||||
|
||||
mvert= me->mvert;
|
||||
for(a=0; a<me->totvert; a++, mvert++) {
|
||||
calc_armature_deform(ob->parent, mvert->co, a);
|
||||
}
|
||||
break;
|
||||
case OB_CURVE:
|
||||
case OB_SURF:
|
||||
break;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -136,7 +136,6 @@ void unlink_mesh(Mesh *me)
|
||||
/* do not free mesh itself */
|
||||
void free_mesh(Mesh *me)
|
||||
{
|
||||
|
||||
unlink_mesh(me);
|
||||
|
||||
if(me->mvert) MEM_freeN(me->mvert);
|
||||
@ -151,7 +150,6 @@ void free_mesh(Mesh *me)
|
||||
if(me->mat) MEM_freeN(me->mat);
|
||||
|
||||
if(me->bb) MEM_freeN(me->bb);
|
||||
if(me->derived) me->derived->release(me->derived);
|
||||
}
|
||||
|
||||
void copy_dverts(MDeformVert *dst, MDeformVert *src, int copycount)
|
||||
@ -238,7 +236,6 @@ Mesh *copy_mesh(Mesh *me)
|
||||
men->key= copy_key(me->key);
|
||||
if(men->key) men->key->from= (ID *)men;
|
||||
|
||||
men->derived = NULL;
|
||||
men->decimated = NULL;
|
||||
|
||||
return men;
|
||||
@ -681,8 +678,6 @@ void flipnorm_mesh(Mesh *me)
|
||||
{
|
||||
MFace *mface;
|
||||
MVert *mvert;
|
||||
DispList *dl;
|
||||
float *fp;
|
||||
int a, temp;
|
||||
|
||||
mvert= me->mvert;
|
||||
|
@ -176,6 +176,7 @@ void free_object(Object *ob)
|
||||
int a;
|
||||
|
||||
if(ob->derivedDeform) ob->derivedDeform->release(ob->derivedDeform);
|
||||
if(ob->derivedFinal) ob->derivedFinal->release(ob->derivedFinal);
|
||||
|
||||
/* disconnect specific data */
|
||||
if(ob->data) {
|
||||
@ -841,6 +842,7 @@ Object *copy_object(Object *ob)
|
||||
obn->soft= copy_softbody(ob->soft);
|
||||
|
||||
ob->derivedDeform = NULL;
|
||||
ob->derivedFinal = NULL;
|
||||
|
||||
return obn;
|
||||
}
|
||||
|
@ -910,20 +910,16 @@ static void mesh_to_softbody(Object *ob)
|
||||
}
|
||||
|
||||
/* copies current sofbody position in mesh, so do this within modifier stacks! */
|
||||
static void softbody_to_mesh(Object *ob)
|
||||
static void softbody_to_mesh(Object *ob, float (*vertexCos)[3])
|
||||
{
|
||||
Mesh *me= ob->data;
|
||||
MVert *mvert;
|
||||
BodyPoint *bp;
|
||||
BodyPoint *bp= ob->soft->bpoint;
|
||||
int a;
|
||||
|
||||
bp= ob->soft->bpoint;
|
||||
mvert= me->mvert;
|
||||
for(a=me->totvert; a>0; a--, mvert++, bp++) {
|
||||
VECCOPY(mvert->co, bp->pos);
|
||||
Mat4MulVecfl(ob->imat, mvert->co); // softbody is in global coords
|
||||
for(a=me->totvert; a>0; a--, bp++, vertexCos++) {
|
||||
VECCOPY(vertexCos[0], bp->pos);
|
||||
Mat4MulVecfl(ob->imat, vertexCos[0]); // softbody is in global coords
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* makes totally fresh start situation */
|
||||
@ -991,7 +987,7 @@ static void lattice_update_softbody(Object *ob)
|
||||
|
||||
/* copies softbody result back in object */
|
||||
/* only used in sbObjectStep() */
|
||||
static void softbody_to_object(Object *ob)
|
||||
static void softbody_to_object(Object *ob, float (*vertexCos)[3])
|
||||
{
|
||||
|
||||
if(ob->soft==NULL) return;
|
||||
@ -1001,7 +997,7 @@ static void softbody_to_object(Object *ob)
|
||||
|
||||
switch(ob->type) {
|
||||
case OB_MESH:
|
||||
softbody_to_mesh(ob);
|
||||
softbody_to_mesh(ob, vertexCos);
|
||||
break;
|
||||
case OB_LATTICE:
|
||||
softbody_to_lattice(ob);
|
||||
@ -1027,7 +1023,7 @@ static void object_update_softbody(Object *ob)
|
||||
}
|
||||
|
||||
/* return 1 if succesfully baked and applied step */
|
||||
static int softbody_baked_step(Object *ob, float framenr)
|
||||
static int softbody_baked_step(Object *ob, float framenr, float (*vertexCos)[3])
|
||||
{
|
||||
SoftBody *sb= ob->soft;
|
||||
SBVertex *key0, *key1, *key2, *key3;
|
||||
@ -1079,7 +1075,7 @@ static int softbody_baked_step(Object *ob, float framenr)
|
||||
bp->pos[2]= data[0]*key0->vec[2] + data[1]*key1->vec[2] + data[2]*key2->vec[2] + data[3]*key3->vec[2];
|
||||
}
|
||||
|
||||
softbody_to_object(ob);
|
||||
softbody_to_object(ob, vertexCos);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -1220,7 +1216,7 @@ void sbObjectReset(Object *ob)
|
||||
|
||||
/* simulates one step. framenr is in frames */
|
||||
/* copies result back to object, displist */
|
||||
void sbObjectStep(Object *ob, float framenr)
|
||||
void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3])
|
||||
{
|
||||
SoftBody *sb;
|
||||
Base *base;
|
||||
@ -1237,7 +1233,7 @@ void sbObjectStep(Object *ob, float framenr)
|
||||
|
||||
/* baking works with global time */
|
||||
if(!(ob->softflag & OB_SB_BAKEDO) )
|
||||
if(softbody_baked_step(ob, framenr) ) return;
|
||||
if(softbody_baked_step(ob, framenr, vertexCos) ) return;
|
||||
|
||||
/* remake softbody if: */
|
||||
if( (ob->softflag & OB_SB_REDO) || // signal after weightpainting
|
||||
@ -1367,7 +1363,7 @@ void sbObjectStep(Object *ob, float framenr)
|
||||
}
|
||||
|
||||
/* and apply to vertices */
|
||||
softbody_to_object(ob);
|
||||
softbody_to_object(ob, vertexCos);
|
||||
|
||||
sb->ctime= ctime;
|
||||
} // if(ABS(dtime) > 0.0)
|
||||
@ -1376,7 +1372,7 @@ void sbObjectStep(Object *ob, float framenr)
|
||||
// since dtime= ctime - ob->soft->ctime== 0.0;
|
||||
// and we were not notifified about any other time changes
|
||||
// so here it is !
|
||||
softbody_to_object(ob);
|
||||
softbody_to_object(ob, vertexCos);
|
||||
}
|
||||
|
||||
/* reset deflector cache */
|
||||
|
@ -2090,7 +2090,6 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
|
||||
mesh->oc= 0;
|
||||
mesh->dface= NULL;
|
||||
mesh->decimated= NULL;
|
||||
mesh->derived= NULL;
|
||||
|
||||
if (mesh->tface) {
|
||||
TFace *tfaces= mesh->tface;
|
||||
@ -2371,6 +2370,7 @@ static void direct_link_object(FileData *fd, Object *ob)
|
||||
|
||||
ob->bb= NULL;
|
||||
ob->derivedDeform= NULL;
|
||||
ob->derivedFinal= NULL;
|
||||
}
|
||||
|
||||
/* ************ READ SCENE ***************** */
|
||||
|
@ -80,8 +80,6 @@ typedef struct Mesh {
|
||||
struct MSticky *msticky;
|
||||
struct Mesh *texcomesh;
|
||||
|
||||
/* not written in file, caches derived mesh */
|
||||
struct DerivedMesh *derived;
|
||||
/* hacky place to store temporary decimated mesh */
|
||||
struct DispListMesh *decimated;
|
||||
|
||||
|
@ -194,7 +194,7 @@ typedef struct Object {
|
||||
|
||||
float toonedge, smoothresh; /* smoothresh is phong interpolation ray_shadow correction in render */
|
||||
|
||||
struct DerivedMesh *derivedDeform;
|
||||
struct DerivedMesh *derivedDeform, *derivedFinal;
|
||||
} Object;
|
||||
|
||||
typedef struct ObHook {
|
||||
|
@ -32,6 +32,7 @@
|
||||
|
||||
#include "Lattice.h" /*This must come first*/
|
||||
|
||||
#include "BKE_utildefines.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_library.h"
|
||||
@ -39,6 +40,8 @@
|
||||
#include "BLI_blenlib.h"
|
||||
#include "DNA_object_types.h"
|
||||
#include "DNA_key_types.h"
|
||||
#include "DNA_mesh_types.h"
|
||||
#include "DNA_meshdata_types.h"
|
||||
#include "DNA_curve_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
#include "BIF_editkey.h"
|
||||
@ -702,10 +705,28 @@ static PyObject *Lattice_applyDeform( BPy_Lattice * self, PyObject *args )
|
||||
* method is needed. Or for users who actually want to apply the
|
||||
* deformation n times. */
|
||||
if((self->Lattice == par->data)) {
|
||||
if ((base->object->type != OB_MESH) || forced)
|
||||
if ((base->object->type != OB_MESH) || forced) {
|
||||
|
||||
if (base->object->type==OB_MESH) {
|
||||
Mesh *me = base->object->data;
|
||||
float (*vcos)[3] = malloc(sizeof(*vcos)*me->totvert);
|
||||
int a;
|
||||
|
||||
for (a=0; a<me->totvert; a++) {
|
||||
VECCOPY(vcos[a], me->mvert[a].co);
|
||||
}
|
||||
mesh_deform( base->object, vcos );
|
||||
for (a=0; a<me->totvert; a++) {
|
||||
VECCOPY(me->mvert[a].co, vcos[a]);
|
||||
}
|
||||
|
||||
free(vcos);
|
||||
} else {
|
||||
object_deform( base->object );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
base = base->next;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user