[Bf-blender-cvs] [5391060724a] refactor-mesh-uv-map-generic: Try to handle creation of associated bool layers for bmesh.
Martijn Versteegh
noreply at git.blender.org
Tue Nov 8 14:13:39 CET 2022
Commit: 5391060724adc280a210d1e5eba2d9cf8c633a73
Author: Martijn Versteegh
Date: Tue Nov 8 14:09:30 2022 +0100
Branches: refactor-mesh-uv-map-generic
https://developer.blender.org/rB5391060724adc280a210d1e5eba2d9cf8c633a73
Try to handle creation of associated bool layers for bmesh.
===================================================================
M source/blender/python/bmesh/bmesh_py_types_customdata.c
M source/blender/python/bmesh/bmesh_py_types_meshdata.c
===================================================================
diff --git a/source/blender/python/bmesh/bmesh_py_types_customdata.c b/source/blender/python/bmesh/bmesh_py_types_customdata.c
index b1e83ac7b2c..ce6fbbc2a96 100644
--- a/source/blender/python/bmesh/bmesh_py_types_customdata.c
+++ b/source/blender/python/bmesh/bmesh_py_types_customdata.c
@@ -461,6 +461,15 @@ static PyObject *bpy_bmlayercollection_verify(BPy_BMLayerCollection *self)
if (index == -1) {
BM_data_layer_add(self->bm, data, self->type);
index = 0;
+ /* Because addingCustomData layers to a bmesh will invalidate any existing pointers
+ * in Py objects we can't lazily add the associated bool layers. So add htem right now.
+ */
+ if (self->type == CD_PROP_FLOAT2 && self->htype == BM_LOOP) {
+ const char *active_uv_name = CustomData_get_active_layer_name(&self->bm->ldata, CD_PROP_FLOAT2);
+ BM_uv_map_ensure_vert_selection_attribute(self->bm, active_uv_name);
+ BM_uv_map_ensure_edge_selection_attribute(self->bm, active_uv_name);
+ BM_uv_map_ensure_pin_attribute(self->bm, active_uv_name);
+ }
}
BLI_assert(index >= 0);
diff --git a/source/blender/python/bmesh/bmesh_py_types_meshdata.c b/source/blender/python/bmesh/bmesh_py_types_meshdata.c
index 0381a969b01..a7dff0d43a9 100644
--- a/source/blender/python/bmesh/bmesh_py_types_meshdata.c
+++ b/source/blender/python/bmesh/bmesh_py_types_meshdata.c
@@ -73,10 +73,10 @@ static int bpy_bmloopuv_pin_uv_set(BPy_BMLoopUV *self, PyObject *value, void *UN
if (self->pinned) {
*self->pinned = PyC_Long_AsBool(value);
}
- /* TODO(martijn) if (!self->pinmned) that means the layed does not exist , or at least didn't exist
- * when the PY object was created
- * we *should* create it here instead of just bailing...
- * same for vertsel and edgesel
+ /* TODO(martijn) if (!self->pinned) that means the layed does not exist , or at least didn't exist
+ * when the PY object was created. We *should* create it here instead of just bailing, but we can't
+ * because that would invalidate all existing BPy_BMLoopUV objects' interal pointers.
+ * the same goes for vertsel and edgesel below.
*/
return 0;
}
@@ -152,19 +152,21 @@ int BPy_BMLoopUV_AssignPyObject(struct BMesh *bm, const int loop_index, PyObject
}
BPy_BMLoopUV *src = (BPy_BMLoopUV *)value;
- const char *active_uv_name = CustomData_get_active_layer_name(&bm->ldata, CD_PROP_FLOAT2);
- BM_uv_map_ensure_vert_selection_attribute(bm, active_uv_name);
- BM_uv_map_ensure_edge_selection_attribute(bm, active_uv_name);
- BM_uv_map_ensure_pin_attribute(bm, active_uv_name);
const BMUVOffsets offsets = BM_uv_map_get_offsets(bm);
BMLoop *l = BM_loop_at_index_find(bm, loop_index);
float *luv = BM_ELEM_CD_GET_FLOAT_P(l, offsets.uv);
copy_v2_v2(luv, src->uv);
- BM_ELEM_CD_SET_BOOL(l, offsets.select_vert, src->vertsel);
- BM_ELEM_CD_SET_BOOL(l, offsets.select_edge, src->edgesel);
- BM_ELEM_CD_SET_BOOL(l, offsets.pin, src->pinned);
+ if (offsets.select_vert >=0) {
+ BM_ELEM_CD_SET_BOOL(l, offsets.select_vert, *src->vertsel);
+ }
+ if (offsets.select_edge >=0) {
+ BM_ELEM_CD_SET_BOOL(l, offsets.select_edge, *src->edgesel);
+ }
+ if (offsets.pin >=0) {
+ BM_ELEM_CD_SET_BOOL(l, offsets.pin, *src->pinned);
+ }
return 0;
}
More information about the Bf-blender-cvs
mailing list