Blender V5.0
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
10
11#include "BLI_bounds.hh"
12#include "BLI_math_vector.h"
13#include "BLI_span.hh"
14
15#include "BKE_editmesh.hh"
16#include "BKE_editmesh_cache.hh" /* own include */
17
18using blender::float3;
19using blender::Span;
20
21/* -------------------------------------------------------------------- */
24
27{
28 if (emd.vert_positions.is_empty() || !emd.face_normals.is_empty()) {
29 return emd.face_normals;
30 }
31 BMesh *bm = em.bm;
32
33 emd.face_normals.reinitialize(bm->totface);
34
36 BMFace *efa;
37 BMIter fiter;
38 int i;
39 BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
40 BM_elem_index_set(efa, i); /* set_inline */
42 }
43 bm->elem_index_dirty &= ~BM_FACE;
44 return emd.face_normals;
45}
46
49{
50 if (emd.vert_positions.is_empty() || !emd.vert_normals.is_empty()) {
51 return emd.vert_normals;
52 }
53 BMesh *bm = em.bm;
54
55 /* Calculate vertex normals from face normals. */
56 const Span<float3> face_normals = BKE_editmesh_cache_ensure_face_normals(em, emd);
57
58 emd.vert_normals.reinitialize(bm->totvert);
59
62 return emd.vert_normals;
63}
64
67{
68 if (!emd.face_centers.is_empty()) {
69 return emd.face_centers;
70 }
71 BMesh *bm = em.bm;
72
73 emd.face_centers.reinitialize(bm->totface);
74
75 BMFace *efa;
76 BMIter fiter;
77 int i;
78 if (emd.vert_positions.is_empty()) {
79 BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
81 }
82 }
83 else {
85 BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
87 }
88 }
89 return emd.face_centers;
90}
91
93
94/* -------------------------------------------------------------------- */
97
98std::optional<blender::Bounds<blender::float3>> BKE_editmesh_cache_calc_minmax(
99 const BMEditMesh &em, const blender::bke::EditMeshData &emd)
100{
101 using namespace blender;
102 BMesh *bm = em.bm;
103 if (bm->totvert == 0) {
104 return std::nullopt;
105 }
106
107 if (emd.vert_positions.is_empty()) {
108 BMVert *eve;
109 BMIter iter;
110 float3 min(std::numeric_limits<float>::max());
111 float3 max(std::numeric_limits<float>::lowest());
112 BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
113 minmax_v3v3_v3(min, max, eve->co);
114 }
115 return Bounds<float3>{min, max};
116 }
117
118 return bounds::min_max(emd.vert_positions.as_span());
119}
120
void minmax_v3v3_v3(float min[3], float max[3], const float vec[3])
#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
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< 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)
std::optional< Bounds< T > > min_max(const std::optional< Bounds< T > > &a, const T &b)
Definition BLI_bounds.hh:55
VecBase< float, 3 > float3
#define min(a, b)
Definition sort.cc:36
float co[3]
i
Definition text_draw.cc:230
max
Definition text_draw.cc:251