Blender  V3.3
draw_cache_extract.hh
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2019 Blender Foundation. */
3 
8 #pragma once
9 
10 #include <algorithm>
11 
12 #include "BLI_utildefines.h"
13 
14 #include "DNA_customdata_types.h"
15 #include "DNA_mesh_types.h"
16 #include "DNA_view3d_enums.h"
17 
18 #include "BKE_attribute.h"
19 #include "BKE_object.h"
20 
21 #include "GPU_batch.h"
22 #include "GPU_index_buffer.h"
23 #include "GPU_vertex_buffer.h"
24 
25 #include "draw_attributes.h"
26 
27 struct DRWSubdivCache;
28 struct MeshRenderData;
29 struct TaskGraph;
30 
31 /* Vertex Group Selection and display options */
35 
36  short flags;
37  char alert_mode;
38 
39  /* Set of all selected bones for Multi-paint. */
40  bool *defgroup_sel; /* #defgroup_len */
42 
43  /* Set of all locked and unlocked deform bones for Lock Relative mode. */
44  bool *defgroup_locked; /* #defgroup_len */
45  bool *defgroup_unlocked; /* #defgroup_len */
46 };
47 
48 /* DRW_MeshWeightState.flags */
49 enum {
53 };
54 
56  uint32_t uv : 8;
65 };
66 /* Keep `DRW_MeshCDMask` struct within a `uint32_t`.
67  * bit-wise and atomic operations are used to compare and update the struct.
68  * See `mesh_cd_layers_type_*` functions. */
69 BLI_STATIC_ASSERT(sizeof(DRW_MeshCDMask) <= sizeof(uint32_t), "DRW_MeshCDMask exceeds 32 bits")
70 
71 enum eMRIterType {
72  MR_ITER_LOOPTRI = 1 << 0,
73  MR_ITER_POLY = 1 << 1,
74  MR_ITER_LEDGE = 1 << 2,
75  MR_ITER_LVERT = 1 << 3,
76 };
77 ENUM_OPERATORS(eMRIterType, MR_ITER_LVERT)
78 
81  MR_DATA_POLY_NOR = 1 << 1,
82  MR_DATA_LOOP_NOR = 1 << 2,
83  MR_DATA_LOOPTRI = 1 << 3,
88 };
90 
91 BLI_INLINE int mesh_render_mat_len_get(const Object *object, const Mesh *me)
92 {
93  if (me->edit_mesh != NULL) {
94  const Mesh *editmesh_eval_final = BKE_object_get_editmesh_eval_final(object);
95  if (editmesh_eval_final != NULL) {
96  return std::max<int>(1, editmesh_eval_final->totcol);
97  }
98  }
99  return std::max<int>(1, me->totcol);
100 }
101 
103  /* Every VBO below contains at least enough data for every loop in the mesh
104  * (except fdots and skin roots). For some VBOs, it extends to (in this exact order) :
105  * loops + loose_edges * 2 + loose_verts */
106  struct {
107  GPUVertBuf *pos_nor; /* extend */
108  GPUVertBuf *lnor; /* extend */
109  GPUVertBuf *edge_fac; /* extend */
110  GPUVertBuf *weights; /* extend */
115  /* Only for edit mode. */
116  GPUVertBuf *edit_data; /* extend */
124  // GPUVertBuf *fdots_edit_data; /* inside fdots_nor for now. */
127  /* Selection */
128  GPUVertBuf *vert_idx; /* extend */
129  GPUVertBuf *edge_idx; /* extend */
133  } vbo;
134  /* Index Buffers:
135  * Only need to be updated when topology changes. */
136  struct {
137  /* Indices to vloops. Ordered per material. */
139  /* Loose edges last. */
141  /* Sub buffer of `lines` only containing the loose edges. */
145  /* 3D overlays. */
146  /* no loose edges. */
149  /* Uv overlays. (visibility can differ from 3D view) */
154  } ibo;
155 };
156 
158  /* Surfaces / Render */
161  /* Edit mode */
170  /* Edit UVs */
177  /* Edit selection */
182  /* Common display / Other */
187  /* Individual edges with face normals. */
189  /* Loops around faces. no edges between selected faces */
191  /* Same as wire_loops but only has uvs. */
194 };
195 
196 #define MBC_BATCH_LEN (sizeof(MeshBatchList) / sizeof(void *))
197 #define MBC_VBO_LEN (sizeof(MeshBufferList::vbo) / sizeof(void *))
198 #define MBC_IBO_LEN (sizeof(MeshBufferList::ibo) / sizeof(void *))
199 
200 #define MBC_BATCH_INDEX(batch) (offsetof(MeshBatchList, batch) / sizeof(void *))
201 
204  MBC_SURFACE_WEIGHTS = (1u << MBC_BATCH_INDEX(surface_weights)),
205  MBC_EDIT_TRIANGLES = (1u << MBC_BATCH_INDEX(edit_triangles)),
206  MBC_EDIT_VERTICES = (1u << MBC_BATCH_INDEX(edit_vertices)),
207  MBC_EDIT_EDGES = (1u << MBC_BATCH_INDEX(edit_edges)),
208  MBC_EDIT_VNOR = (1u << MBC_BATCH_INDEX(edit_vnor)),
209  MBC_EDIT_LNOR = (1u << MBC_BATCH_INDEX(edit_lnor)),
210  MBC_EDIT_FACEDOTS = (1u << MBC_BATCH_INDEX(edit_fdots)),
211  MBC_EDIT_MESH_ANALYSIS = (1u << MBC_BATCH_INDEX(edit_mesh_analysis)),
212  MBC_SKIN_ROOTS = (1u << MBC_BATCH_INDEX(edit_skin_roots)),
213  MBC_EDITUV_FACES_STRETCH_AREA = (1u << MBC_BATCH_INDEX(edituv_faces_stretch_area)),
214  MBC_EDITUV_FACES_STRETCH_ANGLE = (1u << MBC_BATCH_INDEX(edituv_faces_stretch_angle)),
215  MBC_EDITUV_FACES = (1u << MBC_BATCH_INDEX(edituv_faces)),
216  MBC_EDITUV_EDGES = (1u << MBC_BATCH_INDEX(edituv_edges)),
217  MBC_EDITUV_VERTS = (1u << MBC_BATCH_INDEX(edituv_verts)),
218  MBC_EDITUV_FACEDOTS = (1u << MBC_BATCH_INDEX(edituv_fdots)),
219  MBC_EDIT_SELECTION_VERTS = (1u << MBC_BATCH_INDEX(edit_selection_verts)),
220  MBC_EDIT_SELECTION_EDGES = (1u << MBC_BATCH_INDEX(edit_selection_edges)),
221  MBC_EDIT_SELECTION_FACES = (1u << MBC_BATCH_INDEX(edit_selection_faces)),
222  MBC_EDIT_SELECTION_FACEDOTS = (1u << MBC_BATCH_INDEX(edit_selection_fdots)),
223  MBC_ALL_VERTS = (1u << MBC_BATCH_INDEX(all_verts)),
224  MBC_ALL_EDGES = (1u << MBC_BATCH_INDEX(all_edges)),
225  MBC_LOOSE_EDGES = (1u << MBC_BATCH_INDEX(loose_edges)),
226  MBC_EDGE_DETECTION = (1u << MBC_BATCH_INDEX(edge_detection)),
227  MBC_WIRE_EDGES = (1u << MBC_BATCH_INDEX(wire_edges)),
228  MBC_WIRE_LOOPS = (1u << MBC_BATCH_INDEX(wire_loops)),
229  MBC_WIRE_LOOPS_UVS = (1u << MBC_BATCH_INDEX(wire_loops_uvs)),
230  MBC_SCULPT_OVERLAYS = (1u << MBC_BATCH_INDEX(sculpt_overlays)),
232 };
234 
235 BLI_STATIC_ASSERT(MBC_BATCH_LEN < 32, "Number of batches exceeded the limit of bit fields");
236 
238  int edge_len;
239  int vert_len;
240  int *verts;
241  int *edges;
242 };
243 
251 
253 
254  struct {
259 };
260 
261 #define FOREACH_MESH_BUFFER_CACHE(batch_cache, mbc) \
262  for (MeshBufferCache *mbc = &batch_cache->final; \
263  mbc == &batch_cache->final || mbc == &batch_cache->cage || mbc == &batch_cache->uv_cage; \
264  mbc = (mbc == &batch_cache->final) ? \
265  &batch_cache->cage : \
266  ((mbc == &batch_cache->cage) ? &batch_cache->uv_cage : NULL))
267 
270 
272 
273  /* Index buffer per material. These are subranges of `ibo.tris` */
275 
277 
279 
282 
283  /* Settings to determine if cache is invalid. */
284  int edge_len;
285  int tri_len;
286  int poly_len;
287  int vert_len;
288  int mat_len;
289  /* Instantly invalidates cache, skipping mesh check */
290  bool is_dirty;
293 
295 
297 
299 
301 
302  /* Valid only if edge_detection is up to date. */
304 
305  /* Total areas for drawing UV Stretching. Contains the summed area in mesh
306  * space (`tot_area`) and the summed area in uv space (`tot_uvarea`).
307  *
308  * Only valid after `DRW_mesh_batch_cache_create_requested` has been called. */
310 
312 
315 };
316 
317 #define MBC_EDITUV \
318  (MBC_EDITUV_FACES_STRETCH_AREA | MBC_EDITUV_FACES_STRETCH_ANGLE | MBC_EDITUV_FACES | \
319  MBC_EDITUV_EDGES | MBC_EDITUV_VERTS | MBC_EDITUV_FACEDOTS | MBC_WIRE_LOOPS_UVS)
320 
321 namespace blender::draw {
322 
324  MeshBatchCache *cache,
325  MeshBufferCache *mbc,
326  Object *object,
327  Mesh *me,
328  bool is_editmode,
329  bool is_paint_mode,
330  bool is_mode_active,
331  const float obmat[4][4],
332  bool do_final,
333  bool do_uvedit,
334  const Scene *scene,
335  const ToolSettings *ts,
336  bool use_hide);
337 
339  MeshBufferCache *mbc,
340  DRWSubdivCache *subdiv_cache,
341  MeshRenderData *mr);
342 
343 } // namespace blender::draw
Generic geometry attributes built on CustomData.
General operations, lookup, etc. for blender objects.
struct Mesh * BKE_object_get_editmesh_eval_final(const struct Object *object)
#define BLI_INLINE
eV3DShadingColorType
GPUBatch
Definition: GPU_batch.h:78
struct GPUIndexBuf GPUIndexBuf
#define GPU_MAX_ATTR
Definition: GPU_shader.h:388
struct GPUVertBuf GPUVertBuf
Scene scene
Utilities for rendering attributes.
BLI_STATIC_ASSERT(sizeof(DRW_MeshCDMask)<=sizeof(uint32_t), "DRW_MeshCDMask exceeds 32 bits") enum eMRIterType
#define MBC_BATCH_LEN
#define MBC_BATCH_INDEX(batch)
BLI_INLINE int mesh_render_mat_len_get(const Object *object, const Mesh *me)
@ MBC_EDIT_VNOR
@ MBC_EDITUV_FACES_STRETCH_AREA
@ MBC_EDIT_EDGES
@ MBC_LOOSE_EDGES
@ MBC_EDITUV_EDGES
@ MBC_EDITUV_FACEDOTS
@ MBC_SCULPT_OVERLAYS
@ MBC_EDIT_SELECTION_EDGES
@ MBC_EDGE_DETECTION
@ MBC_WIRE_LOOPS_UVS
@ MBC_EDIT_LNOR
@ MBC_ALL_EDGES
@ MBC_EDITUV_FACES
@ MBC_EDITUV_FACES_STRETCH_ANGLE
@ MBC_EDIT_VERTICES
@ MBC_EDIT_MESH_ANALYSIS
@ MBC_EDIT_SELECTION_FACEDOTS
@ MBC_EDIT_FACEDOTS
@ MBC_SURFACE_WEIGHTS
@ MBC_SURFACE_PER_MAT
@ MBC_WIRE_LOOPS
@ MBC_EDITUV_VERTS
@ MBC_SKIN_ROOTS
@ MBC_SURFACE
@ MBC_ALL_VERTS
@ MBC_EDIT_SELECTION_VERTS
@ MBC_EDIT_TRIANGLES
@ MBC_WIRE_EDGES
@ MBC_EDIT_SELECTION_FACES
ENUM_OPERATORS(DRWBatchFlag, MBC_SURFACE_PER_MAT)
@ DRW_MESH_WEIGHT_STATE_MULTIPAINT
@ DRW_MESH_WEIGHT_STATE_AUTO_NORMALIZE
@ DRW_MESH_WEIGHT_STATE_LOCK_RELATIVE
@ MR_DATA_LOOP_NOR
@ MR_DATA_NONE
@ MR_DATA_POLYS_SORTED
@ MR_DATA_TAN_LOOP_NOR
@ MR_DATA_POLY_NOR
@ MR_DATA_LOOPTRI
@ MR_DATA_LOOSE_GEOM
struct @211::@212 surface
void mesh_buffer_cache_create_requested(TaskGraph *task_graph, MeshBatchCache *cache, MeshBufferCache *mbc, Object *object, Mesh *me, bool is_editmode, bool is_paint_mode, bool is_mode_active, const float obmat[4][4], bool do_final, bool do_uvedit, const Scene *scene, const ToolSettings *ts, bool use_hide)
void mesh_buffer_cache_create_requested_subdiv(MeshBatchCache *cache, MeshBufferCache *mbc, DRWSubdivCache *subdiv_cache, MeshRenderData *mr)
unsigned int uint32_t
Definition: stdint.h:80
DRW_MeshCDMask cd_used
DRW_MeshWeightState weight_state
DRW_Attributes attr_used
DRW_MeshCDMask cd_needed
DRW_MeshCDMask cd_used_over_time
GPUBatch ** surface_per_mat
MeshBufferCache uv_cage
MeshBufferCache cage
DRWBatchFlag batch_requested
DRWSubdivCache * subdiv_cache
DRW_Attributes attr_needed
MeshBatchList batch
GPUIndexBuf ** tris_per_mat
DRWBatchFlag batch_ready
eV3DShadingColorType color_type
DRW_Attributes attr_used_over_time
GPUBatch * surface_weights
GPUBatch * edituv_faces_stretch_angle
GPUBatch * edituv_edges
GPUBatch * edit_selection_faces
GPUBatch * loose_edges
GPUBatch * edituv_faces
GPUBatch * edituv_faces_stretch_area
GPUBatch * edituv_verts
GPUBatch * edge_detection
GPUBatch * edit_mesh_analysis
GPUBatch * edit_selection_fdots
GPUBatch * edituv_fdots
GPUBatch * edit_skin_roots
GPUBatch * edit_selection_edges
GPUBatch * wire_loops_uvs
GPUBatch * edit_vertices
GPUBatch * sculpt_overlays
GPUBatch * edit_selection_verts
GPUBatch * edit_triangles
MeshExtractLooseGeom loose_geom
struct MeshBufferCache::@274 poly_sorted
MeshBufferList buff
GPUIndexBuf * lines_paint_mask
GPUVertBuf * edituv_stretch_area
GPUVertBuf * fdots_uv
GPUVertBuf * skin_roots
GPUIndexBuf * lines_loose
GPUVertBuf * attr[GPU_MAX_ATTR]
GPUIndexBuf * lines
GPUVertBuf * edge_idx
GPUVertBuf * pos_nor
GPUIndexBuf * tris
GPUVertBuf * fdots_edituv_data
GPUIndexBuf * edituv_points
GPUVertBuf * poly_idx
GPUVertBuf * edge_fac
GPUIndexBuf * edituv_fdots
GPUIndexBuf * edituv_tris
GPUIndexBuf * edituv_lines
GPUVertBuf * edit_data
GPUVertBuf * fdot_idx
GPUIndexBuf * fdots
GPUVertBuf * fdots_nor
struct MeshBufferList::@272 vbo
GPUVertBuf * weights
struct MeshBufferList::@273 ibo
GPUVertBuf * fdots_pos
GPUVertBuf * edituv_data
GPUVertBuf * edituv_stretch_angle
GPUIndexBuf * lines_adjacency
GPUVertBuf * vert_idx
GPUVertBuf * mesh_analysis
GPUIndexBuf * points
GPUVertBuf * sculpt_data
short totcol