Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Goudey <h.goudey@me.com>2022-08-12 00:55:49 +0300
committerHans Goudey <h.goudey@me.com>2022-08-12 00:56:08 +0300
commit344919240c8bd9ad2457f1775596bf0a1bd7560f (patch)
tree5f72dd1b6f0261a54733f8f159423d57ee1fbfe3
parentd2b1e4712dc16a18862d6c3bd46c68caea2511e7 (diff)
Fix: Broken mesh hide status RNA accessors
Mistake in 2480b55f216c31. Also deduplicate some of the code to find the indices of mesh elements.
-rw-r--r--source/blender/makesrna/intern/rna_mesh.c162
1 files changed, 94 insertions, 68 deletions
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index bdc96f6dec1..46b6a5d9451 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -344,15 +344,61 @@ static void rna_Mesh_update_positions_tag(Main *bmain, Scene *scene, PointerRNA
/** \name Property get/set Callbacks
* \{ */
-static void rna_MeshVertex_normal_get(PointerRNA *ptr, float *value)
+static int rna_MeshVertex_index_get(PointerRNA *ptr)
{
- Mesh *mesh = rna_mesh(ptr);
- const float(*vert_normals)[3] = BKE_mesh_vertex_normals_ensure(mesh);
-
- const int index = (MVert *)ptr->data - mesh->mvert;
+ const Mesh *mesh = rna_mesh(ptr);
+ const MVert *vert = (MVert *)ptr->data;
+ const int index = (int)(vert - mesh->mvert);
BLI_assert(index >= 0);
BLI_assert(index < mesh->totvert);
+ return index;
+}
+
+static int rna_MeshEdge_index_get(PointerRNA *ptr)
+{
+ const Mesh *mesh = rna_mesh(ptr);
+ const MEdge *edge = (MEdge *)ptr->data;
+ const int index = (int)(edge - mesh->medge);
+ BLI_assert(index >= 0);
+ BLI_assert(index < mesh->totedge);
+ return index;
+}
+
+static int rna_MeshPolygon_index_get(PointerRNA *ptr)
+{
+ const Mesh *mesh = rna_mesh(ptr);
+ const MPoly *mpoly = (MPoly *)ptr->data;
+ const int index = (int)(mpoly - mesh->mpoly);
+ BLI_assert(index >= 0);
+ BLI_assert(index < mesh->totpoly);
+ return index;
+}
+static int rna_MeshLoop_index_get(PointerRNA *ptr)
+{
+ const Mesh *mesh = rna_mesh(ptr);
+ const MLoop *mloop = (MLoop *)ptr->data;
+ const int index = (int)(mloop - mesh->mloop);
+ BLI_assert(index >= 0);
+ BLI_assert(index < mesh->totloop);
+ return index;
+}
+
+static int rna_MeshLoopTriangle_index_get(PointerRNA *ptr)
+{
+ const Mesh *mesh = rna_mesh(ptr);
+ const MLoopTri *ltri = (MLoopTri *)ptr->data;
+ const int index = (int)(ltri - mesh->runtime.looptris.array);
+ BLI_assert(index >= 0);
+ BLI_assert(index < mesh->runtime.looptris.len);
+ return index;
+}
+
+static void rna_MeshVertex_normal_get(PointerRNA *ptr, float *value)
+{
+ Mesh *mesh = rna_mesh(ptr);
+ const float(*vert_normals)[3] = BKE_mesh_vertex_normals_ensure(mesh);
+ const int index = rna_MeshVertex_index_get(ptr);
copy_v3_v3(value, vert_normals[index]);
}
@@ -361,19 +407,24 @@ static bool rna_MeshVertex_hide_get(PointerRNA *ptr)
const Mesh *mesh = rna_mesh(ptr);
const bool *hide_vert = (const bool *)CustomData_get_layer_named(
&mesh->vdata, CD_PROP_BOOL, ".hide_vert");
- const int index = (const MVert *)ptr->data - mesh->mvert;
- BLI_assert(index >= 0);
- BLI_assert(index < mesh->totvert);
- return hide_vert[index];
+ const int index = rna_MeshVertex_index_get(ptr);
+ return hide_vert == NULL ? false : hide_vert[index];
}
static void rna_MeshVertex_hide_set(PointerRNA *ptr, bool value)
{
Mesh *mesh = rna_mesh(ptr);
- bool *hide_vert = (bool *)CustomData_get_layer_named(&mesh->vdata, CD_PROP_BOOL, ".hide_vert");
- const int index = (const MVert *)ptr->data - mesh->mvert;
- BLI_assert(index >= 0);
- BLI_assert(index < mesh->totvert);
+ bool *hide_vert = (bool *)CustomData_duplicate_referenced_layer_named(
+ &mesh->vdata, CD_PROP_BOOL, ".hide_vert", mesh->totvert);
+ if (!hide_vert) {
+ if (!value) {
+ /* Skip adding layer if it doesn't exist already anyway and we're not hiding an element.. */
+ return;
+ }
+ hide_vert = (bool *)CustomData_add_layer_named(
+ &mesh->vdata, CD_PROP_BOOL, CD_CALLOC, NULL, mesh->totvert, ".hide_vert");
+ }
+ const int index = rna_MeshVertex_index_get(ptr);
hide_vert[index] = value;
}
@@ -490,19 +541,24 @@ static bool rna_MeshPolygon_hide_get(PointerRNA *ptr)
const Mesh *mesh = rna_mesh(ptr);
const bool *hide_poly = (const bool *)CustomData_get_layer_named(
&mesh->pdata, CD_PROP_BOOL, ".hide_poly");
- const int index = (const MPoly *)ptr->data - mesh->mpoly;
- BLI_assert(index >= 0);
- BLI_assert(index < mesh->totpoly);
- return hide_poly[index];
+ const int index = rna_MeshPolygon_index_get(ptr);
+ return hide_poly == NULL ? false : hide_poly[index];
}
static void rna_MeshPolygon_hide_set(PointerRNA *ptr, bool value)
{
Mesh *mesh = rna_mesh(ptr);
- bool *hide_poly = (bool *)CustomData_get_layer_named(&mesh->pdata, CD_PROP_BOOL, ".hide_poly");
- const int index = (const MPoly *)ptr->data - mesh->mpoly;
- BLI_assert(index >= 0);
- BLI_assert(index < mesh->totpoly);
+ bool *hide_poly = (bool *)CustomData_duplicate_referenced_layer_named(
+ &mesh->pdata, CD_PROP_BOOL, ".hide_poly", mesh->totpoly);
+ if (!hide_poly) {
+ if (!value) {
+ /* Skip adding layer if it doesn't exist already anyway and we're not hiding an element.. */
+ return;
+ }
+ hide_poly = (bool *)CustomData_add_layer_named(
+ &mesh->pdata, CD_PROP_BOOL, CD_CALLOC, NULL, mesh->totpoly, ".hide_poly");
+ }
+ const int index = rna_MeshPolygon_index_get(ptr);
hide_poly[index] = value;
}
@@ -1216,76 +1272,46 @@ static void rna_MeshPoly_material_index_range(
}
# endif
-static int rna_MeshVertex_index_get(PointerRNA *ptr)
-{
- Mesh *me = rna_mesh(ptr);
- MVert *vert = (MVert *)ptr->data;
- return (int)(vert - me->mvert);
-}
-
-static int rna_MeshEdge_index_get(PointerRNA *ptr)
-{
- Mesh *me = rna_mesh(ptr);
- MEdge *edge = (MEdge *)ptr->data;
- return (int)(edge - me->medge);
-}
-
static bool rna_MeshEdge_hide_get(PointerRNA *ptr)
{
const Mesh *mesh = rna_mesh(ptr);
const bool *hide_edge = (const bool *)CustomData_get_layer_named(
&mesh->pdata, CD_PROP_BOOL, ".hide_edge");
- const int index = (const MEdge *)ptr->data - mesh->medge;
- BLI_assert(index >= 0);
- BLI_assert(index < mesh->totedge);
- return hide_edge[index];
+ const int index = rna_MeshEdge_index_get(ptr);
+ return hide_edge == NULL ? false : hide_edge[index];
}
static void rna_MeshEdge_hide_set(PointerRNA *ptr, bool value)
{
Mesh *mesh = rna_mesh(ptr);
- bool *hide_edge = (bool *)CustomData_get_layer_named(&mesh->edata, CD_PROP_BOOL, ".hide_edge");
- const int index = (const MEdge *)ptr->data - mesh->medge;
- BLI_assert(index >= 0);
- BLI_assert(index < mesh->totedge);
+ bool *hide_edge = (bool *)CustomData_duplicate_referenced_layer_named(
+ &mesh->edata, CD_PROP_BOOL, ".hide_edge", mesh->totedge);
+ if (!hide_edge) {
+ if (!value) {
+ /* Skip adding layer if it doesn't exist already anyway and we're not hiding an element.. */
+ return;
+ }
+ hide_edge = (bool *)CustomData_add_layer_named(
+ &mesh->edata, CD_PROP_BOOL, CD_CALLOC, NULL, mesh->totedge, ".hide_edge");
+ }
+ const int index = rna_MeshEdge_index_get(ptr);
hide_edge[index] = value;
}
-static int rna_MeshLoopTriangle_index_get(PointerRNA *ptr)
-{
- Mesh *me = rna_mesh(ptr);
- MLoopTri *ltri = (MLoopTri *)ptr->data;
- return (int)(ltri - me->runtime.looptris.array);
-}
-
static int rna_MeshLoopTriangle_material_index_get(PointerRNA *ptr)
{
- Mesh *me = rna_mesh(ptr);
- MLoopTri *ltri = (MLoopTri *)ptr->data;
+ const Mesh *me = rna_mesh(ptr);
+ const MLoopTri *ltri = (MLoopTri *)ptr->data;
return me->mpoly[ltri->poly].mat_nr;
}
static bool rna_MeshLoopTriangle_use_smooth_get(PointerRNA *ptr)
{
- Mesh *me = rna_mesh(ptr);
- MLoopTri *ltri = (MLoopTri *)ptr->data;
+ const Mesh *me = rna_mesh(ptr);
+ const MLoopTri *ltri = (MLoopTri *)ptr->data;
return me->mpoly[ltri->poly].flag & ME_SMOOTH;
}
-static int rna_MeshPolygon_index_get(PointerRNA *ptr)
-{
- Mesh *me = rna_mesh(ptr);
- MPoly *mpoly = (MPoly *)ptr->data;
- return (int)(mpoly - me->mpoly);
-}
-
-static int rna_MeshLoop_index_get(PointerRNA *ptr)
-{
- Mesh *me = rna_mesh(ptr);
- MLoop *mloop = (MLoop *)ptr->data;
- return (int)(mloop - me->mloop);
-}
-
/* path construction */
static char *rna_VertexGroupElement_path(const PointerRNA *ptr)