[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31832] trunk/blender/source/blender: == Multires ==
Nicholas Bishop
nicholasbishop at gmail.com
Thu Sep 9 02:14:51 CEST 2010
Revision: 31832
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31832
Author: nicholasbishop
Date: 2010-09-09 02:14:51 +0200 (Thu, 09 Sep 2010)
Log Message:
-----------
== Multires ==
Fixed bug #23657, "Modifiers dosen't work when you select diffrent mesh for object"
Multires modifier now adds empty mdisps if they're missing, rather than displaying a warning
Switching an object's mesh will now check for a multires modifier; if found the modifier's total number of levels are reset to match the mesh's mdisps
Switching the mesh also forces a multires update so that sculpted changes aren't lost
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_modifier.h
trunk/blender/source/blender/blenkernel/BKE_multires.h
trunk/blender/source/blender/blenkernel/intern/mesh.c
trunk/blender/source/blender/blenkernel/intern/modifier.c
trunk/blender/source/blender/blenkernel/intern/multires.c
trunk/blender/source/blender/modifiers/intern/MOD_multires.c
Modified: trunk/blender/source/blender/blenkernel/BKE_modifier.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_modifier.h 2010-09-08 21:47:16 UTC (rev 31831)
+++ trunk/blender/source/blender/blenkernel/BKE_modifier.h 2010-09-09 00:14:51 UTC (rev 31832)
@@ -321,6 +321,9 @@
int required_mode);
struct ModifierData *modifiers_getVirtualModifierList(struct Object *ob);
+/* ensure modifier correctness when changing ob->data */
+void test_object_modifiers(struct Object *ob);
+
/* here for do_versions */
void modifier_mdef_compact_influences(struct ModifierData *md);
Modified: trunk/blender/source/blender/blenkernel/BKE_multires.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_multires.h 2010-09-08 21:47:16 UTC (rev 31831)
+++ trunk/blender/source/blender/blenkernel/BKE_multires.h 2010-09-09 00:14:51 UTC (rev 31832)
@@ -44,6 +44,8 @@
void multires_force_render_update(struct Object *ob);
void multires_force_external_reload(struct Object *ob);
+void multiresModifier_set_levels_from_disps(struct MultiresModifierData *mmd, struct Object *ob);
+
struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*,
int local_mmd, struct DerivedMesh*, struct Object *, int, int);
Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c 2010-09-08 21:47:16 UTC (rev 31831)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c 2010-09-09 00:14:51 UTC (rev 31832)
@@ -492,6 +492,8 @@
void set_mesh(Object *ob, Mesh *me)
{
Mesh *old=0;
+
+ multires_force_update(ob);
if(ob==0) return;
@@ -504,6 +506,8 @@
}
test_object_materials((ID *)me);
+
+ test_object_modifiers(ob, me);
}
/* ************** make edges in a Mesh, for outside of editmode */
Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c 2010-09-08 21:47:16 UTC (rev 31831)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c 2010-09-09 00:14:51 UTC (rev 31832)
@@ -49,6 +49,7 @@
#include "BKE_bmesh.h"
#include "BKE_cloth.h"
#include "BKE_key.h"
+#include "BKE_multires.h"
#include "MOD_modifiertypes.h"
@@ -526,5 +527,21 @@
}
}
+/* ensure modifier correctness when changing ob->data */
+void test_object_modifiers(Object *ob)
+{
+ ModifierData *md;
+ /* just multires checked for now, since only multires
+ modifies mesh data */
+ if(ob->type != OB_MESH) return;
+
+ for(md = ob->modifiers.first; md; md = md->next) {
+ if(md->type == eModifierType_Multires) {
+ MultiresModifierData *mmd = (MultiresModifierData*)md;
+
+ multiresModifier_set_levels_from_disps(mmd, ob);
+ }
+ }
+}
Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c 2010-09-08 21:47:16 UTC (rev 31831)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c 2010-09-09 00:14:51 UTC (rev 31832)
@@ -275,6 +275,40 @@
return result;
}
+/* reset the multires levels to match the number of mdisps */
+void multiresModifier_set_levels_from_disps(MultiresModifierData *mmd, Object *ob)
+{
+ Mesh *me = ob->data;
+ MDisps *mdisp;
+ int i;
+
+ mdisp = CustomData_get_layer(&me->fdata, CD_MDISPS);
+
+ if(mdisp) {
+ for(i = 0; i < me->totface; ++i, ++mdisp) {
+ int S = me->mface[i].v4 ? 4 : 3;
+
+ if(mdisp->totdisp == 0) continue;
+
+ while(1) {
+ int side = (1 << (mmd->totlvl-1)) + 1;
+ int lvl_totdisp = side*side*S;
+ if(mdisp->totdisp == lvl_totdisp)
+ break;
+ else if(mdisp->totdisp < lvl_totdisp)
+ --mmd->totlvl;
+ else
+ ++mmd->totlvl;
+
+ }
+ }
+
+ mmd->lvl = MIN2(mmd->sculptlvl, mmd->totlvl);
+ mmd->sculptlvl = MIN2(mmd->sculptlvl, mmd->totlvl);
+ mmd->renderlvl = MIN2(mmd->renderlvl, mmd->totlvl);
+ }
+}
+
static void multires_set_tot_mdisps(Mesh *me, int lvl)
{
MDisps *mdisps= CustomData_get_layer(&me->fdata, CD_MDISPS);
Modified: trunk/blender/source/blender/modifiers/intern/MOD_multires.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_multires.c 2010-09-08 21:47:16 UTC (rev 31831)
+++ trunk/blender/source/blender/modifiers/intern/MOD_multires.c 2010-09-09 00:14:51 UTC (rev 31832)
@@ -72,8 +72,8 @@
if(mmd->totlvl) {
if(!CustomData_get_layer(&me->fdata, CD_MDISPS)) {
- /* multires can't work without displacement layer */
- modifier_setError(md, "Modifier needs mesh with displacement data.");
+ /* multires always needs a displacement layer */
+ CustomData_add_layer(&me->fdata, CD_MDISPS, CD_CALLOC, NULL, me->totface);
return dm;
}
}
More information about the Bf-blender-cvs
mailing list