Commit: 46a27e3e95374bc37522e71fdfbe730f1dc20555 Author: Hans Goudey Date: Mon Feb 6 17:04:43 2023 -0500 Branches: refactor-mesh-corners-generic https://developer.blender.org/rB46a27e3e95374bc37522e71fdfbe730f1dc20555
Merge branch 'master' into refactor-mesh-corners-generic =================================================================== =================================================================== diff --cc source/blender/blenkernel/intern/mesh_boolean_convert.cc index 2d11929219c,60ca6e865dd..d9c2b95e536 --- a/source/blender/blenkernel/intern/mesh_boolean_convert.cc +++ b/source/blender/blenkernel/intern/mesh_boolean_convert.cc @@@ -563,10 -562,10 +562,10 @@@ static void get_poly2d_cos(const Mesh * reinterpret_cast<const float(*)[3]>(positions.data()), axis_dominant); axis_dominant_v3_to_m3(r_axis_mat, axis_dominant); - for (const int i : poly_loops.index_range()) { - float3 co = positions[poly_loops[i].v]; + for (const int i : poly_verts.index_range()) { + float3 co = positions[poly_verts[i]]; - co = trans_mat * co; - mul_v2_m3v3(cos_2d[i], r_axis_mat, co); + co = math::transform_point(trans_mat, co); + *reinterpret_cast<float2 *>(&cos_2d[i]) = (float3x3(r_axis_mat) * co).xy(); } } diff --cc source/blender/blenkernel/intern/mesh_iterators.cc index d6f739b898f,45ad8f2b626..6413d9fd3be --- a/source/blender/blenkernel/intern/mesh_iterators.cc +++ b/source/blender/blenkernel/intern/mesh_iterators.cc @@@ -323,26 -324,26 +322,26 @@@ void BKE_mesh_foreach_mapped_subdiv_fac if (orig == ORIGINDEX_NONE) { continue; } - ml = &loops[mp->loopstart]; - for (int j = 0; j < mp->totloop; j++, ml++) { - if (facedot_tags[ml->v]) { + for (int j = 0; j < mp->totloop; j++) { + const int vert = corner_verts[mp->loopstart + j]; - if (BLI_BITMAP_TEST(facedot_tags, vert)) { ++ if (facedot_tags[vert]) { func(userData, orig, - positions[ml->v], - (flag & MESH_FOREACH_USE_NORMAL) ? vert_normals[ml->v] : nullptr); + positions[vert], + (flag & MESH_FOREACH_USE_NORMAL) ? vert_normals[vert] : nullptr); } } } } else { for (int i = 0; i < mesh->totpoly; i++, mp++) { - ml = &loops[mp->loopstart]; - for (int j = 0; j < mp->totloop; j++, ml++) { - if (facedot_tags[ml->v]) { + for (int j = 0; j < mp->totloop; j++) { + const int vert = corner_verts[mp->loopstart + j]; - if (BLI_BITMAP_TEST(facedot_tags, vert)) { ++ if (facedot_tags[vert]) { func(userData, i, - positions[ml->v], - (flag & MESH_FOREACH_USE_NORMAL) ? vert_normals[ml->v] : nullptr); + positions[vert], + (flag & MESH_FOREACH_USE_NORMAL) ? vert_normals[vert] : nullptr); } } } diff --cc source/blender/blenkernel/intern/pbvh.cc index ddfe4f52606,7c829d32a82..991fbd03be4 --- a/source/blender/blenkernel/intern/pbvh.cc +++ b/source/blender/blenkernel/intern/pbvh.cc @@@ -677,8 -677,7 +677,8 @@@ static void pbvh_draw_args_init(PBVH *p args->face_sets_color_default = pbvh->face_sets_color_default; args->face_sets_color_seed = pbvh->face_sets_color_seed; args->vert_positions = pbvh->vert_positions; - args->corner_verts = pbvh->corner_verts; - args->corner_edges = pbvh->mesh ? BKE_mesh_corner_edges(pbvh->mesh) : NULL; - args->mloop = pbvh->mloop; ++ args->corner_verts = {pbvh->corner_verts, pbvh->mesh->totloop}; ++ args->corner_edges = pbvh->mesh ? pbvh->mesh->corner_edges() : blender::Span<int>(); args->mpoly = pbvh->mpoly; args->mlooptri = pbvh->looptri; diff --cc source/blender/draw/DRW_pbvh.hh index 00000000000,74cf1f93594..1d17b2392a3 mode 000000,100644..100644 --- a/source/blender/draw/DRW_pbvh.hh +++ b/source/blender/draw/DRW_pbvh.hh @@@ -1,0 -1,89 +1,91 @@@ + /* SPDX-License-Identifier: GPL-2.0-or-later + * Copyright 2022 Blender Foundation. */ + + /** \file + * \ingroup draw + */ + + #pragma once + + /* Needed for BKE_ccg.h. */ + #include "BLI_assert.h" + #include "BLI_bitmap.h" ++#include "BLI_span.hh" + + #include "BKE_ccg.h" + + struct PBVHAttrReq; + struct GPUBatch; + struct PBVHNode; + struct PBVHBatches; + struct PBVHGPUFormat; + struct GSet; + struct DMFlagMat; + struct Mesh; + struct MLoopTri; + struct CustomData; + struct MLoop; + struct MPoly; + struct SubdivCCG; + struct BMesh; + + struct PBVH_GPU_Args { + int pbvh_type; + + BMesh *bm; + const Mesh *me; + const float (*vert_positions)[3]; - const MLoop *mloop; ++ blender::Span<int> corner_verts; ++ blender::Span<int> corner_edges; + const MPoly *mpoly; + int mesh_verts_num, mesh_faces_num, mesh_grids_num; + CustomData *vdata, *ldata, *pdata; + const float (*vert_normals)[3]; + + const char *active_color; + const char *render_color; + + int face_sets_color_seed, face_sets_color_default; + int *face_sets; /* for PBVH_FACES and PBVH_GRIDS */ + + SubdivCCG *subdiv_ccg; + const DMFlagMat *grid_flag_mats; + const int *grid_indices; + CCGKey ccg_key; + CCGElem **grids; + void **gridfaces; + BLI_bitmap **grid_hidden; + + int *prim_indices; + int totprim; + + const bool *hide_poly; + + int node_verts_num; + + const MLoopTri *mlooptri; + PBVHNode *node; + + /* BMesh. */ + GSet *bm_unique_vert, *bm_other_verts, *bm_faces; + int cd_mask_layer; + }; + + void DRW_pbvh_node_update(PBVHBatches *batches, PBVH_GPU_Args *args); + void DRW_pbvh_update_pre(PBVHBatches *batches, PBVH_GPU_Args *args); + + void DRW_pbvh_node_gpu_flush(PBVHBatches *batches); + PBVHBatches *DRW_pbvh_node_create(PBVH_GPU_Args *args); + void DRW_pbvh_node_free(PBVHBatches *batches); + GPUBatch *DRW_pbvh_tris_get(PBVHBatches *batches, + PBVHAttrReq *attrs, + int attrs_num, + PBVH_GPU_Args *args, + int *r_prim_count, + bool do_coarse_grids); + GPUBatch *DRW_pbvh_lines_get(PBVHBatches *batches, + PBVHAttrReq *attrs, + int attrs_num, + PBVH_GPU_Args *args, + int *r_prim_count, + bool do_coarse_grids); diff --cc source/blender/draw/intern/draw_pbvh.cc index 47433517d65,04d985be71e..638f8a517dc --- a/source/blender/draw/intern/draw_pbvh.cc +++ b/source/blender/draw/intern/draw_pbvh.cc @@@ -549,10 -548,10 +549,10 @@@ struct PBVHBatches void fill_vbo_faces(PBVHVbo &vbo, PBVH_GPU_Args *args) { ++ const blender::Span<int> corner_verts = args->corner_verts; auto foreach_faces = [&](std::function<void(int buffer_i, int tri_i, int vertex_i, const MLoopTri *tri)> func) { int buffer_i = 0; - const int *corner_verts = args->corner_verts; - const MLoop *mloop = args->mloop; for (int i : IndexRange(args->totprim)) { int face_index = args->mlooptri[args->prim_indices[i]].poly; @@@ -993,8 -992,7 +993,8 @@@ } int r_edges[3]; - BKE_mesh_looptri_get_real_edges(edges.data(), args->mloop, lt, r_edges); + BKE_mesh_looptri_get_real_edges( - edges.data(), args->corner_verts, args->corner_edges, lt, r_edges); ++ edges.data(), args->corner_verts.data(), args->corner_edges.data(), lt, r_edges); if (r_edges[0] != -1) { edge_count++; @@@ -1019,8 -1017,7 +1019,8 @@@ } int r_edges[3]; - BKE_mesh_looptri_get_real_edges(edges.data(), args->mloop, lt, r_edges); + BKE_mesh_looptri_get_real_edges( - edges.data(), args->corner_verts, args->corner_edges, lt, r_edges); ++ edges.data(), args->corner_verts.data(), args->corner_edges.data(), lt, r_edges); if (r_edges[0] != -1) { GPU_indexbuf_add_line_verts(&elb_lines, vertex_i, vertex_i + 1); diff --cc source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc index f661e5fb956,233241ad776..eba70ed8850 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc @@@ -555,14 -557,15 +555,14 @@@ static void extract_edituv_fdots_iter_p const bool mp_select = (efa) ? BM_elem_flag_test_bool(efa, BM_ELEM_SELECT) : false; if (mr->use_subsurf_fdots) { - const BLI_bitmap *facedot_tags = mr->me->runtime->subsurf_face_dot_tags; + const BitVector<> &facedot_tags = mr->me->runtime->subsurf_face_dot_tags; - const MLoop *mloop = mr->mloop; const int ml_index_end = mp->loopstart + mp->totloop; for (int ml_index = mp->loopstart; ml_index < ml_index_end; ml_index += 1) { - const int vert_i = mr->corner_verts[ml_index]; - const MLoop *ml = &mloop[ml_index]; ++ const int vert = mr->corner_verts[ml_index]; const bool real_fdot = !mr->p_origindex || (mr->p_origindex[mp_index] != ORIGINDEX_NONE); - const bool subd_fdot = BLI_BITMAP_TEST(facedot_tags, vert_i); - const bool subd_fdot = facedot_tags[ml->v]; ++ const bool subd_fdot = facedot_tags[vert]; edituv_facedot_add(data, mp_hidden || !real_fdot || !subd_fdot, mp_select, mp_index); } } diff --cc source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_fdots.cc index b99dfe1721a,bd04f6dbb03..3785fff3245 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_fdots.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_fdots.cc @@@ -46,12 -46,13 +46,12 @@@ static void extract_fdots_iter_poly_mes GPUIndexBufBuilder *elb = static_cast<GPUIndexBufBuilder *>(_userdata); if (mr->use_subsurf_fdots) { - const BLI_bitmap *facedot_tags = mr->me->runtime->subsurf_face_dot_tags; + const BitVector<> &facedot_tags = mr->me->runtime->subsurf_face_dot_tags; - const MLoop *mloop = mr->mloop; const int ml_index_end = mp->loopstart + mp->totloop; for (int ml_index = mp->loopstart; ml_index < ml_index_end; ml_index += 1) { - const int vert_i = mr->corner_verts[ml_index]; - if (BLI_BITMAP_TEST(facedot_tags, vert_i) && !hidden) { - const MLoop *ml = &mloop[ml_index]; - if (facedot_tags[ml->v] && !hidden) { ++ const int vert = mr->corner_verts[ml_index]; ++ if (facedot_tags[vert] && !hidden) { GPU_indexbuf_s @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs