diff options
Diffstat (limited to 'source/blender/blenkernel/intern/modifier.c')
-rw-r--r-- | source/blender/blenkernel/intern/modifier.c | 384 |
1 files changed, 233 insertions, 151 deletions
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 7977e7b0160..6ebd68e990f 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -20,8 +20,6 @@ * The Original Code is Copyright (C) 2005 by the Blender Foundation. * All rights reserved. * -* The Original Code is: all of this file. -* * Contributor(s): Daniel Dunbar * Ton Roosendaal, * Ben Batt, @@ -77,9 +75,8 @@ #include "BKE_main.h" #include "BKE_anim.h" -#include "BKE_bad_level_calls.h" #include "BKE_bmesh.h" -#include "BKE_booleanops.h" +// XXX #include "BKE_booleanops.h" #include "BKE_cloth.h" #include "BKE_collision.h" #include "BKE_cdderivedmesh.h" @@ -89,6 +86,7 @@ #include "BKE_displist.h" #include "BKE_fluidsim.h" #include "BKE_global.h" +#include "BKE_multires.h" #include "BKE_lattice.h" #include "BKE_library.h" #include "BKE_material.h" @@ -107,13 +105,18 @@ #include "BKE_shrinkwrap.h" #include "BKE_simple_deform.h" -#include "LOD_DependKludge.h" +//XXX #include "LOD_DependKludge.h" #include "LOD_decimation.h" +// XXX +static struct DerivedMesh *NewBooleanDerivedMesh() {return NULL;} + #include "CCGSubSurf.h" #include "RE_shader_ext.h" +//XXX #include "BIF_meshlaplacian.h" + /***/ static int noneModifier_isDisabled(ModifierData *md) @@ -169,7 +172,7 @@ static void curveModifier_foreachObjectLink( } static void curveModifier_updateDepgraph( - ModifierData *md, DagForest *forest, + ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { CurveModifierData *cmd = (CurveModifierData*) md; @@ -184,11 +187,11 @@ static void curveModifier_updateDepgraph( static void curveModifier_deformVerts( ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts) + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) { CurveModifierData *cmd = (CurveModifierData*) md; - curve_deform_verts(cmd->object, ob, derivedData, vertexCos, numVerts, + curve_deform_verts(md->scene, cmd->object, ob, derivedData, vertexCos, numVerts, cmd->name, cmd->defaxis); } @@ -200,7 +203,7 @@ static void curveModifier_deformVertsEM( if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); - curveModifier_deformVerts(md, ob, dm, vertexCos, numVerts); + curveModifier_deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0); if(!derivedData) dm->release(dm); } @@ -244,7 +247,7 @@ static void latticeModifier_foreachObjectLink( walk(userData, ob, &lmd->object); } -static void latticeModifier_updateDepgraph(ModifierData *md, DagForest *forest, +static void latticeModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { LatticeModifierData *lmd = (LatticeModifierData*) md; @@ -273,7 +276,7 @@ static void modifier_vgroup_cache(ModifierData *md, float (*vertexCos)[3]) static void latticeModifier_deformVerts( ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts) + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) { LatticeModifierData *lmd = (LatticeModifierData*) md; @@ -292,7 +295,7 @@ static void latticeModifier_deformVertsEM( if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); - latticeModifier_deformVerts(md, ob, dm, vertexCos, numVerts); + latticeModifier_deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0); if(!derivedData) dm->release(dm); } @@ -420,10 +423,10 @@ static DerivedMesh *buildModifier_applyModifier(ModifierData *md, Object *ob, for(i = 0; i < maxFaces; ++i) faceMap[i] = i; if (ob) { - frac = bsystem_time(ob, (float)G.scene->r.cfra, + frac = bsystem_time(md->scene, ob, md->scene->r.cfra, bmd->start - 1.0f) / bmd->length; } else { - frac = G.scene->r.cfra - bmd->start / bmd->length; + frac = md->scene->r.cfra - bmd->start / bmd->length; } CLAMP(frac, 0.0, 1.0); @@ -613,7 +616,7 @@ static void maskModifier_foreachObjectLink( walk(userData, ob, &mmd->ob_arm); } -static void maskModifier_updateDepgraph(ModifierData *md, DagForest *forest, +static void maskModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { MaskModifierData *mmd = (MaskModifierData *)md; @@ -999,7 +1002,7 @@ static void arrayModifier_foreachObjectLink( walk(userData, ob, &amd->offset_ob); } -static void arrayModifier_updateDepgraph(ModifierData *md, DagForest *forest, +static void arrayModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { ArrayModifierData *amd = (ArrayModifierData*) md; @@ -1088,7 +1091,7 @@ static int calc_mapping(IndexMapEntry *indexMap, int oldIndex, int copyNum) } static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd, - Object *ob, DerivedMesh *dm, + Scene *scene, Object *ob, DerivedMesh *dm, int initFlags) { int i, j; @@ -1112,9 +1115,9 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd, /* need to avoid infinite recursion here */ if(amd->start_cap && amd->start_cap != ob) - start_cap = mesh_get_derived_final(amd->start_cap, CD_MASK_MESH); + start_cap = mesh_get_derived_final(scene, amd->start_cap, CD_MASK_MESH); if(amd->end_cap && amd->end_cap != ob) - end_cap = mesh_get_derived_final(amd->end_cap, CD_MASK_MESH); + end_cap = mesh_get_derived_final(scene, amd->end_cap, CD_MASK_MESH); MTC_Mat4One(offset); @@ -1159,7 +1162,7 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd, if(!cu->path) { cu->flag |= CU_PATH; // needed for path & bevlist - makeDispListCurveTypes(amd->curve_ob, 0); + makeDispListCurveTypes(scene, amd->curve_ob, 0); } if(cu->path) length = scale*cu->path->totdist; @@ -1635,7 +1638,7 @@ static DerivedMesh *arrayModifier_applyModifier( DerivedMesh *result; ArrayModifierData *amd = (ArrayModifierData*) md; - result = arrayModifier_doArray(amd, ob, derivedData, 0); + result = arrayModifier_doArray(amd, md->scene, ob, derivedData, 0); if(result != derivedData) CDDM_calc_normals(result); @@ -1682,7 +1685,7 @@ static void mirrorModifier_foreachObjectLink( walk(userData, ob, &mmd->mirror_ob); } -static void mirrorModifier_updateDepgraph(ModifierData *md, DagForest *forest, +static void mirrorModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { MirrorModifierData *mmd = (MirrorModifierData*) md; @@ -3461,7 +3464,7 @@ static int displaceModifier_isDisabled(ModifierData *md) } static void displaceModifier_updateDepgraph( - ModifierData *md, DagForest *forest, + ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { DisplaceModifierData *dmd = (DisplaceModifierData*) md; @@ -3683,7 +3686,7 @@ static void displaceModifier_do( static void displaceModifier_deformVerts( ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts) + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) { DerivedMesh *dm; @@ -3782,7 +3785,7 @@ static void uvprojectModifier_foreachIDLink(ModifierData *md, Object *ob, } static void uvprojectModifier_updateDepgraph(ModifierData *md, - DagForest *forest, Object *ob, DagNode *obNode) + DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { UVProjectModifierData *umd = (UVProjectModifierData*) md; int i; @@ -4059,11 +4062,11 @@ static DerivedMesh *decimateModifier_applyModifier( ModifierData *md, Object *ob, DerivedMesh *derivedData, int useRenderParams, int isFinalCalc) { - DecimateModifierData *dmd = (DecimateModifierData*) md; + // DecimateModifierData *dmd = (DecimateModifierData*) md; DerivedMesh *dm = derivedData, *result = NULL; MVert *mvert; MFace *mface; - LOD_Decimation_Info lod; + // LOD_Decimation_Info lod; int totvert, totface; int a, numTris; @@ -4085,6 +4088,8 @@ static DerivedMesh *decimateModifier_applyModifier( goto exit; } + // XXX +#if 0 lod.vertex_buffer= MEM_mallocN(3*sizeof(float)*totvert, "vertices"); lod.vertex_normal_buffer= MEM_mallocN(3*sizeof(float)*totvert, "normals"); lod.triangle_index_buffer= MEM_mallocN(3*sizeof(int)*numTris, "trias"); @@ -4169,6 +4174,10 @@ static DerivedMesh *decimateModifier_applyModifier( MEM_freeN(lod.vertex_buffer); MEM_freeN(lod.vertex_normal_buffer); MEM_freeN(lod.triangle_index_buffer); +#else + modifier_setError(md, "Modifier not working yet in 2.5."); + goto exit; +#endif exit: return result; @@ -4362,7 +4371,7 @@ static void smoothModifier_do( static void smoothModifier_deformVerts( ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts) + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) { DerivedMesh *dm; @@ -4461,7 +4470,7 @@ static void castModifier_foreachObjectLink( } static void castModifier_updateDepgraph( - ModifierData *md, DagForest *forest, Object *ob, + ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { CastModifierData *cmd = (CastModifierData*) md; @@ -4942,7 +4951,7 @@ static void castModifier_cuboid_do( static void castModifier_deformVerts( ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts) + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) { DerivedMesh *dm = derivedData; CastModifierData *cmd = (CastModifierData *)md; @@ -5050,7 +5059,7 @@ static void waveModifier_foreachIDLink(ModifierData *md, Object *ob, } static void waveModifier_updateDepgraph( - ModifierData *md, DagForest *forest, Object *ob, + ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { WaveModifierData *wmd = (WaveModifierData*) md; @@ -5175,15 +5184,15 @@ static void wavemod_get_texture_coords(WaveModifierData *wmd, Object *ob, } } -static void waveModifier_do( - WaveModifierData *md, Object *ob, DerivedMesh *dm, +static void waveModifier_do(WaveModifierData *md, + Scene *scene, Object *ob, DerivedMesh *dm, float (*vertexCos)[3], int numVerts) { WaveModifierData *wmd = (WaveModifierData*) md; MVert *mvert = NULL; MDeformVert *dvert = NULL; int defgrp_index; - float ctime = bsystem_time(ob, (float)G.scene->r.cfra, 0.0); + float ctime = bsystem_time(scene, ob, (float)scene->r.cfra, 0.0); float minfac = (float)(1.0 / exp(wmd->width * wmd->narrow * wmd->width * wmd->narrow)); float lifefac = wmd->height; @@ -5345,7 +5354,7 @@ static void waveModifier_do( static void waveModifier_deformVerts( ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts) + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) { DerivedMesh *dm; WaveModifierData *wmd = (WaveModifierData *)md; @@ -5361,7 +5370,7 @@ static void waveModifier_deformVerts( CDDM_calc_normals(dm); } - waveModifier_do(wmd, ob, dm, vertexCos, numVerts); + waveModifier_do(wmd, md->scene, ob, dm, vertexCos, numVerts); if(dm != derivedData) dm->release(dm); } @@ -5383,7 +5392,7 @@ static void waveModifier_deformVertsEM( CDDM_calc_normals(dm); } - waveModifier_do(wmd, ob, dm, vertexCos, numVerts); + waveModifier_do(wmd, md->scene, ob, dm, vertexCos, numVerts); if(dm != derivedData) dm->release(dm); } @@ -5435,7 +5444,7 @@ static void armatureModifier_foreachObjectLink( } static void armatureModifier_updateDepgraph( - ModifierData *md, DagForest *forest, Object *ob, + ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { ArmatureModifierData *amd = (ArmatureModifierData*) md; @@ -5450,7 +5459,7 @@ static void armatureModifier_updateDepgraph( static void armatureModifier_deformVerts( ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts) + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) { ArmatureModifierData *amd = (ArmatureModifierData*) md; @@ -5556,7 +5565,7 @@ static void hookModifier_foreachObjectLink( walk(userData, ob, &hmd->object); } -static void hookModifier_updateDepgraph(ModifierData *md, DagForest *forest, +static void hookModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { HookModifierData *hmd = (HookModifierData*) md; @@ -5571,7 +5580,7 @@ static void hookModifier_updateDepgraph(ModifierData *md, DagForest *forest, static void hookModifier_deformVerts( ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts) + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) { HookModifierData *hmd = (HookModifierData*) md; float vec[3], mat[4][4]; @@ -5692,7 +5701,7 @@ static void hookModifier_deformVertsEM( if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); - hookModifier_deformVerts(md, ob, derivedData, vertexCos, numVerts); + hookModifier_deformVerts(md, ob, derivedData, vertexCos, numVerts, 0, 0); if(!derivedData) dm->release(dm); } @@ -5701,9 +5710,9 @@ static void hookModifier_deformVertsEM( static void softbodyModifier_deformVerts( ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts) + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) { - sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos, numVerts); + sbObjectStep(md->scene, ob, (float)md->scene->r.cfra, vertexCos, numVerts); } static int softbodyModifier_dependsOnTime(ModifierData *md) @@ -5744,7 +5753,7 @@ static DerivedMesh *clothModifier_applyModifier(ModifierData *md, Object *ob, return derivedData; } - result = clothModifier_do(clmd, ob, derivedData, useRenderParams, isFinalCalc); + result = clothModifier_do(clmd, md->scene, ob, derivedData, useRenderParams, isFinalCalc); if(result) { @@ -5755,7 +5764,7 @@ static DerivedMesh *clothModifier_applyModifier(ModifierData *md, Object *ob, } static void clothModifier_updateDepgraph( - ModifierData *md, DagForest *forest, Object *ob, + ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { ClothModifierData *clmd = (ClothModifierData*) md; @@ -5764,7 +5773,7 @@ static void clothModifier_updateDepgraph( if(clmd) { - for(base = G.scene->base.first; base; base= base->next) + for(base = scene->base.first; base; base= base->next) { Object *ob1= base->object; if(ob1 != ob) @@ -5889,7 +5898,7 @@ static int collisionModifier_dependsOnTime(ModifierData *md) static void collisionModifier_deformVerts( ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts) + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) { CollisionModifierData *collmd = (CollisionModifierData*) md; DerivedMesh *dm = NULL; @@ -5912,7 +5921,7 @@ static void collisionModifier_deformVerts( CDDM_apply_vert_coords(dm, vertexCos); CDDM_calc_normals(dm); - current_time = bsystem_time ( ob, ( float ) G.scene->r.cfra, 0.0 ); + current_time = bsystem_time (md->scene, ob, ( float ) md->scene->r.cfra, 0.0 ); if(G.rt > 0) printf("current_time %f, collmd->time %f\n", current_time, collmd->time); @@ -6051,11 +6060,9 @@ static int surfaceModifier_dependsOnTime(ModifierData *md) static void surfaceModifier_deformVerts( ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts) + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) { SurfaceModifierData *surmd = (SurfaceModifierData*) md; - DerivedMesh *dm = NULL; - float current_time = 0; unsigned int numverts = 0, i = 0; if(surmd->dm) @@ -6121,7 +6128,7 @@ static void booleanModifier_foreachObjectLink( } static void booleanModifier_updateDepgraph( - ModifierData *md, DagForest *forest, Object *ob, + ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { BooleanModifierData *bmd = (BooleanModifierData*) md; @@ -6140,7 +6147,7 @@ static DerivedMesh *booleanModifier_applyModifier( { // XXX doesn't handle derived data BooleanModifierData *bmd = (BooleanModifierData*) md; - DerivedMesh *dm = mesh_get_derived_final(bmd->object, CD_MASK_BAREMESH); + DerivedMesh *dm = mesh_get_derived_final(md->scene, bmd->object, CD_MASK_BAREMESH); /* we do a quick sanity check */ if(dm && (derivedData->getNumFaces(derivedData) > 3) @@ -6258,15 +6265,56 @@ static int is_last_displist(Object *ob) return 0; } + +static DerivedMesh *get_original_dm(Scene *scene, Object *ob, float (*vertexCos)[3], int orco) +{ + DerivedMesh *dm= NULL; + + if(ob->type==OB_MESH) { + dm = CDDM_from_mesh((Mesh*)(ob->data), ob); + + if(vertexCos) { + CDDM_apply_vert_coords(dm, vertexCos); + //CDDM_calc_normals(dm); + } + + if(orco) + DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, get_mesh_orco_verts(ob)); + } + else if(ELEM3(ob->type,OB_FONT,OB_CURVE,OB_SURF)) { + Object *tmpobj; + Curve *tmpcu; + + if(is_last_displist(ob)) { + /* copies object and modifiers (but not the data) */ + tmpobj= copy_object(ob); + tmpcu = (Curve *)tmpobj->data; + tmpcu->id.us--; + + /* copies the data */ + tmpobj->data = copy_curve((Curve *) ob->data); + + makeDispListCurveTypes(scene, tmpobj, 1); + nurbs_to_mesh(tmpobj); + + dm = CDDM_from_mesh((Mesh*)(tmpobj->data), tmpobj); + //CDDM_calc_normals(dm); + + free_libblock_us(&G.main->object, tmpobj); + } + } + + return dm; +} + /* saves the current emitter state for a particle system and calculates particles */ static void particleSystemModifier_deformVerts( ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts) + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) { DerivedMesh *dm = derivedData; ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md; ParticleSystem * psys=0; - Mesh *me; int needsFree=0; if(ob->particlesystem.first) @@ -6274,54 +6322,16 @@ static void particleSystemModifier_deformVerts( else return; - /* multires check */ - if(ob->type == OB_MESH) { - me= (Mesh*)ob->data; - if(me->mr && me->mr->current != 1) - modifier_setError(md, - "Particles only supported on first multires level."); - } - if(!psys_check_enabled(ob, psys)) return; - if(dm==0){ - if(ob->type==OB_MESH){ - dm = CDDM_from_mesh((Mesh*)(ob->data), ob); - - CDDM_apply_vert_coords(dm, vertexCos); - //CDDM_calc_normals(dm); - - DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, get_mesh_orco_verts(ob)); - - needsFree=1; - } - else if(ELEM3(ob->type,OB_FONT,OB_CURVE,OB_SURF)){ - Object *tmpobj; - Curve *tmpcu; - - if(is_last_displist(ob)){ - /* copies object and modifiers (but not the data) */ - tmpobj= copy_object( ob ); - tmpcu = (Curve *)tmpobj->data; - tmpcu->id.us--; - - /* copies the data */ - tmpobj->data = copy_curve( (Curve *) ob->data ); + if(dm==0) { + dm= get_original_dm(md->scene, ob, vertexCos, 1); - makeDispListCurveTypes( tmpobj, 1 ); - nurbs_to_mesh( tmpobj ); - - dm = CDDM_from_mesh((Mesh*)(tmpobj->data), tmpobj); - //CDDM_calc_normals(dm); - - free_libblock_us( &G.main->object, tmpobj ); + if(!dm) + return; - needsFree=1; - } - else return; - } - else return; + needsFree= 1; } /* clear old dm */ @@ -6349,8 +6359,7 @@ static void particleSystemModifier_deformVerts( psmd->dm->getNumFaces(psmd->dm)!=psmd->totdmface){ /* in file read dm hasn't really changed but just wasn't saved in file */ - psys->recalc |= PSYS_RECALC_HAIR; - psys->recalc |= PSYS_DISTR; + psys->recalc |= PSYS_RECALC_RESET; psmd->flag |= eParticleSystemFlag_DM_changed; psmd->totdmvert= psmd->dm->getNumVerts(psmd->dm); @@ -6359,7 +6368,7 @@ static void particleSystemModifier_deformVerts( } if(psys){ - particle_system_update(ob,psys); + particle_system_update(md->scene, ob, psys); psmd->flag |= eParticleSystemFlag_psys_updated; psmd->flag &= ~eParticleSystemFlag_DM_changed; } @@ -6407,7 +6416,7 @@ static int particleInstanceModifier_dependsOnTime(ModifierData *md) return 0; } static void particleInstanceModifier_updateDepgraph(ModifierData *md, DagForest *forest, - Object *ob, DagNode *obNode) + Scene *scene,Object *ob, DagNode *obNode) { ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData*) md; @@ -6475,7 +6484,7 @@ static DerivedMesh * particleInstanceModifier_applyModifier( maxvert=totvert*totpart; maxface=totface*totpart; - psys->lattice=psys_get_lattice(ob, psys); + psys->lattice=psys_get_lattice(md->scene, ob, psys); if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED)){ @@ -6510,7 +6519,7 @@ static DerivedMesh * particleInstanceModifier_applyModifier( state.time=(mv->co[0]-min_co)/(max_co-min_co); if(trackneg) state.time=1.0f-state.time; - psys_get_particle_on_path(pimd->ob,psys,first_particle + i/totvert,&state,1); + psys_get_particle_on_path(md->scene, pimd->ob, psys,first_particle + i/totvert, &state,1); mv->co[0] = 0.0; @@ -6532,7 +6541,7 @@ static DerivedMesh * particleInstanceModifier_applyModifier( } else{ state.time=-1.0; - psys_get_particle_state(pimd->ob,psys,i/totvert,&state,1); + psys_get_particle_state(md->scene, pimd->ob, psys, i/totvert, &state,1); } QuatMulVecf(state.rot,mv->co); @@ -6584,8 +6593,8 @@ static DerivedMesh * particleInstanceModifier_applyModifier( CDDM_calc_normals(result); if(psys->lattice){ - end_latt_deform(); - psys->lattice=0; + end_latt_deform(psys->lattice); + psys->lattice= NULL; } return result; @@ -7203,7 +7212,7 @@ static DerivedMesh * explodeModifier_splitEdges(ExplodeModifierData *emd, Derive } static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd, - ParticleSystemModifierData *psmd, Object *ob, + ParticleSystemModifierData *psmd, Scene *scene, Object *ob, DerivedMesh *to_explode) { DerivedMesh *explode, *dm=to_explode; @@ -7227,9 +7236,9 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd, timestep= psys_get_timestep(part); if(part->flag & PART_GLOB_TIME) - cfra=bsystem_time(0,(float)G.scene->r.cfra,0.0); + cfra=bsystem_time(scene, 0,(float)scene->r.cfra,0.0); else - cfra=bsystem_time(ob,(float)G.scene->r.cfra,0.0); + cfra=bsystem_time(scene, ob,(float)scene->r.cfra,0.0); /* hash table for vertice <-> particle relations */ vertpahash= BLI_edgehash_new(); @@ -7267,7 +7276,7 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd, /* getting back to object space */ Mat4Invert(imat,ob->obmat); - psmd->psys->lattice = psys_get_lattice(ob, psmd->psys); + psmd->psys->lattice = psys_get_lattice(scene, ob, psmd->psys); /* duplicate & displace vertices */ ehi= BLI_edgehashIterator_new(vertpahash); @@ -7295,7 +7304,7 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd, Mat4MulVecfl(ob->obmat,loc0); state.time=cfra; - psys_get_particle_state(ob,psmd->psys,i,&state,1); + psys_get_particle_state(scene, ob, psmd->psys, i, &state,1); vertco=CDDM_get_vert(explode,v)->co; @@ -7360,8 +7369,8 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd, CDDM_calc_normals(explode); if(psmd->psys->lattice){ - end_latt_deform(); - psmd->psys->lattice=0; + end_latt_deform(psmd->psys->lattice); + psmd->psys->lattice= NULL; } return explode; @@ -7411,7 +7420,7 @@ static DerivedMesh * explodeModifier_applyModifier( if(emd->flag & eExplodeFlag_EdgeSplit){ int *facepa = emd->facepa; DerivedMesh *splitdm=explodeModifier_splitEdges(emd,dm); - DerivedMesh *explode=explodeModifier_explodeMesh(emd,psmd,ob,splitdm); + DerivedMesh *explode=explodeModifier_explodeMesh(emd, psmd, md->scene, ob, splitdm); MEM_freeN(emd->facepa); emd->facepa=facepa; @@ -7419,7 +7428,7 @@ static DerivedMesh * explodeModifier_applyModifier( return explode; } else - return explodeModifier_explodeMesh(emd,psmd,ob,derivedData); + return explodeModifier_explodeMesh(emd, psmd, md->scene, ob, derivedData); } return derivedData; } @@ -7465,7 +7474,7 @@ static DerivedMesh * fluidsimModifier_applyModifier( return derivedData; } - result = fluidsimModifier_do(fluidmd, ob, derivedData, useRenderParams, isFinalCalc); + result = fluidsimModifier_do(fluidmd, md->scene, ob, derivedData, useRenderParams, isFinalCalc); if(result) { @@ -7476,7 +7485,7 @@ static DerivedMesh * fluidsimModifier_applyModifier( } static void fluidsimModifier_updateDepgraph( - ModifierData *md, DagForest *forest, + ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { FluidsimModifierData *fluidmd= (FluidsimModifierData*) md; @@ -7486,7 +7495,7 @@ static void fluidsimModifier_updateDepgraph( { if(fluidmd->fss->type == OB_FLUIDSIM_DOMAIN) { - for(base = G.scene->base.first; base; base= base->next) + for(base = scene->base.first; base; base= base->next) { Object *ob1= base->object; if(ob1 != ob) @@ -7568,7 +7577,7 @@ static void meshdeformModifier_foreachObjectLink( } static void meshdeformModifier_updateDepgraph( - ModifierData *md, DagForest *forest, Object *ob, + ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; @@ -7639,25 +7648,36 @@ static void meshdeformModifier_do( float (*vertexCos)[3], int numVerts) { MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; - float imat[4][4], cagemat[4][4], iobmat[4][4], icagemat[3][3], cmat[4][4]; - float weight, totweight, fac, co[3], *weights, (*dco)[3], (*bindcos)[3]; - int a, b, totvert, totcagevert, defgrp_index; + Mesh *me= ob->data; DerivedMesh *tmpdm, *cagedm; MDeformVert *dvert = NULL; MDeformWeight *dw; + EditMesh *em = BKE_mesh_get_editmesh(me); MVert *cagemvert; - + float imat[4][4], cagemat[4][4], iobmat[4][4], icagemat[3][3], cmat[4][4]; + float weight, totweight, fac, co[3], *weights, (*dco)[3], (*bindcos)[3]; + int a, b, totvert, totcagevert, defgrp_index; + if(!mmd->object || (!mmd->bindcos && !mmd->needbind)) return; /* get cage derivedmesh */ - if(mmd->object == G.obedit) { - tmpdm= editmesh_get_derived_cage_and_final(&cagedm, 0); + if(em) { + tmpdm= editmesh_get_derived_cage_and_final(md->scene, ob, em, &cagedm, 0); if(tmpdm) tmpdm->release(tmpdm); + BKE_mesh_end_editmesh(me, em); } else cagedm= mmd->object->derivedFinal; + + /* if we don't have one computed, use derivedmesh from data + * without any modifiers */ + if(!cagedm) { + cagedm= get_original_dm(md->scene, mmd->object, NULL, 0); + if(cagedm) + cagedm->needsFree= 1; + } if(!cagedm) return; @@ -7676,7 +7696,7 @@ static void meshdeformModifier_do( /* progress bar redraw can make this recursive .. */ if(!recursive) { recursive = 1; - harmonic_coordinates_bind(mmd, vertexCos, numVerts, cagemat); + //XXX harmonic_coordinates_bind(mmd, vertexCos, numVerts, cagemat); recursive = 0; } } @@ -7788,7 +7808,7 @@ static void meshdeformModifier_do( static void meshdeformModifier_deformVerts( ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts) + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) { DerivedMesh *dm; @@ -7822,6 +7842,60 @@ static void meshdeformModifier_deformVertsEM( dm->release(dm); } +/* Multires */ +static void multiresModifier_initData(ModifierData *md) +{ + MultiresModifierData *mmd = (MultiresModifierData*)md; + + mmd->lvl = mmd->totlvl = 1; +} + +static void multiresModifier_freeData(ModifierData *md) +{ + MultiresModifierData *mmd = (MultiresModifierData*)md; + + if(mmd->undo_verts) + MEM_freeN(mmd->undo_verts); +} + +static void multiresModifier_copyData(ModifierData *md, ModifierData *target) +{ + MultiresModifierData *mmd = (MultiresModifierData*) md; + MultiresModifierData *tmmd = (MultiresModifierData*) target; + + tmmd->totlvl = mmd->totlvl; + tmmd->lvl = mmd->lvl; +} + +static DerivedMesh *multiresModifier_applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm, + int useRenderParams, int isFinalCalc) +{ + MultiresModifierData *mmd = (MultiresModifierData*)md; + Mesh *me = get_mesh(ob); + DerivedMesh *final; + + /* TODO: for now just skip a level1 mesh */ + if(mmd->lvl == 1) + return dm; + + final = multires_dm_create_from_derived(mmd, dm, me, useRenderParams, isFinalCalc); + if(mmd->undo_signal && mmd->undo_verts && mmd->undo_verts_tot == final->getNumVerts(final)) { + int i; + MVert *dst = CDDM_get_verts(final); + for(i = 0; i < mmd->undo_verts_tot; ++i) { + VecCopyf(dst[i].co, mmd->undo_verts[i].co); + } + CDDM_calc_normals(final); + + MultiresDM_mark_as_modified(final); + + MEM_freeN(mmd->undo_verts); + mmd->undo_signal = 0; + mmd->undo_verts = NULL; + } + + return final; +} /* Shrinkwrap */ @@ -7884,7 +7958,7 @@ static void shrinkwrapModifier_foreachObjectLink(ModifierData *md, Object *ob, O walk(userData, ob, &smd->auxTarget); } -static void shrinkwrapModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +static void shrinkwrapModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) { DerivedMesh *dm = NULL; CustomDataMask dataMask = shrinkwrapModifier_requiredDataMask(md); @@ -7897,14 +7971,14 @@ static void shrinkwrapModifier_deformVerts(ModifierData *md, Object *ob, Derived else if(ob->type==OB_LATTICE) dm = NULL; else return; - if(dm != NULL && (dataMask & CD_MVERT)) + if(dm != NULL && (dataMask & (1<<CD_MVERT))) { CDDM_apply_vert_coords(dm, vertexCos); CDDM_calc_normals(dm); } } - shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, ob, dm, vertexCos, numVerts); + shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, md->scene, ob, dm, vertexCos, numVerts); if(dm) dm->release(dm); @@ -7922,20 +7996,20 @@ static void shrinkwrapModifier_deformVertsEM(ModifierData *md, Object *ob, EditM else if(ob->type==OB_LATTICE) dm = NULL; else return; - if(dm != NULL && (dataMask & CD_MVERT)) + if(dm != NULL && (dataMask & (1<<CD_MVERT))) { CDDM_apply_vert_coords(dm, vertexCos); CDDM_calc_normals(dm); } } - shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, ob, dm, vertexCos, numVerts); + shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, md->scene, ob, dm, vertexCos, numVerts); if(dm) dm->release(dm); } -static void shrinkwrapModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode) +static void shrinkwrapModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md; @@ -7990,7 +8064,7 @@ static void simpledeformModifier_foreachObjectLink(ModifierData *md, Object *ob, walk(userData, ob, &smd->origin); } -static void simpledeformModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode) +static void simpledeformModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) { SimpleDeformModifierData *smd = (SimpleDeformModifierData*)md; @@ -7998,7 +8072,7 @@ static void simpledeformModifier_updateDepgraph(ModifierData *md, DagForest *for dag_add_relation(forest, dag_get_node(forest, smd->origin), obNode, DAG_RL_OB_DATA, "SimpleDeform Modifier"); } -static void simpledeformModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +static void simpledeformModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) { DerivedMesh *dm = NULL; CustomDataMask dataMask = simpledeformModifier_requiredDataMask(md); @@ -8430,6 +8504,14 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type) mti->foreachObjectLink = simpledeformModifier_foreachObjectLink; mti->updateDepgraph = simpledeformModifier_updateDepgraph; + mti = INIT_TYPE(Multires); + mti->type = eModifierTypeType_Constructive; + mti->flags = eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_RequiresOriginalData; + mti->initData = multiresModifier_initData; + mti->freeData = multiresModifier_freeData; + mti->copyData = multiresModifier_copyData; + mti->applyModifier = multiresModifier_applyModifier; + typeArrInit = 0; #undef INIT_TYPE } @@ -8511,8 +8593,6 @@ void modifiers_clearErrors(Object *ob) qRedraw = 1; } } - - if (qRedraw) allqueue(REDRAWBUTSEDIT, 0); } void modifiers_foreachObjectLink(Object *ob, ObjectWalkFunc walk, @@ -8578,7 +8658,6 @@ void modifier_setError(ModifierData *md, char *format, ...) md->error = BLI_strdup(buffer); - allqueue(REDRAWBUTSEDIT, 0); } /* used for buttons, to find out if the 'draw deformed in editmode' option is @@ -8647,7 +8726,7 @@ LinkNode *modifiers_calcDataMasks(ModifierData *md, CustomDataMask dataMask) if(mti->requiredDataMask) mask = mti->requiredDataMask(md); - BLI_linklist_prepend(&dataMasks, (void *)mask); + BLI_linklist_prepend(&dataMasks, SET_INT_IN_POINTER(mask)); } /* build the list of required data masks - each mask in the list must @@ -8658,14 +8737,14 @@ LinkNode *modifiers_calcDataMasks(ModifierData *md, CustomDataMask dataMask) */ for(curr = dataMasks, prev = NULL; curr; prev = curr, curr = curr->next) { if(prev) { - CustomDataMask prev_mask = (CustomDataMask)prev->link; - CustomDataMask curr_mask = (CustomDataMask)curr->link; + CustomDataMask prev_mask = (CustomDataMask)GET_INT_FROM_POINTER(prev->link); + CustomDataMask curr_mask = (CustomDataMask)GET_INT_FROM_POINTER(curr->link); - curr->link = (void *)(curr_mask | prev_mask); + curr->link = SET_INT_IN_POINTER(curr_mask | prev_mask); } else { - CustomDataMask curr_mask = (CustomDataMask)curr->link; + CustomDataMask curr_mask = (CustomDataMask)GET_INT_FROM_POINTER(curr->link); - curr->link = (void *)(curr_mask | dataMask); + curr->link = SET_INT_IN_POINTER(curr_mask | dataMask); } } @@ -8806,14 +8885,15 @@ int modifier_isDeformer(ModifierData *md) return 0; } -int modifiers_isDeformed(Object *ob) +int modifiers_isDeformed(Scene *scene, Object *ob) { ModifierData *md = modifiers_getVirtualModifierList(ob); for (; md; md=md->next) { - if(ob==G.obedit && (md->mode & eModifierMode_Editmode)==0); - else if(modifier_isDeformer(md)) - return 1; + if(ob==scene->obedit && (md->mode & eModifierMode_Editmode)==0); + else + if(modifier_isDeformer(md)) + return 1; } return 0; } @@ -8846,8 +8926,10 @@ void modifier_freeTemporaryData(ModifierData *md) if(md->type == eModifierType_Armature) { ArmatureModifierData *amd= (ArmatureModifierData*)md; - if(amd->prevCos) + if(amd->prevCos) { MEM_freeN(amd->prevCos); + amd->prevCos= NULL; + } } } |