39 #include "RNA_prototypes.h"
106 selected_bone_uses_group.
append(bone_for_group_exists);
109 Span<bool> use_vertex_group = selected_bone_uses_group;
113 r_vertex_mask[i] =
false;
117 if (use_vertex_group.
get(dw.def_nr,
false)) {
119 r_vertex_mask[i] =
true;
135 r_vertex_mask[i] = found;
141 for (
bool &value :
array) {
148 uint *r_verts_masked_num)
152 uint verts_masked_num = 0;
154 if (vertex_mask[i_src]) {
155 r_vertex_map[i_src] = verts_masked_num;
159 r_vertex_map[i_src] = -1;
163 *r_verts_masked_num = verts_masked_num;
169 uint *r_edges_masked_num)
173 uint edges_masked_num = 0;
178 if (vertex_mask[edge.v1] && vertex_mask[edge.v2]) {
179 r_edge_map[i] = edges_masked_num;
187 *r_edges_masked_num = edges_masked_num;
193 uint *r_edges_masked_num,
194 uint *r_verts_add_num)
198 uint edges_masked_num = 0;
199 uint verts_add_num = 0;
204 bool v1 = vertex_mask[edge.v1];
205 bool v2 = vertex_mask[edge.v2];
207 r_edge_map[i] = edges_masked_num;
219 edges_masked_num += verts_add_num;
220 *r_edges_masked_num = edges_masked_num;
221 *r_verts_add_num = verts_add_num;
228 uint *r_polys_masked_num,
229 uint *r_loops_masked_num)
236 uint loops_masked_num = 0;
240 bool all_verts_in_mask =
true;
242 for (
const MLoop &loop : loops_src) {
243 if (!vertex_mask[loop.v]) {
244 all_verts_in_mask =
false;
249 if (all_verts_in_mask) {
252 loops_masked_num += poly_src.
totloop;
256 *r_polys_masked_num = r_masked_poly_indices.
size();
257 *r_loops_masked_num = loops_masked_num;
263 uint loops_masked_num,
266 uint *r_edges_add_num,
267 uint *r_polys_add_num,
268 uint *r_loops_add_num)
274 r_masked_poly_indices.
reserve(r_masked_poly_indices.
size() + verts_add_num);
275 r_loop_starts.
reserve(r_loop_starts.
size() + verts_add_num);
277 uint edges_add_num = 0;
278 uint polys_add_num = 0;
279 uint loops_add_num = 0;
285 int dst_totloop = -1;
288 const MLoop &loop = loops_src[j];
289 if (vertex_mask[loop.
v]) {
292 else if (start == -1) {
296 if (0 < in_count && in_count < poly_src.
totloop) {
298 const MLoop *last_loop = &loops_src[start];
299 bool v_loop_in_mask_last = vertex_mask[last_loop->
v];
301 const MLoop &loop = loops_src[(start + 1 + j) % poly_src.
totloop];
302 const bool v_loop_in_mask = vertex_mask[loop.
v];
303 if (v_loop_in_mask && !v_loop_in_mask_last) {
306 else if (!v_loop_in_mask && v_loop_in_mask_last) {
308 r_masked_poly_indices.
append(i);
309 r_loop_starts.
append(loops_masked_num + loops_add_num);
310 loops_add_num += dst_totloop;
315 else if (v_loop_in_mask && v_loop_in_mask_last) {
320 v_loop_in_mask_last = v_loop_in_mask;
325 *r_edges_add_num = edges_add_num;
326 *r_polys_add_num = polys_add_num;
327 *r_loops_add_num = loops_add_num;
336 const int i_dst = vertex_map[i_src];
356 return (
threshold - value1) / (value2 - value1);
366 uint edges_masked_num,
373 uint vert_index = dst_mesh.
totvert - verts_add_num;
374 uint edge_index = edges_masked_num - verts_add_num;
376 if (r_edge_map[i_src] != -1) {
377 int i_dst = r_edge_map[i_src];
386 e_dst.
v1 = vertex_map[e_src.
v1];
387 e_dst.
v2 = vertex_map[e_src.
v2];
389 if (r_edge_map[i_src] == -2) {
390 const int i_dst = edge_index++;
391 r_edge_map[i_src] = i_dst;
395 if (!vertex_mask[e_src.
v1]) {
396 e_dst.
v1 = vert_index;
401 e_dst.
v1 = vert_index;
407 float weights[2] = {1.0f - fac, fac};
409 &src_mesh.
vdata, &dst_mesh.
vdata, (
int *)&e_src.
v1, weights,
nullptr, 2, vert_index);
430 const int i_dst = edge_map[i_src];
431 if (
ELEM(i_dst, -1, -2)) {
440 e_dst.
v1 = vertex_map[e_src.
v1];
441 e_dst.
v2 = vertex_map[e_src.
v2];
451 int polys_masked_num)
453 for (
const int i_dst :
IndexRange(polys_masked_num)) {
454 const int i_src = masked_poly_indices[i_dst];
459 const int i_ml_dst = new_loop_starts[i_dst];
464 const MLoop *ml_src = src_mesh.
mloop + i_ml_src;
470 ml_dst[i].
v = vertex_map[ml_src[i].
v];
471 ml_dst[i].
e = edge_map[ml_src[i].e];
486 int polys_masked_num,
489 int edge_index = dst_mesh.
totedge - edges_add_num;
490 int sub_poly_index = 0;
492 for (
const int i_dst :
493 IndexRange(polys_masked_num, masked_poly_indices.
size() - polys_masked_num)) {
494 const int i_src = masked_poly_indices[i_dst];
495 if (i_src == last_i_src) {
506 int i_ml_dst = new_loop_starts[i_dst];
507 const int mp_totloop = (i_dst + 1 < new_loop_starts.
size() ? new_loop_starts[i_dst + 1] :
518 int start = -sub_poly_index - 1;
522 if (!vertex_mask[loops_src[j].
v]) {
540 const MLoop *last_loop = &loops_src[start];
541 bool v_loop_in_mask_last = vertex_mask[last_loop->
v];
542 int last_index = start;
544 const int index = (start + 1 + j) % mp_src.
totloop;
545 const MLoop &loop = loops_src[index];
546 const bool v_loop_in_mask = vertex_mask[loop.v];
547 if (v_loop_in_mask && !v_loop_in_mask_last) {
550 dvert, defgrp_index,
threshold, last_loop->
v, loop.v);
551 float weights[2] = {1.0f - fac, fac};
552 int indices[2] = {i_ml_src + last_index, i_ml_src + index};
555 MLoop &cut_dst_loop = dst_mesh.
mloop[i_ml_dst];
556 cut_dst_loop.
e = edge_map[last_loop->
e];
557 cut_dst_loop.
v = dst_mesh.
medge[cut_dst_loop.
e].
v1;
561 MLoop &next_dst_loop = dst_mesh.
mloop[i_ml_dst];
562 next_dst_loop.
v = vertex_map[loop.v];
563 next_dst_loop.
e = edge_map[loop.e];
566 else if (!v_loop_in_mask && v_loop_in_mask_last) {
570 dvert, defgrp_index,
threshold, last_loop->
v, loop.v);
571 float weights[2] = {1.0f - fac, fac};
572 int indices[2] = {i_ml_src + last_index, i_ml_src + index};
575 MLoop &cut_dst_loop = dst_mesh.
mloop[i_ml_dst];
576 cut_dst_loop.
e = edge_index;
577 cut_dst_loop.
v = dst_mesh.
medge[edge_map[last_loop->
e]].
v1;
583 cut_edge.
v2 = cut_dst_loop.
v;
591 else if (v_loop_in_mask && v_loop_in_mask_last) {
596 dst_loop.
v = vertex_map[loop.v];
597 dst_loop.
e = edge_map[loop.e];
602 v_loop_in_mask_last = v_loop_in_mask;
624 if (dvert ==
nullptr) {
634 int defgrp_index = -1;
641 if (
ELEM(
nullptr, armature_ob, armature_ob->
pose)) {
653 if (defgrp_index == -1) {
666 uint verts_masked_num;
670 uint edges_masked_num;
672 if (use_interpolation) {
682 uint polys_masked_num;
683 uint loops_masked_num;
691 uint edges_add_num = 0;
692 uint polys_add_num = 0;
693 uint loops_add_num = 0;
694 if (use_interpolation) {
707 verts_masked_num + verts_add_num,
708 edges_masked_num + edges_add_num,
710 loops_masked_num + loops_add_num,
711 polys_masked_num + polys_add_num);
714 if (use_interpolation) {
736 if (use_interpolation) {
758 bool UNUSED(useRenderParams))
786 uiItemR(row,
ptr,
"armature", 0,
nullptr, ICON_NONE);
789 uiItemR(sub,
ptr,
"invert_vertex_group", 0,
"", ICON_ARROW_LEFTRIGHT);
793 uiItemR(layout,
ptr,
"use_smooth", 0,
nullptr, ICON_NONE);
796 uiItemR(layout,
ptr,
"threshold", 0,
nullptr, ICON_NONE);
Blender kernel action and pose functionality.
struct bPoseChannel * BKE_pose_channel_find_name(const struct bPose *pose, const char *name)
CustomData interface, see also DNA_customdata_types.h.
void CustomData_interp(const struct CustomData *source, struct CustomData *dest, const int *src_indices, const float *weights, const float *sub_weights, int count, int dest_index)
void * CustomData_get_layer(const struct CustomData *data, int type)
void CustomData_copy_data(const struct CustomData *source, struct CustomData *dest, int source_index, int dest_index, int count)
struct Mesh * BKE_mesh_new_nomain_from_template(const struct Mesh *me_src, int verts_len, int edges_len, int tessface_len, int loops_len, int polys_len)
void BKE_mesh_calc_edges_loose(struct Mesh *mesh)
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, int flag)
@ eModifierTypeType_Nonconstructive
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], float t)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
void DEG_add_object_relation(struct DepsNodeHandle *node_handle, struct Object *object, eDepsObjectComponentType component, const char *description)
void DEG_add_modifier_to_transform_relation(struct DepsNodeHandle *node_handle, const char *description)
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
struct MaskModifierData MaskModifierData
Object is a sort of wrapper for general info.
_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 GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
Read Guarded memory(de)allocation.
static void computed_masked_polygons(const Mesh *mesh, Span< bool > vertex_mask, Vector< int > &r_masked_poly_indices, Vector< int > &r_loop_starts, uint *r_polys_masked_num, uint *r_loops_masked_num)
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
static float get_interp_factor_from_vgroup(const MDeformVert *dvert, int defgrp_index, float threshold, uint v1, uint v2)
static void copy_masked_polys_to_new_mesh(const Mesh &src_mesh, Mesh &dst_mesh, Span< int > vertex_map, Span< int > edge_map, Span< int > masked_poly_indices, Span< int > new_loop_starts, int polys_masked_num)
static void add_interp_verts_copy_edges_to_new_mesh(const Mesh &src_mesh, Mesh &dst_mesh, Span< bool > vertex_mask, Span< int > vertex_map, const MDeformVert *dvert, int defgrp_index, float threshold, uint edges_masked_num, uint verts_add_num, MutableSpan< int > r_edge_map)
static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, bool UNUSED(useRenderParams))
static void compute_interpolated_polygons(const Mesh *mesh, Span< bool > vertex_mask, uint verts_add_num, uint loops_masked_num, Vector< int > &r_masked_poly_indices, Vector< int > &r_loop_starts, uint *r_edges_add_num, uint *r_polys_add_num, uint *r_loops_add_num)
static void compute_masked_vertices(Span< bool > vertex_mask, MutableSpan< int > r_vertex_map, uint *r_verts_masked_num)
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *UNUSED(ctx), Mesh *mesh)
static void requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md), CustomData_MeshMasks *r_cddata_masks)
static void computed_masked_edges(const Mesh *mesh, Span< bool > vertex_mask, MutableSpan< int > r_edge_map, uint *r_edges_masked_num)
static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
static void add_interpolated_polys_to_new_mesh(const Mesh &src_mesh, Mesh &dst_mesh, Span< bool > vertex_mask, Span< int > vertex_map, Span< int > edge_map, const MDeformVert *dvert, int defgrp_index, float threshold, Span< int > masked_poly_indices, Span< int > new_loop_starts, int polys_masked_num, int edges_add_num)
static void copy_masked_edges_to_new_mesh(const Mesh &src_mesh, Mesh &dst_mesh, Span< int > vertex_map, Span< int > edge_map)
static void compute_vertex_mask__armature_mode(const MDeformVert *dvert, Mesh *mesh, Object *armature_ob, float threshold, MutableSpan< bool > r_vertex_mask)
static void compute_vertex_mask__vertex_group_mode(const MDeformVert *dvert, int defgrp_index, float threshold, MutableSpan< bool > r_vertex_mask)
static void invert_boolean_array(MutableSpan< bool > array)
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
static void initData(ModifierData *md)
static void panelRegister(ARegionType *region_type)
ModifierTypeInfo modifierType_Mask
static void copy_masked_vertices_to_new_mesh(const Mesh &src_mesh, Mesh &dst_mesh, Span< int > vertex_map)
static void computed_masked_edges_smooth(const Mesh *mesh, Span< bool > vertex_mask, MutableSpan< int > r_edge_map, uint *r_edges_masked_num, uint *r_verts_add_num)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
void modifier_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const char *vgroup_prop, const char *invert_vgroup_prop, const char *text)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
constexpr int64_t size() const
constexpr IndexRange index_range() const
constexpr T get(int64_t index, const T &fallback) const
constexpr int64_t size() const
constexpr IndexRange index_range() const
void append(const T &value)
void append_unchecked(const T &value)
void reserve(const int64_t min_capacity)
ccl_gpu_kernel_postfix ccl_global float int int int int float threshold
ccl_gpu_kernel_postfix int ccl_global int * indices
int RNA_enum_get(PointerRNA *ptr, const char *name)
ListBase vertex_group_names
struct DepsNodeHandle * node