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:
authorSergey Sharybin <sergey.vfx@gmail.com>2010-06-06 19:22:27 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2010-06-06 19:22:27 +0400
commit640fb84bed74e5b63e3e3186a4239cccd021cb05 (patch)
treef045ee34c55afe37659b8bc4891020a8b7d75bff /source/blender/blenkernel
parentd153c765bcfcdda8686e42dd044e63e832974709 (diff)
- Added checking if modifier is active in find_multires_modifier
- Pass MultiresModifierData to reshape functions
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_multires.h14
-rw-r--r--source/blender/blenkernel/intern/multires.c40
2 files changed, 29 insertions, 25 deletions
diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h
index 8716794bbd4..e8bbb58a895 100644
--- a/source/blender/blenkernel/BKE_multires.h
+++ b/source/blender/blenkernel/BKE_multires.h
@@ -47,15 +47,19 @@ void multires_force_external_reload(struct Object *ob);
struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*,
int local_mmd, struct DerivedMesh*, struct Object *, int, int);
-struct MultiresModifierData *find_multires_modifier(struct Object *ob);
-struct DerivedMesh *get_multires_dm(struct Object *ob);
+struct MultiresModifierData *find_multires_modifier(struct Scene *scene, struct Object *ob);
+struct DerivedMesh *get_multires_dm(struct Scene *scene, struct MultiresModifierData *mmd,
+ struct Object *ob);
void multiresModifier_join(struct Object *);
void multiresModifier_del_levels(struct MultiresModifierData *, struct Object *, int direction);
void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob,
int updateblock, int simple);
-int multiresModifier_reshape(struct Object *dst, struct Object *src);
-int multiresModifier_reshapeFromDM(struct Object *ob, struct DerivedMesh *srcdm);
-int multiresModifier_reshapeFromDeformMod(struct Object *ob, struct ModifierData *md);
+int multiresModifier_reshape(struct Scene *scene, struct MultiresModifierData *mmd,
+ struct Object *dst, struct Object *src);
+int multiresModifier_reshapeFromDM(struct Scene *scene, struct MultiresModifierData *mmd,
+ struct Object *ob, struct DerivedMesh *srcdm);
+int multiresModifier_reshapeFromDeformMod(struct Scene *scene, struct MultiresModifierData *mmd,
+ struct Object *ob, struct ModifierData *md);
void multires_stitch_grids(struct Object *);
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index ee8a74d6fbb..87557ea7f2e 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -60,35 +60,33 @@ static const int multires_side_tot[] = {0, 2, 3, 5, 9, 17, 33, 65, 129,
static void multires_mvert_to_ss(DerivedMesh *dm, MVert *mvert);
static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, int invert, int add, DMGridData **oldGridData, int totlvl);
-DerivedMesh *get_multires_dm(Object *ob)
+DerivedMesh *get_multires_dm(Scene *scene, MultiresModifierData *mmd, Object *ob)
{
- Mesh *me= ob->data;
- ModifierData *md= (ModifierData *)find_multires_modifier(ob);
+ ModifierData *md= (ModifierData *)mmd;
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- DerivedMesh *tdm = CDDM_from_mesh(me, ob);
+ DerivedMesh *tdm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
DerivedMesh *dm;
- CDDM_calc_normals(tdm);
dm = mti->applyModifier(md, ob, tdm, 0, 1);
-
- if(tdm != dm) tdm->release(tdm);
+ if (dm == tdm) {
+ dm = CDDM_copy(tdm);
+ }
return dm;
}
-MultiresModifierData *find_multires_modifier(Object *ob)
+MultiresModifierData *find_multires_modifier(Scene *scene, Object *ob)
{
ModifierData *md;
- MultiresModifierData *mmd = NULL;
for(md = ob->modifiers.first; md; md = md->next) {
if(md->type == eModifierType_Multires) {
- mmd = (MultiresModifierData*)md;
- break;
+ if (modifier_isEnabled(scene, md, eModifierMode_Realtime))
+ return (MultiresModifierData*)md;
}
}
- return mmd;
+ return NULL;
}
static int multires_get_level(Object *ob, MultiresModifierData *mmd, int render)
@@ -215,9 +213,10 @@ void multiresModifier_join(Object *ob)
}
#endif
-int multiresModifier_reshapeFromDM(Object *ob, DerivedMesh *srcdm)
+int multiresModifier_reshapeFromDM(Scene *scene, MultiresModifierData *mmd,
+ Object *ob, DerivedMesh *srcdm)
{
- DerivedMesh *mrdm = get_multires_dm (ob);
+ DerivedMesh *mrdm = get_multires_dm (scene, mmd, ob);
if(mrdm && srcdm && mrdm->getNumVerts(mrdm) == srcdm->getNumVerts(srcdm)) {
multires_mvert_to_ss(mrdm, srcdm->getVertArray(srcdm));
@@ -236,13 +235,14 @@ int multiresModifier_reshapeFromDM(Object *ob, DerivedMesh *srcdm)
}
/* Returns 1 on success, 0 if the src's totvert doesn't match */
-int multiresModifier_reshape(Object *dst, Object *src)
+int multiresModifier_reshape(Scene *scene, MultiresModifierData *mmd, Object *dst, Object *src)
{
- DerivedMesh *srcdm = src->derivedFinal;
- return multiresModifier_reshapeFromDM(dst, srcdm);
+ DerivedMesh *srcdm = mesh_get_derived_final(scene, src, CD_MASK_BAREMESH);
+ return multiresModifier_reshapeFromDM(scene, mmd, dst, srcdm);
}
-int multiresModifier_reshapeFromDeformMod(Object *ob, ModifierData *md)
+int multiresModifier_reshapeFromDeformMod(Scene *scene, MultiresModifierData *mmd,
+ Object *ob, ModifierData *md)
{
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
DerivedMesh *dm, *ndm;
@@ -250,7 +250,7 @@ int multiresModifier_reshapeFromDeformMod(Object *ob, ModifierData *md)
float (*deformedVerts)[3];
/* Create DerivedMesh for deformation modifier */
- dm = get_multires_dm(ob);
+ dm = get_multires_dm(scene, mmd, ob);
numVerts= dm->getNumVerts(dm);
deformedVerts= MEM_callocN(sizeof(float)*numVerts*3, "multiresReshape_deformVerts");
@@ -264,7 +264,7 @@ int multiresModifier_reshapeFromDeformMod(Object *ob, ModifierData *md)
dm->release(dm);
/* Reshaping */
- result= multiresModifier_reshapeFromDM(ob, ndm);
+ result= multiresModifier_reshapeFromDM(scene, mmd, ob, ndm);
/* Cleanup */
ndm->release(ndm);