79 float *fp, imat[4][4];
83 float *lattice_weights =
NULL;
92 fp = latticedata =
MEM_mallocN(
sizeof(
float[3]) * num_points +
sizeof(
float),
"latticedata");
112 int defgrp_index = -1;
114 if (lt->
vgroup[0] && dvert) {
117 if (defgrp_index != -1) {
118 lattice_weights =
MEM_malloc_arrayN(
sizeof(
float), num_points,
"lattice_weights");
119 for (
int index = 0; index < num_points; index++) {
125 for (
w = 0, fw = lt->
fw; w < lt->pntsw;
w++, fw += lt->
dw) {
126 for (
v = 0, fv = lt->
fv; v < lt->pntsv;
v++, fv += lt->
dv) {
127 for (u = 0, fu = lt->
fu; u < lt->pntsu; u++, bp++, co += 3, fp += 3, fu += lt->
du) {
134 fp[0] = bp->
vec[0] - fu;
135 fp[1] = bp->
vec[1] - fv;
136 fp[2] = bp->
vec[2] - fw;
147 lattice_deform_data->
lt = lt;
150 return lattice_deform_data;
157 float *latticedata = lattice_deform_data->
latticedata;
160 const Lattice *lt = lattice_deform_data->
lt;
161 float u,
v,
w, tu[4], tv[4], tw[4];
163 int idx_w, idx_v, idx_u;
164 int ui, vi, wi, uu, vv, ww;
167 float co_prev[4] = {0}, weight_blend = 0.0f;
170 __m128 co_vec = _mm_loadu_ps(co_prev);
179 u = (vec[0] - lt->
fu) / lt->
du;
185 tu[0] = tu[2] = tu[3] = 0.0;
191 v = (vec[1] - lt->
fv) / lt->
dv;
197 tv[0] = tv[2] = tv[3] = 0.0;
203 w = (vec[2] - lt->
fw) / lt->
dw;
209 tw[0] = tw[2] = tw[3] = 0.0;
216 const int v_stride = lt->
pntsu;
217 const int idx_v_max = (lt->
pntsv - 1) * lt->
pntsu;
218 const int idx_u_max = (lt->
pntsu - 1);
220 for (ww = wi - 1; ww <= wi + 2; ww++) {
221 w = weight * tw[ww - wi + 1];
222 idx_w =
CLAMPIS(ww * w_stride, 0, idx_w_max);
223 for (vv = vi - 1; vv <= vi + 2; vv++) {
224 v =
w * tv[vv - vi + 1];
225 idx_v =
CLAMPIS(vv * v_stride, 0, idx_v_max);
226 for (uu = ui - 1; uu <= ui + 2; uu++) {
227 u =
v * tu[uu - ui + 1];
228 idx_u =
CLAMPIS(uu, 0, idx_u_max);
229 const int idx = idx_w + idx_v + idx_u;
232 __m128 weight_vec = _mm_set1_ps(u);
235 if (idx * 3 == idx_w_max) {
236 copy_v3_v3((
float *)&lattice_vec, &latticedata[idx * 3]);
241 lattice_vec = _mm_loadu_ps(&latticedata[idx * 3]);
243 co_vec = _mm_add_ps(co_vec, _mm_mul_ps(lattice_vec, weight_vec));
248 if (lattice_weights) {
249 weight_blend += (u * lattice_weights[idx]);
260 if (lattice_weights) {
301 const float weight =
data->invert_vgroup ?
306 data->lattice_deform_data,
data->vert_coords[index], weight *
data->fac);
311 data->lattice_deform_data,
data->vert_coords[index],
data->fac);
340 float (*vert_coords)[3],
341 const int vert_coords_len,
343 const char *defgrp_name,
345 const Mesh *me_target,
350 int defgrp_index = -1;
351 int cd_dvert_offset = -1;
365 if (defgrp_index != -1) {
370 else if (me_target) {
377 dvert = ((
Mesh *)ob_target->
data)->dvert;
383 .lattice_deform_data = lattice_deform_data,
384 .vert_coords = vert_coords,
386 .defgrp_index = defgrp_index,
391 .cd_dvert_offset = cd_dvert_offset,
395 if (em_target !=
NULL) {
400 if (cd_dvert_offset != -1) {
420 float (*vert_coords)[3],
421 const int vert_coords_len,
423 const char *defgrp_name,
427 ob_lattice, ob_target, vert_coords, vert_coords_len, flag, defgrp_name, fac,
NULL,
NULL);
432 float (*vert_coords)[3],
433 const int vert_coords_len,
435 const char *defgrp_name,
437 const Mesh *me_target)
451 const struct Object *ob_target,
452 float (*vert_coords)[3],
453 const int vert_coords_len,
455 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])
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], const float t)
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 BLI_task_parallel_range(const int start, const int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
struct MempoolIterData MempoolIterData
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
void BLI_task_parallel_mempool(struct BLI_mempool *mempool, void *userdata, TaskParallelMempoolFunc func, const bool use_threading)
@ 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
ccl_device_inline float2 floor(const float2 &a)