77 } *data =
static_cast<Arg *
>(datap);
81 if (data->heat && data->armob->pose &&
90 if (data->list !=
nullptr) {
91 hbone = (
Bone ***)&data->list;
93 for (a = 0; a < segments; a++) {
150 bool is_weight_paint;
151 } *data =
static_cast<Arg *
>(datap);
156 if (data->heat && data->armob->pose &&
165 if (!data->is_weight_paint ||
177 if (data->list !=
nullptr) {
180 for (a = 0; a < segments; a++) {
200 const bool *selected,
207 bool use_mask =
false;
216 const VArray select_vert = *attributes.lookup<
bool>(
".select_vert", bke::AttrDomain::Point);
219 for (
int i = 0; i < mesh->verts_num; i++) {
221 if (use_mask && !(select_vert && select_vert[i])) {
228 for (
int j = 0; j < numbones; j++) {
229 if (selected[j] ==
false) {
233 Bone *bone = bonelist[j];
245 if (distance != 0.0f) {
253 if (dgroupflip && dgroupflip[j] && iflip != -1) {
254 if (distance != 0.0f) {
286 Bone **bonelist, *bone;
292 float(*root)[3], (*tip)[3], (*verts)[3];
294 int numbones, vertsfilled = 0, segments = 0;
300 bool is_weight_paint;
303 looper_data.armob = par;
304 looper_data.heat = heat;
305 looper_data.list =
nullptr;
306 looper_data.is_weight_paint = wpmode;
323 looper_data.list = bonelist;
334 looper_data.list = dgrouplist;
339 root =
static_cast<float(*)[3]
>(
MEM_callocN(
sizeof(
float[3]) * numbones,
"root"));
340 tip =
static_cast<float(*)[3]
>(
MEM_callocN(
sizeof(
float[3]) * numbones,
"tip"));
341 selected =
static_cast<bool *
>(
MEM_callocN(
sizeof(
bool) * numbones,
"selected"));
343 for (
int j = 0; j < numbones; j++) {
345 dgroup = dgrouplist[j];
368 if ((segments + 1) < bone->
segments) {
380 mul_m4_v3(par->object_to_world().ptr(), root[j]);
381 mul_m4_v3(par->object_to_world().ptr(), tip[j]);
394 if (dgroup && mirror) {
404 verts =
static_cast<float(*)[3]
>(
426 for (
int i = 0; i < mesh->verts_num; i++) {
435 const char *
error =
nullptr;
438 ob, mesh,
verts, numbones, dgrouplist, dgroupflip, root, tip, selected, &
error);
C++ functions to deal with Armature collections (i.e. the successor of bone layers).
bool ANIM_bone_in_visible_collection(const bArmature *armature, const Bone *bone)
Blender kernel action and pose functionality.
bPoseChannel * BKE_pose_channel_find_name(const bPose *pose, const char *name)
void BKE_pchan_bbone_spline_setup(bPoseChannel *pchan, bool rest, bool for_deform, Mat4 *result_array)
float distfactor_to_bone(const float vec[3], const float b1[3], const float b2[3], float rad1, float rad2, float rdist)
void BKE_mesh_foreach_mapped_vert_coords_get(const Mesh *mesh_eval, float(*r_cos)[3], int totcos)
ModifierData * BKE_modifiers_findby_type(const Object *ob, ModifierType type)
General operations, lookup, etc. for blender objects.
Mesh * BKE_object_get_evaluated_mesh(const Object *object_eval)
void BKE_report(ReportList *reports, eReportType type, const char *message)
void subsurf_calculate_limit_positions(Mesh *mesh, float(*r_positions)[3])
float mat4_to_scale(const float mat[4][4])
void mul_m4_v3(const float M[4][4], float r[3])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
size_t BLI_string_flip_side_name(char *name_dst, const char *name_src, bool strip_number, size_t name_dst_maxncpy) ATTR_NONNULL(1
Object * DEG_get_evaluated_object(const Depsgraph *depsgraph, Object *object)
Object is a sort of wrapper for general info.
#define ARM_GROUPS_ENVELOPE
int mesh_get_x_mirror_vert(Object *ob, Mesh *mesh_eval, int index, bool use_topology)
void ED_mesh_mirror_spatial_table_end(Object *ob)
Read Guarded memory(de)allocation.
int bone_looper(Object *ob, Bone *bone, void *data, int(*bone_func)(Object *, Bone *, void *))
static void envelope_bone_weighting(Object *ob, Mesh *mesh, float(*verts)[3], int numbones, Bone **bonelist, bDeformGroup **dgrouplist, bDeformGroup **dgroupflip, float(*root)[3], float(*tip)[3], const bool *selected, float scale)
static int bone_skinnable_cb(Object *, Bone *bone, void *datap)
void ED_object_vgroup_calc_from_armature(ReportList *reports, Depsgraph *depsgraph, Scene *scene, Object *ob, Object *par, const int mode, const bool mirror)
static int dgroup_skinnable_cb(Object *ob, Bone *bone, void *datap)
static int vgroup_add_unique_bone_cb(Object *ob, Bone *bone, void *)
static void add_verts_to_dgroups(ReportList *reports, Depsgraph *depsgraph, Scene *, Object *ob, Object *par, int heat, const bool mirror)
const Depsgraph * depsgraph
draw_view in_light_buf[] float
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void heat_bone_weighting(Object *ob, Mesh *mesh, float(*verts)[3], int numbones, bDeformGroup **dgrouplist, bDeformGroup **dgroupflip, float(*root)[3], float(*tip)[3], const bool *selected, const char **r_error_str)
static void error(const char *str)
void vgroup_data_clamp_range(ID *id, int total)
void vgroup_vert_add(Object *ob, bDeformGroup *dg, int vertnum, float weight, int assignmode)
void vgroup_vert_remove(Object *ob, bDeformGroup *dg, int vertnum)