63 float *fp, imat[4][4];
67 float *lattice_weights =
NULL;
76 fp = latticedata =
MEM_mallocN(
sizeof(
float[3]) * num_points +
sizeof(
float),
"latticedata");
96 int defgrp_index = -1;
98 if (lt->
vgroup[0] && dvert) {
101 if (defgrp_index != -1) {
102 lattice_weights =
MEM_malloc_arrayN(num_points,
sizeof(
float),
"lattice_weights");
103 for (
int index = 0; index < num_points; index++) {
109 for (
w = 0, fw = lt->
fw; w < lt->pntsw;
w++, fw += lt->
dw) {
110 for (
v = 0, fv = lt->
fv; v < lt->pntsv;
v++, fv += lt->
dv) {
111 for (u = 0, fu = lt->
fu; u < lt->pntsu; u++, bp++, co += 3, fp += 3, fu += lt->
du) {
118 fp[0] = bp->
vec[0] - fu;
119 fp[1] = bp->
vec[1] - fv;
120 fp[2] = bp->
vec[2] - fw;
131 lattice_deform_data->
lt = lt;
134 return lattice_deform_data;
141 float *latticedata = lattice_deform_data->
latticedata;
144 const Lattice *lt = lattice_deform_data->
lt;
145 float u,
v,
w, tu[4], tv[4], tw[4];
147 int idx_w, idx_v, idx_u;
148 int ui, vi, wi, uu, vv, ww;
151 float co_prev[4] = {0}, weight_blend = 0.0f;
154 __m128 co_vec = _mm_loadu_ps(co_prev);
163 u = (vec[0] - lt->
fu) / lt->
du;
169 tu[0] = tu[2] = tu[3] = 0.0;
175 v = (vec[1] - lt->
fv) / lt->
dv;
181 tv[0] = tv[2] = tv[3] = 0.0;
187 w = (vec[2] - lt->
fw) / lt->
dw;
193 tw[0] = tw[2] = tw[3] = 0.0;
200 const int v_stride = lt->
pntsu;
201 const int idx_v_max = (lt->
pntsv - 1) * lt->
pntsu;
202 const int idx_u_max = (lt->
pntsu - 1);
204 for (ww = wi - 1; ww <= wi + 2; ww++) {
205 w = weight * tw[ww - wi + 1];
206 idx_w =
CLAMPIS(ww * w_stride, 0, idx_w_max);
207 for (vv = vi - 1; vv <= vi + 2; vv++) {
208 v =
w * tv[vv - vi + 1];
209 idx_v =
CLAMPIS(vv * v_stride, 0, idx_v_max);
210 for (uu = ui - 1; uu <= ui + 2; uu++) {
211 u =
v * tu[uu - ui + 1];
212 idx_u =
CLAMPIS(uu, 0, idx_u_max);
213 const int idx = idx_w + idx_v + idx_u;
216 __m128 weight_vec = _mm_set1_ps(u);
219 if (idx * 3 == idx_w_max) {
220 copy_v3_v3((
float *)&lattice_vec, &latticedata[idx * 3]);
225 lattice_vec = _mm_loadu_ps(&latticedata[idx * 3]);
227 co_vec = _mm_add_ps(co_vec, _mm_mul_ps(lattice_vec, weight_vec));
232 if (lattice_weights) {
233 weight_blend += (u * lattice_weights[idx]);
244 if (lattice_weights) {
285 const float weight =
data->invert_vgroup ?
290 data->lattice_deform_data,
data->vert_coords[index], weight *
data->fac);
295 data->lattice_deform_data,
data->vert_coords[index],
data->fac);
328 float (*vert_coords)[3],
329 const int vert_coords_len,
331 const char *defgrp_name,
333 const Mesh *me_target,
338 int defgrp_index = -1;
339 int cd_dvert_offset = -1;
354 if (defgrp_index != -1) {
359 else if (me_target) {
366 dvert = ((
Mesh *)ob_target->
data)->dvert;
372 .lattice_deform_data = lattice_deform_data,
373 .vert_coords = vert_coords,
375 .defgrp_index = defgrp_index,
380 .cd_dvert_offset = cd_dvert_offset,
384 if (em_target !=
NULL) {
392 if (cd_dvert_offset != -1) {
413 float (*vert_coords)[3],
414 const int vert_coords_len,
416 const char *defgrp_name,
420 ob_lattice, ob_target, vert_coords, vert_coords_len, flag, defgrp_name, fac,
NULL,
NULL);
425 float (*vert_coords)[3],
426 const int vert_coords_len,
428 const char *defgrp_name,
430 const Mesh *me_target)
444 const struct Object *ob_target,
445 float (*vert_coords)[3],
446 const int vert_coords_len,
448 const char *defgrp_name,
typedef float(TangentPoint)[2]
void * CustomData_get_layer(const struct CustomData *data, int type)
int CustomData_get_offset(const struct CustomData *data, int 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], int type)
struct MDeformVert * BKE_lattice_deform_verts_get(const struct Object *oblatt)
General operations, lookup, etc. for blender objects.
struct Lattice * BKE_object_get_lattice(const struct Object *object)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void mul_mat3_m4_v3(const float M[4][4], float r[3])
bool invert_m4_m4(float R[4][4], const float A[4][4])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
void mul_v3_m4v3(float r[3], const float M[4][4], const float v[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)
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_malloc_arrayN)(size_t len, size_t size, const char *str)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_mallocN)(size_t len, const char *str)
struct BLI_mempool * vpool
struct CurveCache * curve_cache