/** * <pre> * v6--------v5 * | | * | |v4s * | |v3s * | s s | * v7-v0--v1-v2 * </pre> */ static void quad_2edge_split_innervert(BMesh *bm, BMFace *UNUSED(face), BMVert **verts, const SubDParams *params) { BMFace *f_new; BMVert *v, *v_last; BMEdge *e, *e_new, e_tmp; int i, numcuts = params->numcuts; v_last = verts[numcuts]; for (i = numcuts - 1; i >= 0; i--) { e = connect_smallest_face(bm, verts[i], verts[numcuts + (numcuts - i)], &f_new); e_tmp = *e; v = bm_subdivide_edge_addvert(bm, e, &e_tmp, params, 0.5f, 0.5f, &e_new, e->v1, e->v2); if (i != numcuts - 1) { connect_smallest_face(bm, v_last, v, &f_new); } v_last = v; } connect_smallest_face(bm, v_last, verts[numcuts * 2 + 2], &f_new); }
static BMVert *subdivide_edge_num(BMesh *bm, BMEdge *edge, BMEdge *e_orig, int curpoint, int totpoint, const SubDParams *params, BMVert *v_a, BMVert *v_b, BMEdge **r_edge) { BMVert *v_new; float factor_edge_split, factor_subd; if (BMO_edge_flag_test(bm, edge, EDGE_PERCENT) && totpoint == 1) { factor_edge_split = BMO_slot_map_float_get(params->slot_edge_percents, edge); factor_subd = 0.0f; } else { factor_edge_split = 1.0f / (float)(totpoint + 1 - curpoint); factor_subd = (float)(curpoint + 1) / (float)(totpoint + 1); } v_new = bm_subdivide_edge_addvert( bm, edge, e_orig, params, factor_edge_split, factor_subd, v_a, v_b, r_edge); return v_new; }
static BMVert *subdivideedgenum(BMesh *bm, BMEdge *edge, BMEdge *oedge, int curpoint, int totpoint, const SubDParams *params, BMEdge **newe, BMVert *vsta, BMVert *vend) { BMVert *ev; float percent, percent2 = 0.0f; if (BMO_elem_flag_test(bm, edge, EDGE_PERCENT) && totpoint == 1) { percent = BMO_slot_map_float_get(params->slot_edge_percents, edge); } else { percent = 1.0f / (float)(totpoint + 1 - curpoint); percent2 = (float)(curpoint + 1) / (float)(totpoint + 1); } ev = bm_subdivide_edge_addvert(bm, edge, oedge, params, percent, percent2, newe, vsta, vend); return ev; }