47 for (const int face : range) {
48 if (!hide_poly.is_empty() && hide_poly[face]) {
51 const IndexRange mesh_range = bke::mesh::face_triangles_range(faces, face);
52 const Span<uint3> mesh_tris = corner_tris.slice(mesh_range).cast<uint3>();
53 MutableSpan<uint3> ibo_tris = data.slice(face_tri_offsets[face], mesh_tris.size());
54 ibo_tris.copy_from(mesh_tris);
73 for (const int face_index : range) {
74 const BMFace &face = *BM_face_at_index(&bm, face_index);
75 if (BM_elem_flag_test(&face, BM_ELEM_HIDDEN)) {
78 const int loop_index = BM_elem_index_get(BM_FACE_FIRST_LOOP(&face));
79 const IndexRange bm_tris(poly_to_tri_count(face_index, loop_index),
80 bke::mesh::face_triangles_num(face.len));
81 const IndexRange ibo_tris(face_tri_offsets[face_index], bm_tris.size());
82 for (const int i : bm_tris.index_range()) {
83 data[ibo_tris[i]] = uint3(BM_elem_index_get(looptris[bm_tris[i]][0]),
84 BM_elem_index_get(looptris[bm_tris[i]][1]),
85 BM_elem_index_get(looptris[bm_tris[i]][2]));
109 const int start = mat_start * 3;
110 const int len = mat_tri_len * 3;
112 mat_start += mat_tri_len;
141 for (
int i = 0; i < cache.
mat_len; i++) {
147 const int start = subdiv_cache.
mat_start[i] * 6;
void GPU_indexbuf_build_in_place_ex(GPUIndexBufBuilder *builder, uint index_min, uint index_max, bool uses_restart_indices, blender::gpu::IndexBuf *elem)
blender::MutableSpan< uint32_t > GPU_indexbuf_get_data(GPUIndexBufBuilder *)
void GPU_indexbuf_create_subrange_in_place(blender::gpu::IndexBuf *elem, blender::gpu::IndexBuf *elem_src, uint start, uint length)
void GPU_indexbuf_init(GPUIndexBufBuilder *, GPUPrimType, uint prim_len, uint vertex_len)
blender::gpu::IndexBuf * GPU_indexbuf_calloc()
void GPU_indexbuf_build_in_place_from_memory(blender::gpu::IndexBuf *ibo, GPUPrimType prim_type, const uint32_t *data, int32_t data_len, int32_t index_min, int32_t index_max, bool uses_restart_indices)
void GPU_indexbuf_init_build_on_device(blender::gpu::IndexBuf *elem, uint index_len)
ATTR_WARN_UNUSED_RESULT BMesh * bm
constexpr MutableSpan< NewT > cast() const
Span< NewT > constexpr cast() const
constexpr int64_t size() const
void extract_tris(const MeshRenderData &mr, const SortedFaceData &face_sorted, MeshBatchCache &cache, gpu::IndexBuf &ibo)
void extract_tris_subdiv(const DRWSubdivCache &subdiv_cache, MeshBatchCache &cache, gpu::IndexBuf &ibo)
void draw_subdiv_build_tris_buffer(const DRWSubdivCache &cache, gpu::IndexBuf *subdiv_tris, const int material_count)
static void extract_tris_mesh(const MeshRenderData &mr, const SortedFaceData &face_sorted, gpu::IndexBuf &ibo)
static void create_material_subranges(const MeshRenderData &mr, const SortedFaceData &face_sorted, MeshBatchCache &cache, gpu::IndexBuf &ibo)
static void extract_tris_bmesh(const MeshRenderData &mr, const SortedFaceData &face_sorted, gpu::IndexBuf &ibo)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
blender::Array< std::array< BMLoop *, 3 > > looptris
uint num_subdiv_triangles
Array< gpu::IndexBuf * > tris_per_mat
eMRExtractType extract_type
VArraySpan< bool > hide_poly
OffsetIndices< int > faces
std::optional< Array< int > > face_tri_offsets
Array< int > tris_num_by_material