Blender V5.0
draw_cache_extract.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2019 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include "BLI_array.hh"
12#include "BLI_map.hh"
14#include "BLI_utildefines.h"
15
16#include "DNA_view3d_enums.h"
17
18#include "GPU_index_buffer.hh"
19#include "GPU_shader.hh"
20#include "GPU_vertex_buffer.hh"
21
22#include "draw_attributes.hh"
23
24namespace blender::gpu {
25class Batch;
26class IndexBuf;
27} // namespace blender::gpu
28struct Mesh;
29struct Object;
30struct Scene;
31struct TaskGraph;
32struct ToolSettings;
33
34namespace blender::draw {
35
36struct MeshRenderData;
37struct DRWSubdivCache;
38
39/* Vertex Group Selection and display options */
43
44 short flags;
46
47 /* Set of all selected bones for Multi-paint. */
48 bool *defgroup_sel; /* #defgroup_len */
50
51 /* Set of all locked and unlocked deform bones for Lock Relative mode. */
52 bool *defgroup_locked; /* #defgroup_len */
53 bool *defgroup_unlocked; /* #defgroup_len */
54};
55
56/* DRW_MeshWeightState.flags */
57enum {
61};
62
114
138
140 /* Though using maps here may add some overhead compared to just indexed arrays, it's a bit more
141 * convenient currently, because the "buffer exists" test is very clear, it's just whether the
142 * map contains it (e.g. compared to "buffer is allocated but not filled with data"). The
143 * sparseness *may* be useful for reducing memory usage when only few buffers are used. */
144
147};
148
150 /* Surfaces / Render */
151 gpu::Batch *surface;
152 gpu::Batch *surface_weights;
153 /* Edit mode */
154 gpu::Batch *edit_triangles;
155 gpu::Batch *edit_vertices;
156 gpu::Batch *edit_edges;
157 gpu::Batch *edit_vnor;
158 gpu::Batch *edit_lnor;
159 gpu::Batch *edit_fdots;
161 gpu::Batch *edit_skin_roots;
162 /* Edit UVs */
165 gpu::Batch *edituv_faces;
166 gpu::Batch *edituv_edges;
167 gpu::Batch *edituv_verts;
168 gpu::Batch *edituv_fdots;
169 /* Edit selection */
174 /* Common display / Other */
175 gpu::Batch *uv_faces;
176 gpu::Batch *all_verts;
177 gpu::Batch *all_edges;
178 gpu::Batch *loose_edges;
179 gpu::Batch *edge_detection;
180 /* Individual edges with face normals. */
181 gpu::Batch *wire_edges;
182 /* Loops around faces. no edges between selected faces */
185 gpu::Batch *wire_loops_uvs;
187 gpu::Batch *sculpt_overlays;
191};
192
193#define MBC_BATCH_LEN (sizeof(MeshBatchList) / sizeof(void *))
194
195#define MBC_BATCH_INDEX(batch) (offsetof(MeshBatchList, batch) / sizeof(void *))
196
198 MBC_SURFACE = (1u << MBC_BATCH_INDEX(surface)),
199 MBC_SURFACE_WEIGHTS = (1u << MBC_BATCH_INDEX(surface_weights)),
200 MBC_EDIT_TRIANGLES = (1u << MBC_BATCH_INDEX(edit_triangles)),
201 MBC_EDIT_VERTICES = (1u << MBC_BATCH_INDEX(edit_vertices)),
202 MBC_EDIT_EDGES = (1u << MBC_BATCH_INDEX(edit_edges)),
203 MBC_EDIT_VNOR = (1u << MBC_BATCH_INDEX(edit_vnor)),
204 MBC_EDIT_LNOR = (1u << MBC_BATCH_INDEX(edit_lnor)),
205 MBC_EDIT_FACEDOTS = (1u << MBC_BATCH_INDEX(edit_fdots)),
206 MBC_EDIT_MESH_ANALYSIS = (1u << MBC_BATCH_INDEX(edit_mesh_analysis)),
207 MBC_SKIN_ROOTS = (1u << MBC_BATCH_INDEX(edit_skin_roots)),
208 MBC_UV_FACES = (1u << MBC_BATCH_INDEX(uv_faces)),
209 MBC_EDITUV_FACES_STRETCH_AREA = (1u << MBC_BATCH_INDEX(edituv_faces_stretch_area)),
210 MBC_EDITUV_FACES_STRETCH_ANGLE = (1u << MBC_BATCH_INDEX(edituv_faces_stretch_angle)),
211 MBC_EDITUV_FACES = (1u << MBC_BATCH_INDEX(edituv_faces)),
212 MBC_EDITUV_EDGES = (1u << MBC_BATCH_INDEX(edituv_edges)),
213 MBC_EDITUV_VERTS = (1u << MBC_BATCH_INDEX(edituv_verts)),
214 MBC_EDITUV_FACEDOTS = (1u << MBC_BATCH_INDEX(edituv_fdots)),
215 MBC_EDIT_SELECTION_VERTS = (1u << MBC_BATCH_INDEX(edit_selection_verts)),
216 MBC_EDIT_SELECTION_EDGES = (1u << MBC_BATCH_INDEX(edit_selection_edges)),
217 MBC_EDIT_SELECTION_FACES = (1u << MBC_BATCH_INDEX(edit_selection_faces)),
218 MBC_EDIT_SELECTION_FACEDOTS = (1u << MBC_BATCH_INDEX(edit_selection_fdots)),
219 MBC_ALL_VERTS = (1u << MBC_BATCH_INDEX(all_verts)),
220 MBC_ALL_EDGES = (1u << MBC_BATCH_INDEX(all_edges)),
221 MBC_LOOSE_EDGES = (1u << MBC_BATCH_INDEX(loose_edges)),
222 MBC_EDGE_DETECTION = (1u << MBC_BATCH_INDEX(edge_detection)),
223 MBC_WIRE_EDGES = (1u << MBC_BATCH_INDEX(wire_edges)),
224 MBC_PAINT_OVERLAY_WIRE_LOOPS = (1u << MBC_BATCH_INDEX(paint_overlay_wire_loops)),
225 MBC_WIRE_LOOPS_ALL_UVS = (1u << MBC_BATCH_INDEX(wire_loops_all_uvs)),
226 MBC_WIRE_LOOPS_UVS = (1u << MBC_BATCH_INDEX(wire_loops_uvs)),
227 MBC_WIRE_LOOPS_EDITUVS = (1u << MBC_BATCH_INDEX(wire_loops_edituvs)),
228 MBC_SCULPT_OVERLAYS = (1u << MBC_BATCH_INDEX(sculpt_overlays)),
229 MBC_VIEWER_ATTRIBUTE_OVERLAY = (1u << MBC_BATCH_INDEX(surface_viewer_attribute)),
230 MBC_PAINT_OVERLAY_VERTS = (uint64_t(1u) << MBC_BATCH_INDEX(paint_overlay_verts)),
231 MBC_PAINT_OVERLAY_SURFACE = (uint64_t(1u) << MBC_BATCH_INDEX(paint_overlay_surface)),
233};
235
236BLI_STATIC_ASSERT(MBC_BATCH_LEN < 64, "Number of batches exceeded the limit of bit fields");
237
244
246 /* The total number of visible triangles (a sum of the values in #mat_tri_counts). */
254 std::optional<Array<int>> face_tri_offsets;
255};
256
269
270#define FOREACH_MESH_BUFFER_CACHE(batch_cache, mbc) \
271 for (MeshBufferCache *mbc = &batch_cache.final; \
272 mbc == &batch_cache.final || mbc == &batch_cache.cage || mbc == &batch_cache.uv_cage; \
273 mbc = (mbc == &batch_cache.final) ? \
274 &batch_cache.cage : \
275 ((mbc == &batch_cache.cage) ? &batch_cache.uv_cage : nullptr))
276
279
281
282 /* Index buffer per material. These are sub-ranges of `ibo.tris`. */
285
287
290
291 /* Settings to determine if cache is invalid. */
297 /* Instantly invalidates cache, skipping mesh check */
301
303
305
307
309
310 /* Valid only if edge_detection is up to date. */
312
314
315 /* Total areas for drawing UV Stretching. Contains the summed area in mesh
316 * space (`tot_area`) and the summed area in uv space (`tot_uvarea`).
317 *
318 * Only valid after `DRW_mesh_batch_cache_create_requested` has been called. */
320};
321
322#define MBC_EDITUV \
323 (MBC_EDITUV_FACES_STRETCH_AREA | MBC_EDITUV_FACES_STRETCH_ANGLE | MBC_EDITUV_FACES | \
324 MBC_EDITUV_EDGES | MBC_EDITUV_VERTS | MBC_EDITUV_FACEDOTS | MBC_UV_FACES | \
325 MBC_WIRE_LOOPS_ALL_UVS | MBC_WIRE_LOOPS_UVS | MBC_WIRE_LOOPS_EDITUVS)
326
328 const Scene &scene,
329 MeshBatchCache &cache,
330 MeshBufferCache &mbc,
331 Span<IBOType> ibo_requests,
332 Span<VBOType> vbo_requests,
333 Object &object,
334 Mesh &mesh,
335 bool is_editmode,
336 bool is_paint_mode,
337 bool do_final,
338 bool do_uvedit,
339 bool use_hide);
340
341void mesh_buffer_cache_create_requested_subdiv(MeshBatchCache &cache,
342 MeshBufferCache &mbc,
343 Span<IBOType> ibo_requests,
344 Span<VBOType> vbo_requests,
345 DRWSubdivCache &subdiv_cache,
346 MeshRenderData &mr);
347
348} // namespace blender::draw
#define ENUM_OPERATORS(_type, _max)
unsigned long long int uint64_t
Utilities for rendering attributes.
#define MBC_BATCH_LEN
#define MBC_BATCH_INDEX(batch)
void mesh_buffer_cache_create_requested_subdiv(MeshBatchCache &cache, MeshBufferCache &mbc, Span< IBOType > ibo_requests, Span< VBOType > vbo_requests, DRWSubdivCache &subdiv_cache, MeshRenderData &mr)
BLI_STATIC_ASSERT(MBC_BATCH_LEN< 64, "Number of batches exceeded the limit of bit fields")
void mesh_buffer_cache_create_requested(TaskGraph &task_graph, const Scene &scene, MeshBatchCache &cache, MeshBufferCache &mbc, Span< IBOType > ibo_requests, Span< VBOType > vbo_requests, Object &object, Mesh &mesh, bool is_editmode, bool is_paint_mode, bool do_final, bool do_uvedit, bool use_hide)
VectorSet< std::string > attr_used_over_time
Array< gpu::IndexBufPtr > tris_per_mat
VectorSet< std::string > attr_used
Array< gpu::Batch * > surface_per_mat
VectorSet< std::string > attr_needed
Map< IBOType, std::unique_ptr< gpu::IndexBuf, gpu::IndexBufDeleter > > ibos
Map< VBOType, std::unique_ptr< gpu::VertBuf, gpu::VertBufDeleter > > vbos
std::optional< Array< int > > face_tri_offsets