Sculpt Dynamic Topology: support collapsing edges without subdividing edges as well
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Tue, 19 Nov 2013 20:55:46 +0000 (21:55 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Mon, 25 Nov 2013 23:21:04 +0000 (00:21 +0100)
This allows you to choose between subdivide edges, collapse and both. Being able to
only collapse edges can be useful to simplify meshes with accidentally introducing
more detail.

Reviewed By: psy-fi, carter2422

Differential Revision: http://developer.blender.org/D15

release/scripts/startup/bl_ui/space_view3d_toolbar.py
source/blender/blenkernel/BKE_blender.h
source/blender/blenloader/intern/readfile.c
source/blender/editors/sculpt_paint/sculpt.c
source/blender/makesdna/DNA_scene_types.h
source/blender/makesrna/intern/rna_sculpt_paint.c

index cd3c238fe86467ab16621178da0333b3c5ecf541..bfda0c83db97b5716312d3305df09ae971c4343e 100644 (file)
@@ -986,6 +986,8 @@ class VIEW3D_PT_sculpt_topology(Panel, View3DPaintPanel):
 
         toolsettings = context.tool_settings
         sculpt = toolsettings.sculpt
+        settings = self.paint_settings(context)
+        brush = settings.brush
 
         if context.sculpt_object.use_dynamic_topology_sculpting:
             layout.operator("sculpt.dynamic_topology_toggle", icon='X', text="Disable Dynamic")
@@ -994,9 +996,12 @@ class VIEW3D_PT_sculpt_topology(Panel, View3DPaintPanel):
 
         col = layout.column()
         col.active = context.sculpt_object.use_dynamic_topology_sculpting
-        col.prop(sculpt, "detail_size")
+        sub = col.column(align=True)
+        sub.active = brush and brush.sculpt_tool not in ('MASK')
+        sub.prop(sculpt, "detail_size")
+        sub.prop(sculpt, "detail_refine_method", text="")
+        col.separator()
         col.prop(sculpt, "use_smooth_shading")
-        col.prop(sculpt, "use_edge_collapse")
         col.operator("sculpt.optimize")
         col.separator()
         col.prop(sculpt, "symmetrize_direction")
index f2d9c0efc13cb0a34a1266650ef36616d85fe7e2..a4a6b60159d8e14c113692d9fcf7bf32050d22c2 100644 (file)
@@ -42,7 +42,7 @@ extern "C" {
  * and keep comment above the defines.
  * Use STRINGIFY() rather than defining with quotes */
 #define BLENDER_VERSION         269
-#define BLENDER_SUBVERSION      2
+#define BLENDER_SUBVERSION      3
 /* 262 was the last editmesh release but it has compatibility code for bmesh data */
 #define BLENDER_MINVERSION      262
 #define BLENDER_MINSUBVERSION   0
index c7e82c1fe7f213d14530aaf2c1dd809b3265521e..1773538b2e29bed16a241305de7def306d2e6558 100644 (file)
@@ -9768,7 +9768,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
                } FOREACH_NODETREE_END
        }
 
-       {
+       if (!MAIN_VERSION_ATLEAST(main, 269, 3)) {
                bScreen *sc;
                ScrArea *sa;
                SpaceLink *sl;
@@ -9834,25 +9834,27 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
                }
 
                for (scene = main->scene.first; scene; scene = scene->id.next) {
-                       if (scene->gm.matmode == GAME_MAT_TEXFACE) {
+                       /* this can now be turned off */
+                       ToolSettings *ts= scene->toolsettings;
+                       if (ts->sculpt)
+                               ts->sculpt->flags |= SCULPT_DYNTOPO_SUBDIVIDE;
+
+                       /* single texture mode removed from game engine */
+                       if (scene->gm.matmode == GAME_MAT_TEXFACE)
                                scene->gm.matmode = GAME_MAT_MULTITEX;
-                       }
-               }
 
-               /* 'Increment' mode disabled for nodes, use true grid snapping instead */
-               for (scene = main->scene.first; scene; scene = scene->id.next) {
+                       /* 'Increment' mode disabled for nodes, use true grid snapping instead */
                        if (scene->toolsettings->snap_node_mode == SCE_SNAP_MODE_INCREMENT)
                                scene->toolsettings->snap_node_mode = SCE_SNAP_MODE_GRID;
-               }
 
-               /* Update for removed "sound-only" option in FFMPEG export settings. */
 #ifdef WITH_FFMPEG
-               for (scene = main->scene.first; scene; scene = scene->id.next) {
+                       /* Update for removed "sound-only" option in FFMPEG export settings. */
                        if (scene->r.ffcodecdata.type >= FFMPEG_INVALID) {
                                scene->r.ffcodecdata.type = FFMPEG_AVI;
                        }
-               }
 #endif
+
+               }
        }
 
        /* WATCH IT!!!: pointers from libdata have not been converted yet here! */
index 6bd935af436cce49bb8df8a2315efde653a1e2be..100eae97f91bff2f12aa7bf56e61e693b35405e0 100644 (file)
@@ -3076,9 +3076,12 @@ static void sculpt_topology_update(Sculpt *sd, Object *ob, Brush *brush)
 
        /* Only act if some verts are inside the brush area */
        if (totnode) {
-               PBVHTopologyUpdateMode mode = PBVH_Subdivide;
+               PBVHTopologyUpdateMode mode = 0;
                float location[3];
 
+               if (sd->flags & SCULPT_DYNTOPO_SUBDIVIDE)
+                       mode |= PBVH_Subdivide;
+
                if ((sd->flags & SCULPT_DYNTOPO_COLLAPSE) ||
                        (brush->sculpt_tool == SCULPT_TOOL_SIMPLIFY))
                {
index 7aabad86809ed39a7027247900fee7386d61a01e..5291ad808b162c0ed4863d5efd52ff0f2d189c60 100644 (file)
@@ -1568,8 +1568,9 @@ typedef enum SculptFlags {
         * dynamic-topology mode */
        SCULPT_DYNTOPO_SMOOTH_SHADING = (1 << 10),
 
-       /* If set, dynamic-topology brushes will collapse short edges in
-        * addition to subdividing long ones */
+       /* If set, dynamic-topology brushes will subdivide short edges */
+       SCULPT_DYNTOPO_SUBDIVIDE = (1 << 12),
+       /* If set, dynamic-topology brushes will collapse short edges */
        SCULPT_DYNTOPO_COLLAPSE = (1 << 11)
 } SculptFlags;
 
index a9f84f1dcc7b38bf10603f1c98a482cc8310c041..53200d4b8947cfed4ef37b53805d17011764444d 100644 (file)
@@ -322,6 +322,16 @@ static void rna_def_paint(BlenderRNA *brna)
 
 static void rna_def_sculpt(BlenderRNA  *brna)
 {
+       static EnumPropertyItem detail_refine_items[] = {
+               {SCULPT_DYNTOPO_SUBDIVIDE, "SUBDIVIDE", 0,
+                "Subdivide Edges", "Subdivide long edges to add mesh detail where needed"},
+               {SCULPT_DYNTOPO_COLLAPSE, "COLLAPSE", 0,
+                "Collapse Edges", "Collapse short edges to remove mesh detail where possible"},
+               {SCULPT_DYNTOPO_SUBDIVIDE|SCULPT_DYNTOPO_COLLAPSE, "SUBDIVIDE_COLLAPSE", 0,
+                "Subdivide Collapse", "Both subdivide long edges and collapse short edges to refine mesh detail"},
+               {0, NULL, 0, NULL, NULL}
+       };
+
        StructRNA *srna;
        PropertyRNA *prop;
 
@@ -403,16 +413,16 @@ static void rna_def_sculpt(BlenderRNA  *brna)
                                 "shading rather than flat shaded");
        RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Sculpt_update");
 
-       prop = RNA_def_property(srna, "use_edge_collapse", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_DYNTOPO_COLLAPSE);
-       RNA_def_property_ui_text(prop, "Collapse Short Edges",
-                                "In dynamic-topology mode, collapse short edges "
-                                "in addition to subdividing long ones");
-       RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
-
        prop = RNA_def_property(srna, "symmetrize_direction", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_items(prop, symmetrize_direction_items);
        RNA_def_property_ui_text(prop, "Direction", "Source and destination for symmetrize operator");
+
+       prop = RNA_def_property(srna, "detail_refine_method", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_bitflag_sdna(prop, NULL, "flags");
+       RNA_def_property_enum_items(prop, detail_refine_items);
+       RNA_def_property_ui_text(prop, "Detail Refine Method",
+                                "In dynamic-topology mode, how to add or remove mesh detail");
+       RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
 }