70 return elem_id[v_index] == elem;
180 visited_vertices[neighbor_vertex_index] =
true;
214 if (!visited_vertices[neighbor_vertex_index] && neighbor_v != diagonal_v &&
217 visited_vertices[neighbor_vertex_index] =
true;
244 BMIter iter, iter_a, iter_b;
265 bool any_tagged =
false;
293 if (initial_vertex_pole !=
NULL) {
310 if (init_face !=
NULL) {
319 bool valid_tag_found =
false;
332 valid_tag_found =
true;
347 return valid_tag_found;
358 if (!visited_vertices[i]) {
362 visited_vertices[i] =
true;
363 elem_id[i] = current_id;
369 BMVert *current_v, *neighbor_v;
375 if (!visited_vertices[neighbor_index]) {
376 visited_vertices[neighbor_index] =
true;
377 elem_id[neighbor_index] = current_id;
416 "dissolve_verts verts=%hv use_face_split=%b use_boundary_tear=%b",
433 "dissolve_verts verts=%hv use_face_split=%b use_boundary_tear=%b",
465 bool valid_tag_found =
true;
473 for (
int id = 0;
id < tot_ids;
id++) {
476 valid_tag_found =
false;
483 if (valid_tag_found) {
488 return valid_tag_found;
499 (*r_next_vertex) =
v;
533 if (edge_x != test_edge) {
534 if (test_edge->
v1 != initial_vertex && test_edge->
v2 == initial_vertex) {
537 if (test_edge->
v2 != initial_vertex && test_edge->
v1 == initial_vertex) {
549 float (*face_grid)[3],
MDisps *mdisp,
int face_grid_size,
int orig_grid_size,
int loop)
555 const int grid_offset = orig_grid_size - 1;
556 origin[0] = grid_offset;
557 origin[1] = grid_offset;
594 for (
int y = 0;
y < orig_grid_size;
y++) {
595 for (
int x = 0;
x < orig_grid_size;
x++) {
596 const int remap_x = origin[1] + (step_x[1] *
x) + (step_y[1] *
y);
597 const int remap_y = origin[0] + (step_x[0] *
x) + (step_y[0] *
y);
599 const int final_index = remap_x + remap_y * face_grid_size;
610 float (*face_grid)[3],
615 const int grid_it = face_grid_size - 1;
616 for (
int y = 0;
y < face_grid_size;
y++) {
617 for (
int x = 0;
x < face_grid_size;
x++) {
618 const int remap_x = (grid_it * gunsub_x) +
x;
619 const int remap_y = (grid_it * gunsub_y) +
y;
621 const int remap_index_y = grid->
grid_size - remap_x - 1;
622 const int remap_index_x = grid->
grid_size - remap_y - 1;
623 const int grid_index = remap_index_x + (remap_index_y * grid->
grid_size);
651 for (
int i = 0; i < poly->
totloop; i++) {
652 const int loop_index = poly->
loopstart + i;
654 if (
l->
v == corner_vertex_index) {
663 const int face_grid_area = face_grid_size * face_grid_size;
666 for (
int i = 0; i < poly->
totloop; i++) {
667 const int loop_index = poly->
loopstart + i;
669 int quad_loop = i - loop_offset;
673 if (quad_loop >= 4) {
692 const int remap_index_y = grid->
grid_size - 1 - grid_x;
693 const int remap_index_x = grid->
grid_size - 1 - grid_y;
695 const int grid_index = remap_index_x + (remap_index_y * grid->
grid_size);
718 unsubdiv_grid_size * unsubdiv_grid_size,
sizeof(
float[3]),
"grids coordinates");
724 initial_vertex = initial_edge_x->
v1;
727 initial_vertex = initial_edge_x->
v2;
735 edge_temp = initial_edge_x;
736 initial_edge_x = initial_edge_y;
737 initial_edge_y = edge_temp;
743 BMVert *current_vertex_x = initial_vertex;
744 BMEdge *edge_x = initial_edge_x;
746 BMVert *current_vertex_y = initial_vertex;
747 BMEdge *edge_y = initial_edge_y;
748 BMEdge *prev_edge_y = initial_edge_y;
750 BMFace *current_face = f1;
756 int grid_iteration_max_steps = grid_size;
757 if (
context->num_original_levels > 0) {
758 grid_iteration_max_steps = grid_size - 1;
763 while (grid_y < grid_iteration_max_steps) {
765 grid_face = current_face;
767 while (grid_x < grid_iteration_max_steps) {
768 if (
context->num_original_levels == 0) {
772 edge_x =
edge_step(current_vertex_x, edge_x, ¤t_vertex_x);
778 edge_x =
edge_step(current_vertex_x, edge_x, ¤t_vertex_x);
779 grid_face =
face_step(edge_x, grid_face);
786 edge_y =
edge_step(current_vertex_y, edge_y, ¤t_vertex_y);
787 current_vertex_x = current_vertex_y;
801 if (f != current_face) {
807 prev_edge_y = edge_y;
829 initial_vertex = initial_edge_x->
v1;
832 initial_vertex = initial_edge_x->
v2;
838 BMVert *current_vertex_x = initial_vertex;
839 BMEdge *edge_x = initial_edge_x;
841 BMVert *current_vertex_y = initial_vertex;
842 BMEdge *edge_y = initial_edge_y;
846 edge_x =
edge_step(current_vertex_x, edge_x, ¤t_vertex_x);
848 edge_x =
edge_step(current_vertex_x, edge_x, ¤t_vertex_x);
850 (*r_corner_x) = current_vertex_x;
853 edge_y =
edge_step(current_vertex_y, edge_y, ¤t_vertex_y);
855 edge_y =
edge_step(current_vertex_y, edge_y, ¤t_vertex_y);
857 (*r_corner_y) = current_vertex_y;
865 .use_toolflags =
true,
871 .calc_face_normal =
true,
872 .calc_vert_normal =
true,
879 static const char lname[] =
"l_remap_index";
880 static const char vname[] =
"v_remap_index";
885 if (l_layer_index != -1) {
890 if (v_layer_index != -1) {
942 for (
int i = 0; i < base_mesh->
totvert; i++) {
943 int vert_basemesh_index =
context->base_to_orig_vmap[i];
951 for (
int i = 0; i < original_mesh->
totpoly; i++) {
954 int original_loop_index =
l + poly->
loopstart;
955 context->loop_to_face_map[original_loop_index] = i;
973 int next_l_index = loop + 1;
974 if (next_l_index < p->loopstart + p->
totloop) {
976 if (l_next->
v == v_x) {
1002 for (
int i = 0; i < base_mesh->
totvert; i++) {
1003 base_to_orig_vmap[i] =
context->base_to_orig_vmap[i];
1008 for (
int i = 0; i < original_mesh->
totvert; i++) {
1009 orig_to_base_vmap[i] = -1;
1012 for (
int i = 0; i < base_mesh->
totvert; i++) {
1013 const int orig_vertex_index =
context->base_to_orig_vmap[i];
1014 orig_to_base_vmap[orig_vertex_index] = i;
1024 BMIter iter, iter_a, iter_b;
1047 BMVert *corner_x, *corner_y;
1072 base_mesh, base_mesh_face_index, base_mesh_loop_index, corner_x_index);
1075 context->base_mesh_grids[base_mesh_loop_index].grid_index = base_mesh_loop_index;
1101 Mesh *original_mesh,
1104 context->original_mesh = original_mesh;
1106 context->num_total_levels = 0;
1120 int num_levels_left =
context->max_new_levels;
1127 if (
context->num_new_levels == 0) {
1142 .calc_object_remap = true,
1157 for (
int i = 0; i <
context->num_grids; i++) {
1158 if (
context->base_mesh_grids[i].grid_size > 0) {
1180 const int totloop = base_mesh->
totloop;
1185 for (
int i = 0; i < totloop; i++) {
1188 if (mdisps[i].disps) {
1192 for (
int j = 0; j < totdisp; j++) {
1193 if (
context->base_mesh_grids[i].grid_co) {
1198 mdisps[i].
disps = disps;
1208 bool switch_view_to_lower_level)
1251 Mesh *base_mesh =
object->data;
1258 if (switch_view_to_lower_level) {
1281 return rebuild_subdvis;
typedef float(TangentPoint)[2]
CustomData interface, see also DNA_customdata_types.h.
bool CustomData_free_layer(struct CustomData *data, int type, int totelem, int index)
void CustomData_free_layers(struct CustomData *data, int type, int totelem)
bool CustomData_has_layer(const struct CustomData *data, int type)
int CustomData_get_named_layer_index(const struct CustomData *data, int type, const char *name)
void * CustomData_add_layer_named(struct CustomData *data, int type, eCDAllocType alloctype, void *layer, int totelem, const char *name)
void * CustomData_get_layer_named(const struct CustomData *data, int type, const char *name)
void * CustomData_add_layer(struct CustomData *data, int type, eCDAllocType alloctype, void *layer, int totelem)
int CustomData_get_n_offset(const struct CustomData *data, int type, int n)
const CustomData_MeshMasks CD_MASK_MESH
void BKE_mesh_nomain_to_mesh(struct Mesh *mesh_src, struct Mesh *mesh_dst, struct Object *ob, const struct CustomData_MeshMasks *mask, bool take_ownership)
struct Mesh * BKE_mesh_new_nomain(int verts_len, int edges_len, int tessface_len, int loops_len, int polys_len)
void multires_force_sculpt_rebuild(struct Object *object)
int BKE_ccg_gridsize(int level)
#define BLI_assert_msg(a, msg)
void BLI_gsqueue_free(GSQueue *queue)
GSQueue * BLI_gsqueue_new(size_t elem_size)
void BLI_gsqueue_push(GSQueue *queue, const void *item)
void BLI_gsqueue_pop(GSQueue *queue, void *r_item)
bool BLI_gsqueue_is_empty(const GSQueue *queue)
int pow_i(int base, int exp)
MINLINE void copy_v3_v3(float r[3], const float a[3])
struct Depsgraph Depsgraph
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
Read Guarded memory(de)allocation.
#define BM_ELEM_CD_GET_INT(ele, offset)
#define BM_elem_index_get(ele)
#define BM_elem_flag_set(ele, hflag, val)
#define BM_elem_flag_test(ele, hflag)
#define BM_ITER_ELEM(ele, iter, data, itype)
#define BM_ITER_MESH(ele, iter, bm, itype)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_mesh_elem_hflag_enable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide)
void BM_mesh_elem_hflag_disable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide)
void BM_mesh_free(BMesh *bm)
BMesh Free Mesh.
BMesh * BM_mesh_create(const BMAllocTemplate *allocsize, const struct BMeshCreateParams *params)
void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
void BM_mesh_elem_table_init(BMesh *bm, const char htype)
#define BMALLOC_TEMPLATE_FROM_ME(...)
BLI_INLINE BMVert * BM_vert_at_index(BMesh *bm, const int index)
void BM_mesh_bm_from_me(BMesh *bm, const Mesh *me, const struct BMeshFromMeshParams *params)
void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMeshParams *params)
bool BMO_op_callf(BMesh *bm, int flag, const char *fmt,...)
#define BMO_FLAG_DEFAULTS
BMEdge * BM_edge_exists(BMVert *v_a, BMVert *v_b)
bool BM_vert_is_wire(const BMVert *v)
bool BM_edge_share_quad_check(BMEdge *e1, BMEdge *e2)
bool BM_edge_in_face(const BMEdge *e, const BMFace *f)
bool BM_face_share_edge_check(BMFace *f1, BMFace *f2)
bool BM_vert_in_face(BMVert *v, BMFace *f)
int BM_vert_edge_count(const BMVert *v)
bool BM_vert_is_boundary(const BMVert *v)
BLI_INLINE BMVert * BM_edge_other_vert(BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert * v
const Depsgraph * depsgraph
void(* MEM_freeN)(void *vmemh)
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
void multires_reshape_assign_final_coords_from_mdisps(const MultiresReshapeContext *reshape_context)
void multires_reshape_context_free(MultiresReshapeContext *reshape_context)
void multires_reshape_store_original_grids(MultiresReshapeContext *reshape_context)
bool multires_reshape_context_create_from_base_mesh(MultiresReshapeContext *reshape_context, struct Depsgraph *depsgraph, struct Object *object, struct MultiresModifierData *mmd)
bool multires_reshape_context_create_from_object(MultiresReshapeContext *reshape_context, struct Depsgraph *depsgraph, struct Object *object, struct MultiresModifierData *mmd)
void multires_reshape_object_grids_to_tangent_displacement(const MultiresReshapeContext *reshape_context)
static bool unsubdivide_tag_disconnected_mesh_element(BMesh *bm, int *elem_id, int elem)
static void store_vertex_data(MultiresUnsubdivideGrid *grid, BMVert *v, int grid_x, int grid_y)
static void write_loop_in_face_grid(float(*face_grid)[3], MDisps *mdisp, int face_grid_size, int orig_grid_size, int loop)
static BMFace * face_step(BMEdge *edge, BMFace *f)
static BMesh * get_bmesh_from_mesh(Mesh *mesh)
static bool is_vertex_in_id(BMVert *v, const int *elem_id, int elem)
static void multires_create_grids_in_unsubdivided_base_mesh(MultiresUnsubdivideContext *context, Mesh *base_mesh)
static bool multires_unsubdivide_single_level(BMesh *bm)
static void multires_unsubdivide_prepare_original_bmesh_for_extract(MultiresUnsubdivideContext *context)
static void multires_unsubdivide_private_extract_data_free(MultiresUnsubdivideContext *context)
void multires_unsubdivide_context_init(MultiresUnsubdivideContext *context, Mesh *original_mesh, struct MultiresModifierData *mmd)
static bool multires_unsubdivide_flip_grid_x_axis(Mesh *mesh, int poly, int loop, int v_x)
static bool is_vertex_pole_three(BMVert *v)
static void multires_unsubdivide_add_original_index_datalayers(Mesh *mesh)
bool multires_unsubdivide_to_basemesh(MultiresUnsubdivideContext *context)
static void unsubdivide_face_center_vertex_tag(BMesh *bm, BMVert *initial_vertex)
static bool is_vertex_pole(BMVert *v)
static int unsubdivide_init_elem_ids(BMesh *bm, int *elem_id)
static void store_grid_data(MultiresUnsubdivideContext *context, MultiresUnsubdivideGrid *grid, BMVert *v, BMFace *f, int grid_x, int grid_y)
static BMVert * unsubdivide_find_any_pole(BMesh *bm, int *elem_id, int elem)
static const char lname[]
static bool unsubdivide_is_center_vertex_tag_valid(BMesh *bm, int *elem_id, int elem)
static bool unsubdivide_is_all_quads(BMesh *bm)
static void multires_unsubdivide_get_grid_corners_on_base_mesh(BMFace *f1, BMEdge *e1, BMVert **r_corner_x, BMVert **r_corner_y)
static BMEdge * edge_step(BMVert *v, BMEdge *edge, BMVert **r_next_vertex)
static void unsubdivide_build_base_mesh_from_tags(BMesh *bm)
static void multires_unsubdivide_free_original_datalayers(Mesh *mesh)
static bool is_vertex_diagonal(BMVert *from_v, BMVert *to_v)
int multiresModifier_rebuild_subdiv(struct Depsgraph *depsgraph, struct Object *object, struct MultiresModifierData *mmd, int rebuild_limit, bool switch_view_to_lower_level)
static void multires_unsubdivide_extract_grids(MultiresUnsubdivideContext *context)
static void multires_unsubdivide_extract_single_grid_from_face_edge(MultiresUnsubdivideContext *context, BMFace *f1, BMEdge *e1, bool flip_grid, MultiresUnsubdivideGrid *grid)
static const char vname[]
static void write_face_grid_in_unsubdivide_grid(MultiresUnsubdivideGrid *grid, float(*face_grid)[3], int face_grid_size, int gunsub_x, int gunsub_y)
void multires_unsubdivide_context_free(MultiresUnsubdivideContext *context)
static BMEdge * get_initial_edge_y(BMFace *f, BMEdge *edge_x, BMVert *initial_vertex)
struct MDisps * original_mdisp