From eab579cbcb5087156441ecfb2790c51007483c3a Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 18 Feb 2025 15:13:17 +0100 Subject: [PATCH] [render] move Buffers enum in MeshRenderInfo class --- .../vclib/bgfx/drawable/drawable_mesh.h | 4 +- .../bgfx/drawable/mesh/mesh_render_buffers.h | 43 +++++----- .../render/drawable/mesh/mesh_buffer_id.h | 80 ------------------- .../render/drawable/mesh/mesh_render_data.h | 35 ++++---- .../render/drawable/mesh/mesh_render_info.h | 44 ++++++++++ .../src/vclib/bgfx/drawable/drawable_axis.cpp | 11 ++- 6 files changed, 94 insertions(+), 123 deletions(-) delete mode 100644 vclib/render/include/vclib/render/drawable/mesh/mesh_buffer_id.h diff --git a/vclib/render/include/vclib/bgfx/drawable/drawable_mesh.h b/vclib/render/include/vclib/bgfx/drawable/drawable_mesh.h index 36fbf2281..a162f2749 100644 --- a/vclib/render/include/vclib/bgfx/drawable/drawable_mesh.h +++ b/vclib/render/include/vclib/bgfx/drawable/drawable_mesh.h @@ -181,7 +181,7 @@ class DrawableMeshBGFX : public AbstractDrawableMesh, public MeshType if (mMRS.isWireframe(MRI::Wireframe::VISIBLE)) { if (bgfx::isValid(mProgramWireframe)) { mMRB.bindVertexBuffers(mMRS); - mMRB.bindIndexBuffers(MeshBufferId::WIREFRAME); + mMRB.bindIndexBuffers(MRI::Buffers::WIREFRAME); bindUniforms(); bgfx::setState(state | BGFX_STATE_PT_LINES); @@ -193,7 +193,7 @@ class DrawableMeshBGFX : public AbstractDrawableMesh, public MeshType if (mMRS.isEdges(MRI::Edges::VISIBLE)) { if (bgfx::isValid(mProgramEdges)) { mMRB.bindVertexBuffers(mMRS); - mMRB.bindIndexBuffers(MeshBufferId::EDGES); + mMRB.bindIndexBuffers(MRI::Buffers::EDGES); bindUniforms(); bgfx::setState(state | BGFX_STATE_PT_LINES); diff --git a/vclib/render/include/vclib/bgfx/drawable/mesh/mesh_render_buffers.h b/vclib/render/include/vclib/bgfx/drawable/mesh/mesh_render_buffers.h index fb0292e7b..62a19a3f7 100644 --- a/vclib/render/include/vclib/bgfx/drawable/mesh/mesh_render_buffers.h +++ b/vclib/render/include/vclib/bgfx/drawable/mesh/mesh_render_buffers.h @@ -31,7 +31,6 @@ #include #include #include -#include #include #include @@ -42,7 +41,9 @@ namespace vcl { template class MeshRenderBuffers { - BuffersToFill mBuffersToFill = BUFFERS_TO_FILL_ALL; + using MRI = MeshRenderInfo; + + MRI::BuffersBitSet mBuffersToFill = MRI::BUFFERS_ALL; VertexBuffer mVertexCoordsBuffer; VertexBuffer mVertexNormalsBuffer; @@ -72,8 +73,8 @@ class MeshRenderBuffers MeshRenderBuffers() = default; MeshRenderBuffers( - const MeshType& mesh, - BuffersToFill buffersToFill = BUFFERS_TO_FILL_ALL) : + const MeshType& mesh, + MRI::BuffersBitSet buffersToFill = MRI::BUFFERS_ALL) : mBuffersToFill(buffersToFill) { createBGFXBuffers(mesh); @@ -139,9 +140,11 @@ class MeshRenderBuffers } void bindIndexBuffers( - MeshBufferId indexBufferToBind = MeshBufferId::TRIANGLES) const + MRI::Buffers indexBufferToBind = MRI::Buffers::TRIANGLES) const { - if (indexBufferToBind == MeshBufferId::TRIANGLES) { + using enum MRI::Buffers; + + if (indexBufferToBind == TRIANGLES) { mTriangleIndexBuffer.bind(); mTriangleNormalBuffer.bind(VCL_MRB_PRIMITIVE_NORMAL_BUFFER); @@ -151,14 +154,14 @@ class MeshRenderBuffers mTriangleTextureIndexBuffer.bind( VCL_MRB_TRIANGLE_TEXTURE_ID_BUFFER); } - else if (indexBufferToBind == MeshBufferId::EDGES) { + else if (indexBufferToBind == EDGES) { mEdgeIndexBuffer.bind(); mEdgeNormalBuffer.bind(VCL_MRB_PRIMITIVE_NORMAL_BUFFER); mEdgeColorBuffer.bind(VCL_MRB_PRIMITIVE_COLOR_BUFFER); } - else if (indexBufferToBind == MeshBufferId::WIREFRAME) { + else if (indexBufferToBind == WIREFRAME) { mWireframeIndexBuffer.bind(); } } @@ -177,7 +180,7 @@ class MeshRenderBuffers private: void createBGFXBuffers(const MeshType& mesh) { - using enum MeshBufferId; + using enum MRI::Buffers; std::vector> vwm; std::list vtd; @@ -277,7 +280,7 @@ class MeshRenderBuffers const auto& vtd, const auto& ftr) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerVertexNormal) { if (mBuffersToFill[toUnderlying(VERT_NORMALS)]) { @@ -309,7 +312,7 @@ class MeshRenderBuffers const auto& vtd, const auto& ftr) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerVertexColor) { if (mBuffersToFill[toUnderlying(VERT_COLORS)]) { @@ -342,7 +345,7 @@ class MeshRenderBuffers const auto& vtd, const auto& ftr) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerVertexTexCoord) { if (mBuffersToFill[toUnderlying(VERT_TEXCOORDS)]) { @@ -374,7 +377,7 @@ class MeshRenderBuffers const auto& vtd, const auto& ftr) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerFaceWedgeTexCoords) { if (mBuffersToFill[toUnderlying(WEDGE_TEXCOORDS)]) { @@ -407,7 +410,7 @@ class MeshRenderBuffers const auto& ftr, TriPolyIndexBiMap& indexMap) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasFaces) { const uint NUM_TRIS = vcl::countTriangulatedTriangles(mesh); @@ -428,7 +431,7 @@ class MeshRenderBuffers const MeshType& mesh, const TriPolyIndexBiMap& indexMap) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerFaceNormal) { if (mBuffersToFill[toUnderlying(TRI_NORMALS)]) { @@ -456,7 +459,7 @@ class MeshRenderBuffers const MeshType& mesh, const TriPolyIndexBiMap& indexMap) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerFaceColor) { if (mBuffersToFill[toUnderlying(TRI_COLORS)]) { @@ -484,7 +487,7 @@ class MeshRenderBuffers const MeshType& mesh, const TriPolyIndexBiMap& indexMap) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerFaceWedgeTexCoords) { if (mBuffersToFill[toUnderlying(WEDGE_TEXCOORDS)]) { @@ -522,7 +525,7 @@ class MeshRenderBuffers void createEdgeNormalsBuffer(const MeshType& mesh) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerEdgeNormal) { if (mBuffersToFill[toUnderlying(EDGE_NORMALS)]) { @@ -546,7 +549,7 @@ class MeshRenderBuffers void createEdgeColorsBuffer(const MeshType& mesh) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerEdgeColor) { if (mBuffersToFill[toUnderlying(EDGE_COLORS)]) { @@ -569,7 +572,7 @@ class MeshRenderBuffers void createWireframeIndicesBuffer(const MeshType& mesh) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasFaces) { const uint NUM_EDGES = vcl::countPerFaceVertexReferences(mesh); diff --git a/vclib/render/include/vclib/render/drawable/mesh/mesh_buffer_id.h b/vclib/render/include/vclib/render/drawable/mesh/mesh_buffer_id.h deleted file mode 100644 index 014974fde..000000000 --- a/vclib/render/include/vclib/render/drawable/mesh/mesh_buffer_id.h +++ /dev/null @@ -1,80 +0,0 @@ -/***************************************************************************** - * VCLib * - * Visual Computing Library * - * * - * Copyright(C) 2021-2025 * - * Visual Computing Lab * - * ISTI - Italian National Research Council * - * * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the Mozilla Public License Version 2.0 as published * - * by the Mozilla Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * Mozilla Public License Version 2.0 * - * (https://www.mozilla.org/en-US/MPL/2.0/) for more details. * - ****************************************************************************/ - -#ifndef VCL_RENDER_DRAWABLE_MESH_MESH_BUFFER_ID_H -#define VCL_RENDER_DRAWABLE_MESH_MESH_BUFFER_ID_H - -#include -#include - -namespace vcl { - -enum class MeshBufferId : uint { - VERTICES, - VERT_NORMALS, - VERT_COLORS, - VERT_TEXCOORDS, - - TRIANGLES, - TRI_NORMALS, - TRI_COLORS, - WEDGE_TEXCOORDS, - - WIREFRAME, - - EDGES, - EDGE_COLORS, - EDGE_NORMALS, - - TEXTURES, - - COUNT, -}; - -namespace detail { -using BuffersToFillUnderlyingType = ushort; -} // namespace detail - -static_assert( - sizeof(detail::BuffersToFillUnderlyingType) < (uint) MeshBufferId::COUNT, - "BuffersToFill is not able to store all MeshBufferID values"); - -using BuffersToFill = vcl::BitSet; - -namespace detail { - -inline BuffersToFill buffersToFillAll() -{ - BuffersToFill all; - all.set(); - return all; -} - -} // namespace detail - -const inline BuffersToFill BUFFERS_TO_FILL_NONE = BuffersToFill(); - -const inline BuffersToFill BUFFERS_TO_FILL_ALL = detail::buffersToFillAll(); - -} // namespace vcl - -#endif // VCL_RENDER_DRAWABLE_MESH_MESH_BUFFER_ID_H diff --git a/vclib/render/include/vclib/render/drawable/mesh/mesh_render_data.h b/vclib/render/include/vclib/render/drawable/mesh/mesh_render_data.h index 4f32fcf67..ebf190a2c 100644 --- a/vclib/render/include/vclib/render/drawable/mesh/mesh_render_data.h +++ b/vclib/render/include/vclib/render/drawable/mesh/mesh_render_data.h @@ -23,8 +23,7 @@ #ifndef VCL_RENDER_DRAWABLE_MESH_MESH_RENDER_DATA_H #define VCL_RENDER_DRAWABLE_MESH_MESH_RENDER_DATA_H -#include "mesh_buffer_id.h" -#include "mesh_render_settings.h" +#include "mesh_render_info.h" #include #include @@ -40,7 +39,9 @@ namespace vcl { template class MeshRenderData { - BuffersToFill mBuffersToFill = BUFFERS_TO_FILL_ALL; + using MRI = MeshRenderInfo; + + MRI::BuffersBitSet mBuffersToFill = MRI::BUFFERS_ALL; std::vector mVerts; std::vector mTris; @@ -69,7 +70,7 @@ class MeshRenderData MeshRenderData( const MeshType& m, - BuffersToFill buffersToFill = BUFFERS_TO_FILL_ALL) : + MRI::BuffersBitSet buffersToFill = MRI::BUFFERS_ALL) : mBuffersToFill(buffersToFill) { update(m); @@ -77,7 +78,7 @@ class MeshRenderData void update(const MeshType& mesh) { - using enum MeshBufferId; + using enum MRI::Buffers; clear(); @@ -331,7 +332,7 @@ class MeshRenderData const auto& vtd, const auto& ftr) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerVertexNormal) { if (mBuffersToFill[toUnderlying(VERT_NORMALS)]) { @@ -354,7 +355,7 @@ class MeshRenderData const auto& vtd, const auto& ftr) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerVertexColor) { if (mBuffersToFill[toUnderlying(VERT_COLORS)]) { @@ -378,7 +379,7 @@ class MeshRenderData const auto& vtd, const auto& ftr) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerVertexTexCoord) { if (mBuffersToFill[toUnderlying(VERT_TEXCOORDS)]) { @@ -401,7 +402,7 @@ class MeshRenderData const auto& vtd, const auto& ftr) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerFaceWedgeTexCoords) { if (mBuffersToFill[toUnderlying(WEDGE_TEXCOORDS)]) { @@ -424,7 +425,7 @@ class MeshRenderData const auto& ftr, TriPolyIndexBiMap& indexMap) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasFaces) { const uint NUM_TRIS = vcl::countTriangulatedTriangles(mesh); @@ -446,7 +447,7 @@ class MeshRenderData const MeshType& mesh, const TriPolyIndexBiMap& indexMap) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerFaceNormal) { if (mBuffersToFill[toUnderlying(TRI_NORMALS)]) { @@ -469,7 +470,7 @@ class MeshRenderData const MeshType& mesh, const TriPolyIndexBiMap& indexMap) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerFaceColor) { if (mBuffersToFill[toUnderlying(TRI_COLORS)]) { @@ -489,7 +490,7 @@ class MeshRenderData const MeshType& mesh, const TriPolyIndexBiMap& indexMap) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr ( vcl::HasFaces && vcl::HasPerVertexTexCoord) { @@ -510,7 +511,7 @@ class MeshRenderData const MeshType& mesh, const TriPolyIndexBiMap& indexMap) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerFaceWedgeTexCoords) { if (mBuffersToFill[toUnderlying(WEDGE_TEXCOORDS)]) { @@ -537,7 +538,7 @@ class MeshRenderData void createEdgeNormalsBuffer(const MeshType& mesh) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerEdgeNormal) { if (mBuffersToFill[toUnderlying(EDGE_NORMALS)]) { @@ -552,7 +553,7 @@ class MeshRenderData void createEdgeColorsBuffer(const MeshType& mesh) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasPerEdgeColor) { if (mBuffersToFill[toUnderlying(EDGE_COLORS)]) { @@ -568,7 +569,7 @@ class MeshRenderData void createWireframeIndicesBuffer(const MeshType& mesh) { - using enum MeshBufferId; + using enum MRI::Buffers; if constexpr (vcl::HasFaces) { const uint NUM_EDGES = vcl::countPerFaceVertexReferences(mesh); diff --git a/vclib/render/include/vclib/render/drawable/mesh/mesh_render_info.h b/vclib/render/include/vclib/render/drawable/mesh/mesh_render_info.h index 299726be0..9cc06cae5 100644 --- a/vclib/render/include/vclib/render/drawable/mesh/mesh_render_info.h +++ b/vclib/render/include/vclib/render/drawable/mesh/mesh_render_info.h @@ -60,6 +60,30 @@ auto constexpr makeExclusiveReangesArray(auto... args) class MeshRenderInfo { public: + enum class Buffers : uint { + VERTICES, + VERT_NORMALS, + VERT_COLORS, + VERT_TEXCOORDS, + + TRIANGLES, + TRI_NORMALS, + TRI_COLORS, + WEDGE_TEXCOORDS, + + WIREFRAME, + + EDGES, + EDGE_COLORS, + EDGE_NORMALS, + + TEXTURES, + + MESH_UNIFORMS, + + COUNT, + }; + /** * @brief List of primitives for which settings can be stored. */ @@ -73,12 +97,32 @@ class MeshRenderInfo }; private: + using BuffersBitSetUnderlyingType = ushort; + + static_assert( + sizeof(BuffersBitSetUnderlyingType) < (uint) Buffers::COUNT, + "BuffersBitSet is not able to store all enum Buffers values"); + bool mVisible; // settings for each primitive std::array mSettings; public: + using BuffersBitSet = vcl::BitSet; + +private: + static BuffersBitSet buffersAll() { + BuffersBitSet all; + all.set(); + return all; + } + +public: + static const inline BuffersBitSet BUFFERS_NONE = BuffersBitSet(); + + static const inline BuffersBitSet BUFFERS_ALL = buffersAll(); + /** * @brief List of possible settings for the points primitive. */ diff --git a/vclib/render/src/vclib/bgfx/drawable/drawable_axis.cpp b/vclib/render/src/vclib/bgfx/drawable/drawable_axis.cpp index 23e19ab24..5f09647b0 100644 --- a/vclib/render/src/vclib/bgfx/drawable/drawable_axis.cpp +++ b/vclib/render/src/vclib/bgfx/drawable/drawable_axis.cpp @@ -85,10 +85,13 @@ void DrawableAxis::updateMatrices(double size) void DrawableAxis::createAxis() { - BuffersToFill btf = { - toUnderlying(MeshBufferId::VERTICES), - toUnderlying(MeshBufferId::VERT_NORMALS), - toUnderlying(MeshBufferId::TRIANGLES)}; + using MRI = MeshRenderInfo; + using enum MRI::Buffers; + + MRI::BuffersBitSet btf = { + toUnderlying(VERTICES), + toUnderlying(VERT_NORMALS), + toUnderlying(TRIANGLES)}; mArrowBuffers[0] = MeshRenderBuffers(AXIS_MESHES.first, btf);