[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28156] trunk/blender/source/blender: Todo #21831: Deform modifier is applied to base mesh instead of
Sergey Sharybin
g.ulairi at gmail.com
Tue Apr 13 08:06:49 CEST 2010
Revision: 28156
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28156
Author: nazgul
Date: 2010-04-13 08:06:49 +0200 (Tue, 13 Apr 2010)
Log Message:
-----------
Todo #21831: Deform modifier is applied to base mesh instead of
multires modifier if both are in the stack (patch #21965)
This patch also removes limitation of multires reshaping when
destination object has got modifiers after multires modifier.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_multires.h
trunk/blender/source/blender/blenkernel/intern/multires.c
trunk/blender/source/blender/editors/object/object_modifier.c
Modified: trunk/blender/source/blender/blenkernel/BKE_multires.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_multires.h 2010-04-13 00:55:37 UTC (rev 28155)
+++ trunk/blender/source/blender/blenkernel/BKE_multires.h 2010-04-13 06:06:49 UTC (rev 28156)
@@ -35,6 +35,7 @@
struct MFace;
struct Multires;
struct MultiresModifierData;
+struct ModifierData;
struct Object;
void multires_mark_as_modified(struct Object *ob);
@@ -46,11 +47,14 @@
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);
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 MultiresModifierData *mmd, struct Object *dst, struct Object *src);
+int multiresModifier_reshapeFromDM(struct MultiresModifierData *mmd, struct Object *ob, struct DerivedMesh *srcdm);
+int multiresModifier_reshapeFromDeformMod(struct MultiresModifierData *mmd, struct Object *ob, struct ModifierData *md);
void multires_stitch_grids(struct Object *);
Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c 2010-04-13 00:55:37 UTC (rev 28155)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c 2010-04-13 06:06:49 UTC (rev 28156)
@@ -60,6 +60,22 @@
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)
+{
+ Mesh *me= ob->data;
+ ModifierData *md= (ModifierData *)find_multires_modifier(ob);
+ ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+ DerivedMesh *tdm = CDDM_from_mesh(me, ob);
+ DerivedMesh *dm;
+
+ CDDM_calc_normals(tdm);
+ dm = mti->applyModifier(md, ob, tdm, 0, 1);
+
+ if(tdm != dm) tdm->release(tdm);
+
+ return dm;
+}
+
MultiresModifierData *find_multires_modifier(Object *ob)
{
ModifierData *md;
@@ -191,24 +207,64 @@
}
#endif
-/* Returns 1 on success, 0 if the src's totvert doesn't match */
-int multiresModifier_reshape(MultiresModifierData *mmd, Object *dst, Object *src)
+int multiresModifier_reshapeFromDM(MultiresModifierData *mmd, Object *ob, DerivedMesh *srcdm)
{
- DerivedMesh *srcdm = src->derivedFinal;
- DerivedMesh *mrdm = dst->derivedFinal;
+ DerivedMesh *mrdm = get_multires_dm (ob);
if(mrdm && srcdm && mrdm->getNumVerts(mrdm) == srcdm->getNumVerts(srcdm)) {
multires_mvert_to_ss(mrdm, srcdm->getVertArray(srcdm));
multires_dm_mark_as_modified(mrdm);
- multires_force_update(dst);
+ multires_force_update(ob);
+ mrdm->release(mrdm);
+
return 1;
}
+ mrdm->release(mrdm);
+
return 0;
}
+/* Returns 1 on success, 0 if the src's totvert doesn't match */
+int multiresModifier_reshape(MultiresModifierData *mmd, Object *dst, Object *src)
+{
+ DerivedMesh *srcdm = src->derivedFinal;
+ return multiresModifier_reshapeFromDM(mmd, dst, srcdm);
+}
+
+int multiresModifier_reshapeFromDeformMod(MultiresModifierData *mmd, Object *ob, ModifierData *md)
+{
+ ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+ DerivedMesh *dm, *ndm;
+ int numVerts, result;
+ float (*deformedVerts)[3];
+
+ /* Create DerivedMesh for deformation modifier */
+ dm = get_multires_dm(ob);
+ numVerts= dm->getNumVerts(dm);
+ deformedVerts= MEM_callocN(sizeof(float)*numVerts*3, "multiresReshape_deformVerts");
+
+ dm->getVertCos(dm, deformedVerts);
+ mti->deformVerts(md, ob, dm, deformedVerts, numVerts, 0, 0);
+
+ ndm= CDDM_copy(dm);
+ CDDM_apply_vert_coords(ndm, deformedVerts);
+
+ MEM_freeN(deformedVerts);
+ dm->release(dm);
+
+ /* Reshaping */
+ result= multiresModifier_reshapeFromDM(mmd, ob, ndm);
+
+ /* Cleanup */
+ ndm->release(ndm);
+
+ return result;
+}
+
+
static void column_vectors_to_mat3(float mat[][3], float v1[3], float v2[3], float v3[3])
{
copy_v3_v3(mat[0], v1);
Modified: trunk/blender/source/blender/editors/object/object_modifier.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_modifier.c 2010-04-13 00:55:37 UTC (rev 28155)
+++ trunk/blender/source/blender/editors/object/object_modifier.c 2010-04-13 06:06:49 UTC (rev 28156)
@@ -389,32 +389,44 @@
static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob, ModifierData *md)
{
+ ModifierTypeInfo *mti= modifierType_getInfo(md->type);
+
+ if (!(md->mode&eModifierMode_Realtime) || (mti->isDisabled && mti->isDisabled(md, 0))) {
+ BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply");
+ return 0;
+ }
+
if (ob->type==OB_MESH) {
DerivedMesh *dm;
Mesh *me = ob->data;
+ MultiresModifierData *mmd= find_multires_modifier(ob);
+
if( me->key) {
BKE_report(reports, RPT_ERROR, "Modifier cannot be applied to Mesh with Shape Keys");
return 0;
}
-
+
mesh_pmv_off(ob, me);
-
+
/* Multires: ensure that recent sculpting is applied */
if(md->type == eModifierType_Multires)
multires_force_update(ob);
-
- dm = mesh_create_derived_for_modifier(scene, ob, md);
- if (!dm) {
- BKE_report(reports, RPT_ERROR, "Modifier is disabled or returned error, skipping apply");
- return 0;
+
+ if (mmd && mti->type==eModifierTypeType_OnlyDeform) {
+ multiresModifier_reshapeFromDeformMod (mmd, ob, md);
+ } else {
+ dm = mesh_create_derived_for_modifier(scene, ob, md);
+ if (!dm) {
+ BKE_report(reports, RPT_ERROR, "Modifier is returned error, skipping apply");
+ return 0;
+ }
+
+ DM_to_mesh(dm, me);
+
+ dm->release(dm);
}
-
- DM_to_mesh(dm, me);
-
- dm->release(dm);
}
else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
- ModifierTypeInfo *mti = modifierType_getInfo(md->type);
Curve *cu;
int numVerts;
float (*vertexCos)[3];
@@ -427,11 +439,6 @@
cu = ob->data;
BKE_report(reports, RPT_INFO, "Applied modifier only changed CV points, not tesselated/bevel vertices");
- if (!(md->mode&eModifierMode_Realtime) || (mti->isDisabled && mti->isDisabled(md, 0))) {
- BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply");
- return 0;
- }
-
vertexCos = curve_getVertexCos(cu, &cu->nurb, &numVerts);
mti->deformVerts(md, ob, NULL, vertexCos, numVerts, 0, 0);
curve_applyVertexCos(cu, &cu->nurb, vertexCos);
@@ -829,11 +836,6 @@
Object *ob= ptr.id.data, *secondob= NULL;
MultiresModifierData *mmd= ptr.data;
- if(ob->derivedFinal == NULL || ob->derivedFinal->type != DM_TYPE_CCGDM) {
- BKE_report(op->reports, RPT_ERROR, "Active objects multires is disabled, can't reshape multires data.");
- return OPERATOR_CANCELLED;
- }
-
CTX_DATA_BEGIN(C, Object*, selob, selected_editable_objects) {
if(selob->type == OB_MESH && selob != ob) {
secondob= selob;
More information about the Bf-blender-cvs
mailing list