64 const float *co = dl ? dl->
verts :
nullptr;
65 float *fp, imat[4][4];
69 float *lattice_weights =
nullptr;
91 mul_m4_m4m4(latmat, imat, ob->object_to_world().ptr());
98 int defgrp_index = -1;
100 if (lt->
vgroup[0] && dvert) {
103 if (defgrp_index != -1) {
105 for (
int index = 0; index < num_points; index++) {
113 for (u = 0, fu = lt->
fu; u < lt->pntsu; u++, fp += 3, fu += lt->
du) {
121 fp[0] = bp->
vec[0] - fu;
122 fp[1] = bp->
vec[1] - fv;
123 fp[2] = bp->
vec[2] - fw;
135 lattice_deform_data->
lt = lt;
138 return lattice_deform_data;
145 float *latticedata = lattice_deform_data->
latticedata;
148 const Lattice *lt = lattice_deform_data->
lt;
149 float u,
v,
w, tu[4], tv[4], tw[4];
151 int idx_w, idx_v, idx_u;
152 int ui, vi, wi, uu, vv, ww;
155 float co_prev[4] = {0}, weight_blend = 0.0f;
158 __m128 co_vec = _mm_loadu_ps(co_prev);
167 u = (vec[0] - lt->
fu) / lt->
du;
173 tu[0] = tu[2] = tu[3] = 0.0;
179 v = (vec[1] - lt->
fv) / lt->
dv;
185 tv[0] = tv[2] = tv[3] = 0.0;
191 w = (vec[2] - lt->
fw) / lt->
dw;
197 tw[0] = tw[2] = tw[3] = 0.0;
204 const int v_stride = lt->
pntsu;
205 const int idx_v_max = (lt->
pntsv - 1) * lt->
pntsu;
206 const int idx_u_max = (lt->
pntsu - 1);
208 for (ww = wi - 1; ww <= wi + 2; ww++) {
209 w = weight * tw[ww - wi + 1];
210 idx_w = std::clamp(ww * w_stride, 0, idx_w_max);
211 for (vv = vi - 1; vv <= vi + 2; vv++) {
212 v =
w * tv[vv - vi + 1];
213 idx_v = std::clamp(vv * v_stride, 0, idx_v_max);
214 for (uu = ui - 1; uu <= ui + 2; uu++) {
215 u =
v * tu[uu - ui + 1];
216 idx_u = std::clamp(uu, 0, idx_u_max);
217 const int idx = idx_w + idx_v + idx_u;
220 __m128 weight_vec = _mm_set1_ps(u);
223 if (idx * 3 == idx_w_max) {
224 copy_v3_v3((
float *)&lattice_vec, &latticedata[idx * 3]);
229 lattice_vec = _mm_loadu_ps(&latticedata[idx * 3]);
231 co_vec = _mm_add_ps(co_vec, _mm_mul_ps(lattice_vec, weight_vec));
236 if (lattice_weights) {
237 weight_blend += (u * lattice_weights[idx]);
248 if (lattice_weights) {
288 if (dvert !=
nullptr) {
289 const float weight =
data->invert_vgroup ?
294 data->lattice_deform_data,
data->vert_coords[index], weight *
data->fac);
299 data->lattice_deform_data,
data->vert_coords[index],
data->fac);
333 float (*vert_coords)[3],
334 const int vert_coords_len,
336 const char *defgrp_name,
338 const Mesh *me_target,
343 int defgrp_index = -1;
344 int cd_dvert_offset = -1;
359 if (defgrp_index != -1) {
364 else if (me_target) {
365 dvert = me_target->deform_verts().data();
371 dvert = ((
Mesh *)ob_target->
data)->deform_verts().data();
377 data.lattice_deform_data = lattice_deform_data;
378 data.vert_coords = vert_coords;
380 data.defgrp_index = defgrp_index;
383 data.bmesh.cd_dvert_offset = cd_dvert_offset;
385 if (em_target !=
nullptr) {
393 if (cd_dvert_offset != -1) {
414 float (*vert_coords)[3],
415 const int vert_coords_len,
417 const char *defgrp_name,
433 float (*vert_coords)[3],
434 const int vert_coords_len,
436 const char *defgrp_name,
438 const Mesh *me_target)
453 float (*vert_coords)[3],
454 const int vert_coords_len,
456 const char *defgrp_name,
int CustomData_get_offset(const CustomData *data, eCustomDataType type)
display list (or rather multi purpose list) stuff.
DispList * BKE_displist_find(struct ListBase *lb, int type)
void key_curve_position_weights(float t, float data[4], KeyInterpolationType type)
MDeformVert * BKE_lattice_deform_verts_get(const Object *oblatt)
General operations, lookup, etc. for blender objects.
Lattice * BKE_object_get_lattice(const Object *object)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
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])
void mul_mat3_m4_v3(const float mat[4][4], float r[3])
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], float t)
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)
@ MOD_LATTICE_INVERT_VGROUP
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 BMVert * v
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
void * MEM_mallocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
struct BLI_mempool * vpool
ObjectRuntimeHandle * runtime