[Bf-blender-cvs] [9673aa8c151] soc-2017-normal-tools: Added point normals to target. Moved common loop functions and made changes to structure
Rohan Rathi
noreply at git.blender.org
Sun Jun 11 21:37:43 CEST 2017
Commit: 9673aa8c151b463e05922b192bcd403c2c7c319e
Author: Rohan Rathi
Date: Sun Jun 11 23:21:42 2017 +0530
Branches: soc-2017-normal-tools
https://developer.blender.org/rB9673aa8c151b463e05922b192bcd403c2c7c319e
Added point normals to target.
Moved common loop functions and made changes to structure
===================================================================
M source/blender/bmesh/bmesh_class.h
M source/blender/bmesh/intern/bmesh_mesh.c
M source/blender/bmesh/intern/bmesh_mesh.h
M source/blender/editors/mesh/editmesh_tools.c
M source/blender/editors/mesh/mesh_intern.h
M source/blender/editors/mesh/mesh_ops.c
M source/blender/editors/transform/transform.c
M source/blender/editors/transform/transform.h
M source/blender/editors/transform/transform_ops.c
===================================================================
diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h
index cc6a96a59cd..a35bc2b3141 100644
--- a/source/blender/bmesh/bmesh_class.h
+++ b/source/blender/bmesh/bmesh_class.h
@@ -268,6 +268,24 @@ enum {
BM_FACE = 8
};
+typedef struct TransDataLoopNormal {
+ int loop_index;
+ float mtx[3][3];
+ float smtx[3][3];
+ float niloc[3];
+ float nloc[3];
+ float *loc;
+ short *clnors_data;
+} TransDataLoopNormal;
+
+typedef struct LoopNormalData {
+ TransDataLoopNormal *normal;
+
+ int offset;
+ int totloop;
+ void *funcdata;
+} LoopNormalData;
+
#define BM_ALL (BM_VERT | BM_EDGE | BM_LOOP | BM_FACE)
#define BM_ALL_NOLOOP (BM_VERT | BM_EDGE | BM_FACE)
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index 5cbd8fd7472..d6d61404b0e 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -647,7 +647,6 @@ static void bm_mesh_loops_calc_normals(
do {
if (rebuild && !BM_elem_flag_test(l_curr, BM_ELEM_LNORSPACE) && !(bm->spacearr_dirty & BM_SPACEARR_DIRTY_ALL))
continue;
-
/* A smooth edge, we have to check for cyclic smooth fan case.
* If we find a new, never-processed cyclic smooth fan, we can do it now using that loop/edge as
* 'entry point', otherwise we can skip it. */
@@ -1070,7 +1069,7 @@ void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
if (BM_elem_flag_test(l, BM_ELEM_LNORSPACE)) {
-#ifdef _DEBUG
+#if 0
short(*clnor)[2] = BM_ELEM_CD_GET_VOID_P(l, cd_loop_clnors_offset);
int l_index = BM_elem_index_get(l);
BKE_lnor_space_custom_normal_to_data(bm->bmspacearr.lspacearr[l_index], l->v->no, *clnor);
@@ -1089,6 +1088,54 @@ void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
bm->spacearr_dirty &= ~(BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL);
}
+void BM_lnorspace_update(BMesh *bm)
+{
+ float(*lnors)[3] = MEM_callocN(sizeof(*lnors) * bm->totloop, "__func__");
+
+ if (bm->bmspacearr.lspacearr == NULL) {
+ BM_lnorspacearr_store(bm, lnors);
+ }
+ else if(bm->spacearr_dirty & (BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL)){
+ BM_lnorspace_rebuild(bm, false);
+ }
+ MEM_freeN(lnors);
+}
+
+int BM_total_loop_select(BMesh *bm)
+{
+ int r_sel = 0;
+ BMVert *v;
+ BMIter viter;
+
+ BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
+ if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+ r_sel += BM_vert_face_count(v);
+ }
+ }
+ return r_sel;
+}
+
+void InitTransDataNormal(BMesh *bm, TransDataLoopNormal *tld, BMVert *v, BMLoop *l, int offset)
+{
+ int l_index = BM_elem_index_get(l);
+ tld->loop_index = l_index;
+ short *clnors_data = BM_ELEM_CD_GET_VOID_P(l, offset);
+
+ float custom_normal[3];
+ BKE_lnor_space_custom_data_to_normal(bm->bmspacearr.lspacearr[l_index], clnors_data, custom_normal);
+
+ tld->clnors_data = clnors_data;
+ copy_v3_v3(tld->nloc, custom_normal);
+ copy_v3_v3(tld->niloc, custom_normal);
+
+ if (v) {
+ tld->loc = v->co;
+ }
+ else {
+ tld->loc = NULL;
+ }
+}
+
static void UNUSED_FUNCTION(bm_mdisps_space_set)(Object *ob, BMesh *bm, int from, int to)
{
/* switch multires data out of tangent space */
diff --git a/source/blender/bmesh/intern/bmesh_mesh.h b/source/blender/bmesh/intern/bmesh_mesh.h
index bf1a24d9ce4..b74394276eb 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.h
+++ b/source/blender/bmesh/intern/bmesh_mesh.h
@@ -55,6 +55,11 @@ void BM_loops_calc_normal_vcos(
void BM_lnorspacearr_store(BMesh *bm, float (*r_lnors)[3]);
void BM_lnorspace_invalidate(BMesh *bm, bool inval_all);
void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor);
+void BM_lnorspace_update(BMesh *bm);
+
+/* Loop Generics */
+int BM_total_loop_select(BMesh *bm);
+void InitTransDataNormal(BMesh *bm, TransDataLoopNormal *tld, BMVert *v, BMLoop *l, int offset);
void bmesh_edit_begin(BMesh *bm, const BMOpTypeFlag type_flag);
void bmesh_edit_end(BMesh *bm, const BMOpTypeFlag type_flag);
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 1f90b60a1f5..01fceb7c715 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -5976,4 +5976,261 @@ void MESH_OT_mark_freestyle_face(wmOperatorType *ot)
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
+static int init_point_normals(bContext *C, wmOperator *op, const wmEvent *event)
+{
+ Object *obedit = CTX_data_edit_object(C);
+ BMesh *bm = BKE_editmesh_from_object(obedit)->bm;
+ BMVert *v;
+ BMLoop *l;
+ BMIter viter, liter;
+
+ BM_lnorspace_update(bm);
+ LoopNormalData *ld = MEM_mallocN(sizeof(LoopNormalData), "__func__");
+ int cd_custom_normal_offset = CustomData_get_offset(&bm->ldata, CD_CUSTOMLOOPNORMAL);
+ int totloopsel = 0;
+
+ totloopsel = BM_total_loop_select(bm);
+ TransDataLoopNormal *tld = ld->normal = MEM_mallocN(sizeof(*tld) * totloopsel, "__func__");
+ BM_mesh_elem_index_ensure(bm, BM_LOOP);
+
+ BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
+ if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+ BM_ITER_ELEM(l, &liter, v, BM_LOOPS_OF_VERT) {
+
+ InitTransDataNormal(bm, tld, v, l, cd_custom_normal_offset);
+ tld++;
+ }
+ }
+ }
+
+ ld->totloop = totloopsel;
+ ld->offset = cd_custom_normal_offset;
+ op->customdata = ld;
+
+ return totloopsel;
+}
+
+static void apply_point_normals(bContext *C, wmOperator *op, float target[3], bool vert)
+{
+ Object *obedit = CTX_data_edit_object(C);
+ BMesh *bm = BKE_editmesh_from_object(obedit)->bm;
+ BMIter liter;
+ LoopNormalData *ld = op->customdata;
+ TransDataLoopNormal *tld = ld->normal;
+ bool point_away = RNA_boolean_get(op->ptr, "point_away");
+ int i = 0;
+
+ if (vert) {
+ BMElem *ele;
+ ele = BM_mesh_active_elem_get(bm);
+ if (ele->head.htype == BM_VERT) {
+ BMLoop *l;
+ BM_ITER_ELEM(l, &liter, ((BMVert *)ele), BM_LOOPS_OF_VERT) {
+ int loop_index = BM_elem_index_get(l);
+ tld = ld->normal;
+ for (i = 0; i < ld->totloop; i++, tld++) {
+ if (tld->loop_index == loop_index) {
+ tld->loop_index = -1;
+ break;
+ }
+ }
+ }
+ tld = ld->normal;
+ }
+ }
+
+ for (int i = 0; i < ld->totloop; i++, tld++) {
+ sub_v3_v3v3(tld->nloc, target, tld->loc);
+ normalize_v3(tld->nloc);
+
+ if (point_away) {
+ negate_v3(tld->nloc);
+ }
+ if (tld->loop_index != -1) {
+ BKE_lnor_space_custom_normal_to_data(bm->bmspacearr.lspacearr[tld->loop_index], tld->nloc, tld->clnors_data);
+ }
+ }
+}
+
+static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *event)
+{
+ View3D *v3d = CTX_wm_view3d(C);
+ Scene *scene = CTX_data_scene(C);
+ Object *obedit = CTX_data_edit_object(C);
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ BMesh *bm = em->bm;
+ BMVert *v;
+ LoopNormalData *ld = op->customdata;
+ TransDataLoopNormal *tld = ld->normal;
+ float target[3];
+ static BMElem *ele_ref = NULL;
+ int i = 0;
+
+ bool point_away = RNA_boolean_get(op->ptr, "point_away"), handled = false;
+ PropertyRNA *prop = RNA_struct_find_property(op->ptr, "target");
+
+ if (ele_ref) {
+ BMElem *ele_new = BM_mesh_active_elem_get(bm);
+ if (ele_ref == ele_new) {
+ ele_ref = NULL;
+ return OPERATOR_CANCELLED;
+ }
+ RNA_boolean_set(op->ptr, "check_vert", true);
+ ED_object_editmode_calc_active_center(obedit, false, target);
+ RNA_property_float_set_array(op->ptr, prop, target);
+ handled = true;
+ ele_ref = NULL;
+ }
+
+ if (event->val == KM_PRESS) {
+ if (event->type == RIGHTMOUSE) {
+ ele_ref = BM_mesh_active_elem_get(bm);
+ }
+ else if (event->type == LKEY) {
+ BMIter viter;
+
+ switch (v3d->around) {
+ case V3D_AROUND_CENTER_BOUNDS:
+ /* calculateCenterBound */
+ {
+ float min[3], max[3];
+ BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
+ if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+ if (i) {
+ minmax_v3v3_v3(min, max, v->co);
+ }
+ else {
+ copy_v3_v3(min, v->co);
+ copy_v3_v3(max, v->co);
+ }
+ i++;
+ }
+ }
+ mid_v3_v3v3(target, min, max);
+ RNA_property_float_set_array(op->ptr, prop, target);
+ }
+ break;
+
+ case V3D_AROUND_CENTER_MEAN:
+ if (ld->totloop) {
+ zero_v3(target);
+ BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
+ if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+ add_v3_v3(target, v->co);
+ i++;
+ }
+ }
+ mul_v3_fl(target, 1.0f / i);
+ }
+ else {
+ return OPERATOR_CANCELLED;
+ }
+ RNA_property_float_set_array(op->ptr, prop, target);
+ break;
+
+ case V3D_AROUND_CURSOR:
+ copy_v3_v3(target, ED_view3d_cursor3d_get(scene, v3d));
+ RNA_property_float_set_array(op->ptr, prop, target);
+ break;
+
+ case V3D_AROUND_ACTIVE:
+ if (!ED_object_editmode_calc_active_center(obedit, false, target)) {
+ return OPERATOR_CANCELLED;
+ }
+ RNA_boolean_set(op->ptr, "check_vert", true);
+ RNA_property_float_set_array(op->ptr, prop, target);
+ break;
+
+ default:
+ BKE_report(op->reports, RPT_ERROR, "Does not support Indivisual Origin as pivot");
+ return OPERATOR_CANCELLED;
+ }
+ handled = true;
+ }
+ else if (ISKEYBOARD(event->type) && event->type != RIGHTALTKEY) {
+ return OPERATOR_CANCELLED;
+ }
+ }
+
+ if (handled) {
+ bool check_vert = RNA_boolean_get(op->ptr, "check_vert");
+ apply_point_normals(C, op, target, check_vert);
+ EDBM_update_generic(em, true, false); /* Recheck bools */
+ return OPERATOR_FINISHED;
+ }
+ return OPERATOR_PASS_THROUGH;
+}
+
+static int edbm_point_normals_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+{
+ Object *obedit = CTX_data_edit_object(C);
+ if ((((Mesh *)(obedit->data))->flag & ME_AUTOSMOOTH) == 0) {
+ BKE_report(op->reports, RPT_ERROR, "Auto Smooth is turned off");
+ return OPERATOR_CANCELLED;
+ }
+
+ if (!init_point_normals(C, op, event)) {
+ return OPERATOR_CANCELLED;
+ }
+
+ WM_event_add_modal_handler(C, op);
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static int edbm_point_normals_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit = CTX_data_edit_object(C);
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ BMesh *bm = em->bm;
+ PropertyRNA *prop;
+
+ if (!init_point_normals(C, op, NULL)) {
+ return OPERATOR_CANCELLED;
+ }
+
+ LoopNormalData *ld = op->customdata;
+ T
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list