fix for asserts added in own recent commit with more strict type-checking
- BMO_slot_copy now only copies compatible elements. other minor changes - don't use text.format(...), convention for UI scripts is C style string formatting. - rename bmo_edgenet_prepare --> bmo_edgenet_prepare_exec - float/double warning in bevel.
This commit is contained in:
@@ -148,7 +148,7 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel, Panel):
|
|||||||
#row.label(text="Render")
|
#row.label(text="Render")
|
||||||
|
|
||||||
if part.is_fluid:
|
if part.is_fluid:
|
||||||
layout.label(text="{} fluid particles for this frame".format(str(part.count)))
|
layout.label(text="%d fluid particles for this frame" % part.count)
|
||||||
return
|
return
|
||||||
|
|
||||||
row = col.row()
|
row = col.row()
|
||||||
|
@@ -569,7 +569,7 @@ static BMOpDefine bmo_edgenet_prepare_def = {
|
|||||||
{{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* new edges */
|
{{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* new edges */
|
||||||
{{'\0'}},
|
{{'\0'}},
|
||||||
},
|
},
|
||||||
bmo_edgenet_prepare,
|
bmo_edgenet_prepare_exec,
|
||||||
0,
|
0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -136,8 +136,8 @@ typedef enum eBMOpSlotSubType_Ptr {
|
|||||||
} eBMOpSlotSubType_Ptr;
|
} eBMOpSlotSubType_Ptr;
|
||||||
|
|
||||||
typedef union eBMOpSlotSubType_Union {
|
typedef union eBMOpSlotSubType_Union {
|
||||||
eBMOpSlotSubType_Map elem;
|
eBMOpSlotSubType_Elem elem;
|
||||||
eBMOpSlotSubType_Map ptr;
|
eBMOpSlotSubType_Ptr ptr;
|
||||||
eBMOpSlotSubType_Map map;
|
eBMOpSlotSubType_Map map;
|
||||||
} eBMOpSlotSubType_Union;
|
} eBMOpSlotSubType_Union;
|
||||||
|
|
||||||
|
@@ -287,11 +287,51 @@ void _bmo_slot_copy(BMOpSlot slot_args_src[BMO_OP_MAX_SLOTS], const char *slot_n
|
|||||||
/* do buffer copy */
|
/* do buffer copy */
|
||||||
slot_dst->data.buf = NULL;
|
slot_dst->data.buf = NULL;
|
||||||
slot_dst->len = slot_src->len;
|
slot_dst->len = slot_src->len;
|
||||||
|
if (slot_dst->len) {
|
||||||
|
/* check dest has all flags enabled that the source has */
|
||||||
|
const eBMOpSlotSubType_Elem src_elem_flag = (slot_src->slot_subtype.elem & BM_ALL_NOLOOP);
|
||||||
|
const eBMOpSlotSubType_Elem dst_elem_flag = (slot_dst->slot_subtype.elem & BM_ALL_NOLOOP);
|
||||||
|
|
||||||
|
if ((src_elem_flag | dst_elem_flag) == dst_elem_flag) {
|
||||||
|
/* pass */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* check types */
|
||||||
|
const unsigned int tot = slot_src->len;
|
||||||
|
unsigned int i;
|
||||||
|
unsigned int out = 0;
|
||||||
|
BMElem **ele_src = (BMElem **)slot_src->data.buf;
|
||||||
|
for (i = 0; i < tot; i++, ele_src++) {
|
||||||
|
if ((*ele_src)->head.htype & dst_elem_flag) {
|
||||||
|
out++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (out != tot) {
|
||||||
|
slot_dst->len = out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (slot_dst->len) {
|
if (slot_dst->len) {
|
||||||
const int slot_alloc_size = BMO_OPSLOT_TYPEINFO[slot_dst->slot_type] * slot_dst->len;
|
const int slot_alloc_size = BMO_OPSLOT_TYPEINFO[slot_dst->slot_type] * slot_dst->len;
|
||||||
slot_dst->data.buf = BLI_memarena_alloc(arena_dst, slot_alloc_size);
|
slot_dst->data.buf = BLI_memarena_alloc(arena_dst, slot_alloc_size);
|
||||||
|
if (slot_src->len == slot_dst->len) {
|
||||||
memcpy(slot_dst->data.buf, slot_src->data.buf, slot_alloc_size);
|
memcpy(slot_dst->data.buf, slot_src->data.buf, slot_alloc_size);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
/* only copy compatible elements */
|
||||||
|
const unsigned int tot = slot_src->len;
|
||||||
|
unsigned int i;
|
||||||
|
BMElem **ele_src = (BMElem **)slot_src->data.buf;
|
||||||
|
BMElem **ele_dst = (BMElem **)slot_dst->data.buf;
|
||||||
|
for (i = 0; i < tot; i++, ele_src++) {
|
||||||
|
if ((*ele_src)->head.htype & dst_elem_flag) {
|
||||||
|
*ele_dst = *ele_src;
|
||||||
|
ele_dst++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (slot_dst->slot_type == BMO_OP_SLOT_MAPPING) {
|
else if (slot_dst->slot_type == BMO_OP_SLOT_MAPPING) {
|
||||||
GHashIterator it;
|
GHashIterator it;
|
||||||
|
@@ -61,7 +61,7 @@ void bmo_dissolve_limit_exec(BMesh *bm, BMOperator *op);
|
|||||||
void bmo_dissolve_verts_exec(BMesh *bm, BMOperator *op);
|
void bmo_dissolve_verts_exec(BMesh *bm, BMOperator *op);
|
||||||
void bmo_duplicate_exec(BMesh *bm, BMOperator *op);
|
void bmo_duplicate_exec(BMesh *bm, BMOperator *op);
|
||||||
void bmo_edgenet_fill_exec(BMesh *bm, BMOperator *op);
|
void bmo_edgenet_fill_exec(BMesh *bm, BMOperator *op);
|
||||||
void bmo_edgenet_prepare(BMesh *bm, BMOperator *op);
|
void bmo_edgenet_prepare_exec(BMesh *bm, BMOperator *op);
|
||||||
void bmo_extrude_discrete_faces_exec(BMesh *bm, BMOperator *op);
|
void bmo_extrude_discrete_faces_exec(BMesh *bm, BMOperator *op);
|
||||||
void bmo_extrude_edge_only_exec(BMesh *bm, BMOperator *op);
|
void bmo_extrude_edge_only_exec(BMesh *bm, BMOperator *op);
|
||||||
void bmo_extrude_face_region_exec(BMesh *bm, BMOperator *op);
|
void bmo_extrude_face_region_exec(BMesh *bm, BMOperator *op);
|
||||||
|
@@ -1098,7 +1098,7 @@ static BMEdge *edge_next(BMesh *bm, BMEdge *e)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bmo_edgenet_prepare(BMesh *bm, BMOperator *op)
|
void bmo_edgenet_prepare_exec(BMesh *bm, BMOperator *op)
|
||||||
{
|
{
|
||||||
BMOIter siter;
|
BMOIter siter;
|
||||||
BMEdge *e;
|
BMEdge *e;
|
||||||
|
@@ -663,7 +663,7 @@ static void get_point_on_round_edge(EdgeHalf *e, int k,
|
|||||||
|
|
||||||
sub_v3_v3v3(va_vmid, vmid, va);
|
sub_v3_v3v3(va_vmid, vmid, va);
|
||||||
sub_v3_v3v3(vb_vmid, vmid, vb);
|
sub_v3_v3v3(vb_vmid, vmid, vb);
|
||||||
if (fabs(angle_v3v3(va_vmid, vb_vmid) - (float)M_PI) > 100.f *(float)BEVEL_EPSILON) {
|
if (fabsf(angle_v3v3(va_vmid, vb_vmid) - (float)M_PI) > 100.f *(float)BEVEL_EPSILON) {
|
||||||
sub_v3_v3v3(vo, va, vb_vmid);
|
sub_v3_v3v3(vo, va, vb_vmid);
|
||||||
cross_v3_v3v3(vddir, vb_vmid, va_vmid);
|
cross_v3_v3v3(vddir, vb_vmid, va_vmid);
|
||||||
normalize_v3(vddir);
|
normalize_v3(vddir);
|
||||||
|
@@ -265,9 +265,11 @@ int EDBM_op_callf(BMEditMesh *em, wmOperator *op, const char *fmt, ...)
|
|||||||
|
|
||||||
int EDBM_op_call_and_selectf(BMEditMesh *em, wmOperator *op, const char *select_slot_out, const char *fmt, ...)
|
int EDBM_op_call_and_selectf(BMEditMesh *em, wmOperator *op, const char *select_slot_out, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
|
BMOpSlot *slot_select_out;
|
||||||
BMesh *bm = em->bm;
|
BMesh *bm = em->bm;
|
||||||
BMOperator bmop;
|
BMOperator bmop;
|
||||||
va_list list;
|
va_list list;
|
||||||
|
char hflag;
|
||||||
|
|
||||||
va_start(list, fmt);
|
va_start(list, fmt);
|
||||||
|
|
||||||
@@ -283,9 +285,12 @@ int EDBM_op_call_and_selectf(BMEditMesh *em, wmOperator *op, const char *select_
|
|||||||
|
|
||||||
BMO_op_exec(bm, &bmop);
|
BMO_op_exec(bm, &bmop);
|
||||||
|
|
||||||
|
slot_select_out = BMO_slot_get(bmop.slots_out, select_slot_out);
|
||||||
|
hflag = slot_select_out->slot_subtype.elem & BM_ALL_NOLOOP;
|
||||||
|
|
||||||
BM_mesh_elem_hflag_disable_all(em->bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT, FALSE);
|
BM_mesh_elem_hflag_disable_all(em->bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT, FALSE);
|
||||||
|
|
||||||
BMO_slot_buffer_hflag_enable(em->bm, bmop.slots_out, select_slot_out, BM_ALL_NOLOOP, BM_ELEM_SELECT, TRUE);
|
BMO_slot_buffer_hflag_enable(em->bm, bmop.slots_out, select_slot_out, hflag, BM_ELEM_SELECT, TRUE);
|
||||||
|
|
||||||
va_end(list);
|
va_end(list);
|
||||||
return EDBM_op_finish(em, &bmop, op, TRUE);
|
return EDBM_op_finish(em, &bmop, op, TRUE);
|
||||||
|
Reference in New Issue
Block a user