Blender V4.3
editmesh_cache.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
11#include "MEM_guardedalloc.h"
12
13#include "BLI_bounds.hh"
14#include "BLI_math_vector.h"
15#include "BLI_span.hh"
16
17#include "BKE_editmesh.hh"
18#include "BKE_editmesh_cache.hh" /* own include */
19
20using blender::float3;
21using blender::Span;
22
23/* -------------------------------------------------------------------- */
29{
30 if (emd.vert_positions.is_empty() || !emd.face_normals.is_empty()) {
31 return emd.face_normals;
32 }
33 BMesh *bm = em.bm;
34
36
38 BMFace *efa;
39 BMIter fiter;
40 int i;
41 BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
42 BM_elem_index_set(efa, i); /* set_inline */
44 }
45 bm->elem_index_dirty &= ~BM_FACE;
46 return emd.face_normals;
47}
48
51{
52 if (emd.vert_positions.is_empty() || !emd.vert_normals.is_empty()) {
53 return emd.vert_normals;
54 }
55 BMesh *bm = em.bm;
56
57 /* Calculate vertex normals from face normals. */
58 const Span<float3> face_normals = BKE_editmesh_cache_ensure_face_normals(em, emd);
59
61
64 return emd.vert_normals;
65}
66
69{
70 if (!emd.face_centers.is_empty()) {
71 return emd.face_centers;
72 }
73 BMesh *bm = em.bm;
74
76
77 BMFace *efa;
78 BMIter fiter;
79 int i;
80 if (emd.vert_positions.is_empty()) {
81 BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
83 }
84 }
85 else {
87 BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
89 }
90 }
91 return emd.face_centers;
92}
93
96/* -------------------------------------------------------------------- */
100std::optional<blender::Bounds<blender::float3>> BKE_editmesh_cache_calc_minmax(
101 const BMEditMesh &em, const blender::bke::EditMeshData &emd)
102{
103 using namespace blender;
104 BMesh *bm = em.bm;
105 if (bm->totvert == 0) {
106 return std::nullopt;
107 }
108
109 if (emd.vert_positions.is_empty()) {
110 BMVert *eve;
111 BMIter iter;
112 float3 min(std::numeric_limits<float>::max());
113 float3 max(std::numeric_limits<float>::lowest());
114 BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
115 minmax_v3v3_v3(min, max, eve->co);
116 }
117 return Bounds<float3>{min, max};
118 }
119
120 return bounds::min_max(emd.vert_positions.as_span());
121}
122
void minmax_v3v3_v3(float min[3], float max[3], const float vec[3])
Read Guarded memory(de)allocation.
#define BM_elem_index_set(ele, index)
#define BM_ITER_MESH(ele, iter, bm, itype)
#define BM_ITER_MESH_INDEX(ele, iter, bm, itype, indexvar)
@ BM_VERTS_OF_MESH
@ BM_FACES_OF_MESH
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
void BM_verts_calc_normal_vcos(BMesh *bm, const Span< float3 > fnos, const Span< float3 > vcos, MutableSpan< float3 > vnos)
#define BM_FACE
#define BM_VERT
float BM_face_calc_normal_vcos(const BMesh *bm, const BMFace *f, float r_no[3], const Span< float3 > vertexCos)
void BM_face_calc_center_median_vcos(const BMesh *bm, const BMFace *f, float r_cent[3], const blender::Span< blender::float3 > vert_positions)
void BM_face_calc_center_median(const BMFace *f, float r_cent[3])
Span< T > as_span() const
Definition BLI_array.hh:232
void reinitialize(const int64_t new_size)
Definition BLI_array.hh:388
bool is_empty() const
Definition BLI_array.hh:253
Span< float3 > BKE_editmesh_cache_ensure_face_normals(BMEditMesh &em, blender::bke::EditMeshData &emd)
Span< float3 > BKE_editmesh_cache_ensure_vert_normals(BMEditMesh &em, blender::bke::EditMeshData &emd)
Span< float3 > BKE_editmesh_cache_ensure_face_centers(BMEditMesh &em, blender::bke::EditMeshData &emd)
std::optional< blender::Bounds< blender::float3 > > BKE_editmesh_cache_calc_minmax(const BMEditMesh &em, const blender::bke::EditMeshData &emd)
#define min(a, b)
Definition sort.c:32
float co[3]
int totvert
char elem_index_dirty
int totface
float max