41 float vec_u[3], vec_v[3];
50 const float zero_vec[3] = {0.0f};
79 for (
int i = 0; md && i <= cageIndex; i++, md = md->
next) {
124 const bool use_select)
130 const bool has_origcos = !origcos.
is_empty();
154 const float *co_prev, *co_curr, *co_next;
161 const float3 &vd_prev = mappedcos[vert_prev];
162 const float3 &vd_curr = mappedcos[vert];
163 const float3 &vd_next = mappedcos[vert_next];
166 co_prev = origcos[vert_prev];
167 co_curr = origcos[vert];
168 co_next = origcos[vert_next];
172 co_curr = l_iter->
v->
co;
180 }
while ((l_iter = l_iter->
next) != l_first);
191 BitVector<> vert_tag(mesh->verts_num);
195 const OffsetIndices<int> faces = mesh->faces();
196 const Span<int> corner_verts = mesh->corner_verts();
198 for (
const int i : faces.index_range()) {
201 for (
const int corner : face) {
202 const int vert = corner_verts[corner];
203 if (vert_tag[vert]) {
206 const int vert_prev = corner_verts[mesh::face_corner_prev(face, corner)];
207 const int vert_next = corner_verts[mesh::face_corner_next(face, corner)];
209 const float3 &vd_prev = mappedcos[vert_prev];
210 const float3 &vd_curr = mappedcos[vert];
211 const float3 &vd_next = mappedcos[vert_next];
213 const float3 &co_prev = positions[vert_prev];
214 const float3 &co_curr = positions[vert];
215 const float3 &co_next = positions[vert_next];
219 vert_tag[vert].set();
234 Mesh *mesh =
nullptr;
235 int i, modifiers_left_num = 0;
248 for (i = 0; md && i <= cageIndex; i++, md = md->
next) {
260 scene, md, &cd_mask_extra, required_mode);
261 cd_mask_extra = datamasks->
mask;
265 std::make_shared<BMEditMesh>(*em), &cd_mask_extra, me_input);
278 for (; md && i <= cageIndex; md = md->
next, i++) {
282 modifiers_left_num++;
290 return modifiers_left_num;
305 *object_crazy = blender::dna::shallow_copy(*object_eval);
306 object_crazy->
runtime = MEM_new<blender::bke::ObjectRuntime>(__func__, *object_eval->
runtime);
307 if (object_crazy->
runtime->data_orig !=
nullptr) {
308 object_crazy->
data = object_crazy->
runtime->data_orig;
334 Mesh *mesh_eval =
nullptr;
335 int modifiers_left_num = 0;
342 const bool has_multires = mmd !=
nullptr && mmd->sculptlvl > 0;
345 if (is_sculpt_mode && has_multires) {
348 return modifiers_left_num;
353 for (; md; md = md->
next) {
364 deformcos = mesh->vert_positions();
381 for (; md; md = md->
next) {
387 modifiers_left_num++;
391 if (mesh_eval !=
nullptr) {
395 return modifiers_left_num;
405 depsgraph, scene,
object, deformmats, deformcos);
412 Mesh *mesh_eval =
nullptr;
415 deformcos = mesh->vert_positions();
429 &virtual_modifier_data);
432 for (; md; md = md->next) {
446 if (mesh_eval ==
nullptr) {
450 mti->
deform_verts(md, &mectx, mesh_eval, deformedVerts);
455 quats =
static_cast<float(*)[4]
>(
MEM_mallocN(mesh->verts_num *
sizeof(*quats),
"crazy quats"));
459 for (i = 0; i < mesh->verts_num; i++) {
460 float qmat[3][3], tmat[3][3];
469 if (mesh_eval !=
nullptr) {
477 deformcos = mesh->vert_positions();
492 if (!object->runtime->crazyspace_deform_imats.is_empty() ||
493 !object->runtime->crazyspace_deform_cos.is_empty())
501 "Crazyspace transformation is only available for Mesh type of objects");
508 object->runtime->crazyspace_deform_imats,
509 object->runtime->crazyspace_deform_cos);
515 const float displacement[3],
516 float r_displacement_deformed[3])
518 if (vertex_index < 0 || vertex_index >= object->runtime->crazyspace_deform_imats.size()) {
521 "Invalid vertex index %d (expected to be within 0 to %d range)",
523 int(object->runtime->crazyspace_deform_imats.size()));
528 object->runtime->crazyspace_deform_imats[vertex_index].ptr(),
535 const float displacement_deformed[3],
536 float r_displacement[3])
538 if (vertex_index < 0 || vertex_index >= 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()));
548 if (!
invert_m3_m3(mat, object->runtime->crazyspace_deform_imats[vertex_index].ptr())) {
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) {
594 deformation.positions = *positions;
595 uses_extra_positions =
true;
599 deformation.deform_mats = *edit_hints->
deform_mats;
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) {
612 deformation.positions = curves_eval.
positions();
629 const int layer_index,
639 if (drawing_orig ==
nullptr) {
647 if (ob_eval ==
nullptr) {
651 if (geometry_eval ==
nullptr) {
660 if (edit_hints !=
nullptr && &edit_hints->grease_pencil_id_orig == &grease_pencil_orig &&
661 edit_hints->drawing_hints.has_value())
663 BLI_assert(edit_hints->drawing_hints->size() == layers_orig.
size());
665 edit_hints->drawing_hints.value()[layer_index];
677 if (
const GreasePencil *grease_pencil_eval = grease_pencil_component_eval->get()) {
679 if (layers_eval.
size() == layers_orig.
size()) {
683 if (drawing_eval->strokes().points_num() == drawing_orig->
strokes().
points_num()) {
684 deformation.positions = drawing_eval->strokes().positions();
696 const int layer_index,
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)
Object * DEG_get_evaluated_object(const Depsgraph *depsgraph, Object *object)
@ 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
void fill(const T &value) const
void reinitialize(const int64_t new_size)
constexpr int64_t size() const
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_
std::optional< Span< float3 > > positions() const
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)
void BKE_crazyspace_api_displacement_to_original(Object *object, ReportList *reports, int vertex_index, const float displacement_deformed[3], float r_displacement[3])
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])
void BKE_crazyspace_api_displacement_to_deformed(Object *object, ReportList *reports, int vertex_index, const float displacement[3], float r_displacement_deformed[3])
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)
const Depsgraph * depsgraph
draw_view in_light_buf[] float
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
GeometryDeformation get_evaluated_grease_pencil_drawing_deformation(const Object *ob_eval, const Object &ob_orig, int layer_index, int frame)
GeometryDeformation get_evaluated_curves_deformation(const Object *ob_eval, const Object &ob_orig)
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)
Frequency::GEOMETRY nor[]
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