[Bf-blender-cvs] [15279c04d79] soc-2017-normal-tools: Do not include BKE_mesh.h in bmesh_class.h
Bastien Montagne
noreply at git.blender.org
Mon Jun 12 09:35:48 CEST 2017
Commit: 15279c04d7946946f7b56f97783338958e4f2e0a
Author: Bastien Montagne
Date: Mon Jun 12 09:22:19 2017 +0200
Branches: soc-2017-normal-tools
https://developer.blender.org/rB15279c04d7946946f7b56f97783338958e4f2e0a
Do not include BKE_mesh.h in bmesh_class.h
We absolutely avoid such include unless totally mandatory, here we can
simply keep lnorspaces array a pointer in BMesh struct, and allocate it
on demand. Also, was breaking bmesh tests building.
Note: this totally breaks undo/redo, but previous code was utterly
wrong here as well (shallow copy of lnorspaces, ending up sharing whole
internal memory -> crash garanteed ;) ). Think we can skip that struct
for undo/redo for now at least, we can rebuild it in those cases imho...
===================================================================
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/mesh/editmesh_undo.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 a35bc2b3141..58079678454 100644
--- a/source/blender/bmesh/bmesh_class.h
+++ b/source/blender/bmesh/bmesh_class.h
@@ -20,8 +20,6 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "BKE_mesh.h"
-
#ifndef __BMESH_CLASS_H__
#define __BMESH_CLASS_H__
@@ -40,6 +38,8 @@ struct BMEdge;
struct BMLoop;
struct BMFace;
+struct MLoopNorSpaceArray;
+
struct BLI_mempool;
/* note: it is very important for BMHeader to start with two
@@ -256,7 +256,7 @@ typedef struct BMesh {
void *py_handle;
- MLoopNorSpaceArray bmspacearr; /* Stores MLoopNorSpaceArray for this BMesh */
+ struct MLoopNorSpaceArray *bmspacearr; /* 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 d6d61404b0e..6e2b65245c8 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -270,6 +270,8 @@ void BM_mesh_data_free(BMesh *bm)
BLI_freelistN(&bm->selected);
+ MEM_SAFE_FREE(bm->bmspacearr);
+
BMO_error_clear(bm);
}
@@ -982,13 +984,15 @@ void BM_loops_calc_normal_vcos(
void BM_lnorspacearr_store(BMesh *bm, float (*r_lnors)[3])
{
+ BLI_assert(bm->bmspacearr != NULL);
+
if (!CustomData_has_layer(&bm->ldata, CD_CUSTOMLOOPNORMAL)) {
BM_data_layer_add(bm, &bm->ldata, CD_CUSTOMLOOPNORMAL);
}
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->bmspacearr, NULL, cd_loop_clnors_offset, false);
bm->spacearr_dirty &= ~(BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL);
}
@@ -1031,6 +1035,8 @@ void BM_lnorspace_invalidate(BMesh *bm, bool inval_all)
void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
{
+ BLI_assert(bm->bmspacearr != NULL);
+
if (!(bm->spacearr_dirty & (BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL))) {
return;
}
@@ -1048,20 +1054,21 @@ void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
}
if (preserve_clnor) {
- BM_ITER_MESH(f, &fiter, bm, BM_FACES_OF_MESH) {
+ BLI_assert(bm->bmspacearr->lspacearr != NULL);
+ BM_ITER_MESH(f, &fiter, bm, BM_FACES_OF_MESH) {
BM_ITER_ELEM(l, &liter, f, BM_LOOPS_OF_FACE) {
if (BM_elem_flag_test(l, BM_ELEM_LNORSPACE))
{
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->bmspacearr->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->bmspacearr, NULL, cd_loop_clnors_offset, true);
MEM_freeN(r_lnors);
BM_ITER_MESH(f, &fiter, bm, BM_FACES_OF_MESH) {
@@ -1072,12 +1079,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->bmspacearr->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->bmspacearr->lspacearr[l_index], oldnors[l_index], *clnor);
}
#endif
BM_elem_flag_disable(l, BM_ELEM_LNORSPACE);
@@ -1092,7 +1099,10 @@ void BM_lnorspace_update(BMesh *bm)
{
float(*lnors)[3] = MEM_callocN(sizeof(*lnors) * bm->totloop, "__func__");
- if (bm->bmspacearr.lspacearr == NULL) {
+ if (bm->bmspacearr == NULL) {
+ bm->bmspacearr = MEM_callocN(sizeof(*bm->bmspacearr), __func__);
+ }
+ if (bm->bmspacearr->lspacearr == NULL) {
BM_lnorspacearr_store(bm, lnors);
}
else if(bm->spacearr_dirty & (BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL)){
@@ -1117,12 +1127,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);
+
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->bmspacearr->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 01fceb7c715..e1aaa06c5b2 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -54,6 +54,7 @@
#include "BKE_report.h"
#include "BKE_texture.h"
#include "BKE_main.h"
+#include "BKE_mesh.h"
#include "BKE_editmesh.h"
#include "BLT_translation.h"
@@ -6047,7 +6048,7 @@ 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->bmspacearr->lspacearr[tld->loop_index], tld->nloc, tld->clnors_data);
}
}
}
diff --git a/source/blender/editors/mesh/editmesh_undo.c b/source/blender/editors/mesh/editmesh_undo.c
index e036dd8b94c..953b4c1b0f5 100644
--- a/source/blender/editors/mesh/editmesh_undo.c
+++ b/source/blender/editors/mesh/editmesh_undo.c
@@ -491,7 +491,7 @@ static void *editbtMesh_to_undoMesh(void *emv, void *obdata)
UndoMesh *um = MEM_callocN(sizeof(UndoMesh), "undo Mesh");
- um->bmspacearr = em->bm->bmspacearr;
+ um->bmspacearr = *em->bm->bmspacearr;
um->spacearr_dirty = em->bm->spacearr_dirty;
/* make sure shape keys work */
@@ -586,7 +586,7 @@ static void undoMesh_to_editbtMesh(void *um_v, void *em_v, void *obdata)
bm->selectmode = um->selectmode;
em->ob = ob;
- bm->bmspacearr = um->bmspacearr;
+ *bm->bmspacearr = um->bmspacearr;
bm->spacearr_dirty = um->spacearr_dirty;
/* T35170: Restore the active key on the RealMesh. Otherwise 'fake' offset propagation happens
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 66fad1e36a7..b08d2c9bc31 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -63,6 +63,7 @@
#include "BKE_particle.h"
#include "BKE_unit.h"
#include "BKE_mask.h"
+#include "BKE_mesh.h"
#include "BKE_report.h"
#include "BIF_gl.h"
@@ -4235,7 +4236,7 @@ void freeCustomNormalArray(TransInfo *t, TransCustomData *custom_data)
BMesh *bm = em->bm;
for (int i = 0; i < ld->totloop; i++, tld++){ /* Restore custom loop normal on cancel */
- BKE_lnor_space_custom_normal_to_data(bm->bmspacearr.lspacearr[tld->loop_index], tld->niloc, tld->clnors_data);
+ BKE_lnor_space_custom_normal_to_data(bm->bmspacearr->lspacearr[tld->loop_index], tld->niloc, tld->clnors_data);
}
}
@@ -4315,7 +4316,7 @@ static void applyNormalRotation(TransInfo *t, const int mval[2])
sub_v3_v3v3(vec, tld->nloc, tld->niloc);
add_v3_v3v3(tld->nloc, tld->niloc, vec);
- 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->bmspacearr->lspacearr[tld->loop_index], tld->nloc, tld->clnors_data);
}
recalcData(t);
More information about the Bf-blender-cvs
mailing list