50 const float deform_mat[4][4],
55 float mat_accum[3][3],
56 const bool full_deform)
89 const bool full_deform)
102 weight * (1.0f -
blend),
108 &quats[index + 1], mats[index + 2].mat, co, weight *
blend, vec, dq, defmat, full_deform);
112 const float vec[3],
const float b1[3],
const float b2[3],
float rad1,
float rad2,
float rdist)
117 float hsqr, a,
l, rad;
138 dist_sq = (hsqr - (a * a));
142 rad = rad * rad2 + (1.0f - rad) * rad1;
156 if (rdist == 0.0f || dist_sq >=
l) {
160 a =
sqrtf(dist_sq) - rad;
161 return 1.0f - (a * a) / (rdist * rdist);
169 const bool full_deform)
172 float fac, contrib = 0.0;
174 if (bone ==
nullptr) {
184 if (contrib > 0.0f) {
204 const bool full_deform,
221 (*contrib) += weight;
265 float(*
const vert_coords)[3] =
data->vert_coords;
266 float(*
const vert_deform_mats)[3][3] =
data->vert_deform_mats;
267 float(*
const vert_coords_prev)[3] =
data->vert_coords_prev;
268 const bool use_envelope =
data->use_envelope;
269 const bool use_quaternion =
data->use_quaternion;
270 const bool use_dverts =
data->use_dverts;
271 const int armature_def_nr =
data->armature_def_nr;
276 float sumvec[3], summat[3][3];
277 float *vec =
nullptr, (*smat)[3] =
nullptr;
278 float contrib = 0.0f;
279 float armature_weight = 1.0f;
280 float prevco_weight = 0.0f;
282 const bool full_deform = vert_deform_mats !=
nullptr;
284 if (use_quaternion) {
297 if (armature_def_nr != -1 && dvert) {
300 if (
data->invert_vgroup) {
301 armature_weight = 1.0f - armature_weight;
305 if (vert_coords_prev) {
308 prevco_weight = 1.0f - armature_weight;
309 armature_weight = 1.0f;
314 if (vert_coords_prev) {
315 if (prevco_weight == 1.0f) {
320 co = vert_coords_prev[
i];
323 if (armature_weight == 0.0f) {
334 if (use_dverts && dvert && dvert->
totweight) {
338 for (j = dvert->
totweight; j != 0; j--, dw++) {
340 if (index >=
data->defbase_len) {
343 pchan =
data->pchan_from_defbase[index];
344 if (pchan ==
nullptr) {
348 float weight = dw->
weight;
361 if (deformed == 0 && use_envelope) {
362 for (pchan =
static_cast<const bPoseChannel *
>(
data->ob_arm->pose->chanbase.first); pchan;
371 else if (use_envelope) {
372 for (pchan =
static_cast<const bPoseChannel *
>(
data->ob_arm->pose->chanbase.first); pchan;
382 if (contrib > 0.0001f) {
383 if (use_quaternion) {
386 if (armature_weight != 1.0f) {
388 mul_v3m3_dq(dco, full_deform ? summat :
nullptr, dq);
394 mul_v3m3_dq(co, full_deform ? summat :
nullptr, dq);
400 mul_v3_fl(vec, armature_weight / contrib);
405 float pre[3][3], post[3][3], tmpmat[3][3];
411 if (!use_quaternion) {
412 mul_m3_fl(smat, armature_weight / contrib);
423 if (vert_coords_prev) {
424 float mw = 1.0f - prevco_weight;
425 vert_coords[
i][0] = prevco_weight * vert_coords[
i][0] + mw * co[0];
426 vert_coords[
i][1] = prevco_weight * vert_coords[
i][1] + mw * co[1];
427 vert_coords[
i][2] = prevco_weight * vert_coords[
i][2] + mw * co[2];
437 if (
data->use_dverts ||
data->armature_def_nr != -1) {
438 if (
data->me_target) {
440 if (
data->dverts !=
nullptr) {
441 dvert =
data->dverts +
i;
448 dvert =
data->dverts +
i;
484 float (*vert_coords)[3],
485 float (*vert_deform_mats)[3][3],
486 const int vert_coords_len,
487 const int deformflag,
488 float (*vert_coords_prev)[3],
489 const char *defgrp_name,
491 const Mesh *me_target,
500 bool use_dverts =
false;
501 int armature_def_nr = -1;
502 int cd_dvert_offset = -1;
505 if (arm->
edbo || (ob_arm->
pose ==
nullptr)) {
511 "Trying to evaluate influence of armature '%s' which needs Pose recalc!",
526 use_dverts = (cd_dvert_offset != -1);
528 else if (me_target) {
529 use_dverts = !me_target->deform_verts().is_empty();
531 else if (dverts.
size() == vert_coords_len) {
545 if (pchan_from_defbase[
i]) {
547 pchan_from_defbase[
i] =
nullptr;
556 data.ob_arm = ob_arm;
557 data.me_target = me_target;
558 data.vert_coords = vert_coords;
559 data.vert_deform_mats = vert_deform_mats;
560 data.vert_coords_prev = vert_coords_prev;
561 data.use_envelope = use_envelope;
562 data.use_quaternion = use_quaternion;
563 data.invert_vgroup = invert_vgroup;
564 data.use_dverts = use_dverts;
565 data.armature_def_nr = armature_def_nr;
568 data.pchan_from_defbase = pchan_from_defbase;
569 data.defbase_len = defbase_len;
570 data.bmesh.cd_dvert_offset = cd_dvert_offset;
573 invert_m4_m4(obinv, ob_target->object_to_world().ptr());
578 if (em_target !=
nullptr) {
602 if (pchan_from_defbase) {
623 if (vert_coords_prev.has_value()) {
625 vert_coords_prev_data =
const_cast<blender::float3 *
>(vert_coords_prev->data());
632 reinterpret_cast<float(*)[3]
>(vert_coords.
data()),
633 vert_deform_mats ?
reinterpret_cast<float(*)[3][3]
>(vert_deform_mats->data()) :
nullptr,
636 reinterpret_cast<float(*)[3]
>(vert_coords_prev_data),
645 float (*vert_coords)[3],
646 float (*vert_deform_mats)[3][3],
649 float (*vert_coords_prev)[3],
650 const char *defgrp_name,
651 const Mesh *me_target)
655 const ID *id_target =
static_cast<const ID *
>(ob_target->
data);
668 if (me_target ==
nullptr) {
669 me_target =
static_cast<const Mesh *
>(ob_target->
data);
671 dverts = me_target->deform_verts();
694 float (*vert_coords)[3],
695 float (*vert_deform_mats)[3][3],
698 float (*vert_coords_prev)[3],
699 const char *defgrp_name,
Blender kernel action and pose functionality.
bPoseChannel * BKE_pose_channel_find_name(const bPose *pose, const char *name)
void BKE_pchan_bbone_deform_segment_index(const bPoseChannel *pchan, const float *co, int *r_index, float *r_blend_next)
CustomData interface, see also DNA_customdata_types.h.
int CustomData_get_offset(const CustomData *data, eCustomDataType type)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void copy_m3_m3(float m1[3][3], const float m2[3][3])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
void mul_m3_fl(float R[3][3], float f)
void zero_m3(float m[3][3])
void mul_m4_v3(const float M[4][4], float r[3])
void madd_m3_m3m3fl(float R[3][3], const float A[3][3], const float B[3][3], float f)
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
#define mul_m3_series(...)
void mul_v3m3_dq(float r[3], float R[3][3], DualQuat *dq)
void add_weighted_dq_dq_pivot(DualQuat *dq_sum, const DualQuat *dq, const float pivot[3], float weight, bool compute_scale_matrix)
void normalize_dq(DualQuat *dq, float totweight)
MINLINE float len_squared_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE float len_squared_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void zero_v3(float r[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE float normalize_v3(float n[3])
struct MempoolIterData MempoolIterData
void BLI_task_parallel_range(int start, int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
void BLI_task_parallel_mempool(struct BLI_mempool *mempool, void *userdata, TaskParallelMempoolFunc func, const TaskParallelSettings *settings)
BLI_INLINE void BLI_parallel_mempool_settings_defaults(TaskParallelSettings *settings)
#define CLOG_ERROR(clg_ref,...)
These structs are the foundation for all linked lists in the library system.
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
#define BM_ELEM_CD_GET_VOID_P(ele, offset)
#define BM_elem_index_get(ele)
BMesh const char void * data
void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert * v
constexpr int64_t size() const
constexpr T * data() const
constexpr const T * data() const
constexpr int64_t size() const
constexpr const char * c_str() const
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
VecBase< float, 3 > float3
float(* vert_deform_mats)[3][3]
bPoseChannel ** pchan_from_defbase
struct ArmatureUserdata::@232276244170050210343154241327011141376321103026 bmesh
const MDeformVert * dverts
float(* vert_coords_prev)[3]
struct BLI_mempool * vpool
struct MDeformVert * dvert
struct Mat4 * bbone_deform_mats
struct DualQuat deform_dual_quat
struct DualQuat * bbone_dual_quats
struct bPoseChannel * next
struct bPoseChannel_Runtime runtime
static int blend(const Tex *tex, const float texvec[3], TexResult *texres)