86 return elem_id[v_index] == elem;
196 visited_vertices[neighbor_vertex_index] =
true;
230 if (!visited_vertices[neighbor_vertex_index] && neighbor_v != diagonal_v &&
233 visited_vertices[neighbor_vertex_index] =
true;
260 BMIter iter, iter_a, iter_b;
281 bool any_tagged =
false;
309 if (initial_vertex_pole !=
NULL) {
326 if (init_face !=
NULL) {
335 bool valid_tag_found =
false;
348 valid_tag_found =
true;
363 return valid_tag_found;
374 if (!visited_vertices[i]) {
378 visited_vertices[i] =
true;
379 elem_id[i] = current_id;
385 BMVert *current_v, *neighbor_v;
391 if (!visited_vertices[neighbor_index]) {
392 visited_vertices[neighbor_index] =
true;
393 elem_id[neighbor_index] = current_id;
432 "dissolve_verts verts=%hv use_face_split=%b use_boundary_tear=%b",
449 "dissolve_verts verts=%hv use_face_split=%b use_boundary_tear=%b",
481 bool valid_tag_found =
true;
489 for (
int id = 0;
id < tot_ids;
id++) {
492 valid_tag_found =
false;
499 if (valid_tag_found) {
504 return valid_tag_found;
515 (*r_next_vertex) =
v;
549 if (edge_x != test_edge) {
550 if (test_edge->
v1 != initial_vertex && test_edge->
v2 == initial_vertex) {
553 if (test_edge->
v2 != initial_vertex && test_edge->
v1 == initial_vertex) {
565 float (*face_grid)[3],
MDisps *mdisp,
int face_grid_size,
int orig_grid_size,
int loop)
571 const int grid_offset = orig_grid_size - 1;
572 origin[0] = grid_offset;
573 origin[1] = grid_offset;
610 for (
int y = 0;
y < orig_grid_size;
y++) {
611 for (
int x = 0;
x < orig_grid_size;
x++) {
612 const int remap_x = origin[1] + (step_x[1] *
x) + (step_y[1] *
y);
613 const int remap_y = origin[0] + (step_x[0] *
x) + (step_y[0] *
y);
615 const int final_index = remap_x + remap_y * face_grid_size;
626 float (*face_grid)[3],
631 const int grid_it = face_grid_size - 1;
632 for (
int y = 0;
y < face_grid_size;
y++) {
633 for (
int x = 0;
x < face_grid_size;
x++) {
634 const int remap_x = (grid_it * gunsub_x) +
x;
635 const int remap_y = (grid_it * gunsub_y) +
y;
637 const int remap_index_y = grid->
grid_size - remap_x - 1;
638 const int remap_index_x = grid->
grid_size - remap_y - 1;
639 const int grid_index = remap_index_x + (remap_index_y * grid->
grid_size);
667 for (
int i = 0; i < poly->
totloop; i++) {
668 const int loop_index = poly->
loopstart + i;
670 if (
l->
v == corner_vertex_index) {
679 const int face_grid_area = face_grid_size * face_grid_size;
682 for (
int i = 0; i < poly->
totloop; i++) {
683 const int loop_index = poly->
loopstart + i;
685 int quad_loop = i - loop_offset;
689 if (quad_loop >= 4) {
708 const int remap_index_y = grid->
grid_size - 1 - grid_x;
709 const int remap_index_x = grid->
grid_size - 1 - grid_y;
711 const int grid_index = remap_index_x + (remap_index_y * grid->
grid_size);
734 unsubdiv_grid_size * unsubdiv_grid_size,
sizeof(
float[3]),
"grids coordinates");
740 initial_vertex = initial_edge_x->
v1;
743 initial_vertex = initial_edge_x->
v2;
751 edge_temp = initial_edge_x;
752 initial_edge_x = initial_edge_y;
753 initial_edge_y = edge_temp;
759 BMVert *current_vertex_x = initial_vertex;
760 BMEdge *edge_x = initial_edge_x;
762 BMVert *current_vertex_y = initial_vertex;
763 BMEdge *edge_y = initial_edge_y;
764 BMEdge *prev_edge_y = initial_edge_y;
766 BMFace *current_face = f1;
772 int grid_iteration_max_steps = grid_size;
773 if (
context->num_original_levels > 0) {
774 grid_iteration_max_steps = grid_size - 1;
779 while (grid_y < grid_iteration_max_steps) {
781 grid_face = current_face;
783 while (grid_x < grid_iteration_max_steps) {
784 if (
context->num_original_levels == 0) {
788 edge_x =
edge_step(current_vertex_x, edge_x, ¤t_vertex_x);
794 edge_x =
edge_step(current_vertex_x, edge_x, ¤t_vertex_x);
795 grid_face =
face_step(edge_x, grid_face);
802 edge_y =
edge_step(current_vertex_y, edge_y, ¤t_vertex_y);
803 current_vertex_x = current_vertex_y;
817 if (f != current_face) {
823 prev_edge_y = edge_y;
845 initial_vertex = initial_edge_x->
v1;
848 initial_vertex = initial_edge_x->
v2;
854 BMVert *current_vertex_x = initial_vertex;
855 BMEdge *edge_x = initial_edge_x;
857 BMVert *current_vertex_y = initial_vertex;
858 BMEdge *edge_y = initial_edge_y;
862 edge_x =
edge_step(current_vertex_x, edge_x, ¤t_vertex_x);
864 edge_x =
edge_step(current_vertex_x, edge_x, ¤t_vertex_x);
866 (*r_corner_x) = current_vertex_x;
869 edge_y =
edge_step(current_vertex_y, edge_y, ¤t_vertex_y);
871 edge_y =
edge_step(current_vertex_y, edge_y, ¤t_vertex_y);
873 (*r_corner_y) = current_vertex_y;
881 .use_toolflags =
true,
887 .calc_face_normal =
true,
894 static const char lname[] =
"l_remap_index";
895 static const char vname[] =
"v_remap_index";
900 if (l_layer_index != -1) {
905 if (v_layer_index != -1) {
957 for (
int i = 0; i < base_mesh->
totvert; i++) {
958 int vert_basemesh_index =
context->base_to_orig_vmap[i];
966 for (
int i = 0; i < original_mesh->
totpoly; i++) {
969 int original_loop_index =
l + poly->
loopstart;
970 context->loop_to_face_map[original_loop_index] = i;
988 int next_l_index = loop + 1;
989 if (next_l_index < p->loopstart + p->
totloop) {
991 if (l_next->
v == v_x) {
1017 for (
int i = 0; i < base_mesh->
totvert; i++) {
1018 base_to_orig_vmap[i] =
context->base_to_orig_vmap[i];
1023 for (
int i = 0; i < original_mesh->
totvert; i++) {
1024 orig_to_base_vmap[i] = -1;
1027 for (
int i = 0; i < base_mesh->
totvert; i++) {
1028 const int orig_vertex_index =
context->base_to_orig_vmap[i];
1029 orig_to_base_vmap[orig_vertex_index] = i;
1039 BMIter iter, iter_a, iter_b;
1062 BMVert *corner_x, *corner_y;
1087 base_mesh, base_mesh_face_index, base_mesh_loop_index, corner_x_index);
1090 context->base_mesh_grids[base_mesh_loop_index].grid_index = base_mesh_loop_index;
1116 Mesh *original_mesh,
1119 context->original_mesh = original_mesh;
1121 context->num_total_levels = 0;
1135 int num_levels_left =
context->max_new_levels;
1142 if (
context->num_new_levels == 0) {
1157 .calc_object_remap = true,
1172 for (
int i = 0; i <
context->num_grids; i++) {
1173 if (
context->base_mesh_grids[i].grid_size > 0) {
1195 const int totloop = base_mesh->
totloop;
1200 for (
int i = 0; i < totloop; i++) {
1203 if (mdisps[i].disps) {
1207 for (
int j = 0; j < totdisp; j++) {
1208 if (
context->base_mesh_grids[i].grid_co) {
1213 mdisps[i].
disps = disps;
1223 bool switch_view_to_lower_level)
1266 Mesh *base_mesh =
object->data;
1273 if (switch_view_to_lower_level) {
1296 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)
void BLI_gsqueue_free(GSQueue *queue)
void BLI_gsqueue_push(GSQueue *queue, const void *item)
GSQueue * BLI_gsqueue_new(const size_t elem_size)
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)
BMesh Make Mesh.
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)
Mesh -> BMesh.
void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMeshParams *params)
#define BMO_FLAG_DEFAULTS
bool BMO_op_callf(BMesh *bm, const int flag, const char *fmt,...)
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)
ThreadQueue * queue
all scheduled work for the cpu
struct SELECTID_Context context
struct CustomData pdata ldata
struct MDisps * original_mdisp