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:
authorNicholas Bishop <nicholasbishop@gmail.com>2010-09-09 04:14:51 +0400
committerNicholas Bishop <nicholasbishop@gmail.com>2010-09-09 04:14:51 +0400
commit4eaa10aa02994c4609e1c12e38d0eda6355f9077 (patch)
treed2a8fcc7adc471dee1c5b2f29e2431c8afbfa469 /source/blender/blenkernel/intern/multires.c
parent2d4e8ba22fc4fd304c35af629480e80d4cb8bac2 (diff)
== 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
Diffstat (limited to 'source/blender/blenkernel/intern/multires.c')
-rw-r--r--source/blender/blenkernel/intern/multires.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index 56d517f1e13..57f568e6094 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -275,6 +275,40 @@ int multiresModifier_reshapeFromDeformMod(Scene *scene, MultiresModifierData *mm
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);