35#include "RNA_prototypes.hh"
140 if (mmd->
object !=
nullptr) {
152 float gridvec[3], dvec[3], ivec[3], wx, wy, wz;
153 float weight, cageweight, totweight, *cageco;
156 __m128 co = _mm_setzero_ps();
158 float co[3] = {0.0f, 0.0f, 0.0f};
164 for (
i = 0;
i < 3;
i++) {
166 ivec[
i] = int(gridvec[
i]);
167 dvec[
i] = gridvec[
i] - ivec[
i];
170 for (
i = 0;
i < 8;
i++) {
203 weight = wx * wy * wz;
208 cageco = dco[inf->
vertex];
209 cageweight = weight * inf->
weight;
212 __m128 cageweight_r = _mm_set1_ps(cageweight);
216 __m128 cageco_r = _mm_loadu_ps(cageco);
217 co = _mm_add_ps(co, _mm_mul_ps(cageco_r, cageweight_r));
220 co[0] += cageweight * cageco[0];
221 co[1] += cageweight * cageco[1];
222 co[2] += cageweight * cageco[2];
224 totweight += cageweight;
254 const int defgrp_index =
data->defgrp_index;
260 float weight, totweight, fac = 1.0f;
288 int start = offsets[iter];
289 int end = offsets[iter + 1];
291 for (
int a = start; a < end; a++) {
292 weight = influences[a].weight;
298 if (totweight > 0.0f) {
308 float (*vertexCos)[3],
316 float imat[4][4], cagemat[4][4], iobmat[4][4], icagemat[3][3], cmat[4][4];
317 const float (*bindcagecos)[3];
318 int a, cage_verts_num, defgrp_index;
321 static int recursive_bind_sentinel = 0;
339 if (cagemesh ==
nullptr) {
346 mul_m4_m4m4(cagemat, imat, ob->object_to_world().ptr());
358 if (!recursive_bind_sentinel) {
359 recursive_bind_sentinel = 1;
360 mmd->
bindfunc(ob, mmd, cagemesh, (
float *)vertexCos, verts_num, cagemat);
361 recursive_bind_sentinel = 0;
376 ob, md,
"Cage vertices changed from %d to %d", mmd->
cage_verts_num, cage_verts_num);
394 for (a = 0; a < cage_verts_num; a++) {
407 data.dco =
reinterpret_cast<float (*)[3]
>(dco.
data());
408 data.defgrp_index = defgrp_index;
409 data.vertexCos = vertexCos;
410 data.cagemat = cagemat;
411 data.icagemat = icagemat;
428 md, ctx, mesh,
reinterpret_cast<float (*)[3]
>(positions.
data()), positions.
size());
431#define MESHDEFORM_MIN_INFLUENCE 0.00001f
437 float weight, totweight;
438 int influences_num, verts_num, cage_verts_num, a,
b;
449 for (
b = 0;
b < verts_num;
b++) {
450 for (a = 0; a < cage_verts_num; a++) {
451 weight = weights[a +
b * cage_verts_num];
468 for (
b = 0;
b < verts_num;
b++) {
473 for (a = 0; a < cage_verts_num; a++) {
474 weight = weights[a +
b * cage_verts_num];
482 for (a = 0; a < cage_verts_num; a++) {
483 weight = weights[a +
b * cage_verts_num];
513 col->enabled_set(!is_bound);
519 col->enabled_set(!is_bound);
523 layout->
op(
"OBJECT_OT_meshdeform_bind", is_bound ?
IFACE_(
"Unbind") :
IFACE_(
"Bind"), ICON_NONE);
571 BLO_write_struct_array(
572 writer, MDefInfluence, mmd.influences_num, mmd.bindinfluences);
582 [&]() { BLO_write_int32_array(writer, mmd.verts_num + 1, mmd.bindoffsets); });
592 [&]() { BLO_write_float3_array(writer, mmd.cage_verts_num, mmd.bindcagecos); });
595 BLO_write_struct_array(writer, MDefCell, size * size * size, mmd.dyngrid);
602 BLO_write_struct_array(
603 writer, MDefInfluence, mmd.influences_num, mmd.dyninfluences);
609 [&]() { BLO_write_int32_array(writer, mmd.verts_num, mmd.dynverts); });
621 BLO_read_struct_array(reader, MDefInfluence, mmd->influences_num, &mmd->bindinfluences);
622 return blender::implicit_sharing::info_for_mem_free(mmd->bindinfluences);
631 BLO_read_int32_array(reader, mmd->verts_num + 1, &mmd->bindoffsets);
632 return blender::implicit_sharing::info_for_mem_free(mmd->bindoffsets);
639 BLO_read_float3_array(reader, mmd->cage_verts_num, &mmd->bindcagecos);
640 return blender::implicit_sharing::info_for_mem_free(mmd->bindcagecos);
645 BLO_read_struct_array(reader, MDefCell, size * size * size, &mmd->dyngrid);
646 return blender::implicit_sharing::info_for_mem_free(mmd->dyngrid);
651 BLO_read_struct_array(reader, MDefInfluence, mmd->influences_num, &mmd->dyninfluences);
652 return blender::implicit_sharing::info_for_mem_free(mmd->dyninfluences);
657 BLO_read_int32_array(reader, mmd->verts_num, &mmd->dynverts);
658 return blender::implicit_sharing::info_for_mem_free(mmd->dynverts);
670 "MeshDeformModifierData",
672 &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)
void(*)(void *user_data, Object *ob, ID **idpoin, LibraryForeachIDCallbackFlag cb_flag) IDWalkFunc
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 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, int64_t array_size, float **ptr_p)
void BLO_read_float_array(BlendDataReader *reader, int64_t array_size, float **ptr_p)
bool BLO_write_is_undo(BlendWriter *writer)
void BLO_write_shared(BlendWriter *writer, const void *data, size_t approximate_size_in_bytes, const blender::ImplicitSharingInfo *sharing_info, blender::FunctionRef< void()> write_fn)
const blender::ImplicitSharingInfo * BLO_read_shared(BlendDataReader *reader, T **data_ptr, blender::FunctionRef< const blender::ImplicitSharingInfo *()> read_fn)
#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
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
static void init_data(ModifierData *md)
static void deform_verts(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
static void panel_register(ARegionType *region_type)
static void required_data_mask(ModifierData *, CustomData_MeshMasks *r_cddata_masks)
static void blend_read(BlendDataReader *, ModifierData *md)
static void panel_draw(const bContext *, Panel *panel)
static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
static void free_data(ModifierData *md)
static void blend_write(BlendWriter *writer, const ID *, const ModifierData *md)
void modifier_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const StringRefNull vgroup_prop, const std::optional< StringRefNull > invert_vgroup_prop, const std::optional< StringRefNull > text)
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_error_message_draw(uiLayout *layout, PointerRNA *ptr)
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])
BMesh const char void * data
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
MutableSpan< T > as_mutable_span()
constexpr int64_t size() const
constexpr T * data() const
static void update_depsgraph(tGraphSliderOp *gso)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
#define MESHDEFORM_MIN_INFLUENCE
void copy_shared_pointer(T *src_ptr, const ImplicitSharingInfo *src_sharing_info, T **r_dst_ptr, const ImplicitSharingInfo **r_dst_sharing_info)
const ImplicitSharingInfo * info_for_mem_free(void *data)
void free_shared_data(T **data, const ImplicitSharingInfo **sharing_info)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
uiLayout & column(bool align)
PointerRNA op(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, blender::wm::OpCallContext context, eUI_Item_Flag flag)
void use_property_split_set(bool value)