[Bf-blender-cvs] [dfcef670956] soc-2017-sculpting_improvements: Added a new undonode for the silhouette operator. Bare basics of undo now work, Redo can cause a crash and still needs to be implemented. Fixed crash when stroke with < 3 points was drawn.
Sebastian Witt
noreply at git.blender.org
Fri Jul 21 13:15:09 CEST 2017
Commit: dfcef670956273e9c23db565334f3bfa2f4d7701
Author: Sebastian Witt
Date: Fri Jul 21 13:12:24 2017 +0200
Branches: soc-2017-sculpting_improvements
https://developer.blender.org/rBdfcef670956273e9c23db565334f3bfa2f4d7701
Added a new undonode for the silhouette operator.
Bare basics of undo now work, Redo can cause a crash and still needs to be implemented.
Fixed crash when stroke with < 3 points was drawn.
===================================================================
M source/blender/editors/sculpt_paint/sculpt.c
M source/blender/editors/sculpt_paint/sculpt_intern.h
M source/blender/editors/sculpt_paint/sculpt_undo.c
===================================================================
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 49cc2e13964..b2c18217f35 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -5152,7 +5152,7 @@ static void silhouette_set_ref_plane(SilhouetteData *sil)
ED_view3d_global_to_vector(sil->ar->regiondata, sil->anchor, sil->z_vec);
}
-static void sculpt_silhouette_stroke_update(bContext *C, float mouse[2], SilhouetteData *sil)
+static void sculpt_silhouette_stroke_update(float mouse[2], SilhouetteData *sil)
{
float anchor[3];
silhouette_set_ref_plane(sil);
@@ -6608,7 +6608,7 @@ static bool calc_stroke_normal_ori(SilhouetteStroke *stroke, float z_vec[3]) {
}
/* Generates a 3D shape from a stroke. */
-static void silhouette_create_shape_mesh(bContext *C, Mesh *me, SilhouetteData *sil, SilhouetteStroke *stroke)
+static void silhouette_create_shape_mesh(bContext *UNUSED(C), Mesh *me, SilhouetteData *sil, SilhouetteStroke *stroke)
{
float z_vec[3] = {0.0f,0.0f,1.0f};
float depth = sil->depth;
@@ -6662,7 +6662,7 @@ static void silhouette_create_shape_mesh(bContext *C, Mesh *me, SilhouetteData *
free_spine(spine);
- ED_mesh_update(me, C, 1, 1);
+ /*ED_mesh_update(me, C, 1, 1);*/
}
/* Adds additional points to the stroke if start and end are far apart. */
@@ -6695,20 +6695,21 @@ static void sculpt_silhouette_calc_mesh(bContext *C, wmOperator *op)
Mesh *me = ob->data;
SilhouetteStroke *stroke = sil->current_stroke;
+
stroke_smooth_cap(stroke, 0.3f);
silhouette_create_shape_mesh(C, me, sil, stroke);
- /* Rebuild mesh caches
+ /* Rebuild mesh caches
* TODO: Proper PBVH etc. */
BKE_object_free_derived_caches(ob);
}
static void sculpt_silhouette_stroke_done(bContext *UNUSED(C), wmOperator *op)
{
+#ifdef DEBUG_DRAW
SilhouetteData *sil = op->customdata;
-#ifdef DEBUG_DRAW
for (int i = 1; i < sil->current_stroke->totvert; i ++) {
float v1[3], v2[3];
copy_v3_v3(v1, &sil->current_stroke->points[i * 3 - 3]);
@@ -6733,15 +6734,29 @@ static void sculpt_silhouette_clean_draw(bContext *C, wmOperator *op)
static int sculpt_silhouette_exec(bContext *C, wmOperator *op)
{
+ int v_start, e_start, l_start, p_start;
SilhouetteData *sil = op->customdata;
+ Object *ob = CTX_data_active_object(C);
+ Mesh *me = ob->data;
+
if (!sil) {
sil = silhouette_data_new(C);
silhouette_set_ref_plane(sil);
op->customdata = sil;
}
- sculpt_silhouette_calc_mesh(C, op);
- sculpt_silhouette_stroke_done(C, op);
+ if (sil->current_stroke->totvert > 2) {
+ sculpt_undo_push_begin("draw Silhouette");
+ v_start = me->totvert;
+ e_start = me->totedge;
+ l_start = me->totloop;
+ p_start = me->totpoly;
+ sculpt_silhouette_calc_mesh(C, op);
+ sculpt_silhouette_stroke_done(C, op);
+
+ sculpt_undo_silhouette_push(ob, v_start, e_start, l_start, p_start);
+ sculpt_undo_push_end(C);
+ }
return OPERATOR_FINISHED;
}
@@ -6761,7 +6776,7 @@ static int sculpt_silhouette_modal(bContext *C, wmOperator *op, const wmEvent *e
return OPERATOR_FINISHED;
} else {
if (sil->state == SIL_DRAWING) {
- sculpt_silhouette_stroke_update(C,mouse,op->customdata);
+ sculpt_silhouette_stroke_update(mouse, op->customdata);
}
return OPERATOR_RUNNING_MODAL;
}
@@ -6830,8 +6845,6 @@ static int sculpt_silhouette_poll(bContext *UNUSED(C))
static void SCULPT_OT_silhouette_draw(wmOperatorType *ot)
{
- PropertyRNA *prop;
-
/* identifiers */
ot->name = "Draw Silhouette";
ot->idname = "SCULPT_OT_silhouette_draw";
@@ -6845,7 +6858,7 @@ static void SCULPT_OT_silhouette_draw(wmOperatorType *ot)
ot->cancel = sculpt_silhouette_stroke_done;
/* flags */
- ot->flag = OPTYPE_BLOCKING | OPTYPE_REGISTER | OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* end Silhouette */
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index f1475b179c5..bc08be5a864 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -70,6 +70,7 @@ typedef enum SculptUndoType {
SCULPT_UNDO_DYNTOPO_BEGIN,
SCULPT_UNDO_DYNTOPO_END,
SCULPT_UNDO_DYNTOPO_SYMMETRIZE,
+ SCULPT_UNDO_SILHOUETTE
} SculptUndoType;
typedef struct SculptUndoNode {
@@ -99,6 +100,7 @@ typedef struct SculptUndoNode {
BLI_bitmap **grid_hidden;
/* bmesh */
+ /* Reused for Silhouette undonode. TODO: Maybe separate?*/
struct BMLogEntry *bm_entry;
bool applied;
CustomData bm_enter_vdata;
@@ -116,6 +118,7 @@ typedef struct SculptUndoNode {
SculptUndoNode *sculpt_undo_push_node(Object *ob, PBVHNode *node, SculptUndoType type);
SculptUndoNode *sculpt_undo_get_node(PBVHNode *node);
+SculptUndoNode *sculpt_undo_silhouette_push(Object *ob, int v_start, int e_start, int l_start, int p_start);
void sculpt_undo_push_begin(const char *name);
void sculpt_undo_push_end(const struct bContext *C);
diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c
index 44bd872d107..676bf790f86 100644
--- a/source/blender/editors/sculpt_paint/sculpt_undo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_undo.c
@@ -68,6 +68,7 @@
#include "bmesh.h"
#include "paint_intern.h"
#include "sculpt_intern.h"
+#include "BKE_object.h"
/************************** Undo *************************/
@@ -446,6 +447,59 @@ static int sculpt_undo_bmesh_restore(bContext *C,
return false;
}
+static void sculpt_undo_silhouette_restore(bContext *C, Object *ob, SculptUndoNode *unode)
+{
+ Mesh *me = ob->data;
+ if(unode->applied){
+ unode->applied = false;
+
+ CustomData_free_elem(&me->vdata, me->totvert - unode->bm_enter_totvert, unode->bm_enter_totvert);
+ CustomData_free_elem(&me->edata, me->totedge - unode->bm_enter_totedge, unode->bm_enter_totedge);
+ CustomData_free_elem(&me->ldata, me->totloop - unode->bm_enter_totloop, unode->bm_enter_totloop);
+ CustomData_free_elem(&me->pdata, me->totpoly - unode->bm_enter_totpoly, unode->bm_enter_totpoly);
+
+ CustomData_realloc(&me->vdata, me->totvert - unode->bm_enter_totvert);
+ CustomData_realloc(&me->edata, me->totedge - unode->bm_enter_totedge);
+ CustomData_realloc(&me->ldata, me->totloop - unode->bm_enter_totloop);
+ CustomData_realloc(&me->pdata, me->totpoly - unode->bm_enter_totpoly);
+
+ BKE_mesh_update_customdata_pointers(me, true);
+
+ me->totvert = me->totvert - unode->bm_enter_totvert;
+ me->totedge = me->totedge - unode->bm_enter_totedge;
+ me->totloop = me->totloop - unode->bm_enter_totloop;
+ me->totpoly = me->totpoly - unode->bm_enter_totpoly;
+
+ BKE_object_free_derived_caches(ob);
+ } else {
+ unode->applied = true;
+ /* TODO: Add Redo
+ printf("Redo it!\n");
+
+ CustomData_realloc(&me->vdata, me->totvert + unode->bm_enter_totvert);
+ CustomData_realloc(&me->edata, me->totedge + unode->bm_enter_totedge);
+ CustomData_realloc(&me->ldata, me->totloop + unode->bm_enter_totloop);
+ CustomData_realloc(&me->pdata, me->totpoly + unode->bm_enter_totpoly);
+
+ CustomData_copy_data(&unode->bm_enter_vdata, &me->vdata, 0,
+ me->totvert, unode->bm_enter_totvert);
+ CustomData_copy_data(&unode->bm_enter_edata, &me->edata, 0,
+ me->totedge, unode->bm_enter_totedge);
+ CustomData_copy_data(&unode->bm_enter_ldata, &me->ldata, 0,
+ me->totloop, unode->bm_enter_totloop);
+ CustomData_copy_data(&unode->bm_enter_pdata, &me->pdata, 0,
+ me->totpoly, unode->bm_enter_totpoly);
+
+ me->totvert += unode->bm_enter_totvert;
+ me->totloop += unode->bm_enter_totloop;
+ me->totpoly += unode->bm_enter_totpoly;
+ me->totedge += unode->bm_enter_totedge;
+
+ BKE_mesh_update_customdata_pointers(me, true);
+ BKE_object_free_derived_caches(ob);*/
+ }
+}
+
static void sculpt_undo_restore(bContext *C, ListBase *lb)
{
Scene *scene = CTX_data_scene(C);
@@ -517,6 +571,12 @@ static void sculpt_undo_restore(bContext *C, ListBase *lb)
case SCULPT_UNDO_DYNTOPO_SYMMETRIZE:
BLI_assert(!"Dynamic topology should've already been handled");
break;
+ case SCULPT_UNDO_SILHOUETTE:
+ sculpt_undo_silhouette_restore(C, ob, unode);
+ rebuild = true;
+ partial_update = false;
+ return;
+ break;
}
}
@@ -711,6 +771,8 @@ static SculptUndoNode *sculpt_undo_alloc_node(Object *ob, PBVHNode *node,
case SCULPT_UNDO_DYNTOPO_SYMMETRIZE:
BLI_assert(!"Dynamic topology should've already been handled");
break;
+ case SCULPT_UNDO_SILHOUETTE:
+ break;
}
BLI_addtail(lb, unode);
@@ -868,6 +930,7 @@ static SculptUndoNode *sculpt_undo_bmesh_push(Object *ob,
case SCULPT_UNDO_DYNTOPO_BEGIN:
case SCULPT_UNDO_DYNTOPO_END:
case SCULPT_UNDO_DYNTOPO_SYMMETRIZE:
+ case SCULPT_UNDO_SILHOUETTE:
break;
}
}
@@ -875,6 +938,43 @@ static SculptUndoNode *sculpt_undo_bmesh_push(Object *ob,
return unode;
}
+SculptUndoNode *sculpt_undo_silhouette_push(Object *ob, int v_start, int e_start, int l_start, int p_start)
+{
+ /* list is manipulated by multiple threads, so we lock */
+ BLI_lock_thread(LOCK_CUSTOM1);
+
+ ListBase *lb = undo_paint_push_get_list(UNDO_PAINT_MESH);
+ SculptUndoNode *unode = lb->first;
+
+ if (!lb->first) {
+ unode = MEM_callocN(sizeof(*unode), __func__);
+
+ BLI_strncpy(unode->idname, ob->id.name, sizeof(unode->idname));
+ unode->type = SCULPT_UNDO_SILHOUETTE;
+ unode->applied = true;
+
+ Mesh *me = ob->data;
+
+ /* Store a copy of the silhouettes current vertices, loops, and
+ * polys. TODO: Add bridge edges and deleted existing geometry later */
+ /*TODO: Not a full copy is possible*/
+ CustomData_copy_data(&me->vdata, &unode->bm_enter_vdata, v_start, 0, me->totvert - v_start);
+ CustomData_copy_data(&me->edata, &unode->bm_enter_edata, e_start, 0, me->totedge - e_start);
+ CustomData_copy_data(&me->ldata, &unode->bm_enter_ldata, l_start, 0, me->totloop - l_start);
+ CustomData_copy_data(&me->pdata, &unode->bm_enter_pdata, p_start, 0, me->totpoly - p_start);
+ unode->bm_enter_totvert = me->totvert - v_start;
+ unode->bm_enter_totedge = me->totedge - e_start;
+ unode->bm_enter_totloop = me->totloop - l_start;
+ unode->bm_enter_totpoly = me->totpoly - p_start;
+
+ BLI_ad
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list