43 float vec_u[3], vec_v[3];
52 const float zero_vec[3] = {0.0f};
81 for (
int i = 0; md &&
i <= cageIndex;
i++, md = md->
next) {
126 const bool use_select)
132 const bool has_origcos = !origcos.
is_empty();
156 const float *co_prev, *co_curr, *co_next;
163 const float3 &vd_prev = mappedcos[vert_prev];
164 const float3 &vd_curr = mappedcos[vert];
165 const float3 &vd_next = mappedcos[vert_next];
168 co_prev = origcos[vert_prev];
169 co_curr = origcos[vert];
170 co_next = origcos[vert_next];
174 co_curr = l_iter->
v->
co;
182 }
while ((l_iter = l_iter->
next) != l_first);
200 for (
const int i :
faces.index_range()) {
203 for (
const int corner : face) {
204 const int vert = corner_verts[corner];
205 if (vert_tag[vert]) {
211 const float3 &vd_prev = mappedcos[vert_prev];
212 const float3 &vd_curr = mappedcos[vert];
213 const float3 &vd_next = mappedcos[vert_next];
215 const float3 &co_prev = positions[vert_prev];
216 const float3 &co_curr = positions[vert];
217 const float3 &co_next = positions[vert_next];
221 vert_tag[vert].set();
237 int i, modifiers_left_num = 0;
250 for (
i = 0; md &&
i <= cageIndex;
i++, md = md->
next) {
262 scene, md, &cd_mask_extra, required_mode);
263 cd_mask_extra = datamasks->
mask;
267 std::make_shared<BMEditMesh>(*em), &cd_mask_extra, me_input);
280 for (; md &&
i <= cageIndex; md = md->
next,
i++) {
284 modifiers_left_num++;
292 return modifiers_left_num;
307 *object_crazy = blender::dna::shallow_copy(*object_eval);
308 object_crazy->
runtime = MEM_new<blender::bke::ObjectRuntime>(__func__, *object_eval->
runtime);
309 if (object_crazy->
runtime->data_orig !=
nullptr) {
310 object_crazy->
data = object_crazy->
runtime->data_orig;
336 Mesh *mesh_eval =
nullptr;
337 int modifiers_left_num = 0;
344 const bool has_multires = mmd !=
nullptr && mmd->sculptlvl > 0;
347 if (is_sculpt_mode && has_multires) {
350 return modifiers_left_num;
355 for (; md; md = md->
next) {
366 deformcos =
mesh->vert_positions();
383 for (; md; md = md->
next) {
389 modifiers_left_num++;
393 if (mesh_eval !=
nullptr) {
397 return modifiers_left_num;
407 depsgraph, scene,
object, deformmats, deformcos);
414 Mesh *mesh_eval =
nullptr;
417 deformcos =
mesh->vert_positions();
430 &virtual_modifier_data);
433 for (; md; md = md->next) {
447 if (mesh_eval ==
nullptr) {
460 for (
i = 0;
i <
mesh->verts_num;
i++) {
461 float qmat[3][3], tmat[3][3];
470 if (mesh_eval !=
nullptr) {
478 deformcos =
mesh->vert_positions();
493 if (!
object->runtime->crazyspace_deform_imats.is_empty() ||
494 !
object->runtime->crazyspace_deform_cos.is_empty())
502 "Crazyspace transformation is only available for Mesh type of objects");
509 object->runtime->crazyspace_deform_imats,
510 object->runtime->crazyspace_deform_cos);
516 const float displacement[3],
517 float r_displacement_deformed[3])
519 if (vert < 0 || vert >=
object->runtime->crazyspace_deform_imats.size()) {
522 "Invalid vertex index %d (expected to be within 0 to %d range)",
524 int(
object->runtime->crazyspace_deform_imats.size()));
529 r_displacement_deformed,
object->runtime->crazyspace_deform_imats[vert].ptr(), displacement);
535 const float displacement_deformed[3],
536 float r_displacement[3])
538 if (vert < 0 || vert >=
object->runtime->crazyspace_deform_imats.size()) {
541 "Invalid vertex index %d (expected to be within 0 to %d range)",
543 int(
object->runtime->crazyspace_deform_imats.size()));
549 copy_v3_v3(r_displacement, displacement_deformed);
553 mul_v3_m3v3(r_displacement, mat, displacement_deformed);
558 object->runtime->crazyspace_deform_imats = {};
559 object->runtime->crazyspace_deform_cos = {};
571 const int points_num = curves_orig.
points_num();
577 if (ob_eval ==
nullptr) {
581 if (geometry_eval ==
nullptr) {
588 bool uses_extra_positions =
false;
589 if (edit_component_eval !=
nullptr) {
591 if (edit_hints !=
nullptr && &edit_hints->
curves_id_orig == &curves_id_orig) {
595 uses_extra_positions =
true;
605 if (!uses_extra_positions) {
607 if (curves_component_eval !=
nullptr) {
608 const Curves *curves_id_eval = curves_component_eval->
get();
609 if (curves_id_eval !=
nullptr) {
632 return &drawing_hint;
648 if (ob_eval ==
nullptr) {
652 if (geometry_eval ==
nullptr) {
661 if (edit_hints !=
nullptr && &edit_hints->grease_pencil_id_orig == &grease_pencil_orig &&
662 edit_hints->drawing_hints.has_value())
667 if (drawing_hints->positions()) {
668 deformation.
positions = *drawing_hints->positions();
670 if (drawing_hints->deform_mats.has_value()) {
671 deformation.
deform_mats = *drawing_hints->deform_mats;
Low-level operations for curves.
const CustomData_MeshMasks CD_MASK_BAREMESH
BMEditMesh * BKE_editmesh_from_object(Object *ob)
Return the BMEditMesh for a given object.
Low-level operations for grease pencil.
void BKE_id_free(Main *bmain, void *idv)
Mesh * BKE_mesh_copy_for_eval(const Mesh &source)
void BKE_mesh_wrapper_vert_coords_copy(const Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
Mesh * BKE_mesh_wrapper_from_editmesh(std::shared_ptr< BMEditMesh > em, const CustomData_MeshMasks *cd_mask_extra, const Mesh *me_settings)
void BKE_modifiers_clear_errors(Object *ob)
bool BKE_modifier_is_enabled(const Scene *scene, ModifierData *md, int required_mode)
int BKE_modifiers_get_cage_index(const Scene *scene, Object *ob, int *r_lastPossibleCageIndex, bool is_virtual)
const ModifierTypeInfo * BKE_modifier_get_info(ModifierType type)
CDMaskLink * BKE_modifier_calc_data_masks(const Scene *scene, ModifierData *md, CustomData_MeshMasks *final_datamask, int required_mode)
bool BKE_modifier_is_correctable_deformed(ModifierData *md)
ModifierData * BKE_modifiers_get_virtual_modifierlist(const Object *ob, VirtualModifierData *data)
MultiresModifierData * get_multires_modifier(Scene *scene, 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)
void BLI_linklist_free(LinkNode *list, LinkNodeFreeFP freefunc)
void copy_m3_m3(float m1[3][3], const float m2[3][3])
bool invert_m3_m3(float inverse[3][3], const float mat[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 quat_to_mat3(float m[3][3], const float q[4])
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])
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])
MINLINE float normalize_v3(float n[3])
#define BLI_SCOPED_DEFER(function_to_defer)
void DEG_id_tag_update(ID *id, unsigned int flags)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
@ 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
BPy_StructRNA * depsgraph
void fill(const T &value) const
void reinitialize(const int64_t new_size)
constexpr bool is_empty() const
const Curves * get() const
const Curves & curves_id_orig
std::optional< Span< float3 > > positions() const
std::optional< Array< float3x3 > > deform_mats
Span< float3 > positions() const
std::unique_ptr< GreasePencilEditHints > grease_pencil_edit_hints_
std::unique_ptr< CurvesEditHints > curves_edit_hints_
const greasepencil::Drawing * drawing_orig
std::optional< Array< GreasePencilDrawingEditHints > > drawing_hints
const bke::CurvesGeometry & strokes() const
blender::Array< blender::float3 > BKE_crazyspace_get_mapped_editverts(Depsgraph *depsgraph, Object *obedit)
void BKE_crazyspace_build_sculpt(Depsgraph *depsgraph, Scene *scene, Object *object, blender::Array< blender::float3x3, 0 > &deformmats, blender::Array< blender::float3, 0 > &deformcos)
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])
int BKE_crazyspace_get_first_deform_matrices_editbmesh(Depsgraph *depsgraph, Scene *scene, Object *ob, BMEditMesh *em, blender::Array< blender::float3x3, 0 > &deformmats, blender::Array< blender::float3, 0 > &deformcos)
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_api_eval(Depsgraph *depsgraph, Scene *scene, Object *object, ReportList *reports)
static bool crazyspace_modifier_supports_deform(ModifierData *md)
static bool modifiers_disable_subsurf_temporary(Object *ob, const int cageIndex)
void BKE_crazyspace_set_quats_editmesh(BMEditMesh *em, const blender::Span< blender::float3 > origcos, const blender::Span< blender::float3 > mappedcos, float(*quats)[4], const bool use_select)
void BKE_crazyspace_api_eval_clear(Object *object)
static void crazyspace_init_object_for_eval(Depsgraph *depsgraph, Object *object, Object *object_crazy)
void BKE_crazyspace_set_quats_mesh(Mesh *mesh, const blender::Span< blender::float3 > origcos, const blender::Span< blender::float3 > mappedcos, float(*quats)[4])
static bool crazyspace_modifier_supports_deform_matrices(ModifierData *md)
int BKE_sculpt_get_first_deform_matrices(Depsgraph *depsgraph, Scene *scene, Object *object, blender::Array< blender::float3x3, 0 > &deformmats, blender::Array< blender::float3, 0 > &deformcos)
void BKE_crazyspace_api_displacement_to_original(Object *object, ReportList *reports, int vert, const float displacement_deformed[3], float r_displacement[3])
void BKE_crazyspace_api_displacement_to_deformed(Object *object, ReportList *reports, int vert, const float displacement[3], float r_displacement_deformed[3])
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
GeometryDeformation get_evaluated_grease_pencil_drawing_deformation(const Object *ob_eval, const Object &ob_orig, const bke::greasepencil::Drawing &drawing_orig)
GeometryDeformation get_evaluated_curves_deformation(const Object *ob_eval, const Object &ob_orig)
static const GreasePencilDrawingEditHints * get_drawing_edit_hint_for_original_drawing(const GreasePencilEditHints *edit_hints, const bke::greasepencil::Drawing &drawing_orig)
int face_corner_prev(const IndexRange face, const int corner)
int face_corner_next(const IndexRange face, const int corner)
Mesh * editbmesh_get_eval_cage(Depsgraph *depsgraph, const Scene *scene, Object *obedit, BMEditMesh *em, const CustomData_MeshMasks *dataMask)
bool editbmesh_modifier_is_enabled(const Scene *scene, const Object *ob, ModifierData *md, bool has_prev_mesh)
void mesh_data_update(Depsgraph &depsgraph, const Scene &scene, Object &ob, const CustomData_MeshMasks &dataMask)
void mesh_get_mapped_verts_coords(Mesh *mesh_eval, MutableSpan< float3 > r_cos)
CustomData_MeshMasks mask
struct ModifierData * next
void(* deform_verts)(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
void(* deform_matrices_EM)(ModifierData *md, const ModifierEvalContext *ctx, const BMEditMesh *em, Mesh *mesh, blender::MutableSpan< blender::float3 > positions, blender::MutableSpan< blender::float3x3 > matrices)
void(* deform_matrices)(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions, blender::MutableSpan< blender::float3x3 > matrices)
ObjectRuntimeHandle * runtime
static MatBase identity()
bool has(const GeometryComponent::Type component_type) const
const GeometryComponent * get_component(GeometryComponent::Type component_type) const