forked from bartvdbraak/blender
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:
parent
33c92a02e4
commit
9982b283e6
@ -148,7 +148,7 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel, Panel):
|
||||
#row.label(text="Render")
|
||||
|
||||
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
|
||||
|
||||
row = col.row()
|
||||
|
@ -569,7 +569,7 @@ static BMOpDefine bmo_edgenet_prepare_def = {
|
||||
{{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* new edges */
|
||||
{{'\0'}},
|
||||
},
|
||||
bmo_edgenet_prepare,
|
||||
bmo_edgenet_prepare_exec,
|
||||
0,
|
||||
};
|
||||
|
||||
|
@ -136,8 +136,8 @@ typedef enum eBMOpSlotSubType_Ptr {
|
||||
} eBMOpSlotSubType_Ptr;
|
||||
|
||||
typedef union eBMOpSlotSubType_Union {
|
||||
eBMOpSlotSubType_Map elem;
|
||||
eBMOpSlotSubType_Map ptr;
|
||||
eBMOpSlotSubType_Elem elem;
|
||||
eBMOpSlotSubType_Ptr ptr;
|
||||
eBMOpSlotSubType_Map map;
|
||||
} eBMOpSlotSubType_Union;
|
||||
|
||||
|
@ -288,9 +288,49 @@ void _bmo_slot_copy(BMOpSlot slot_args_src[BMO_OP_MAX_SLOTS], const char *slot_n
|
||||
slot_dst->data.buf = NULL;
|
||||
slot_dst->len = slot_src->len;
|
||||
if (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);
|
||||
memcpy(slot_dst->data.buf, slot_src->data.buf, slot_alloc_size);
|
||||
/* 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) {
|
||||
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);
|
||||
if (slot_src->len == slot_dst->len) {
|
||||
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) {
|
||||
|
@ -61,7 +61,7 @@ void bmo_dissolve_limit_exec(BMesh *bm, BMOperator *op);
|
||||
void bmo_dissolve_verts_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_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_edge_only_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;
|
||||
}
|
||||
|
||||
void bmo_edgenet_prepare(BMesh *bm, BMOperator *op)
|
||||
void bmo_edgenet_prepare_exec(BMesh *bm, BMOperator *op)
|
||||
{
|
||||
BMOIter siter;
|
||||
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(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);
|
||||
cross_v3_v3v3(vddir, vb_vmid, va_vmid);
|
||||
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, ...)
|
||||
{
|
||||
BMOpSlot *slot_select_out;
|
||||
BMesh *bm = em->bm;
|
||||
BMOperator bmop;
|
||||
va_list list;
|
||||
char hflag;
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
return EDBM_op_finish(em, &bmop, op, TRUE);
|
||||
|
Loading…
Reference in New Issue
Block a user