Multires: Disallow changing mode and quality after subdivision
authorSergey Sharybin <sergey.vfx@gmail.com>
Fri, 20 Mar 2020 08:50:00 +0000 (09:50 +0100)
committerSergey Sharybin <sergey.vfx@gmail.com>
Fri, 20 Mar 2020 08:50:00 +0000 (09:50 +0100)
Avoids possible final object shape destruction since those options
defines how displacement is applied and propagated.

release/scripts/startup/bl_ui/properties_data_modifier.py

index bcf1c285d2bef41e4ad5d8fc87af77c44e6de174..7508b0e2321e8da5eb3ac0fbc8082b65c49bebfb 100644 (file)
@@ -665,7 +665,19 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         col.prop(md, "offset_v")
 
     def MULTIRES(self, layout, ob, md):
-        layout.row().prop(md, "subdivision_type", expand=True)
+        # Changing some of the properties can not be done once there is an
+        # actual displacement stored for this multires modifier. This check
+        # will disallow those properties from change.
+        # This is a bit stupid check but should be sufficient for the usual
+        # multires usage. It might become less strict and only disallow
+        # modifications if there is CD_MDISPS layer, or if there is actual
+        # non-zero displacement but such checks will be too slow to be done
+        # on every redraw.
+        have_displacement = (md.total_levels != 0)
+
+        row = layout.row()
+        row.enabled = not have_displacement
+        row.prop(md, "subdivision_type", expand=True)
 
         split = layout.split()
         col = split.column()
@@ -673,7 +685,10 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         # TODO(sergey): Expose it again after T58473 is solved.
         # col.prop(md, "sculpt_levels", text="Sculpt")
         col.prop(md, "render_levels", text="Render")
-        col.prop(md, "quality")
+
+        row = col.row()
+        row.enabled = not have_displacement
+        row.prop(md, "quality")
 
         col = split.column()