Differential D14171 Diff 48840 source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc
Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc
| Show First 20 Lines • Show All 250 Lines • ▼ Show 20 Lines | static void extract_edit_data_iter_lvert_mesh(const MeshRenderData *mr, | ||||
| const int v_index = mr->lverts[lvert_index]; | const int v_index = mr->lverts[lvert_index]; | ||||
| BMVert *eve = bm_original_vert_get(mr, v_index); | BMVert *eve = bm_original_vert_get(mr, v_index); | ||||
| if (eve) { | if (eve) { | ||||
| mesh_render_data_vert_flag(mr, eve, data); | mesh_render_data_vert_flag(mr, eve, data); | ||||
| } | } | ||||
| } | } | ||||
| static void extract_edit_data_init_subdiv(const DRWSubdivCache *subdiv_cache, | static void extract_edit_data_init_subdiv(const DRWSubdivCache *subdiv_cache, | ||||
| const MeshRenderData *mr, | const MeshRenderData *UNUSED(mr), | ||||
| MeshBatchCache *UNUSED(cache), | MeshBatchCache *UNUSED(cache), | ||||
| void *buf, | void *buf, | ||||
| void *data) | void *data) | ||||
| { | { | ||||
| const DRWSubdivLooseGeom &loose_geom = subdiv_cache->loose_geom; | |||||
| GPUVertBuf *vbo = static_cast<GPUVertBuf *>(buf); | GPUVertBuf *vbo = static_cast<GPUVertBuf *>(buf); | ||||
| GPU_vertbuf_init_with_format(vbo, get_edit_data_format()); | GPU_vertbuf_init_with_format(vbo, get_edit_data_format()); | ||||
| GPU_vertbuf_data_alloc(vbo, subdiv_cache->num_subdiv_loops + mr->loop_loose_len); | GPU_vertbuf_data_alloc(vbo, subdiv_cache->num_subdiv_loops + loose_geom.loop_len); | ||||
| EditLoopData *vbo_data = (EditLoopData *)GPU_vertbuf_get_data(vbo); | EditLoopData *vbo_data = (EditLoopData *)GPU_vertbuf_get_data(vbo); | ||||
| *(EditLoopData **)data = vbo_data; | *(EditLoopData **)data = vbo_data; | ||||
| } | } | ||||
| static void extract_edit_data_iter_subdiv_bm(const DRWSubdivCache *subdiv_cache, | static void extract_edit_data_iter_subdiv_bm(const DRWSubdivCache *subdiv_cache, | ||||
| const MeshRenderData *mr, | const MeshRenderData *mr, | ||||
| void *_data, | void *_data, | ||||
| uint subdiv_quad_index, | uint subdiv_quad_index, | ||||
| ▲ Show 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| const int coarse_quad_index = static_cast<int>(coarse_quad - mr->mpoly); | const int coarse_quad_index = static_cast<int>(coarse_quad - mr->mpoly); | ||||
| BMFace *coarse_quad_bm = bm_original_face_get(mr, coarse_quad_index); | BMFace *coarse_quad_bm = bm_original_face_get(mr, coarse_quad_index); | ||||
| extract_edit_data_iter_subdiv_bm(subdiv_cache, mr, _data, subdiv_quad_index, coarse_quad_bm); | extract_edit_data_iter_subdiv_bm(subdiv_cache, mr, _data, subdiv_quad_index, coarse_quad_bm); | ||||
| } | } | ||||
| static void extract_edit_data_loose_geom_subdiv(const DRWSubdivCache *subdiv_cache, | static void extract_edit_data_loose_geom_subdiv(const DRWSubdivCache *subdiv_cache, | ||||
| const MeshRenderData *mr, | const MeshRenderData *mr, | ||||
| const MeshExtractLooseGeom *loose_geom, | |||||
| void *UNUSED(buffer), | void *UNUSED(buffer), | ||||
| void *_data) | void *_data) | ||||
| { | { | ||||
| if (loose_geom->edge_len == 0) { | const DRWSubdivLooseGeom &loose_geom = subdiv_cache->loose_geom; | ||||
| if (loose_geom.edge_len == 0) { | |||||
| return; | return; | ||||
| } | } | ||||
| blender::Span<DRWSubdivLooseEdge> loose_edges = draw_subdiv_cache_get_loose_edges(subdiv_cache); | |||||
| EditLoopData *vbo_data = *(EditLoopData **)_data; | EditLoopData *vbo_data = *(EditLoopData **)_data; | ||||
| int ledge_index = 0; | |||||
| for (int ledge_index = 0; ledge_index < loose_geom->edge_len; ledge_index++) { | for (const DRWSubdivLooseEdge &loose_edge : loose_edges) { | ||||
| const int offset = subdiv_cache->num_subdiv_loops + ledge_index * 2; | const int offset = subdiv_cache->num_subdiv_loops + ledge_index++ * 2; | ||||
| EditLoopData *data = &vbo_data[offset]; | EditLoopData *data = &vbo_data[offset]; | ||||
| memset(data, 0, sizeof(EditLoopData)); | memset(data, 0, sizeof(EditLoopData)); | ||||
| const int edge_index = loose_geom->edges[ledge_index]; | const int edge_index = loose_edge.coarse_edge_index; | ||||
| BMEdge *eed = mr->e_origindex ? bm_original_edge_get(mr, edge_index) : | BMEdge *eed = mr->e_origindex ? bm_original_edge_get(mr, edge_index) : | ||||
| BM_edge_at_index(mr->bm, edge_index); | BM_edge_at_index(mr->bm, edge_index); | ||||
| mesh_render_data_edge_flag(mr, eed, &data[0]); | mesh_render_data_edge_flag(mr, eed, &data[0]); | ||||
| data[1] = data[0]; | data[1] = data[0]; | ||||
| const DRWSubdivLooseVertex &v1 = loose_geom.verts[loose_edge.loose_subdiv_v1_index]; | |||||
| const DRWSubdivLooseVertex &v2 = loose_geom.verts[loose_edge.loose_subdiv_v2_index]; | |||||
| if (v1.coarse_vertex_index != -1u) { | |||||
| mesh_render_data_vert_flag(mr, eed->v1, &data[0]); | mesh_render_data_vert_flag(mr, eed->v1, &data[0]); | ||||
| } | |||||
| if (v2.coarse_vertex_index != -1u) { | |||||
| mesh_render_data_vert_flag(mr, eed->v2, &data[1]); | mesh_render_data_vert_flag(mr, eed->v2, &data[1]); | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| constexpr MeshExtract create_extractor_edit_data() | constexpr MeshExtract create_extractor_edit_data() | ||||
| { | { | ||||
| MeshExtract extractor = {nullptr}; | MeshExtract extractor = {nullptr}; | ||||
| extractor.init = extract_edit_data_init; | extractor.init = extract_edit_data_init; | ||||
| extractor.iter_poly_bm = extract_edit_data_iter_poly_bm; | extractor.iter_poly_bm = extract_edit_data_iter_poly_bm; | ||||
| extractor.iter_poly_mesh = extract_edit_data_iter_poly_mesh; | extractor.iter_poly_mesh = extract_edit_data_iter_poly_mesh; | ||||
| extractor.iter_ledge_bm = extract_edit_data_iter_ledge_bm; | extractor.iter_ledge_bm = extract_edit_data_iter_ledge_bm; | ||||
| Show All 21 Lines | |||||