35#include "RNA_prototypes.hh"
148 if (mmd->
object !=
nullptr) {
160 float gridvec[3], dvec[3], ivec[3], wx, wy, wz;
161 float weight, cageweight, totweight, *cageco;
164 __m128 co = _mm_setzero_ps();
166 float co[3] = {0.0f, 0.0f, 0.0f};
172 for (i = 0; i < 3; i++) {
174 ivec[i] =
int(gridvec[i]);
175 dvec[i] = gridvec[i] - ivec[i];
178 for (i = 0; i < 8; i++) {
206 CLAMP(x, 0, size - 1);
207 CLAMP(y, 0, size - 1);
210 a = x + y * size +
z * size *
size;
211 weight = wx * wy * wz;
216 cageco = dco[inf->
vertex];
217 cageweight = weight * inf->
weight;
220 __m128 cageweight_r = _mm_set1_ps(cageweight);
224 __m128 cageco_r = _mm_loadu_ps(cageco);
225 co = _mm_add_ps(co, _mm_mul_ps(cageco_r, cageweight_r));
228 co[0] += cageweight * cageco[0];
229 co[1] += cageweight * cageco[1];
230 co[2] += cageweight * cageco[2];
232 totweight += cageweight;
262 const int defgrp_index = data->defgrp_index;
265 float(*__restrict dco)[3] = data->dco;
266 float(*vertexCos)[3] = data->vertexCos;
268 float weight, totweight, fac = 1.0f;
296 int start = offsets[iter];
297 int end = offsets[iter + 1];
299 for (
int a = start; a < end; a++) {
300 weight = influences[a].weight;
306 if (totweight > 0.0f) {
316 float (*vertexCos)[3],
324 float imat[4][4], cagemat[4][4], iobmat[4][4], icagemat[3][3], cmat[4][4];
325 float(*bindcagecos)[3];
326 int a, cage_verts_num, defgrp_index;
329 static int recursive_bind_sentinel = 0;
347 if (cagemesh ==
nullptr) {
354 mul_m4_m4m4(cagemat, imat, ob->object_to_world().ptr());
366 if (!recursive_bind_sentinel) {
367 recursive_bind_sentinel = 1;
368 mmd->
bindfunc(ob, mmd, cagemesh, (
float *)vertexCos, verts_num, cagemat);
369 recursive_bind_sentinel = 0;
384 ob, md,
"Cage vertices changed from %d to %d", mmd->
cage_verts_num, cage_verts_num);
402 for (a = 0; a < cage_verts_num; a++) {
415 data.dco =
reinterpret_cast<float(*)[3]
>(dco.
data());
416 data.defgrp_index = defgrp_index;
417 data.vertexCos = vertexCos;
418 data.cagemat = cagemat;
419 data.icagemat = icagemat;
424 settings.min_iter_per_thread = 16;
436 md, ctx, mesh,
reinterpret_cast<float(*)[3]
>(positions.data()), positions.size());
439#define MESHDEFORM_MIN_INFLUENCE 0.00001f
444 float weight, totweight;
445 int influences_num, verts_num, cage_verts_num, a,
b;
456 for (
b = 0;
b < verts_num;
b++) {
457 for (a = 0; a < cage_verts_num; a++) {
458 weight = weights[a +
b * cage_verts_num];
474 for (
b = 0;
b < verts_num;
b++) {
479 for (a = 0; a < cage_verts_num; a++) {
480 weight = weights[a +
b * cage_verts_num];
488 for (a = 0; a < cage_verts_num; a++) {
489 weight = weights[a +
b * cage_verts_num];
532 "OBJECT_OT_meshdeform_bind");
614 "MeshDeformModifierData",
616 &RNA_MeshDeformModifier,
void BKE_mesh_wrapper_vert_coords_copy(const Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
int BKE_mesh_wrapper_vert_len(const Mesh *mesh)
Mesh * BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval)
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_AcceptsCVs
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsVertexCosOnly
void(*)(void *user_data, Object *ob, ID **idpoin, int cb_flag) IDWalkFunc
void BKE_modifier_set_error(const Object *ob, ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
void mul_m3_v3(const float M[3][3], float r[3])
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void copy_m3_m4(float m1[3][3], 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])
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
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 void zero_v3(float r[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
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)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
void BLO_read_float3_array(BlendDataReader *reader, int array_size, float **ptr_p)
void BLO_write_float3_array(BlendWriter *writer, uint num, const float *data_ptr)
void BLO_write_int32_array(BlendWriter *writer, uint num, const int32_t *data_ptr)
void BLO_read_float_array(BlendDataReader *reader, int array_size, float **ptr_p)
void BLO_read_int32_array(BlendDataReader *reader, int array_size, int32_t **ptr_p)
#define BLO_write_struct_array(writer, struct_name, array_size, data_ptr)
#define BLO_read_struct_array(reader, struct_name, array_size, ptr_p)
bool BLO_write_is_undo(BlendWriter *writer)
#define BLO_write_struct_at_address(writer, struct_name, address, data_ptr)
bool DEG_is_active(const Depsgraph *depsgraph)
void DEG_add_depends_on_transform_relation(DepsNodeHandle *node_handle, const char *description)
void DEG_add_object_relation(DepsNodeHandle *node_handle, Object *object, eDepsObjectComponentType component, const char *description)
#define ID_IS_LINKED(_id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
@ eModifierFlag_OverrideLibrary_Local
@ eModifierType_MeshDeform
struct MeshDeformModifierData MeshDeformModifierData
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const char *vgroup_prop, const char *invert_vgroup_prop, const char *text)
void MOD_get_vgroup(const Object *ob, const Mesh *mesh, const char *name, const MDeformVert **dvert, int *defgrp_index)
void MOD_previous_vcos_store(ModifierData *md, const float(*vert_coords)[3])
void uiLayoutSetEnabled(uiLayout *layout, bool enabled)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
MutableSpan< T > as_mutable_span()
local_group_size(16, 16) .push_constant(Type b
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_calloc_arrayN)(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_dupallocN)(const void *vmemh)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)