65 const float *co = dl ? dl->
verts :
nullptr;
66 float *fp, imat[4][4];
70 float *lattice_weights =
nullptr;
79 fp = latticedata =
static_cast<float *
>(
80 MEM_mallocN(
sizeof(
float[3]) * num_points +
sizeof(
float),
"latticedata"));
93 mul_m4_m4m4(latmat, imat, ob->object_to_world().ptr());
100 int defgrp_index = -1;
102 if (lt->
vgroup[0] && dvert) {
105 if (defgrp_index != -1) {
106 lattice_weights =
static_cast<float *
>(
108 for (
int index = 0; index < num_points; index++) {
114 for (
w = 0, fw = lt->
fw;
w < lt->
pntsw;
w++, fw += lt->
dw) {
115 for (
v = 0, fv = lt->
fv;
v < lt->
pntsv;
v++, fv += lt->
dv) {
116 for (u = 0, fu = lt->
fu; u < lt->
pntsu; u++, fp += 3, fu += lt->
du) {
124 fp[0] = bp->
vec[0] - fu;
125 fp[1] = bp->
vec[1] - fv;
126 fp[2] = bp->
vec[2] - fw;
139 lattice_deform_data->
lt = lt;
142 return lattice_deform_data;
149 float *latticedata = lattice_deform_data->
latticedata;
152 const Lattice *lt = lattice_deform_data->
lt;
153 float u,
v,
w, tu[4], tv[4], tw[4];
155 int idx_w, idx_v, idx_u;
156 int ui, vi, wi, uu, vv, ww;
159 float co_prev[4] = {0}, weight_blend = 0.0f;
162 __m128 co_vec = _mm_loadu_ps(co_prev);
171 u = (vec[0] - lt->
fu) / lt->
du;
177 tu[0] = tu[2] = tu[3] = 0.0;
183 v = (vec[1] - lt->
fv) / lt->
dv;
189 tv[0] = tv[2] = tv[3] = 0.0;
195 w = (vec[2] - lt->
fw) / lt->
dw;
201 tw[0] = tw[2] = tw[3] = 0.0;
208 const int v_stride = lt->
pntsu;
209 const int idx_v_max = (lt->
pntsv - 1) * lt->
pntsu;
210 const int idx_u_max = (lt->
pntsu - 1);
212 for (ww = wi - 1; ww <= wi + 2; ww++) {
213 w = weight * tw[ww - wi + 1];
214 idx_w = std::clamp(ww * w_stride, 0, idx_w_max);
215 for (vv = vi - 1; vv <= vi + 2; vv++) {
216 v =
w * tv[vv - vi + 1];
217 idx_v = std::clamp(vv * v_stride, 0, idx_v_max);
218 for (uu = ui - 1; uu <= ui + 2; uu++) {
219 u =
v * tu[uu - ui + 1];
220 idx_u = std::clamp(uu, 0, idx_u_max);
221 const int idx = idx_w + idx_v + idx_u;
224 __m128 weight_vec = _mm_set1_ps(u);
227 if (idx * 3 == idx_w_max) {
228 copy_v3_v3((
float *)&lattice_vec, &latticedata[idx * 3]);
233 lattice_vec = _mm_loadu_ps(&latticedata[idx * 3]);
235 co_vec = _mm_add_ps(co_vec, _mm_mul_ps(lattice_vec, weight_vec));
240 if (lattice_weights) {
241 weight_blend += (u * lattice_weights[idx]);
252 if (lattice_weights) {
292 if (dvert !=
nullptr) {
293 const float weight = data->invert_vgroup ?
298 data->lattice_deform_data, data->vert_coords[index], weight * data->fac);
303 data->lattice_deform_data, data->vert_coords[index], data->fac);
337 float (*vert_coords)[3],
338 const int vert_coords_len,
340 const char *defgrp_name,
342 const Mesh *me_target,
347 int defgrp_index = -1;
348 int cd_dvert_offset = -1;
363 if (defgrp_index != -1) {
368 else if (me_target) {
376 dvert = ((
Mesh *)ob_target->
data)->deform_verts().data();
383 data.vert_coords = vert_coords;
385 data.defgrp_index = defgrp_index;
388 data.bmesh.cd_dvert_offset = cd_dvert_offset;
390 if (em_target !=
nullptr) {
398 if (cd_dvert_offset != -1) {
410 settings.min_iter_per_thread = 32;
419 float (*vert_coords)[3],
420 const int vert_coords_len,
422 const char *defgrp_name,
438 float (*vert_coords)[3],
439 const int vert_coords_len,
441 const char *defgrp_name,
443 const Mesh *me_target)
458 float (*vert_coords)[3],
459 const int vert_coords_len,
461 const char *defgrp_name,
int CustomData_get_offset(const CustomData *data, eCustomDataType type)
const void * CustomData_get_layer(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], int 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)
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.
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
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)
ccl_device_inline float2 floor(const float2 a)
struct BLI_mempool * vpool
ObjectRuntimeHandle * runtime