Make sure we invalidate the node ID layer each time the PBVH is reset.
authorAntony Riakiotakis <kalast@gmail.com>
Thu, 17 Apr 2014 17:53:20 +0000 (20:53 +0300)
committerAntony Riakiotakis <kalast@gmail.com>
Thu, 17 Apr 2014 17:53:40 +0000 (20:53 +0300)
It makes code more tidy (avoids having to call invalidation on a myriad
places). Also makes sure other invalidation cases (some mesh change,
e.g.) work as expected.

source/blender/blenkernel/intern/pbvh_bmesh.c
source/blender/editors/sculpt_paint/sculpt.c
source/blender/editors/sculpt_paint/sculpt_intern.h
source/blender/editors/sculpt_paint/sculpt_undo.c

index d316cbba86b30a36b58e7f3be1b066c8fa2cd600..e2e4592403ca17eaf63ab28fa63b5b624f619854 100644 (file)
@@ -1143,6 +1143,26 @@ void pbvh_bmesh_normals_update(PBVHNode **nodes, int totnode)
 
 /***************************** Public API *****************************/
 
+static void pbvh_bmesh_node_layers_reset(PBVH *bvh)
+{
+       BMFace *f;
+       BMVert *v;
+       BMIter iter;
+       BMesh *bm = bvh->bm;
+       int cd_vert_node_offset = bvh->cd_vert_node_offset;
+       int cd_face_node_offset = bvh->cd_face_node_offset;
+
+       /* clear the elements of the node information */
+       BM_ITER_MESH(v, &iter, bm, BM_VERTS_OF_MESH) {
+               BM_ELEM_CD_SET_INT(v, cd_vert_node_offset, DYNTOPO_NODE_NONE);
+       }
+
+       BM_ITER_MESH(f, &iter, bm, BM_FACES_OF_MESH) {
+               BM_ELEM_CD_SET_INT(f, cd_face_node_offset, DYNTOPO_NODE_NONE);
+       }
+}
+
+
 /* Build a PBVH from a BMesh */
 void BKE_pbvh_build_bmesh(PBVH *bvh, BMesh *bm, bool smooth_shading, BMLog *log,
                           const int cd_vert_node_offset, const int cd_face_node_offset)
@@ -1167,6 +1187,8 @@ void BKE_pbvh_build_bmesh(PBVH *bvh, BMesh *bm, bool smooth_shading, BMLog *log,
        if (smooth_shading)
                bvh->flags |= PBVH_DYNTOPO_SMOOTH_SHADING;
 
+       pbvh_bmesh_node_layers_reset(bvh);
+
        /* Start with all faces in the root node */
        n = bvh->nodes = MEM_callocN(sizeof(PBVHNode), "PBVHNode");
        bvh->totnode = 1;
index f5bdbfa974db9cb2519954fc9b2f0608ab697396..16c0f9bc4fb63527a4719f41f7ab5c5497200d9d 100644 (file)
@@ -4793,25 +4793,6 @@ void sculpt_pbvh_clear(Object *ob)
        BKE_object_free_derived_caches(ob);
 }
 
-void sculpt_dyntopo_node_layers_reset(SculptSession *ss)
-{
-       BMFace *f;
-       BMVert *v;
-       BMIter iter;
-       BMesh *bm = ss->bm;
-       int cd_vert_node_offset = ss->cd_vert_node_offset;
-       int cd_face_node_offset = ss->cd_face_node_offset;
-
-       /* clear the elements of the node information */
-       BM_ITER_MESH(v, &iter, bm, BM_VERTS_OF_MESH) {
-               BM_ELEM_CD_SET_INT(v, cd_vert_node_offset, DYNTOPO_NODE_NONE);
-       }
-
-       BM_ITER_MESH(f, &iter, bm, BM_FACES_OF_MESH) {
-               BM_ELEM_CD_SET_INT(f, cd_face_node_offset, DYNTOPO_NODE_NONE);
-       }
-}
-
 void sculpt_dyntopo_node_layers_add(SculptSession *ss)
 {
        int cd_node_layer_index;
@@ -4874,7 +4855,6 @@ void sculpt_dynamic_topology_enable(bContext *C)
        BM_data_layer_add(ss->bm, &ss->bm->vdata, CD_PAINT_MASK);
        sculpt_dyntopo_node_layers_add(ss);
        /* make sure the data for existing faces are initialized */
-       sculpt_dyntopo_node_layers_reset(ss);
        BM_mesh_normals_update(ss->bm);
 
        /* Enable dynamic topology */
@@ -5013,7 +4993,6 @@ static int sculpt_optimize_exec(bContext *C, wmOperator *UNUSED(op))
        Object *ob = CTX_data_active_object(C);
 
        sculpt_pbvh_clear(ob);
-       sculpt_dyntopo_node_layers_reset(ob->sculpt);
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
 
        return OPERATOR_FINISHED;
@@ -5072,7 +5051,6 @@ static int sculpt_symmetrize_exec(bContext *C, wmOperator *UNUSED(op))
 
        /* Redraw */
        sculpt_pbvh_clear(ob);
-       sculpt_dyntopo_node_layers_reset(ss);
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
 
        return OPERATOR_FINISHED;
@@ -5333,7 +5311,6 @@ static int sculpt_detail_flood_fill_exec(bContext *C, wmOperator *UNUSED(op))
 
        /* force rebuild of pbvh for better BB placement */
        sculpt_pbvh_clear(ob);
-       sculpt_dyntopo_node_layers_reset(ss);
        /* Redraw */
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
 
index 8cf5bf88bcca4494b71315597ef93973ce981307..a4d2f0dc057b4b6adbe89991ce12a506b8a56cc7 100644 (file)
@@ -48,7 +48,6 @@ struct MultiresModifierData;
 struct Object;
 struct Scene;
 struct Sculpt;
-struct SculptSession;
 struct SculptStroke;
 struct SculptUndoNode;
 
@@ -68,7 +67,6 @@ bool sculpt_stroke_get_location(bContext *C, float out[3], const float mouse[2])
 
 /* Dynamic topology */
 void sculpt_pbvh_clear(Object *ob);
-void sculpt_dyntopo_node_layers_reset(struct SculptSession *ss);
 void sculpt_dyntopo_node_layers_add(struct SculptSession *ss);
 void sculpt_update_after_dynamic_topology_toggle(bContext *C);
 void sculpt_dynamic_topology_enable(struct bContext *C);
index 39df15bd985d279c0401a3d4817a9cdbfef48f2c..6ac65e431ead0303587753da9fc29a448e7f3797 100644 (file)
@@ -301,7 +301,6 @@ static void sculpt_undo_bmesh_restore_generic(bContext *C,
                        MEM_freeN(nodes);
        }
        else {
-               sculpt_dyntopo_node_layers_reset(ss);
                sculpt_pbvh_clear(ob);
        }
 }
@@ -341,9 +340,6 @@ static void sculpt_undo_bmesh_restore_begin(bContext *C,
                /* Restore the mesh from the first log entry */
                BM_log_redo(ss->bm, ss->bm_log);
 
-               /* reset layers for all bmesh data */
-               sculpt_dyntopo_node_layers_reset(ss);
-
                unode->applied = true;
        }
 }
@@ -359,9 +355,6 @@ static void sculpt_undo_bmesh_restore_end(bContext *C,
                /* Restore the mesh from the last log entry */
                BM_log_undo(ss->bm, ss->bm_log);
 
-               /* reset layers for all bmesh data */
-               sculpt_dyntopo_node_layers_reset(ss);
-
                unode->applied = false;
        }
        else {