Instead of keeping track of a local array of positions in the modifier stack itself, use the existing edit mode SoA "edit cache" which already contains a contiguous array of positions. Combined with positions as a generic attribute, this means the state is contained just in the mesh (and the geometry set) making the code much easier to follow. To do this we make more use of the mesh wrapper system, where we can pass a `Mesh` that's actually stored with a `BMesh` and the extra cached array of positions. This also resolves some confusion-- it was weird to have the mesh wrapper system for this purpose but not use it. Since we always created a wrapped mesh in edit mode, there's no need for `MOD_deform_mesh_eval_get` at all anymore. That function was quite confusing with "eval" in its name when it really retrieved the original mesh. Many deform modifiers had placeholder edit mode evaluation functions. Since these didn't do anything and since the priority is node-based deformation now, I removed these. The case is documented more in the modifier type struct callbacks. Pull Request: https://projects.blender.org/blender/blender/pulls/108637
57 lines
1.8 KiB
C
57 lines
1.8 KiB
C
/* SPDX-FileCopyrightText: 2023 Blender Foundation
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
#pragma once
|
|
|
|
/** \file
|
|
* \ingroup bke
|
|
*/
|
|
|
|
struct BMEditMesh;
|
|
struct CustomData_MeshMasks;
|
|
struct Mesh;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct Mesh *BKE_mesh_wrapper_from_editmesh(struct BMEditMesh *em,
|
|
const struct CustomData_MeshMasks *cd_mask_extra,
|
|
const struct Mesh *me_settings);
|
|
void BKE_mesh_wrapper_ensure_mdata(struct Mesh *me);
|
|
bool BKE_mesh_wrapper_minmax(const struct Mesh *me, float min[3], float max[3]);
|
|
|
|
int BKE_mesh_wrapper_vert_len(const struct Mesh *me);
|
|
int BKE_mesh_wrapper_edge_len(const struct Mesh *me);
|
|
int BKE_mesh_wrapper_loop_len(const struct Mesh *me);
|
|
int BKE_mesh_wrapper_poly_len(const struct Mesh *me);
|
|
|
|
/**
|
|
* Return a contiguous array of vertex position values, if available.
|
|
* Otherwise, vertex positions are stored in BMesh vertices.
|
|
*/
|
|
const float (*BKE_mesh_wrapper_vert_coords(const struct Mesh *mesh))[3];
|
|
|
|
|
|
/**
|
|
* Return a contiguous array of face normal values, if available.
|
|
* Otherwise, normals are stored in BMesh faces.
|
|
*/
|
|
const float (*BKE_mesh_wrapper_poly_normals(struct Mesh *mesh))[3];
|
|
|
|
void BKE_mesh_wrapper_tag_positions_changed(struct Mesh *mesh);
|
|
|
|
void BKE_mesh_wrapper_vert_coords_copy(const struct Mesh *me,
|
|
float (*vert_coords)[3],
|
|
int vert_coords_len);
|
|
void BKE_mesh_wrapper_vert_coords_copy_with_mat4(const struct Mesh *me,
|
|
float (*vert_coords)[3],
|
|
int vert_coords_len,
|
|
const float mat[4][4]);
|
|
|
|
struct Mesh *BKE_mesh_wrapper_ensure_subdivision(struct Mesh *me);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|