[Bf-blender-cvs] [19ff231ff5b] soc-2017-normal-tools: Fixed issues with Point Normals.
Rohan Rathi
noreply at git.blender.org
Tue Jun 13 08:04:56 CEST 2017
Commit: 19ff231ff5bbc62425a5c81b00bd3712bc34e01b
Author: Rohan Rathi
Date: Tue Jun 13 11:34:03 2017 +0530
Branches: soc-2017-normal-tools
https://developer.blender.org/rB19ff231ff5bbc62425a5c81b00bd3712bc34e01b
Fixed issues with Point Normals.
Added header, fixed bugs and logic errors in point normals to target. Target location is now editable from UI.
Also renamed 'bmspacearr' to 'lnor_spacearr'
===================================================================
M source/blender/bmesh/bmesh_class.h
M source/blender/bmesh/intern/bmesh_mesh.c
M source/blender/editors/mesh/editmesh_tools.c
M source/blender/editors/transform/transform.c
===================================================================
diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h
index 58079678454..dcaceef8ac9 100644
--- a/source/blender/bmesh/bmesh_class.h
+++ b/source/blender/bmesh/bmesh_class.h
@@ -256,7 +256,7 @@ typedef struct BMesh {
void *py_handle;
- struct MLoopNorSpaceArray *bmspacearr; /* Stores MLoopNorSpaceArray for this BMesh */
+ struct MLoopNorSpaceArray *lnor_spacearr; /* Stores MLoopNorSpaceArray for this BMesh */
char spacearr_dirty;
} BMesh;
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index 7745438fceb..e1d110fb486 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -270,9 +270,9 @@ void BM_mesh_data_free(BMesh *bm)
BLI_freelistN(&bm->selected);
- if (bm->bmspacearr) {
- BKE_lnor_spacearr_free(bm->bmspacearr);
- MEM_freeN(bm->bmspacearr);
+ if (bm->lnor_spacearr) {
+ BKE_lnor_spacearr_free(bm->lnor_spacearr);
+ MEM_freeN(bm->lnor_spacearr);
}
BMO_error_clear(bm);
@@ -987,7 +987,7 @@ void BM_loops_calc_normal_vcos(
void BM_lnorspacearr_store(BMesh *bm, float (*r_lnors)[3])
{
- BLI_assert(bm->bmspacearr != NULL);
+ BLI_assert(bm->lnor_spacearr != NULL);
if (!CustomData_has_layer(&bm->ldata, CD_CUSTOMLOOPNORMAL)) {
BM_data_layer_add(bm, &bm->ldata, CD_CUSTOMLOOPNORMAL);
@@ -995,7 +995,7 @@ void BM_lnorspacearr_store(BMesh *bm, float (*r_lnors)[3])
int cd_loop_clnors_offset = CustomData_get_offset(&bm->ldata, CD_CUSTOMLOOPNORMAL);
- BM_loops_calc_normal_vcos(bm, NULL, NULL, NULL, true, M_PI, r_lnors, bm->bmspacearr, NULL, cd_loop_clnors_offset, false);
+ BM_loops_calc_normal_vcos(bm, NULL, NULL, NULL, true, M_PI, r_lnors, bm->lnor_spacearr, NULL, cd_loop_clnors_offset, false);
bm->spacearr_dirty &= ~(BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL);
}
@@ -1038,7 +1038,7 @@ void BM_lnorspace_invalidate(BMesh *bm, bool inval_all)
void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
{
- BLI_assert(bm->bmspacearr != NULL);
+ BLI_assert(bm->lnor_spacearr != NULL);
if (!(bm->spacearr_dirty & (BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL))) {
return;
@@ -1057,7 +1057,7 @@ void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
}
if (preserve_clnor) {
- BLI_assert(bm->bmspacearr->lspacearr != NULL);
+ BLI_assert(bm->lnor_spacearr->lspacearr != NULL);
BM_ITER_MESH(f, &fiter, bm, BM_FACES_OF_MESH) {
BM_ITER_ELEM(l, &liter, f, BM_LOOPS_OF_FACE) {
@@ -1066,12 +1066,12 @@ void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
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_data_to_normal(bm->bmspacearr->lspacearr[l_index], *clnor, oldnors[l_index]);
+ BKE_lnor_space_custom_data_to_normal(bm->lnor_spacearr->lspacearr[l_index], *clnor, oldnors[l_index]);
}
}
}
}
- BM_loops_calc_normal_vcos(bm, NULL, NULL, NULL, true, M_PI, r_lnors, bm->bmspacearr, NULL, cd_loop_clnors_offset, true);
+ BM_loops_calc_normal_vcos(bm, NULL, NULL, NULL, true, M_PI, r_lnors, bm->lnor_spacearr, NULL, cd_loop_clnors_offset, true);
MEM_freeN(r_lnors);
BM_ITER_MESH(f, &fiter, bm, BM_FACES_OF_MESH) {
@@ -1082,12 +1082,12 @@ void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
#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);
+ BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[l_index], l->v->no, *clnor);
#else
if (preserve_clnor) {
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], oldnors[l_index], *clnor);
+ BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[l_index], oldnors[l_index], *clnor);
}
#endif
BM_elem_flag_disable(l, BM_ELEM_LNORSPACE);
@@ -1102,10 +1102,10 @@ void BM_lnorspace_update(BMesh *bm)
{
float(*lnors)[3] = MEM_callocN(sizeof(*lnors) * bm->totloop, "__func__");
- if (bm->bmspacearr == NULL) {
- bm->bmspacearr = MEM_callocN(sizeof(*bm->bmspacearr), __func__);
+ if (bm->lnor_spacearr == NULL) {
+ bm->lnor_spacearr = MEM_callocN(sizeof(*bm->lnor_spacearr), __func__);
}
- if (bm->bmspacearr->lspacearr == NULL) {
+ if (bm->lnor_spacearr->lspacearr == NULL) {
BM_lnorspacearr_store(bm, lnors);
}
else if(bm->spacearr_dirty & (BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL)){
@@ -1130,15 +1130,15 @@ int BM_total_loop_select(BMesh *bm)
void InitTransDataNormal(BMesh *bm, TransDataLoopNormal *tld, BMVert *v, BMLoop *l, int offset)
{
- BLI_assert(bm->bmspacearr != NULL);
- BLI_assert(bm->bmspacearr->lspacearr != NULL);
+ BLI_assert(bm->lnor_spacearr != NULL);
+ BLI_assert(bm->lnor_spacearr->lspacearr != NULL);
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);
+ BKE_lnor_space_custom_data_to_normal(bm->lnor_spacearr->lspacearr[l_index], clnors_data, custom_normal);
tld->clnors_data = clnors_data;
copy_v3_v3(tld->nloc, custom_normal);
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index e1aaa06c5b2..b16c27884f9 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -46,6 +46,7 @@
#include "BLI_math.h"
#include "BLI_rand.h"
#include "BLI_sort_utils.h"
+#include "BLI_string.h"
#include "BKE_material.h"
#include "BKE_context.h"
@@ -5990,19 +5991,39 @@ static int init_point_normals(bContext *C, wmOperator *op, const wmEvent *event)
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);
+ PropertyRNA *prop = RNA_struct_find_property(op->ptr, "selected");
+ int length = RNA_property_array_length(op->ptr, prop);
+ int *vert_sel = MEM_mallocN(sizeof(*vert_sel) * length, "__func__");
+ RNA_int_get_array(op->ptr, "selected", vert_sel);
- 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) {
+ if (*vert_sel != -1) {
+ totloopsel = RNA_int_get(op->ptr, "loop_selected");
+ TransDataLoopNormal *tld = ld->normal = MEM_mallocN(sizeof(*tld) * totloopsel, "__func__");
+
+ for (int i = 0; i < length; i++, vert_sel++) {
+ v = BM_vert_at_index_find_or_table(bm, *vert_sel);
+ BM_ITER_ELEM(l, &liter, v, BM_LOOPS_OF_VERT) {
InitTransDataNormal(bm, tld, v, l, cd_custom_normal_offset);
tld++;
}
}
}
+ else {
+ 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;
@@ -6011,10 +6032,11 @@ static int init_point_normals(bContext *C, wmOperator *op, const wmEvent *event)
return totloopsel;
}
-static void apply_point_normals(bContext *C, wmOperator *op, float target[3], bool vert)
+static void apply_point_normals(bContext *C, wmOperator *op, const wmEvent *event, float target[3], bool vert)
{
Object *obedit = CTX_data_edit_object(C);
BMesh *bm = BKE_editmesh_from_object(obedit)->bm;
+ BMLoop *l;
BMIter liter;
LoopNormalData *ld = op->customdata;
TransDataLoopNormal *tld = ld->normal;
@@ -6025,7 +6047,6 @@ static void apply_point_normals(bContext *C, wmOperator *op, float target[3], bo
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;
@@ -6039,7 +6060,6 @@ static void apply_point_normals(bContext *C, wmOperator *op, float target[3], bo
tld = ld->normal;
}
}
-
for (int i = 0; i < ld->totloop; i++, tld++) {
sub_v3_v3v3(tld->nloc, target, tld->loc);
normalize_v3(tld->nloc);
@@ -6048,11 +6068,21 @@ static void apply_point_normals(bContext *C, wmOperator *op, float target[3], bo
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);
+ BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[tld->loop_index], tld->nloc, tld->clnors_data);
}
}
}
+static void point_normals_free(bContext *C, wmOperator *op)
+{
+ LoopNormalData *ld = op->customdata;
+ MEM_freeN(ld->normal);
+ MEM_freeN(ld);
+ op->customdata = NULL;
+
+ ED_area_headerprint(CTX_wm_area(C), NULL);
+}
+
static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *event)
{
View3D *v3d = CTX_wm_view3d(C);
@@ -6060,20 +6090,18 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
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");
+ bool handled = false;
+ PropertyRNA *prop = RNA_struct_find_property(op->ptr, "Target Location");
if (ele_ref) {
BMElem *ele_new = BM_mesh_active_elem_get(bm);
if (ele_ref == ele_new) {
ele_ref = NULL;
+ point_normals_free
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list