40 float vec_u[3], vec_v[3];
49 const float zero_vec[3] = {0.0f};
75 bool disabled =
false;
79 for (
int i = 0; md && i <= cageIndex; i++, md = md->
next) {
94 Mesh *mesh_eval =
static_cast<Mesh *
>(obedit_eval->
data);
107 const int nverts = editmesh_eval->
bm->
totvert;
108 float(*vertexcos)[3] =
static_cast<float(*)[3]
>(
109 MEM_mallocN(
sizeof(*vertexcos) * nverts,
"vertexcos map"));
120 float (*mappedcos)[3],
122 const bool use_select)
149 const float *co_prev, *co_curr, *co_next;
150 const float *vd_prev, *vd_curr, *vd_next;
157 vd_prev = mappedcos[i_prev];
158 vd_curr = mappedcos[i_curr];
159 vd_next = mappedcos[i_next];
162 co_prev = origcos[i_prev];
163 co_curr = origcos[i_curr];
164 co_next = origcos[i_next];
168 co_curr = l_iter->
v->
co;
176 }
while ((l_iter = l_iter->
next) != l_first);
182 float (*mappedcos)[3],
192 for (
int i = 0; i < me->
totpoly; i++, mp++) {
197 for (
int j = 0; j < mp->
totloop; j++) {
199 const float *co_prev, *co_curr, *co_next;
200 const float *vd_prev, *vd_curr, *vd_next;
203 vd_prev = mappedcos[ml_prev->
v];
204 vd_curr = mappedcos[ml_curr->
v];
205 vd_next = mappedcos[ml_next->
v];
208 co_prev = origcos[ml_prev->
v];
209 co_curr = origcos[ml_curr->
v];
210 co_next = origcos[ml_next->
v];
213 co_prev = mvert[ml_prev->
v].
co;
214 co_curr = mvert[ml_curr->
v].
co;
215 co_next = mvert[ml_next->
v].
co;
219 quats[ml_curr->
v], co_curr, co_next, co_prev, vd_curr, vd_next, vd_prev);
237 float (**deformmats)[3][3],
238 float (**deformcos)[3])
243 int i,
a, modifiers_left_num = 0, verts_num = 0;
245 float(*defmats)[3][3] =
nullptr, (*deformedVerts)[3] =
nullptr;
256 for (i = 0; md && i <= cageIndex; i++, md = md->
next) {
268 scene, ob, md, &cd_mask_extra, required_mode,
nullptr,
nullptr);
269 cd_mask_extra = datamasks->
mask;
274 defmats =
static_cast<float(*)[3][3]
>(
275 MEM_mallocN(
sizeof(*defmats) * verts_num,
"defmats"));
277 for (
a = 0;
a < verts_num;
a++) {
281 mti->
deformMatricesEM(md, &mectx, em, me, deformedVerts, defmats, verts_num);
288 for (; md && i <= cageIndex; md = md->
next, i++) {
291 modifiers_left_num++;
299 *deformmats = defmats;
300 *deformcos = deformedVerts;
302 return modifiers_left_num;
317 *object_crazy = blender::dna::shallow_copy(*object_eval);
324 float (**deformmats)[3][3],
325 float (**deformcos)[3])
329 *deformmats =
static_cast<float(*)[3][3]
>(
330 MEM_callocN(
sizeof(**deformmats) * verts_num,
"defmats"));
331 for (
int a = 0;
a < verts_num;
a++) {
355 float (**deformmats)[3][3],
356 float (**deformcos)[3])
359 Mesh *me_eval =
nullptr;
360 float(*defmats)[3][3] =
nullptr, (*deformedVerts)[3] =
nullptr;
361 int modifiers_left_num = 0;
367 const bool has_multires = mmd !=
nullptr && mmd->
sculptlvl > 0;
370 if (is_sculpt_mode && has_multires) {
371 *deformmats =
nullptr;
372 *deformcos =
nullptr;
373 return modifiers_left_num;
378 for (; md; md = md->
next) {
385 if (defmats ==
nullptr) {
404 for (; md; md = md->
next) {
410 modifiers_left_num++;
414 if (me_eval !=
nullptr) {
418 *deformmats = defmats;
419 *deformcos = deformedVerts;
421 return modifiers_left_num;
427 float (**deformmats)[3][3],
428 float (**deformcos)[3])
438 Mesh *mesh_eval =
nullptr;
440 if (*deformcos ==
nullptr) {
444 float(*deformedVerts)[3] = *deformcos;
454 for (; md; md = md->
next) {
468 if (mesh_eval ==
nullptr) {
472 mti->
deformVerts(md, &mectx, mesh_eval, deformedVerts, mesh_eval->totvert);
482 float qmat[3][3], tmat[3][3];
492 if (mesh_eval !=
nullptr) {
497 if (*deformmats ==
nullptr) {
502 *deformmats =
static_cast<float(*)[3][3]
>(
503 MEM_callocN(
sizeof(*(*deformmats)) * verts_num,
"defmats"));
505 for (
a = 0;
a < verts_num;
a++) {
528 "Crazyspace transformation is only available for Mesh type of objects");
544 float displacement[3],
545 float r_displacement_deformed[3])
550 "Invalid vertex index %d (expected to be within 0 to %d range)",
564 float displacement_deformed[3],
565 float r_displacement[3])
570 "Invalid vertex index %d (expected to be within 0 to %d range))",
578 copy_v3_v3(r_displacement, displacement_deformed);
582 mul_v3_m3v3(r_displacement, mat, displacement_deformed);
601 const int points_num = curves_orig.
points_num();
608 if (ob_eval ==
nullptr) {
612 if (geometry_eval ==
nullptr) {
619 bool uses_extra_positions =
false;
620 if (edit_component_eval !=
nullptr) {
622 if (edit_hints !=
nullptr && &edit_hints->
curves_id_orig == &curves_id_orig) {
626 uses_extra_positions =
true;
636 if (!uses_extra_positions) {
639 if (curves_component_eval !=
nullptr) {
641 if (curves_id_eval !=
nullptr) {
typedef float(TangentPoint)[2]
bool editbmesh_modifier_is_enabled(const struct Scene *scene, const struct Object *ob, struct ModifierData *md, bool has_prev_mesh)
struct Mesh * editbmesh_get_eval_cage_from_orig(struct Depsgraph *depsgraph, const struct Scene *scene, struct Object *obedit, const struct CustomData_MeshMasks *dataMask)
void mesh_get_mapped_verts_coords(struct Mesh *me_eval, float(*r_cos)[3], int totcos)
void makeDerivedMesh(struct Depsgraph *depsgraph, const struct Scene *scene, struct Object *ob, const struct CustomData_MeshMasks *dataMask)
float(* editbmesh_vert_coords_alloc(struct BMEditMesh *em, int *r_vert_len))[3]
Low-level operations for curves.
const CustomData_MeshMasks CD_MASK_BAREMESH
void BKE_id_free(struct Main *bmain, void *idv)
struct Mesh * BKE_mesh_copy_for_eval(const struct Mesh *source, bool reference)
float(* BKE_mesh_vert_coords_alloc(const struct Mesh *mesh, int *r_vert_len))[3]
struct Mesh * BKE_mesh_wrapper_from_editmesh_with_coords(struct BMEditMesh *em, const struct CustomData_MeshMasks *cd_mask_extra, const float(*vert_coords)[3], const struct Mesh *me_settings)
const ModifierTypeInfo * BKE_modifier_get_info(ModifierType type)
bool BKE_modifier_is_enabled(const struct Scene *scene, struct ModifierData *md, int required_mode)
struct ModifierData * BKE_modifiers_get_virtual_modifierlist(const struct Object *ob, struct VirtualModifierData *data)
@ eModifierTypeType_OnlyDeform
bool BKE_modifier_is_correctable_deformed(struct ModifierData *md)
void BKE_modifiers_clear_errors(struct Object *ob)
struct CDMaskLink * BKE_modifier_calc_data_masks(const struct Scene *scene, struct Object *ob, struct ModifierData *md, struct CustomData_MeshMasks *final_datamask, int required_mode, ModifierData *previewmd, const struct CustomData_MeshMasks *previewmask)
int BKE_modifiers_get_cage_index(const struct Scene *scene, struct Object *ob, int *r_lastPossibleCageIndex, bool is_virtual)
struct MultiresModifierData * get_multires_modifier(struct Scene *scene, struct Object *ob, bool use_first)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
#define BLI_BITMAP_NEW(_num, _alloc_string)
#define BLI_BITMAP_TEST(_bitmap, _index)
#define BLI_BITMAP_ENABLE(_bitmap, _index)
void BLI_linklist_free(LinkNode *list, LinkNodeFreeFP freefunc)
void copy_m3_m3(float m1[3][3], const float m2[3][3])
void unit_m3(float m[3][3])
bool invert_m3_m3(float R[3][3], const float A[3][3])
void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3])
void mul_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3])
void sub_qt_qtqt(float q[4], const float a[4], const float b[4])
void tri_to_quat_ex(float quat[4], const float v1[3], const float v2[3], const float v3[3], const float no_orig[3])
void quat_to_mat3(float mat[3][3], const float q[4])
MINLINE float normalize_v3(float r[3])
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
struct Depsgraph Depsgraph
struct Scene * DEG_get_input_scene(const Depsgraph *graph)
struct Object * DEG_get_evaluated_object(const struct Depsgraph *depsgraph, struct Object *object)
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
@ eModifierMode_DisableTemporary
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
#define BM_FACE_FIRST_LOOP(p)
#define BM_elem_index_get(ele)
#define BM_elem_flag_disable(ele, hflag)
#define BM_elem_index_set(ele, index)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
#define BM_ITER_MESH(ele, iter, bm, itype)
#define BM_ITER_MESH_INDEX(ele, iter, bm, itype, indexvar)
ATTR_WARN_UNUSED_RESULT const BMVert * v
const Curves * get_for_read() const
std::unique_ptr< blender::bke::CurvesEditHints > curves_edit_hints_
const Curves & curves_id_orig
std::optional< Array< float3 > > positions
std::optional< Array< float3x3 > > deform_mats
static CurvesGeometry & wrap(::CurvesGeometry &dna_struct)
Span< float3 > positions() const
int BKE_crazyspace_get_first_deform_matrices_editbmesh(struct Depsgraph *depsgraph, Scene *scene, Object *ob, BMEditMesh *em, float(**deformmats)[3][3], float(**deformcos)[3])
static bool modifiers_disable_subsurf_temporary(struct Scene *scene, Object *ob)
int BKE_sculpt_get_first_deform_matrices(struct Depsgraph *depsgraph, Scene *scene, Object *object, float(**deformmats)[3][3], float(**deformcos)[3])
BLI_INLINE void tan_calc_quat_v3(float r_quat[4], const float co_1[3], const float co_2[3], const float co_3[3])
float(* BKE_crazyspace_get_mapped_editverts(struct Depsgraph *depsgraph, Object *obedit))[3]
void BKE_crazyspace_api_displacement_to_original(struct Object *object, struct ReportList *reports, int vertex_index, float displacement_deformed[3], float r_displacement[3])
void BKE_crazyspace_api_displacement_to_deformed(struct Object *object, struct ReportList *reports, int vertex_index, float displacement[3], float r_displacement_deformed[3])
void BKE_crazyspace_api_eval(Depsgraph *depsgraph, Scene *scene, Object *object, struct ReportList *reports)
static void set_crazy_vertex_quat(float r_quat[4], const float co_1[3], const float co_2[3], const float co_3[3], const float vd_1[3], const float vd_2[3], const float vd_3[3])
void BKE_crazyspace_build_sculpt(struct Depsgraph *depsgraph, Scene *scene, Object *object, float(**deformmats)[3][3], float(**deformcos)[3])
static bool crazyspace_modifier_supports_deform(ModifierData *md)
void BKE_crazyspace_set_quats_mesh(Mesh *me, float(*origcos)[3], float(*mappedcos)[3], float(*quats)[4])
void BKE_crazyspace_set_quats_editmesh(BMEditMesh *em, float(*origcos)[3], float(*mappedcos)[3], float(*quats)[4], const bool use_select)
void BKE_crazyspace_api_eval_clear(Object *object)
static void crazyspace_init_verts_and_matrices(const Mesh *mesh, float(**deformmats)[3][3], float(**deformcos)[3])
static void crazyspace_init_object_for_eval(struct Depsgraph *depsgraph, Object *object, Object *object_crazy)
static bool crazyspace_modifier_supports_deform_matrices(ModifierData *md)
const Depsgraph * depsgraph
void(* MEM_freeN)(void *vmemh)
void *(* MEM_dupallocN)(const void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
GeometryDeformation get_evaluated_curves_deformation(const Depsgraph &depsgraph, const Object &ob_orig)
struct CustomData_MeshMasks mask
const GeometryComponent * get_component_for_read(GeometryComponentType component_type) const
struct BMEditMesh * edit_mesh
struct ModifierData * next
void(* deformVerts)(struct ModifierData *md, const struct ModifierEvalContext *ctx, struct Mesh *mesh, float(*vertexCos)[3], int numVerts)
void(* deformMatrices)(struct ModifierData *md, const struct ModifierEvalContext *ctx, struct Mesh *mesh, float(*vertexCos)[3], float(*defMats)[3][3], int numVerts)
void(* deformMatricesEM)(struct ModifierData *md, const struct ModifierEvalContext *ctx, struct BMEditMesh *editData, struct Mesh *mesh, float(*vertexCos)[3], float(*defMats)[3][3], int numVerts)
float(* crazyspace_deform_imats)[3][3]
float(* crazyspace_deform_cos)[3]
struct GeometrySet * geometry_set_eval