59#define TRIS_PER_MAT_INDEX BUFFER_LEN
70 for (
const VBOType vbo : vbos) {
71 if (
const auto *buffer = mbc->buff.vbos.lookup_ptr(vbo)) {
72 buffer_ptrs.
add(buffer->get());
77 for (
const IBOType ibo : ibos) {
78 if (
const auto *buffer = mbc->buff.ibos.lookup_ptr(ibo)) {
79 buffer_ptrs.
add(buffer->get());
84 const auto batch_contains_data = [&](gpu::Batch &
batch) {
89 return vbo && buffer_ptrs.contains(vbo);
98 gpu::Batch *
batch = ((gpu::Batch **)&cache.
batch)[
i];
115 for (
const VBOType vbo : vbos) {
120 for (
const IBOType ibo : ibos) {
130 return (*((uint32_t *)&a) & *((uint32_t *)&
b)) == *((uint32_t *)&
b);
135 return *((uint32_t *)&a) == *((uint32_t *)&
b);
140 uint32_t *a_p = (uint32_t *)a;
141 uint32_t *b_p = (uint32_t *)&
b;
147 *((uint32_t *)a) = 0;
163 cd_used.
uv |= (1 << layer);
175 cd_used.
uv |= (1 << layer);
199 if (gpumat ==
nullptr) {
207 std::optional<bke::AttrDomain> domain;
209 if (gpu_attr->is_default_color) {
218 if (!
name.is_empty()) {
255 layer = !
name.is_empty() ?
260 cd_used.
uv |= (1 << layer);
266 layer = !
name.is_empty() ?
271 if (layer == -1 && !
name.is_empty()) {
276 cd_used.
tan |= (1 << layer);
301 if (layer != -1 && domain.has_value()) {
327 memset(wstate, 0,
sizeof(*wstate));
340 memcpy(wstate_dst, wstate_src,
sizeof(*wstate_dst));
356 return ((!array1 && !array2) ||
357 (array1 && array2 && memcmp(array1, array2,
size *
sizeof(
bool)) == 0));
376 memset(wstate, 0,
sizeof(*wstate));
449 if (cache ==
nullptr) {
472 if (!mesh.
runtime->batch_cache) {
473 mesh.
runtime->batch_cache = MEM_new<MeshBatchCache>(__func__);
503 if (mesh.
runtime->batch_cache) {
544 const VectorSet<int> &used_material_indices = mesh.material_indices_used();
545 for (
const int i : used_material_indices) {
594 if (!mesh->
runtime->batch_cache) {
652 for (
int i = 0;
i <
sizeof(cache.
batch) /
sizeof(
void *);
i++) {
653 gpu::Batch **
batch = (gpu::Batch **)&cache.
batch;
691 "No uv layer available in texpaint, but batches requested anyway!");
706 if (!
name.is_empty()) {
811 *r_attrs = attrs_needed;
815 *r_cd_needed = cd_needed;
1000 "No uv layer available in edituv, but batches requested anyway!");
1009 float **tot_uv_area)
1015 if (tot_area !=
nullptr) {
1018 if (tot_uv_area !=
nullptr) {
1113 if (cache ==
nullptr) {
1125 if (ctime - cache->
lastmatch >
U.vbotimeout) {
1151 const bool is_paint_mode,
1152 const bool use_hide)
1157 bool cd_uv_update =
false;
1186 if (batch_requested &
1208 if (cd_overlap ==
false || attr_overlap ==
false) {
1212 cd_uv_update =
true;
1250 if ((batch_requested &
MBC_EDITUV) || cd_uv_update) {
1253 if (cd_uv_update || (cache.
is_uvsyncsel != is_uvsyncsel)) {
1281 if ((batch_requested & ~cache.
batch_ready) == 0) {
1298 bool do_cage =
false;
1299 const Mesh *edit_data_mesh =
nullptr;
1302 if (eval_cage && eval_cage != &mesh) {
1307 edit_data_mesh = eval_cage;
1310 edit_data_mesh = &mesh;
1314 bool do_uvcage =
false;
1318 do_uvcage = !(mesh.
runtime->is_original_bmesh &&
1322 const DRWBatchFlag batches_to_create = batch_requested & ~cache.batch_ready;
1326 enum class BufferList : int8_t { Final, Cage, UVCage };
1328 struct BatchCreateData {
1332 std::optional<IBOType> ibo;
1338 const BufferList list = BufferList::Final;
1426 BatchCreateData
batch{
1434 BatchCreateData
batch{
1442 BatchCreateData
batch{
1453 const bool is_face_selectable =
1478 *edit_data_mesh, orig_edit_mesh);
1481 const BufferList list = do_cage ? BufferList::Cage : BufferList::Final;
1483 if (edit_mapping_valid) {
1495 if (edit_mapping_valid) {
1501 if (!do_subdivision || do_cage) {
1511 if (edit_mapping_valid) {
1524 if (edit_mapping_valid) {
1536 if (edit_mapping_valid) {
1548 if (edit_mapping_valid) {
1560 if (edit_mapping_valid) {
1572 if (is_editmode && !edit_mapping_valid) {
1584 if (is_editmode && !edit_mapping_valid) {
1596 if (is_editmode && !edit_mapping_valid) {
1608 if (is_editmode && !edit_mapping_valid) {
1627 const BufferList list = do_uvcage ? BufferList::UVCage : BufferList::Final;
1630 if (edit_mapping_valid) {
1642 if (edit_mapping_valid) {
1654 if (edit_mapping_valid) {
1666 if (edit_mapping_valid) {
1678 if (edit_mapping_valid) {
1690 if (edit_mapping_valid) {
1703 std::array<VectorSet<IBOType>, 3> ibo_requests;
1704 std::array<VectorSet<VBOType>, 3> vbo_requests;
1705 for (
const BatchCreateData &
batch : batch_info) {
1707 ibo_requests[int(
batch.list)].add(*
batch.ibo);
1709 vbo_requests[int(
batch.list)].add_multiple(
batch.vbos);
1720 vbo_requests[int(BufferList::Final)].add(
VBOType::UVs);
1735 ibo_requests[
int(BufferList::UVCage)],
1736 vbo_requests[
int(BufferList::UVCage)],
1751 ibo_requests[
int(BufferList::Cage)],
1752 vbo_requests[
int(BufferList::Cage)],
1762 if (do_subdivision) {
1767 ibo_requests[
int(BufferList::Final)],
1768 vbo_requests[
int(BufferList::Final)],
1787 ibo_requests[
int(BufferList::Final)],
1788 vbo_requests[
int(BufferList::Final)],
1797 std::array<MeshBufferCache *, 3> caches{&cache.
final, &cache.
cage, &cache.
uv_cage};
1798 for (
const BatchCreateData &
batch : batch_info) {
1805 &
batch.batch, cache_for_batch.
buff.
vbos.lookup(vbo_request).get(),
false);
CustomData interface, see also DNA_customdata_types.h.
int CustomData_get_named_layer(const CustomData *data, eCustomDataType type, blender::StringRef name)
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
bool CustomData_layer_is_anonymous(const CustomData *data, eCustomDataType type, int n)
int CustomData_get_stencil_layer(const CustomData *data, eCustomDataType type)
int CustomData_get_active_layer(const CustomData *data, eCustomDataType type)
int CustomData_get_render_layer(const CustomData *data, eCustomDataType type)
bool BKE_editmesh_eval_orig_map_available(const Mesh &mesh_eval, const Mesh *mesh_orig)
General operations, lookup, etc. for materials.
int BKE_id_material_used_with_fallback_eval(const ID &id)
@ BKE_MESH_BATCH_DIRTY_UVEDIT_ALL
@ BKE_MESH_BATCH_DIRTY_SELECT_PAINT
@ BKE_MESH_BATCH_DIRTY_SHADING
@ BKE_MESH_BATCH_DIRTY_UVEDIT_SELECT
@ BKE_MESH_BATCH_DIRTY_ALL
@ BKE_MESH_BATCH_DIRTY_SELECT
General operations, lookup, etc. for blender objects.
const Mesh * BKE_object_get_pre_modified_mesh(const Object *object)
const Mesh * BKE_object_get_editmesh_eval_final(const Object *object)
A BVH for high poly meshes.
bool BKE_subsurf_modifier_has_gpu_subdiv(const Mesh *mesh)
#define LISTBASE_FOREACH(type, var, list)
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define ME_USING_MIRROR_X_VERTEX_GROUPS(_me)
Object is a sort of wrapper for general info.
#define GPU_BATCH_CLEAR_SAFE(batch)
int GPU_batch_vertbuf_add(blender::gpu::Batch *batch, blender::gpu::VertBuf *vertex_buf, bool own_vbo)
#define GPU_batch_init(batch, primitive_type, vertex_buf, index_buf)
#define GPU_BATCH_DISCARD_SAFE(batch)
ListBase GPU_material_attributes(const GPUMaterial *material)
static constexpr int GPU_MAX_ATTR
static blender::gpu::VertBuf * GPU_vertbuf_create_with_format(const GPUVertFormat &format)
void GPU_vertbuf_data_len_set(blender::gpu::VertBuf &verts, uint v_len)
void GPU_vertbuf_data_alloc(blender::gpu::VertBuf &verts, uint v_len)
Read Guarded memory(de)allocation.
Provides wrapper around system-specific atomic primitives, and some extensions (faked-atomic operatio...
ATOMIC_INLINE uint32_t atomic_fetch_and_or_uint32(uint32_t *p, uint32_t x)
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
IndexRange index_range() const
void reinitialize(const int64_t new_size)
IndexRange index_range() const
void reserve(const int64_t n)
bool contains(const Key &key) const
constexpr int64_t size() const
constexpr const char * c_str() const
void append(const T &value)
blender::gpu::Batch * DRW_batch_request(blender::gpu::Batch **batch)
const Mesh * DRW_object_get_editmesh_cage_for_drawing(const Object &object)
struct @021025263243242147216143265077100330027142264337::@225245033123204053237120173316075113304004012000 batch
void * MEM_dupallocN(const void *vmemh)
pbvh::Tree * pbvh_get(Object &object)
void update_normals_from_eval(Object &object_eval, Tree &pbvh)
void DRW_mesh_batch_cache_validate(Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edituv_faces_stretch_angle(Object &object, Mesh &mesh)
void drw_attributes_add_request(VectorSet< std::string > *attrs, const StringRef name)
const CustomData & mesh_cd_ldata_get_from_mesh(const Mesh &mesh)
static void drw_mesh_weight_state_extract(Object &ob, Mesh &mesh, const ToolSettings &ts, bool paint_mode, DRW_MeshWeightState *wstate)
static void init_empty_dummy_batch(gpu::Batch &batch)
BLI_INLINE bool mesh_cd_layers_type_equal(DRW_MeshCDMask a, DRW_MeshCDMask b)
blender::gpu::Batch * DRW_mesh_batch_cache_get_loose_edges(Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edituv_edges(Object &object, Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_surface_texpaint_single(Object &object, Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edit_edges(Mesh &mesh)
static void mesh_batch_cache_discard_shaded_tri(MeshBatchCache &cache)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edituv_facedots(Object &object, Mesh &mesh)
static bool drw_mesh_flags_equal(const bool *array1, const bool *array2, int size)
blender::gpu::Batch * DRW_mesh_batch_cache_get_facedots_with_select_id(Mesh &mesh)
static void mesh_cd_calc_active_uv_layer(const Object &object, const Mesh &mesh, DRW_MeshCDMask &cd_used)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edituv_wireframe(Object &object, Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edit_facedots(Mesh &mesh)
void draw_subdiv_cache_free(DRWSubdivCache &cache)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edituv_verts(Object &object, Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edit_mesh_analysis(Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_surface(Mesh &mesh)
BLI_INLINE bool mesh_cd_layers_type_overlap(DRW_MeshCDMask a, DRW_MeshCDMask b)
static void texpaint_request_active_uv(MeshBatchCache &cache, Object &object, Mesh &mesh)
static void mesh_cd_calc_edit_uv_layer(const Mesh &, DRW_MeshCDMask *cd_used)
static void mesh_batch_cache_discard_uvedit_select(MeshBatchCache &cache)
blender::gpu::Batch * DRW_mesh_batch_cache_get_surface_weights(Mesh &mesh)
Span< gpu::Batch * > DRW_mesh_batch_cache_get_surface_shaded(Object &object, Mesh &mesh, Span< const GPUMaterial * > materials)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edituv_faces(Object &object, Mesh &mesh)
@ MBC_EDIT_SELECTION_FACES
@ MBC_PAINT_OVERLAY_VERTS
@ MBC_PAINT_OVERLAY_WIRE_LOOPS
@ MBC_EDITUV_FACES_STRETCH_ANGLE
@ MBC_EDIT_SELECTION_FACEDOTS
@ MBC_PAINT_OVERLAY_SURFACE
@ MBC_EDIT_SELECTION_VERTS
@ MBC_EDITUV_FACES_STRETCH_AREA
@ MBC_VIEWER_ATTRIBUTE_OVERLAY
@ MBC_EDIT_SELECTION_EDGES
const CustomData & mesh_cd_edata_get_from_mesh(const Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_surface_vertpaint(Object &object, Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_wireframes_face(Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_surface_sculpt(Object &object, Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_all_edges(Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_paint_overlay_verts(Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edit_loop_normals(Mesh &mesh)
static bool drw_mesh_weight_state_compare(const DRW_MeshWeightState *a, const DRW_MeshWeightState *b)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edge_detection(Mesh &mesh, bool *r_is_manifold)
void DRW_mesh_batch_cache_free_old(Mesh *mesh, int ctime)
void DRW_mesh_batch_cache_free(void *batch_cache)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edit_triangles(Mesh &mesh)
Span< gpu::Batch * > DRW_mesh_batch_cache_get_surface_texpaint(Object &object, Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edit_vertices(Mesh &mesh)
static void mesh_batch_cache_init(Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_all_uv_wireframe(Object &object, Mesh &mesh)
static void mesh_batch_cache_clear(MeshBatchCache &cache)
blender::gpu::Batch * DRW_mesh_batch_cache_get_triangles_with_select_id(Mesh &mesh)
static void mesh_buffer_cache_clear(MeshBufferCache *mbc)
static void mesh_batch_cache_discard_uvedit(MeshBatchCache &cache)
BLI_INLINE void mesh_cd_layers_type_clear(DRW_MeshCDMask *a)
static void mesh_batch_cache_check_vertex_group(MeshBatchCache &cache, const DRW_MeshWeightState *wstate)
static void drw_mesh_weight_state_copy(DRW_MeshWeightState *wstate_dst, const DRW_MeshWeightState *wstate_src)
BLI_INLINE void mesh_cd_layers_type_merge(DRW_MeshCDMask *a, DRW_MeshCDMask b)
const Mesh & editmesh_final_or_this(const Object &object, const Mesh &mesh)
static void mesh_cd_calc_active_mask_uv_layer(const Object &object, const Mesh &mesh, DRW_MeshCDMask &cd_used)
bool drw_attributes_overlap(const VectorSet< std::string > *a, const VectorSet< std::string > *b)
static void mesh_batch_cache_request_surface_batches(Mesh &mesh, MeshBatchCache &cache)
void DRW_create_subdivision(Object &ob, Mesh &mesh, MeshBatchCache &batch_cache, MeshBufferCache &mbc, const Span< IBOType > ibo_requests, const Span< VBOType > vbo_requests, const bool is_editmode, const bool is_paint_mode, const bool do_final, const bool do_uvedit, const bool do_cage, const ToolSettings *ts, const bool use_hide)
static DRW_MeshCDMask mesh_cd_calc_used_gpu_layers(const Object &object, const Mesh &mesh, const Span< const GPUMaterial * > materials, VectorSet< std::string > *attributes)
static void request_active_and_default_color_attributes(const Object &object, const Mesh &mesh, VectorSet< std::string > &attributes)
blender::gpu::Batch * DRW_mesh_batch_cache_get_verts_with_select_id(Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_sculpt_overlays(Mesh &mesh)
static void discard_buffers(MeshBatchCache &cache, const Span< VBOType > vbos, const Span< IBOType > ibos)
blender::gpu::Batch * DRW_mesh_batch_cache_get_paint_overlay_surface(Mesh &mesh)
void DRW_mesh_batch_cache_dirty_tag(Mesh *mesh, eMeshBatchDirtyMode mode)
blender::gpu::Batch * DRW_mesh_batch_cache_get_surface_viewer_attribute(Mesh &mesh)
const CustomData & mesh_cd_vdata_get_from_mesh(const Mesh &mesh)
void DRW_mesh_batch_cache_create_requested(TaskGraph &task_graph, Object &ob, Mesh &mesh, const Scene &scene, bool is_paint_mode, bool use_hide)
void DRW_mesh_get_attributes(const Object &object, const Mesh &mesh, const Span< const GPUMaterial * > materials, VectorSet< std::string > *r_attrs, DRW_MeshCDMask *r_cd_needed)
static void mesh_batch_cache_free_subdiv_cache(MeshBatchCache &cache)
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)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edit_vert_normals(Mesh &mesh)
static MeshBatchCache * mesh_batch_cache_get(Mesh &mesh)
static void drw_mesh_weight_state_clear(DRW_MeshWeightState *wstate)
void drw_attributes_merge(VectorSet< std::string > *dst, const VectorSet< std::string > *src)
blender::gpu::Batch * DRW_mesh_batch_cache_get_uv_faces(Object &object, Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edges_with_select_id(Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edituv_faces_stretch_area(Object &object, Mesh &mesh, float **tot_area, float **tot_uv_area)
blender::gpu::Batch * DRW_mesh_batch_cache_get_paint_overlay_edges(Mesh &mesh)
static void edituv_request_active_uv(MeshBatchCache &cache, Object &object, Mesh &mesh)
static bool mesh_batch_cache_valid(Mesh &mesh)
blender::gpu::Batch * DRW_mesh_batch_cache_get_all_verts(Mesh &mesh)
@ DRW_MESH_WEIGHT_STATE_MULTIPAINT
@ DRW_MESH_WEIGHT_STATE_LOCK_RELATIVE
@ DRW_MESH_WEIGHT_STATE_AUTO_NORMALIZE
blender::gpu::Batch * DRW_mesh_batch_cache_get_uv_wireframe(Object &object, Mesh &mesh)
bool drw_custom_data_match_attribute(const CustomData &custom_data, const StringRef name, int *r_layer_index, eCustomDataType *r_type)
blender::gpu::Batch * DRW_mesh_batch_cache_get_edit_skin_roots(Mesh &mesh)
const CustomData & mesh_cd_pdata_get_from_mesh(const Mesh &mesh)
void create_material_subranges(const SortedFaceData &face_sorted, gpu::IndexBuf &tris_ibo, MutableSpan< gpu::IndexBufPtr > ibos)
MeshRuntimeHandle * runtime
char * default_color_attribute
ListBase vertex_group_names
int vertex_group_active_index
char * active_color_attribute
struct ToolSettings * toolsettings
VectorSet< std::string > attr_used_over_time
DRW_MeshWeightState weight_state
Array< gpu::IndexBufPtr > tris_per_mat
DRWBatchFlag batch_requested
VectorSet< std::string > attr_used
DRWSubdivCache * subdiv_cache
Array< gpu::Batch * > surface_per_mat
DRW_MeshCDMask cd_used_over_time
VectorSet< std::string > attr_needed
gpu::Batch * wire_loops_edituvs
gpu::Batch * edit_selection_faces
gpu::Batch * edit_skin_roots
gpu::Batch * wire_loops_uvs
gpu::Batch * paint_overlay_surface
gpu::Batch * surface_weights
gpu::Batch * edituv_fdots
gpu::Batch * sculpt_overlays
gpu::Batch * paint_overlay_verts
gpu::Batch * edit_selection_edges
gpu::Batch * edituv_faces
gpu::Batch * surface_viewer_attribute
gpu::Batch * edituv_faces_stretch_angle
gpu::Batch * wire_loops_all_uvs
gpu::Batch * edit_mesh_analysis
gpu::Batch * edit_vertices
gpu::Batch * edituv_verts
gpu::Batch * edge_detection
gpu::Batch * edit_selection_verts
gpu::Batch * edit_triangles
gpu::Batch * paint_overlay_wire_loops
gpu::Batch * edituv_edges
gpu::Batch * edituv_faces_stretch_area
gpu::Batch * edit_selection_fdots
MeshExtractLooseGeom loose_geom
SortedFaceData face_sorted
Map< IBOType, std::unique_ptr< gpu::IndexBuf, gpu::IndexBufDeleter > > ibos
Map< VBOType, std::unique_ptr< gpu::VertBuf, gpu::VertBufDeleter > > vbos