Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/draw_cache_impl_mesh.cc
| Show First 20 Lines • Show All 56 Lines • ▼ Show 20 Lines | |||||
| #include "ED_mesh.h" | #include "ED_mesh.h" | ||||
| #include "ED_uvedit.h" | #include "ED_uvedit.h" | ||||
| #include "draw_cache_extract.hh" | #include "draw_cache_extract.hh" | ||||
| #include "draw_cache_inline.h" | #include "draw_cache_inline.h" | ||||
| #include "draw_subdivision.h" | #include "draw_subdivision.h" | ||||
| #include "draw_cache_impl.h" /* own include */ | #include "draw_cache_impl.h" /* own include */ | ||||
| #include "draw_manager.h" | |||||
| #include "mesh_extractors/extract_mesh.hh" | #include "mesh_extractors/extract_mesh.hh" | ||||
| using blender::IndexRange; | using blender::IndexRange; | ||||
| using blender::Map; | using blender::Map; | ||||
| using blender::Span; | using blender::Span; | ||||
| using blender::StringRefNull; | using blender::StringRefNull; | ||||
| Show All 26 Lines | |||||
| static constexpr DRWBatchFlag batches_that_use_buffer(const int buffer_index) | static constexpr DRWBatchFlag batches_that_use_buffer(const int buffer_index) | ||||
| { | { | ||||
| switch (buffer_index) { | switch (buffer_index) { | ||||
| case BUFFER_INDEX(vbo.pos_nor): | case BUFFER_INDEX(vbo.pos_nor): | ||||
| return MBC_SURFACE | MBC_SURFACE_WEIGHTS | MBC_EDIT_TRIANGLES | MBC_EDIT_VERTICES | | return MBC_SURFACE | MBC_SURFACE_WEIGHTS | MBC_EDIT_TRIANGLES | MBC_EDIT_VERTICES | | ||||
| MBC_EDIT_EDGES | MBC_EDIT_VNOR | MBC_EDIT_LNOR | MBC_EDIT_MESH_ANALYSIS | | MBC_EDIT_EDGES | MBC_EDIT_VNOR | MBC_EDIT_LNOR | MBC_EDIT_MESH_ANALYSIS | | ||||
| MBC_EDIT_SELECTION_VERTS | MBC_EDIT_SELECTION_EDGES | MBC_EDIT_SELECTION_FACES | | MBC_EDIT_SELECTION_VERTS | MBC_EDIT_SELECTION_EDGES | MBC_EDIT_SELECTION_FACES | | ||||
| MBC_ALL_VERTS | MBC_ALL_EDGES | MBC_LOOSE_EDGES | MBC_EDGE_DETECTION | | MBC_ALL_VERTS | MBC_ALL_EDGES | MBC_LOOSE_EDGES | MBC_EDGE_DETECTION | | ||||
| MBC_WIRE_EDGES | MBC_WIRE_LOOPS | MBC_SCULPT_OVERLAYS | MBC_SURFACE_PER_MAT; | MBC_WIRE_EDGES | MBC_WIRE_LOOPS | MBC_SCULPT_OVERLAYS | MBC_VIEWER_ATTRIBUTE_OVERLAY | | ||||
| MBC_SURFACE_PER_MAT; | |||||
| case BUFFER_INDEX(vbo.lnor): | case BUFFER_INDEX(vbo.lnor): | ||||
| return MBC_SURFACE | MBC_EDIT_LNOR | MBC_WIRE_LOOPS | MBC_SURFACE_PER_MAT; | return MBC_SURFACE | MBC_EDIT_LNOR | MBC_WIRE_LOOPS | MBC_SURFACE_PER_MAT; | ||||
| case BUFFER_INDEX(vbo.edge_fac): | case BUFFER_INDEX(vbo.edge_fac): | ||||
| return MBC_WIRE_EDGES; | return MBC_WIRE_EDGES; | ||||
| case BUFFER_INDEX(vbo.weights): | case BUFFER_INDEX(vbo.weights): | ||||
| return MBC_SURFACE_WEIGHTS; | return MBC_SURFACE_WEIGHTS; | ||||
| case BUFFER_INDEX(vbo.uv): | case BUFFER_INDEX(vbo.uv): | ||||
| return MBC_SURFACE | MBC_EDITUV_FACES_STRETCH_AREA | MBC_EDITUV_FACES_STRETCH_ANGLE | | return MBC_SURFACE | MBC_EDITUV_FACES_STRETCH_AREA | MBC_EDITUV_FACES_STRETCH_ANGLE | | ||||
| ▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | switch (buffer_index) { | ||||
| case BUFFER_INDEX(vbo.attr[8]): | case BUFFER_INDEX(vbo.attr[8]): | ||||
| case BUFFER_INDEX(vbo.attr[9]): | case BUFFER_INDEX(vbo.attr[9]): | ||||
| case BUFFER_INDEX(vbo.attr[10]): | case BUFFER_INDEX(vbo.attr[10]): | ||||
| case BUFFER_INDEX(vbo.attr[11]): | case BUFFER_INDEX(vbo.attr[11]): | ||||
| case BUFFER_INDEX(vbo.attr[12]): | case BUFFER_INDEX(vbo.attr[12]): | ||||
| case BUFFER_INDEX(vbo.attr[13]): | case BUFFER_INDEX(vbo.attr[13]): | ||||
| case BUFFER_INDEX(vbo.attr[14]): | case BUFFER_INDEX(vbo.attr[14]): | ||||
| return MBC_SURFACE | MBC_SURFACE_PER_MAT; | return MBC_SURFACE | MBC_SURFACE_PER_MAT; | ||||
| case BUFFER_INDEX(vbo.attr_viewer): | |||||
| return MBC_VIEWER_ATTRIBUTE_OVERLAY; | |||||
| case BUFFER_INDEX(ibo.tris): | case BUFFER_INDEX(ibo.tris): | ||||
| return MBC_SURFACE | MBC_SURFACE_WEIGHTS | MBC_EDIT_TRIANGLES | MBC_EDIT_LNOR | | return MBC_SURFACE | MBC_SURFACE_WEIGHTS | MBC_EDIT_TRIANGLES | MBC_EDIT_LNOR | | ||||
| MBC_EDIT_MESH_ANALYSIS | MBC_EDIT_SELECTION_FACES | MBC_SCULPT_OVERLAYS; | MBC_EDIT_MESH_ANALYSIS | MBC_EDIT_SELECTION_FACES | MBC_SCULPT_OVERLAYS | | ||||
| MBC_VIEWER_ATTRIBUTE_OVERLAY; | |||||
| case BUFFER_INDEX(ibo.lines): | case BUFFER_INDEX(ibo.lines): | ||||
| return MBC_EDIT_EDGES | MBC_EDIT_SELECTION_EDGES | MBC_ALL_EDGES | MBC_WIRE_EDGES; | return MBC_EDIT_EDGES | MBC_EDIT_SELECTION_EDGES | MBC_ALL_EDGES | MBC_WIRE_EDGES; | ||||
| case BUFFER_INDEX(ibo.lines_loose): | case BUFFER_INDEX(ibo.lines_loose): | ||||
| return MBC_LOOSE_EDGES; | return MBC_LOOSE_EDGES; | ||||
| case BUFFER_INDEX(ibo.points): | case BUFFER_INDEX(ibo.points): | ||||
| return MBC_EDIT_VNOR | MBC_EDIT_VERTICES | MBC_EDIT_SELECTION_VERTS; | return MBC_EDIT_VNOR | MBC_EDIT_VERTICES | MBC_EDIT_SELECTION_VERTS; | ||||
| case BUFFER_INDEX(ibo.fdots): | case BUFFER_INDEX(ibo.fdots): | ||||
| return MBC_EDIT_FACEDOTS | MBC_EDIT_SELECTION_FACEDOTS; | return MBC_EDIT_FACEDOTS | MBC_EDIT_SELECTION_FACEDOTS; | ||||
| ▲ Show 20 Lines • Show All 792 Lines • ▼ Show 20 Lines | |||||
| GPUBatch *DRW_mesh_batch_cache_get_edit_mesh_analysis(Mesh *me) | GPUBatch *DRW_mesh_batch_cache_get_edit_mesh_analysis(Mesh *me) | ||||
| { | { | ||||
| MeshBatchCache *cache = mesh_batch_cache_get(me); | MeshBatchCache *cache = mesh_batch_cache_get(me); | ||||
| mesh_batch_cache_add_request(cache, MBC_EDIT_MESH_ANALYSIS); | mesh_batch_cache_add_request(cache, MBC_EDIT_MESH_ANALYSIS); | ||||
| return DRW_batch_request(&cache->batch.edit_mesh_analysis); | return DRW_batch_request(&cache->batch.edit_mesh_analysis); | ||||
| } | } | ||||
| void DRW_mesh_get_attributes(Object *object, | |||||
| Mesh *me, | |||||
| struct GPUMaterial **gpumat_array, | |||||
| int gpumat_array_len, | |||||
| DRW_Attributes *r_attrs, | |||||
| DRW_MeshCDMask *r_cd_needed) | |||||
| { | |||||
| DRW_Attributes attrs_needed; | |||||
| drw_attributes_clear(&attrs_needed); | |||||
| DRW_MeshCDMask cd_needed = mesh_cd_calc_used_gpu_layers( | |||||
| object, me, gpumat_array, gpumat_array_len, &attrs_needed); | |||||
| if (r_attrs) { | |||||
| *r_attrs = attrs_needed; | |||||
| } | |||||
| if (r_cd_needed) { | |||||
| *r_cd_needed = cd_needed; | |||||
| } | |||||
| } | |||||
| GPUBatch **DRW_mesh_batch_cache_get_surface_shaded(Object *object, | GPUBatch **DRW_mesh_batch_cache_get_surface_shaded(Object *object, | ||||
| Mesh *me, | Mesh *me, | ||||
| struct GPUMaterial **gpumat_array, | struct GPUMaterial **gpumat_array, | ||||
| uint gpumat_array_len) | uint gpumat_array_len) | ||||
| { | { | ||||
| MeshBatchCache *cache = mesh_batch_cache_get(me); | MeshBatchCache *cache = mesh_batch_cache_get(me); | ||||
| DRW_Attributes attrs_needed; | DRW_Attributes attrs_needed; | ||||
| drw_attributes_clear(&attrs_needed); | drw_attributes_clear(&attrs_needed); | ||||
| ▲ Show 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | GPUBatch *DRW_mesh_batch_cache_get_sculpt_overlays(Mesh *me) | ||||
| cache->cd_needed.sculpt_overlays = 1; | cache->cd_needed.sculpt_overlays = 1; | ||||
| mesh_batch_cache_add_request(cache, MBC_SCULPT_OVERLAYS); | mesh_batch_cache_add_request(cache, MBC_SCULPT_OVERLAYS); | ||||
| DRW_batch_request(&cache->batch.sculpt_overlays); | DRW_batch_request(&cache->batch.sculpt_overlays); | ||||
| return cache->batch.sculpt_overlays; | return cache->batch.sculpt_overlays; | ||||
| } | } | ||||
| GPUBatch *DRW_mesh_batch_cache_get_surface_viewer_attribute(Mesh *me) | |||||
| { | |||||
| MeshBatchCache *cache = mesh_batch_cache_get(me); | |||||
| mesh_batch_cache_add_request(cache, MBC_VIEWER_ATTRIBUTE_OVERLAY); | |||||
| DRW_batch_request(&cache->batch.surface_viewer_attribute); | |||||
| return cache->batch.surface_viewer_attribute; | |||||
| } | |||||
| /** \} */ | /** \} */ | ||||
| /* ---------------------------------------------------------------------- */ | /* ---------------------------------------------------------------------- */ | ||||
| /** \name Edit Mode API | /** \name Edit Mode API | ||||
| * \{ */ | * \{ */ | ||||
| GPUVertBuf *DRW_mesh_batch_cache_pos_vertbuf_get(Mesh *me) | GPUVertBuf *DRW_mesh_batch_cache_pos_vertbuf_get(Mesh *me) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 729 Lines • ▼ Show 20 Lines | assert_deps_valid(MBC_EDITUV_FACEDOTS, | ||||
| {BUFFER_INDEX(ibo.edituv_fdots), | {BUFFER_INDEX(ibo.edituv_fdots), | ||||
| BUFFER_INDEX(vbo.fdots_uv), | BUFFER_INDEX(vbo.fdots_uv), | ||||
| BUFFER_INDEX(vbo.fdots_edituv_data)}); | BUFFER_INDEX(vbo.fdots_edituv_data)}); | ||||
| if (DRW_batch_requested(cache->batch.edituv_fdots, GPU_PRIM_POINTS)) { | if (DRW_batch_requested(cache->batch.edituv_fdots, GPU_PRIM_POINTS)) { | ||||
| DRW_ibo_request(cache->batch.edituv_fdots, &mbuflist->ibo.edituv_fdots); | DRW_ibo_request(cache->batch.edituv_fdots, &mbuflist->ibo.edituv_fdots); | ||||
| DRW_vbo_request(cache->batch.edituv_fdots, &mbuflist->vbo.fdots_uv); | DRW_vbo_request(cache->batch.edituv_fdots, &mbuflist->vbo.fdots_uv); | ||||
| DRW_vbo_request(cache->batch.edituv_fdots, &mbuflist->vbo.fdots_edituv_data); | DRW_vbo_request(cache->batch.edituv_fdots, &mbuflist->vbo.fdots_edituv_data); | ||||
| } | } | ||||
| assert_deps_valid( | |||||
| MBC_VIEWER_ATTRIBUTE_OVERLAY, | |||||
| {BUFFER_INDEX(ibo.tris), BUFFER_INDEX(vbo.pos_nor), BUFFER_INDEX(vbo.attr_viewer)}); | |||||
| if (DRW_batch_requested(cache->batch.surface_viewer_attribute, GPU_PRIM_TRIS)) { | |||||
| DRW_ibo_request(cache->batch.surface_viewer_attribute, &mbuflist->ibo.tris); | |||||
| DRW_vbo_request(cache->batch.surface_viewer_attribute, &mbuflist->vbo.pos_nor); | |||||
| DRW_vbo_request(cache->batch.surface_viewer_attribute, &mbuflist->vbo.attr_viewer); | |||||
| } | |||||
| #ifdef DEBUG | #ifdef DEBUG | ||||
| auto assert_final_deps_valid = [&](const int buffer_index) { | auto assert_final_deps_valid = [&](const int buffer_index) { | ||||
| BLI_assert(batches_that_use_buffer(buffer_index) == | BLI_assert(batches_that_use_buffer(buffer_index) == | ||||
| batches_that_use_buffer_local.lookup(buffer_index)); | batches_that_use_buffer_local.lookup(buffer_index)); | ||||
| }; | }; | ||||
| assert_final_deps_valid(BUFFER_INDEX(vbo.lnor)); | assert_final_deps_valid(BUFFER_INDEX(vbo.lnor)); | ||||
| assert_final_deps_valid(BUFFER_INDEX(vbo.pos_nor)); | assert_final_deps_valid(BUFFER_INDEX(vbo.pos_nor)); | ||||
| Show All 15 Lines | #ifdef DEBUG | ||||
| assert_final_deps_valid(BUFFER_INDEX(vbo.edituv_data)); | assert_final_deps_valid(BUFFER_INDEX(vbo.edituv_data)); | ||||
| assert_final_deps_valid(BUFFER_INDEX(vbo.edituv_stretch_area)); | assert_final_deps_valid(BUFFER_INDEX(vbo.edituv_stretch_area)); | ||||
| assert_final_deps_valid(BUFFER_INDEX(vbo.edituv_stretch_angle)); | assert_final_deps_valid(BUFFER_INDEX(vbo.edituv_stretch_angle)); | ||||
| assert_final_deps_valid(BUFFER_INDEX(vbo.fdots_uv)); | assert_final_deps_valid(BUFFER_INDEX(vbo.fdots_uv)); | ||||
| assert_final_deps_valid(BUFFER_INDEX(vbo.fdots_edituv_data)); | assert_final_deps_valid(BUFFER_INDEX(vbo.fdots_edituv_data)); | ||||
| for (const int i : IndexRange(GPU_MAX_ATTR)) { | for (const int i : IndexRange(GPU_MAX_ATTR)) { | ||||
| assert_final_deps_valid(BUFFER_INDEX(vbo.attr[i])); | assert_final_deps_valid(BUFFER_INDEX(vbo.attr[i])); | ||||
| } | } | ||||
| assert_final_deps_valid(BUFFER_INDEX(vbo.attr_viewer)); | |||||
| assert_final_deps_valid(BUFFER_INDEX(ibo.tris)); | assert_final_deps_valid(BUFFER_INDEX(ibo.tris)); | ||||
| assert_final_deps_valid(BUFFER_INDEX(ibo.lines)); | assert_final_deps_valid(BUFFER_INDEX(ibo.lines)); | ||||
| assert_final_deps_valid(BUFFER_INDEX(ibo.lines_loose)); | assert_final_deps_valid(BUFFER_INDEX(ibo.lines_loose)); | ||||
| assert_final_deps_valid(BUFFER_INDEX(ibo.lines_adjacency)); | assert_final_deps_valid(BUFFER_INDEX(ibo.lines_adjacency)); | ||||
| assert_final_deps_valid(BUFFER_INDEX(ibo.lines_paint_mask)); | assert_final_deps_valid(BUFFER_INDEX(ibo.lines_paint_mask)); | ||||
| assert_final_deps_valid(BUFFER_INDEX(ibo.points)); | assert_final_deps_valid(BUFFER_INDEX(ibo.points)); | ||||
| assert_final_deps_valid(BUFFER_INDEX(ibo.fdots)); | assert_final_deps_valid(BUFFER_INDEX(ibo.fdots)); | ||||
| ▲ Show 20 Lines • Show All 92 Lines • Show Last 20 Lines | |||||