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:
Diffstat (limited to 'source/blender/blenkernel/intern/modifier.c')
-rw-r--r--source/blender/blenkernel/intern/modifier.c384
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;
+ }
}
}