Blender V4.3
extract_mesh_vbo_vnor.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2021 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "BLI_array_utils.hh"
10
11#include "extract_mesh.hh"
12
13namespace blender::draw {
14
17{
18 MutableSpan corners_data = vbo_data.take_front(mr.corners_num);
19 MutableSpan loose_edge_data = vbo_data.slice(mr.corners_num, mr.loose_edges.size() * 2);
20 MutableSpan loose_vert_data = vbo_data.take_back(mr.loose_verts.size());
21
22 const Span<float3> vert_normals = mr.mesh->vert_normals();
23
24 Array<GPUPackedNormal> converted(vert_normals.size());
25 convert_normals(vert_normals, converted.as_mutable_span());
26 array_utils::gather(converted.as_span(), mr.corner_verts, corners_data);
27 extract_mesh_loose_edge_data(converted.as_span(), mr.edges, mr.loose_edges, loose_edge_data);
28 array_utils::gather(converted.as_span(), mr.loose_verts, loose_vert_data);
29}
30
33{
34 const BMesh &bm = *mr.bm;
35 MutableSpan corners_data = vbo_data.take_front(mr.corners_num);
36 MutableSpan loose_edge_data = vbo_data.slice(mr.corners_num, mr.loose_edges.size() * 2);
37 MutableSpan loose_vert_data = vbo_data.take_back(mr.loose_verts.size());
38
39 threading::parallel_for(IndexRange(bm.totface), 2048, [&](const IndexRange range) {
40 for (const int face_index : range) {
41 const BMFace &face = *BM_face_at_index(&const_cast<BMesh &>(bm), face_index);
42 const BMLoop *loop = BM_FACE_FIRST_LOOP(&face);
43 for ([[maybe_unused]] const int i : IndexRange(face.len)) {
44 const int index = BM_elem_index_get(loop);
45 corners_data[index] = GPU_normal_convert_i10_v3(bm_vert_no_get(mr, loop->v));
46 loop = loop->next;
47 }
48 }
49 });
50
51 const Span<int> loose_edges = mr.loose_edges;
52 threading::parallel_for(loose_edges.index_range(), 4096, [&](const IndexRange range) {
53 for (const int i : range) {
54 const BMEdge &edge = *BM_edge_at_index(&const_cast<BMesh &>(bm), loose_edges[i]);
55 loose_edge_data[i * 2 + 0] = GPU_normal_convert_i10_v3(bm_vert_no_get(mr, edge.v1));
56 loose_edge_data[i * 2 + 1] = GPU_normal_convert_i10_v3(bm_vert_no_get(mr, edge.v2));
57 }
58 });
59
60 const Span<int> loose_verts = mr.loose_verts;
61 threading::parallel_for(loose_verts.index_range(), 2048, [&](const IndexRange range) {
62 for (const int i : range) {
63 const BMVert &vert = *BM_vert_at_index(&const_cast<BMesh &>(bm), loose_verts[i]);
64 loose_vert_data[i] = GPU_normal_convert_i10_v3(bm_vert_no_get(mr, &vert));
65 }
66 });
67}
68
70{
71 static GPUVertFormat format = {0};
72 if (format.attr_len == 0) {
74 }
75 const int size = mr.corners_num + mr.loose_indices_num;
77 GPU_vertbuf_data_alloc(vbo, size);
78 MutableSpan vbo_data = vbo.data<GPUPackedNormal>();
79
80 if (mr.extract_type == MR_EXTRACT_MESH) {
81 extract_vert_normals_mesh(mr, vbo_data);
82 }
83 else {
84 extract_vert_normals_bm(mr, vbo_data);
85 }
86}
87
88} // namespace blender::draw
#define GPU_vertbuf_init_with_format(verts, format)
void GPU_vertbuf_data_alloc(blender::gpu::VertBuf &verts, uint v_len)
@ GPU_FETCH_INT_TO_FLOAT_UNIT
uint GPU_vertformat_attr_add(GPUVertFormat *, const char *name, GPUVertCompType, uint comp_len, GPUVertFetchMode)
@ GPU_COMP_I10
ATTR_WARN_UNUSED_RESULT BMesh * bm
Span< T > as_span() const
Definition BLI_array.hh:232
MutableSpan< T > as_mutable_span()
Definition BLI_array.hh:237
constexpr MutableSpan slice(const int64_t start, const int64_t size) const
Definition BLI_span.hh:574
constexpr MutableSpan take_back(const int64_t n) const
Definition BLI_span.hh:641
constexpr MutableSpan take_front(const int64_t n) const
Definition BLI_span.hh:630
constexpr int64_t size() const
Definition BLI_span.hh:253
MutableSpan< T > data()
Extraction of Mesh data into VBO to feed to GPU.
format
void gather(const GVArray &src, const IndexMask &indices, GMutableSpan dst, int64_t grain_size=4096)
void convert_normals(Span< float3 > src, MutableSpan< GPUType > dst)
static void extract_vert_normals_bm(const MeshRenderData &mr, MutableSpan< GPUPackedNormal > vbo_data)
void extract_vert_normals(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_mesh_loose_edge_data(const Span< T > vert_data, const Span< int2 > edges, const Span< int > loose_edges, MutableSpan< T > gpu_data)
static void extract_vert_normals_mesh(const MeshRenderData &mr, MutableSpan< GPUPackedNormal > vbo_data)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
Definition BLI_task.hh:95
int totface