77 } *
data =
static_cast<Arg *
>(datap);
86 if (
data->heat &&
data->armob->pose && pose_bone) {
93 if (
data->list !=
nullptr) {
96 for (a = 0; a < segments; a++) {
153 bool is_weight_paint;
154 } *
data =
static_cast<Arg *
>(datap);
177 if (!
data->is_weight_paint ||
189 if (
data->list !=
nullptr) {
192 for (a = 0; a < segments; a++) {
209 const bool *selected,
216 bool use_mask =
false;
230 if (use_mask && !(select_vert && select_vert[
i])) {
237 for (
int j = 0; j < numbones; j++) {
238 if (selected[j] ==
false) {
242 Bone *bone = bonelist[j];
262 if (dgroupflip && dgroupflip[j] && iflip != -1) {
295 Bone **bonelist, *bone;
301 float (*root)[3], (*tip)[3];
304 int numbones, vertsfilled = 0, segments = 0;
310 bool is_weight_paint;
313 looper_data.armob = par;
314 looper_data.heat = heat;
315 looper_data.list =
nullptr;
316 looper_data.is_weight_paint = wpmode;
337 looper_data.list = bonelist;
346 looper_data.list = dgrouplist;
355 for (
int j = 0; j < numbones; j++) {
357 dgroup = dgrouplist[j];
380 if ((segments + 1) < bone->
segments) {
392 mul_m4_v3(par->object_to_world().ptr(), root[j]);
393 mul_m4_v3(par->object_to_world().ptr(), tip[j]);
406 if (dgroup && mirror) {
415 mesh =
static_cast<Mesh *
>(ob->
data);
424 mesh_eval,
reinterpret_cast<float (*)[3]
>(
verts.data()), mesh->
verts_num);
447 const char *
error =
nullptr;
451 reinterpret_cast<float (*)[3]
>(
verts.data()),
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.
void BKE_pose_channels_hash_ensure(bPose *pose) ATTR_NONNULL(1)
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)
void BKE_pose_rebuild(Main *bmain, Object *ob, bArmature *arm, bool do_id_user)
float distfactor_to_bone(const blender::float3 &position, const blender::float3 &head, const blender::float3 &tail, float radius_head, float radius_tail, float falloff_distance)
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)
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
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
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 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)
static void envelope_bone_weighting(Object *ob, Mesh *mesh, const blender::Span< blender::float3 > verts, int numbones, Bone **bonelist, bDeformGroup **dgrouplist, bDeformGroup **dgroupflip, float(*root)[3], float(*tip)[3], const bool *selected, float scale)
BMesh const char void * data
BPy_StructRNA * depsgraph
GAttributeReader lookup(const StringRef attribute_id) const
float distance(VecOp< float, D >, VecOp< float, D >) RET
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
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 calculate_limit_positions(Mesh *mesh, MutableSpan< float3 > limit_positions)
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)