From 71ea2d9237d03d0d1b4880f89be67fc02c46250e Mon Sep 17 00:00:00 2001 From: ZY4N Date: Tue, 25 Mar 2025 02:22:44 +0100 Subject: [PATCH] tried making naming more uniform and implemented most of the opengl managers --- .gitmodules | 7 +- .idea/vcs.xml | 3 +- CMakeLists.txt | 143 +++--- .../assets/components/material_components.hpp | 21 +- .../components/mesh_vertex_components.hpp | 7 +- .../point_cloud_vertex_components.hpp | 7 +- .../assets/components/texture_components.hpp | 7 +- .../generic/vertex_array_data.hpp} | 9 +- include/assets/data/material_data.hpp | 56 +++ include/assets/data/material_library_data.hpp | 11 + include/assets/data/mesh_data.hpp | 53 +++ include/assets/data/point_cloud_data.hpp | 37 ++ include/assets/data/pose_data.hpp | 10 + include/assets/data/shader_source_data.hpp | 18 + include/assets/data/surface_properties.hpp | 7 +- .../texture_data.hpp} | 30 +- .../generic/base_dynamic_loader.hpp | 7 +- .../material_library_loader.hpp} | 23 +- .../material_loader.hpp} | 19 +- .../mesh_loader.hpp} | 20 +- .../point_cloud_loader.hpp} | 30 +- .../texture_loader.hpp} | 35 +- .../generic/generic_basic_store.hpp} | 10 +- .../generic/generic_material_store.hpp | 155 ++++++ .../generic/generic_mesh_store.hpp | 167 +++++++ .../generic/generic_point_cloud_store.hpp | 161 +++++++ .../data_stores/material_library_store.hpp | 11 + include/assets/data_stores/material_store.hpp | 19 + include/assets/data_stores/mesh_store.hpp | 16 + .../assets/data_stores/point_cloud_store.hpp | 17 + include/assets/data_stores/pose_store.hpp | 11 + .../data_stores/shader_source_store.hpp | 137 ++++++ include/assets/data_stores/texture_store.hpp | 12 + include/assets/data_views/material_view.hpp | 10 + include/assets/data_views/mesh_view.hpp | 33 ++ .../assets/data_views/point_cloud_view.hpp | 28 ++ .../assets/data_views/shader_source_view.hpp | 5 + include/assets/data_views/texture_view.hpp | 15 + include/assets/dynamic_data_store.hpp | 32 +- .../dynamic_material_library_store.hpp | 6 - .../dynamic_material_store.hpp | 37 -- .../dynamic_mesh_store.hpp | 37 -- .../dynamic_point_cloud_store.hpp | 36 -- .../dynamic_pose_store.hpp | 6 - .../dynamic_shader_source_store.hpp | 7 - .../dynamic_texture_store.hpp | 6 - .../dynamic_vertex_store.hpp | 37 -- .../generic_dynamic_component_array_store.hpp | 149 ------ .../generic_dynamic_component_store.hpp | 147 ------ ..._dynamic_indexed_component_array_store.hpp | 157 ------ .../dynamic_material_buffer.hpp | 50 -- .../dynamic_material_library_buffer.hpp | 6 - .../dynamic_mesh_buffer.hpp | 48 -- .../dynamic_point_cloud_buffer.hpp | 32 -- .../dynamic_pose_buffer.hpp | 5 - .../dynamic_shader_buffer.hpp | 16 - .../generic/generic_3dtk_loader.hpp | 8 +- .../glsl_loader.hpp | 13 +- .../interface.txt | 0 .../kitti_loader.hpp | 16 +- .../kitti_pose_loader.hpp | 6 +- .../mtl_loader.hpp | 8 +- .../obj_loader.hpp | 4 +- .../stl_loader.hpp | 6 +- .../threedtk_pose_loader.hpp | 4 +- .../uos_loader.hpp | 0 .../uos_normal_loader.hpp | 0 .../uos_rgb_loader.hpp | 0 .../uosr_loader.hpp | 0 include/assets/prefetch_lookup.hpp | 9 +- .../material_library_prefetch_lookup.hpp | 9 +- .../material_prefetch_lookup.hpp | 9 +- .../prefetch_lookups/mesh_prefetch_lookup.hpp | 9 +- .../point_cloud_prefetch_lookup.hpp | 9 +- .../prefetch_lookups/pose_prefetch_lookup.hpp | 20 +- .../shader_prefetch_lookup.hpp | 9 +- .../texture_prefetch_lookup.hpp | 9 +- include/assets/prefetch_queue.hpp | 8 +- include/geometry/normal_estimation.hpp | 4 +- include/opengl/data/material_data.hpp | 8 +- include/opengl/data/mesh_data.hpp | 10 +- include/opengl/data/point_cloud_data.hpp | 6 +- .../opengl/data_managers/buffer_manager.hpp | 36 -- .../mesh_index_buffer_manager.hpp | 35 ++ .../mesh_vertex_buffer_manager.hpp | 20 +- .../point_cloud_vertex_buffer_manager.hpp | 38 ++ .../opengl/data_managers/shader_manager.hpp | 6 +- .../data_managers/shader_program_manager.hpp | 6 +- .../data_managers/shader_source_manager.hpp | 10 +- .../opengl/data_managers/texture_manager.hpp | 12 +- .../opengl/handles/index_buffer_handle.hpp | 1 + .../opengl/metadata/index_buffer_metadata.hpp | 16 + .../metadata/mesh_vertex_buffer_metadata.hpp | 15 + .../point_cloud_vertex_buffer_metadata.hpp | 14 + include/opengl/metadata/texture_metadata.hpp | 2 +- .../metadata/vertex_buffer_metadata.hpp | 26 - include/opengl/vertex_buffer_utils.hpp | 127 +++++ .../batch_renderers/mesh_batch_renderer.hpp | 2 +- .../point_cloud_batch_renderer.hpp | 2 +- .../requirements/mesh_requirements.hpp | 20 +- .../requirements/point_cloud_requirements.hpp | 12 +- include/viewer/asset_loader.hpp | 36 +- include/viewer/instance.hpp | 4 +- libraries/CMakeLists.txt | 6 + libraries/glm | 1 + libraries/include/glm | 1 - libraries/stb | 1 + main.cpp | 36 +- source/assets/data/material_data.ipp | 99 ++++ source/assets/data/mesh_data.ipp | 80 ++++ source/assets/data/point_cloud_data.ipp | 49 ++ source/assets/data/texture_data.ipp | 159 +++++++ .../generic/base_dynamic_loader.ipp | 2 +- .../mesh_loader.cpp} | 8 +- .../point_cloud_loader.cpp} | 8 +- .../texture_loader.cpp} | 19 +- .../generic/generic_basic_store.ipp} | 20 +- .../generic_dynamic_component_array_store.ipp | 83 ++-- ..._dynamic_indexed_component_array_store.ipp | 48 +- .../generic/generic_material_store.ipp | 386 +++++++++++++++ .../generic/generic_mesh_store.ipp | 449 ++++++++++++++++++ .../generic/generic_point_cloud_store.ipp | 415 ++++++++++++++++ .../data_stores/shader_source_store.ipp | 303 ++++++++++++ .../dynamic_material_store.cpp | 26 - .../dynamic_mesh_store.cpp | 31 -- .../dynamic_point_cloud_store.cpp | 27 -- .../generic_dynamic_component_store.ipp | 373 --------------- .../dynamic_material_buffer.ipp | 99 ---- .../dynamic_mesh_buffer.ipp | 80 ---- .../dynamic_model_buffer.ipp | 148 ------ .../dynamic_point_cloud_buffer.ipp | 49 -- .../dynamic_texture_buffer.ipp | 159 ------- .../generic/generic_3dtk_loader.ipp | 18 +- .../glsl_loader.cpp | 2 +- .../kitti_loader.cpp | 6 +- .../kitti_pose_loader.cpp | 4 +- .../mtl_loader.cpp | 12 +- .../obj_loader.cpp | 10 +- .../stl_loader.cpp | 22 +- .../threedtk_pose_loader.cpp | 4 +- source/geometry/normal_estimation.cpp | 6 +- source/opengl/data/mesh_data.cpp | 2 +- source/opengl/data/mesh_data.ipp | 8 +- source/opengl/data/point_cloud_data.ipp | 2 +- .../mesh_index_buffer_manager.cpp | 106 +++++ .../mesh_vertex_buffer_manager.cpp | 196 ++++---- .../point_cloud_vertex_buffer_manager.cpp | 113 +++++ .../opengl/data_managers/shader_manager.cpp | 4 +- .../data_managers/shader_program_manager.cpp | 4 +- .../data_managers/shader_source_manager.cpp | 6 +- .../opengl/data_managers/texture_manager.cpp | 4 +- .../batch_renderers/mesh_batch_renderer.cpp | 4 +- .../point_cloud_batch_renderer.cpp | 4 +- source/viewer/asset_loader.cpp | 20 +- source/viewer/instance.cpp | 4 +- 155 files changed, 4097 insertions(+), 2434 deletions(-) rename include/assets/{dynamic_read_buffers/generic/dynamic_vertex_buffer.hpp => data/generic/vertex_array_data.hpp} (65%) create mode 100755 include/assets/data/material_data.hpp create mode 100644 include/assets/data/material_library_data.hpp create mode 100644 include/assets/data/mesh_data.hpp create mode 100644 include/assets/data/point_cloud_data.hpp create mode 100644 include/assets/data/pose_data.hpp create mode 100644 include/assets/data/shader_source_data.hpp rename include/assets/{dynamic_read_buffers/dynamic_texture_buffer.hpp => data/texture_data.hpp} (68%) rename include/assets/{dynamic_data_loaders => data_loaders}/generic/base_dynamic_loader.hpp (87%) rename include/assets/{dynamic_data_loaders/dynamic_material_library_loader.hpp => data_loaders/material_library_loader.hpp} (59%) rename include/assets/{dynamic_data_loaders/dynamic_material_loader.hpp => data_loaders/material_loader.hpp} (66%) rename include/assets/{dynamic_data_loaders/dynamic_mesh_loader.hpp => data_loaders/mesh_loader.hpp} (57%) rename include/assets/{dynamic_data_loaders/dynamic_point_cloud_loader.hpp => data_loaders/point_cloud_loader.hpp} (54%) rename include/assets/{dynamic_data_loaders/dynamic_texture_loader.hpp => data_loaders/texture_loader.hpp} (50%) rename include/assets/{dynamic_data_stores/generic/generic_dynamic_store.hpp => data_stores/generic/generic_basic_store.hpp} (72%) create mode 100644 include/assets/data_stores/generic/generic_material_store.hpp create mode 100644 include/assets/data_stores/generic/generic_mesh_store.hpp create mode 100644 include/assets/data_stores/generic/generic_point_cloud_store.hpp create mode 100644 include/assets/data_stores/material_library_store.hpp create mode 100644 include/assets/data_stores/material_store.hpp create mode 100644 include/assets/data_stores/mesh_store.hpp create mode 100644 include/assets/data_stores/point_cloud_store.hpp create mode 100644 include/assets/data_stores/pose_store.hpp create mode 100644 include/assets/data_stores/shader_source_store.hpp create mode 100644 include/assets/data_stores/texture_store.hpp create mode 100644 include/assets/data_views/material_view.hpp create mode 100644 include/assets/data_views/mesh_view.hpp create mode 100644 include/assets/data_views/point_cloud_view.hpp create mode 100644 include/assets/data_views/shader_source_view.hpp create mode 100644 include/assets/data_views/texture_view.hpp delete mode 100644 include/assets/dynamic_data_stores/dynamic_material_library_store.hpp delete mode 100644 include/assets/dynamic_data_stores/dynamic_material_store.hpp delete mode 100644 include/assets/dynamic_data_stores/dynamic_mesh_store.hpp delete mode 100644 include/assets/dynamic_data_stores/dynamic_point_cloud_store.hpp delete mode 100644 include/assets/dynamic_data_stores/dynamic_pose_store.hpp delete mode 100644 include/assets/dynamic_data_stores/dynamic_shader_source_store.hpp delete mode 100644 include/assets/dynamic_data_stores/dynamic_texture_store.hpp delete mode 100644 include/assets/dynamic_data_stores/dynamic_vertex_store.hpp delete mode 100644 include/assets/dynamic_data_stores/generic/generic_dynamic_component_array_store.hpp delete mode 100644 include/assets/dynamic_data_stores/generic/generic_dynamic_component_store.hpp delete mode 100644 include/assets/dynamic_data_stores/generic/generic_dynamic_indexed_component_array_store.hpp delete mode 100755 include/assets/dynamic_read_buffers/dynamic_material_buffer.hpp delete mode 100644 include/assets/dynamic_read_buffers/dynamic_material_library_buffer.hpp delete mode 100644 include/assets/dynamic_read_buffers/dynamic_mesh_buffer.hpp delete mode 100644 include/assets/dynamic_read_buffers/dynamic_point_cloud_buffer.hpp delete mode 100644 include/assets/dynamic_read_buffers/dynamic_pose_buffer.hpp delete mode 100644 include/assets/dynamic_read_buffers/dynamic_shader_buffer.hpp rename include/assets/{data_loaders => file_parsers}/generic/generic_3dtk_loader.hpp (81%) rename include/assets/{data_loaders => file_parsers}/glsl_loader.hpp (81%) rename include/assets/{data_loaders => file_parsers}/interface.txt (100%) rename include/assets/{data_loaders => file_parsers}/kitti_loader.hpp (79%) rename include/assets/{data_loaders => file_parsers}/kitti_pose_loader.hpp (82%) rename include/assets/{data_loaders => file_parsers}/mtl_loader.hpp (83%) rename include/assets/{data_loaders => file_parsers}/obj_loader.hpp (93%) rename include/assets/{data_loaders => file_parsers}/stl_loader.hpp (78%) rename include/assets/{data_loaders => file_parsers}/threedtk_pose_loader.hpp (89%) rename include/assets/{data_loaders => file_parsers}/uos_loader.hpp (100%) rename include/assets/{data_loaders => file_parsers}/uos_normal_loader.hpp (100%) rename include/assets/{data_loaders => file_parsers}/uos_rgb_loader.hpp (100%) rename include/assets/{data_loaders => file_parsers}/uosr_loader.hpp (100%) delete mode 100644 include/opengl/data_managers/buffer_manager.hpp create mode 100644 include/opengl/data_managers/mesh_index_buffer_manager.hpp create mode 100644 include/opengl/data_managers/point_cloud_vertex_buffer_manager.hpp create mode 100644 include/opengl/metadata/index_buffer_metadata.hpp create mode 100644 include/opengl/metadata/mesh_vertex_buffer_metadata.hpp create mode 100644 include/opengl/metadata/point_cloud_vertex_buffer_metadata.hpp delete mode 100644 include/opengl/metadata/vertex_buffer_metadata.hpp create mode 100644 include/opengl/vertex_buffer_utils.hpp create mode 100644 libraries/CMakeLists.txt create mode 160000 libraries/glm delete mode 160000 libraries/include/glm create mode 160000 libraries/stb create mode 100644 source/assets/data/material_data.ipp create mode 100644 source/assets/data/mesh_data.ipp create mode 100644 source/assets/data/point_cloud_data.ipp create mode 100644 source/assets/data/texture_data.ipp rename source/assets/{dynamic_data_loaders => data_loaders}/generic/base_dynamic_loader.ipp (96%) rename source/assets/{dynamic_data_loaders/dynamic_mesh_loader.cpp => data_loaders/mesh_loader.cpp} (75%) rename source/assets/{dynamic_data_loaders/dynamic_point_cloud_loader.cpp => data_loaders/point_cloud_loader.cpp} (73%) rename source/assets/{dynamic_data_loaders/dynamic_texture_loader.cpp => data_loaders/texture_loader.cpp} (82%) rename source/assets/{dynamic_data_stores/generic/generic_dynamic_store.ipp => data_stores/generic/generic_basic_store.ipp} (59%) rename source/assets/{dynamic_data_stores => data_stores}/generic/generic_dynamic_component_array_store.ipp (87%) rename source/assets/{dynamic_data_stores => data_stores}/generic/generic_dynamic_indexed_component_array_store.ipp (95%) create mode 100644 source/assets/data_stores/generic/generic_material_store.ipp create mode 100644 source/assets/data_stores/generic/generic_mesh_store.ipp create mode 100644 source/assets/data_stores/generic/generic_point_cloud_store.ipp create mode 100644 source/assets/data_stores/shader_source_store.ipp delete mode 100644 source/assets/dynamic_data_stores/dynamic_material_store.cpp delete mode 100644 source/assets/dynamic_data_stores/dynamic_mesh_store.cpp delete mode 100644 source/assets/dynamic_data_stores/dynamic_point_cloud_store.cpp delete mode 100644 source/assets/dynamic_data_stores/generic/generic_dynamic_component_store.ipp delete mode 100644 source/assets/dynamic_read_buffers/dynamic_material_buffer.ipp delete mode 100644 source/assets/dynamic_read_buffers/dynamic_mesh_buffer.ipp delete mode 100644 source/assets/dynamic_read_buffers/dynamic_model_buffer.ipp delete mode 100644 source/assets/dynamic_read_buffers/dynamic_point_cloud_buffer.ipp delete mode 100644 source/assets/dynamic_read_buffers/dynamic_texture_buffer.ipp rename source/assets/{data_loaders => file_parsers}/generic/generic_3dtk_loader.ipp (94%) rename source/assets/{data_loaders => file_parsers}/glsl_loader.cpp (93%) rename source/assets/{data_loaders => file_parsers}/kitti_loader.cpp (97%) rename source/assets/{data_loaders => file_parsers}/kitti_pose_loader.cpp (96%) rename source/assets/{data_loaders => file_parsers}/mtl_loader.cpp (97%) rename source/assets/{data_loaders => file_parsers}/obj_loader.cpp (98%) rename source/assets/{data_loaders => file_parsers}/stl_loader.cpp (87%) rename source/assets/{data_loaders => file_parsers}/threedtk_pose_loader.cpp (96%) create mode 100644 source/opengl/data_managers/mesh_index_buffer_manager.cpp create mode 100644 source/opengl/data_managers/point_cloud_vertex_buffer_manager.cpp diff --git a/.gitmodules b/.gitmodules index eeed3b5..d249076 100755 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,9 @@ [submodule "libraries/include/stb"] path = libraries/include/stb url = https://github.com/nothings/stb -[submodule "libraries/include/glm"] - path = libraries/include/glm +[submodule "libraries/stb"] + path = libraries/stb + url = https://github.com/nothings/stb +[submodule "libraries/glm"] + path = libraries/glm url = https://github.com/g-truc/glm diff --git a/.idea/vcs.xml b/.idea/vcs.xml index a32aab4..c12b08c 100755 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,6 +2,7 @@ - + + \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 23bdf7b..ac9535b 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,13 +11,13 @@ add_executable(z3d main.cpp include/assets/components/material_components.hpp include/assets/components/point_cloud_vertex_components.hpp include/assets/components/mesh_vertex_components.hpp - include/assets/dynamic_read_buffers/dynamic_material_buffer.hpp - include/assets/dynamic_read_buffers/dynamic_mesh_buffer.hpp - include/assets/dynamic_read_buffers/dynamic_point_cloud_buffer.hpp - include/assets/data_loaders/kitti_loader.hpp - include/assets/data_loaders/obj_loader.hpp - include/assets/data_loaders/stl_loader.hpp - include/assets/data_loaders/uos_loader.hpp + include/assets/data/material_data.hpp + include/assets/data/mesh_data.hpp + include/assets/data/point_cloud_data.hpp + include/assets/file_parsers/kitti_loader.hpp + include/assets/file_parsers/obj_loader.hpp + include/assets/file_parsers/stl_loader.hpp + include/assets/file_parsers/uos_loader.hpp include/assets/components/mesh_vertex_components.hpp include/scene/camera.hpp include/scene/flying_camera.hpp @@ -42,8 +42,8 @@ add_executable(z3d main.cpp include/util/string_indexer.hpp include/util/string_literal.hpp include/util/uix.hpp - source/assets/data_loaders/stl_loader.cpp - source/assets/data_loaders/obj_loader.cpp + source/assets/file_parsers/stl_loader.cpp + source/assets/file_parsers/obj_loader.cpp source/scene/flying_camera.cpp source/opengl/data/point_cloud_data.cpp source/opengl/handles/shader_program_handle.ipp @@ -62,18 +62,18 @@ add_executable(z3d main.cpp include/opengl/shader_program_variable.hpp include/opengl/type_utils.hpp include/util/binary_ifstream.hpp - source/assets/data_loaders/kitti_loader.cpp - include/assets/data_loaders/generic/generic_3dtk_loader.hpp - include/assets/data_loaders/uosr_loader.hpp - include/assets/data_loaders/uos_normal_loader.hpp - include/assets/data_loaders/uos_rgb_loader.hpp - include/assets/dynamic_data_loaders/dynamic_mesh_loader.hpp - source/assets/dynamic_data_loaders/dynamic_mesh_loader.cpp - source/assets/dynamic_data_loaders/dynamic_mesh_loader.cpp - include/assets/dynamic_data_loaders/dynamic_point_cloud_loader.hpp - include/assets/dynamic_data_loaders/generic/base_dynamic_loader.hpp - source/assets/dynamic_data_loaders/generic/base_dynamic_loader.ipp - source/assets/dynamic_data_loaders/dynamic_point_cloud_loader.cpp + source/assets/file_parsers/kitti_loader.cpp + include/assets/file_parsers/generic/generic_3dtk_loader.hpp + include/assets/file_parsers/uosr_loader.hpp + include/assets/file_parsers/uos_normal_loader.hpp + include/assets/file_parsers/uos_rgb_loader.hpp + include/assets/data_loaders/mesh_loader.hpp + source/assets/data_loaders/mesh_loader.cpp + source/assets/data_loaders/mesh_loader.cpp + include/assets/data_loaders/point_cloud_loader.hpp + include/assets/data_loaders/generic/base_dynamic_loader.hpp + source/assets/data_loaders/generic/base_dynamic_loader.ipp + source/assets/data_loaders/point_cloud_loader.cpp include/opengl/handles/matrix_handles.hpp include/viewer/instance.hpp include/opengl/data/material_data.hpp @@ -86,9 +86,9 @@ add_executable(z3d main.cpp source/viewer/instance.cpp include/viewer/asset_loader.hpp source/viewer/asset_loader.cpp - include/assets/data_loaders/glsl_loader.hpp - include/assets/dynamic_read_buffers/dynamic_shader_buffer.hpp - source/assets/data_loaders/glsl_loader.cpp + include/assets/file_parsers/glsl_loader.hpp + include/assets/data/shader_source_data.hpp + source/assets/file_parsers/glsl_loader.cpp include/viewer/settings.hpp include/opengl/data/shader_data.hpp source/opengl/data/shader_data.ipp @@ -122,58 +122,49 @@ add_executable(z3d main.cpp include/geometry/normal_estimation.hpp include/assets/components/texture_components.hpp include/util/enum_bitfield_operators.hpp - include/assets/dynamic_read_buffers/dynamic_texture_buffer.hpp - source/assets/dynamic_read_buffers/dynamic_mesh_buffer.ipp - source/assets/dynamic_read_buffers/dynamic_material_buffer.ipp - include/assets/dynamic_read_buffers/generic/dynamic_vertex_buffer.hpp - source/assets/dynamic_read_buffers/dynamic_model_buffer.ipp - source/assets/dynamic_read_buffers/dynamic_texture_buffer.ipp - source/assets/dynamic_read_buffers/dynamic_point_cloud_buffer.ipp - include/assets/data_loaders/mtl_loader.hpp - include/assets/dynamic_data_loaders/dynamic_material_loader.hpp + include/assets/data/texture_data.hpp + source/assets/data/mesh_data.ipp + source/assets/data/material_data.ipp + include/assets/data/generic/vertex_array_data.hpp + source/assets/data/texture_data.ipp + source/assets/data/point_cloud_data.ipp + include/assets/file_parsers/mtl_loader.hpp + include/assets/data_loaders/material_loader.hpp include/util/id_type.hpp - include/assets/dynamic_data_stores/generic/generic_dynamic_store.hpp - source/assets/dynamic_data_stores/generic/generic_dynamic_store.ipp - include/assets/dynamic_data_stores/dynamic_material_store.hpp - include/assets/dynamic_data_stores/dynamic_mesh_store.hpp - include/assets/dynamic_data_stores/dynamic_point_cloud_store.hpp + include/assets/data_stores/generic/generic_basic_store.hpp + source/assets/data_stores/generic/generic_basic_store.ipp + include/assets/data_stores/material_store.hpp + include/assets/data_stores/mesh_store.hpp + include/assets/data_stores/point_cloud_store.hpp include/util/result.hpp - source/assets/data_loaders/mtl_loader.cpp + source/assets/file_parsers/mtl_loader.cpp include/util/line_parser.hpp - include/assets/dynamic_data_loaders/dynamic_texture_loader.hpp - source/assets/dynamic_data_loaders/dynamic_texture_loader.cpp - include/assets/dynamic_data_stores/dynamic_texture_store.hpp + include/assets/data_loaders/texture_loader.hpp + source/assets/data_loaders/texture_loader.cpp + include/assets/data_stores/texture_store.hpp include/opengl/data_managers/texture_manager.hpp - include/assets/dynamic_data_stores/dynamic_vertex_store.hpp include/assets/prefetch_lookups/mesh_prefetch_lookup.hpp include/assets/prefetch_lookups/point_cloud_prefetch_lookup.hpp include/assets/prefetch_lookups/material_prefetch_lookup.hpp include/assets/prefetch_lookups/texture_prefetch_lookup.hpp include/assets/prefetch_lookups/pose_prefetch_lookup.hpp - include/assets/dynamic_data_stores/dynamic_pose_store.hpp - include/assets/data_loaders/kitti_pose_loader.hpp - include/assets/data_loaders/threedtk_pose_loader.hpp - source/assets/data_loaders/threedtk_pose_loader.cpp - include/assets/dynamic_read_buffers/dynamic_pose_buffer.hpp - source/assets/data_loaders/kitti_pose_loader.cpp + include/assets/data_stores/pose_store.hpp + include/assets/file_parsers/kitti_pose_loader.hpp + include/assets/file_parsers/threedtk_pose_loader.hpp + source/assets/file_parsers/threedtk_pose_loader.cpp + include/assets/data/pose_data.hpp + source/assets/file_parsers/kitti_pose_loader.cpp include/assets/prefetch_queue.hpp include/util/string_list.hpp - include/assets/dynamic_data_stores/dynamic_material_library_store.hpp - include/assets/dynamic_data_stores/generic/generic_dynamic_component_store.hpp - source/assets/dynamic_data_stores/generic/generic_dynamic_component_store.ipp - source/assets/dynamic_data_stores/dynamic_material_store.cpp - include/assets/dynamic_data_stores/generic/generic_dynamic_component_array_store.hpp - source/assets/dynamic_data_stores/generic/generic_dynamic_component_array_store.ipp - source/assets/dynamic_data_stores/dynamic_mesh_store.cpp - include/assets/dynamic_data_stores/generic/generic_dynamic_indexed_component_array_store.hpp - source/assets/dynamic_data_stores/dynamic_point_cloud_store.cpp - include/assets/dynamic_read_buffers/dynamic_material_library_buffer.hpp - include/assets/dynamic_data_loaders/dynamic_material_library_loader.hpp + include/assets/data_stores/material_library_store.hpp + source/assets/data_stores/generic/generic_dynamic_component_array_store.ipp + include/assets/data/material_library_data.hpp + include/assets/data_loaders/material_library_loader.hpp include/assets/prefetch_lookups/material_library_prefetch_lookup.hpp include/assets/prefetch_lookups/shader_prefetch_lookup.hpp - include/assets/dynamic_data_stores/dynamic_shader_source_store.hpp - include/assets/data_loaders/generic/generic_3dtk_loader.hpp - source/assets/data_loaders/generic/generic_3dtk_loader.ipp + include/assets/data_stores/shader_source_store.hpp + include/assets/file_parsers/generic/generic_3dtk_loader.hpp + source/assets/file_parsers/generic/generic_3dtk_loader.ipp include/assets/prefetch_lookup.hpp source/assets/prefetch_lookups/pose_prefetch_lookup.cpp include/assets/dynamic_data_store.hpp @@ -202,7 +193,6 @@ add_executable(z3d main.cpp include/util/reference_counter.hpp include/opengl/resource_management/resource_manager.hpp source/opengl/resource_management/resource_manager.ipp - include/opengl/data_managers/buffer_manager.hpp include/opengl/data_managers/shader_manager.hpp include/opengl/data_managers/mesh_vertex_buffer_manager.hpp source/opengl/data_managers/mesh_vertex_buffer_manager.cpp @@ -215,13 +205,32 @@ add_executable(z3d main.cpp include/opengl/handles/index_buffer_handle.hpp source/opengl/handles/index_buffer_handle.ipp include/opengl/metadata/texture_metadata.hpp - include/opengl/metadata/vertex_buffer_metadata.hpp + include/opengl/vertex_buffer_utils.hpp + include/opengl/data_managers/mesh_index_buffer_manager.hpp + include/opengl/metadata/index_buffer_metadata.hpp + source/opengl/data_managers/mesh_index_buffer_manager.cpp + include/opengl/data_managers/point_cloud_vertex_buffer_manager.hpp + source/opengl/data_managers/point_cloud_vertex_buffer_manager.cpp + include/assets/data_views/mesh_view.hpp + include/assets/data_views/point_cloud_view.hpp + include/assets/data_views/shader_source_view.hpp + include/assets/data_stores/generic/generic_mesh_store.hpp + source/assets/data_stores/generic/generic_mesh_store.ipp + include/assets/data_stores/generic/generic_point_cloud_store.hpp + source/assets/data_stores/generic/generic_point_cloud_store.ipp + include/assets/data_views/material_view.hpp + include/assets/data_views/texture_view.hpp + include/assets/data_stores/generic/generic_material_store.hpp + source/assets/data_stores/generic/generic_material_store.ipp + source/assets/data_stores/shader_source_store.ipp + include/opengl/metadata/mesh_vertex_buffer_metadata.hpp + include/opengl/metadata/point_cloud_vertex_buffer_metadata.hpp ) target_include_directories(z3d PRIVATE include) target_include_directories(z3d PRIVATE source) # for ipp headers -target_include_directories(z3d PRIVATE libraries/include/glm) -target_include_directories(z3d PRIVATE libraries/include/stb) + +add_subdirectory(libraries) find_package(GLEW REQUIRED) find_package(OpenGL REQUIRED) diff --git a/include/assets/components/material_components.hpp b/include/assets/components/material_components.hpp index 58871c7..b3f01ad 100644 --- a/include/assets/components/material_components.hpp +++ b/include/assets/components/material_components.hpp @@ -1,20 +1,21 @@ #pragma once #include -#include "../dynamic_read_buffers" + +#include "assets/data_stores/texture_store.hpp" #include "assets/data/surface_properties.hpp" #include "util/enum_bitfield_operators.hpp" -namespace components::material +namespace assets::material_components { -using surface_properties = ::surface_properties; +using surface_properties = surface_properties; using transparency = float; -using ambient_color_texture = ::dynamic_texture_data; -using diffuse_color_texture = ::dynamic_texture_data; -using specular_color_texture = ::dynamic_texture_data; -using shininess_texture = ::dynamic_texture_data; -using alpha_texture = ::dynamic_texture_data; -using bump_texture = ::dynamic_texture_data; +using ambient_color_texture = texture_store::id_type; +using diffuse_color_texture = texture_store::id_type; +using specular_color_texture = texture_store::id_type; +using shininess_texture = texture_store::id_type; +using alpha_texture = texture_store::id_type; +using bump_texture = texture_store::id_type; namespace indices { @@ -56,4 +57,4 @@ constexpr inline auto count = std::tuple_size_v; } // namespace material_component -DEFINE_ENUM_BITFIELD_OPERATORS(components::material::flags) +DEFINE_ENUM_BITFIELD_OPERATORS(assets::material_components::flags) diff --git a/include/assets/components/mesh_vertex_components.hpp b/include/assets/components/mesh_vertex_components.hpp index 0e1d2dd..87be280 100755 --- a/include/assets/components/mesh_vertex_components.hpp +++ b/include/assets/components/mesh_vertex_components.hpp @@ -4,7 +4,8 @@ #include #include "util/enum_bitfield_operators.hpp" -namespace components::mesh_vertex { +namespace assets::mesh_vertex_components +{ using position = std::array; using normal = std::array; @@ -35,6 +36,6 @@ enum class flags : std::uint8_t using all = std::tuple; constexpr inline auto count = std::tuple_size_v; -} // namespace components::mesh_vertex +} // namespace mesh_vertex_components -DEFINE_ENUM_BITFIELD_OPERATORS(components::mesh_vertex::flags) +DEFINE_ENUM_BITFIELD_OPERATORS(assets::mesh_vertex_components::flags) diff --git a/include/assets/components/point_cloud_vertex_components.hpp b/include/assets/components/point_cloud_vertex_components.hpp index ebec5c5..1f8c561 100755 --- a/include/assets/components/point_cloud_vertex_components.hpp +++ b/include/assets/components/point_cloud_vertex_components.hpp @@ -4,7 +4,8 @@ #include #include "util/enum_bitfield_operators.hpp" -namespace components::point_cloud_vertex { +namespace assets::point_cloud_vertex_components +{ using position = std::array; using normal = std::array; @@ -32,6 +33,6 @@ enum class flags : std::uint8_t using all = std::tuple; constexpr inline auto count = std::tuple_size_v; -} // namespace components::point_cloud_vertex +} // namespace point_cloud_vertex_components -DEFINE_ENUM_BITFIELD_OPERATORS(components::point_cloud_vertex::flags) +DEFINE_ENUM_BITFIELD_OPERATORS(assets::point_cloud_vertex_components::flags) diff --git a/include/assets/components/texture_components.hpp b/include/assets/components/texture_components.hpp index 496fa46..651eb81 100644 --- a/include/assets/components/texture_components.hpp +++ b/include/assets/components/texture_components.hpp @@ -4,7 +4,8 @@ #include #include "util/enum_bitfield_operators.hpp" -namespace components::texture { +namespace assets::texture_components +{ using red = std::uint8_t; using green = std::uint8_t; @@ -24,6 +25,6 @@ enum class flags : std::uint8_t using all = std::tuple; constexpr inline auto count = std::tuple_size_v; -} // namespace components::texture +} // namespace texture_components -DEFINE_ENUM_BITFIELD_OPERATORS(components::texture::flags) \ No newline at end of file +DEFINE_ENUM_BITFIELD_OPERATORS(assets::texture_components::flags) diff --git a/include/assets/dynamic_read_buffers/generic/dynamic_vertex_buffer.hpp b/include/assets/data/generic/vertex_array_data.hpp similarity index 65% rename from include/assets/dynamic_read_buffers/generic/dynamic_vertex_buffer.hpp rename to include/assets/data/generic/vertex_array_data.hpp index c18d138..2ebb9c0 100644 --- a/include/assets/dynamic_read_buffers/generic/dynamic_vertex_buffer.hpp +++ b/include/assets/data/generic/vertex_array_data.hpp @@ -1,16 +1,15 @@ #pragma once -#include "util/uix.hpp" -#include #include -#include "GL/glew.h" template -struct dynamic_vertex_buffer { +struct vertex_array_data +{ + C component_flags; std::tuple...> vertices{}; protected: - inline void clear_vertices() + void clear_vertices() { std::apply( [](auto&... vertex_opt) { diff --git a/include/assets/data/material_data.hpp b/include/assets/data/material_data.hpp new file mode 100755 index 0000000..3ac8ccb --- /dev/null +++ b/include/assets/data/material_data.hpp @@ -0,0 +1,56 @@ +#pragma once + +#include + +#include "assets/components/material_components.hpp" +#include "assets/data_stores/texture_store.hpp" + +namespace assets +{ + +struct material_data +{ + + material_data() = default; + + material_components::surface_properties& initialized_surface_properties(); + + [[nodiscard]] inline std::optional& surface_properties(); + [[nodiscard]] inline std::optional& transparency(); + [[nodiscard]] inline std::optional& ambient_color_texture_id(); + [[nodiscard]] inline std::optional& diffuse_color_texture_id(); + [[nodiscard]] inline std::optional& specular_color_texture_id(); + [[nodiscard]] inline std::optional& shininess_texture_id(); + [[nodiscard]] inline std::optional& alpha_texture_id(); + [[nodiscard]] inline std::optional& bump_texture_id(); + + [[nodiscard]] inline const std::optional& surface_properties() const; + [[nodiscard]] inline const std::optional& transparency() const; + [[nodiscard]] inline const std::optional& ambient_color_texture_id() const; + [[nodiscard]] inline const std::optional& diffuse_color_texture_id() const; + [[nodiscard]] inline const std::optional& specular_color_texture_id() const; + [[nodiscard]] inline const std::optional& shininess_texture_id() const; + [[nodiscard]] inline const std::optional& alpha_texture_id() const; + [[nodiscard]] inline const std::optional& bump_texture_id() const; + + inline void clear(); + + std::tuple< + std::optional, + std::optional, + std::optional, + std::optional, + std::optional, + std::optional, + std::optional, + std::optional + > data{ + std::nullopt, std::nullopt, std::nullopt, std::nullopt, std::nullopt, std::nullopt, std::nullopt, std::nullopt + }; +}; + +} + +#define INCLUDE_DYNAMIC_MATERIAL_DATA_IMPLEMENTATION +#include "assets/data/material_data.ipp" +#undef INCLUDE_DYNAMIC_MATERIAL_DATA_IMPLEMENTATION diff --git a/include/assets/data/material_library_data.hpp b/include/assets/data/material_library_data.hpp new file mode 100644 index 0000000..6755c66 --- /dev/null +++ b/include/assets/data/material_library_data.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "util/string_lookup.hpp" +#include "assets/data_stores/material_store.hpp" + +namespace assets +{ + +using material_library_data = ztu::string_lookup; + +} diff --git a/include/assets/data/mesh_data.hpp b/include/assets/data/mesh_data.hpp new file mode 100644 index 0000000..43cb9e8 --- /dev/null +++ b/include/assets/data/mesh_data.hpp @@ -0,0 +1,53 @@ +#pragma once + +#include +#include + +#include "util/uix.hpp" +#include "assets/components/mesh_vertex_components.hpp" +#include "generic/vertex_array_data.hpp" +#include "assets/data_stores/material_store.hpp" + +namespace assets +{ + +class mesh_data : public vertex_array_data< + mesh_vertex_components::flags, + mesh_vertex_components::position, + mesh_vertex_components::normal, + mesh_vertex_components::tex_coord, + mesh_vertex_components::color, + mesh_vertex_components::reflectance +> { +public: + using index_type = ztu::u32; + using triangle_type = std::array; + + [[nodiscard]] inline std::vector& positions(); + [[nodiscard]] inline std::vector& normals(); + [[nodiscard]] inline std::vector& tex_coords(); + [[nodiscard]] inline std::vector& colors(); + [[nodiscard]] inline std::vector& reflectances(); + [[nodiscard]] inline std::vector& triangles(); + [[nodiscard]] inline auto& material_id(); + + [[nodiscard]] inline const std::vector& positions() const; + [[nodiscard]] inline const std::vector& normals() const; + [[nodiscard]] inline const std::vector& tex_coords() const; + [[nodiscard]] inline const std::vector& colors() const; + [[nodiscard]] inline const std::vector& reflectances() const; + [[nodiscard]] inline const std::vector& triangles() const; + [[nodiscard]] inline const auto& material_id() const; + + inline void clear(); + +private: + std::vector m_triangles{}; + material_store::id_type m_material_id{}; +}; + +} + +#define INCLUDE_DYNAMIC_MESH_DATA_IMPLEMENTATION +#include "assets/data/mesh_data.ipp" +#undef INCLUDE_DYNAMIC_MESH_DATA_IMPLEMENTATION diff --git a/include/assets/data/point_cloud_data.hpp b/include/assets/data/point_cloud_data.hpp new file mode 100644 index 0000000..65c9d2a --- /dev/null +++ b/include/assets/data/point_cloud_data.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include "assets/components/point_cloud_vertex_components.hpp" + +#include +#include +#include "generic/vertex_array_data.hpp" + +namespace assets +{ + +class point_cloud_data : public vertex_array_data< + point_cloud_vertex_components::flags, + point_cloud_vertex_components::position, + point_cloud_vertex_components::normal, + point_cloud_vertex_components::color, + point_cloud_vertex_components::reflectance +> { +public: + [[nodiscard]] inline std::vector& positions(); + [[nodiscard]] inline std::vector& normals(); + [[nodiscard]] inline std::vector& colors(); + [[nodiscard]] inline std::vector& reflectances(); + + [[nodiscard]] inline const std::vector& positions() const; + [[nodiscard]] inline const std::vector& normals() const; + [[nodiscard]] inline const std::vector& colors() const; + [[nodiscard]] inline const std::vector& reflectances() const; + + inline void clear(); +}; + +} + +#define INCLUDE_DYNAMIC_TEXTURE_DATA_IMPLEMENTATION +#include "assets/data/point_cloud_data.ipp" +#undef INCLUDE_DYNAMIC_TEXTURE_DATA_IMPLEMENTATION \ No newline at end of file diff --git a/include/assets/data/pose_data.hpp b/include/assets/data/pose_data.hpp new file mode 100644 index 0000000..b413d80 --- /dev/null +++ b/include/assets/data/pose_data.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "glm/mat4x4.hpp" + +namespace assets +{ + +using pose_data = glm::mat4; + +} diff --git a/include/assets/data/shader_source_data.hpp b/include/assets/data/shader_source_data.hpp new file mode 100644 index 0000000..a99ac54 --- /dev/null +++ b/include/assets/data/shader_source_data.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include + +namespace assets +{ + +struct shader_source_data +{ + std::vector source{}; + + void clear() + { + source.clear(); + } +}; + +} diff --git a/include/assets/data/surface_properties.hpp b/include/assets/data/surface_properties.hpp index dce0c1e..bbd980e 100644 --- a/include/assets/data/surface_properties.hpp +++ b/include/assets/data/surface_properties.hpp @@ -2,10 +2,15 @@ #include +namespace assets +{ + struct surface_properties { std::array ambient_filter{ 0.7f, 0.7f, 0.7f }; std::array diffuse_filter{ 0.466f, 0.466f, 0.7922f }; std::array specular_filter{ 0.5974f, 0.2084f, 0.2084f }; float shininess{ 100.2237f }; -}; \ No newline at end of file +}; + +} diff --git a/include/assets/dynamic_read_buffers/dynamic_texture_buffer.hpp b/include/assets/data/texture_data.hpp similarity index 68% rename from include/assets/dynamic_read_buffers/dynamic_texture_buffer.hpp rename to include/assets/data/texture_data.hpp index 4437397..c82e00f 100755 --- a/include/assets/dynamic_read_buffers/dynamic_texture_buffer.hpp +++ b/include/assets/data/texture_data.hpp @@ -6,7 +6,11 @@ #include #include "assets/components/texture_components.hpp" -class dynamic_texture_buffer { +namespace assets +{ + +class texture_data +{ public: using value_type = std::uint8_t; using dim_type = std::int32_t; @@ -19,24 +23,24 @@ public: using iterator = pointer; using const_iterator = const_pointer; - dynamic_texture_buffer() = default; + texture_data() = default; - inline dynamic_texture_buffer( - std::unique_ptr&& data, + inline texture_data( + std::unique_ptr&& data, dim_type width, dim_type height, - components::texture::flags components + texture_components::flags components );; - inline dynamic_texture_buffer(const dynamic_texture_buffer&); + inline texture_data(const texture_data&); - inline dynamic_texture_buffer(dynamic_texture_buffer&&) noexcept; + inline texture_data(texture_data&&) noexcept; - [[nodiscard]] inline dynamic_texture_buffer& operator=(const dynamic_texture_buffer&); + [[nodiscard]] inline texture_data& operator=(const texture_data&); - [[nodiscard]] inline dynamic_texture_buffer& operator=(dynamic_texture_buffer&&) noexcept; + [[nodiscard]] inline texture_data& operator=(texture_data&&) noexcept; - [[nodiscard]] inline components::texture::flags components() const; + [[nodiscard]] inline texture_components::flags components() const; [[nodiscard]] inline dim_type width() const; @@ -71,9 +75,11 @@ public: private: std::unique_ptr m_data{ nullptr }; dim_type m_width{ 0 }, m_height{ 0 }; - components::texture::flags m_components{ components::texture::flags::none }; + texture_components::flags m_components{ texture_components::flags::none }; }; +} + #define INCLUDE_DYNAMIC_TEXTURE_DATA_IMPLEMENTATION -#include "assets/dynamic_read_buffers/dynamic_texture_buffer.ipp" +#include "assets/data/texture_data.ipp" #undef INCLUDE_DYNAMIC_TEXTURE_DATA_IMPLEMENTATION diff --git a/include/assets/dynamic_data_loaders/generic/base_dynamic_loader.hpp b/include/assets/data_loaders/generic/base_dynamic_loader.hpp similarity index 87% rename from include/assets/dynamic_data_loaders/generic/base_dynamic_loader.hpp rename to include/assets/data_loaders/generic/base_dynamic_loader.hpp index bf0d819..07ca51f 100644 --- a/include/assets/dynamic_data_loaders/generic/base_dynamic_loader.hpp +++ b/include/assets/data_loaders/generic/base_dynamic_loader.hpp @@ -3,12 +3,14 @@ #include #include -#include "assets/dynamic_data_stores/dynamic_point_cloud_store.hpp" +#include "../../data_stores" #include "util/uix.hpp" #include "util/string_lookup.hpp" #include "util/id_type.hpp" #include "util/result.hpp" + + template class base_dynamic_loader { @@ -26,6 +28,7 @@ public: protected: + // TODO this seems like I modified this to something that does not make sense template ztu::result invoke_with_matching_loader(loader_id_type loader_id, F&& f); @@ -35,5 +38,5 @@ protected: }; #define INCLUDE_BASE_DYNAMIC_LOADER_IMPLEMENTATION -#include "assets/dynamic_data_loaders/generic/base_dynamic_loader.ipp" +#include "../../data_loaders" #undef INCLUDE_BASE_DYNAMIC_LOADER_IMPLEMENTATION diff --git a/include/assets/dynamic_data_loaders/dynamic_material_library_loader.hpp b/include/assets/data_loaders/material_library_loader.hpp similarity index 59% rename from include/assets/dynamic_data_loaders/dynamic_material_library_loader.hpp rename to include/assets/data_loaders/material_library_loader.hpp index 8c508ab..875628d 100644 --- a/include/assets/dynamic_data_loaders/dynamic_material_library_loader.hpp +++ b/include/assets/data_loaders/material_library_loader.hpp @@ -2,16 +2,21 @@ #include "assets/prefetch_queue.hpp" #include "assets/components/material_components.hpp" -#include "assets/dynamic_read_buffers/dynamic_material_library_buffer.hpp" -#include "assets/dynamic_data_stores/dynamic_material_library_store.hpp" +#include "assets/data/material_library_data.hpp" +#include "assets/data_stores/material_store.hpp" #include "assets/prefetch_lookups/material_library_prefetch_lookup.hpp" #include "generic/base_dynamic_loader.hpp" -#include "assets/data_loaders/mtl_loader.hpp" #include "util/string_list.hpp" -class dynamic_material_library_loader : public base_dynamic_loader< - components::material::flags, +#include "assets/file_parsers/mtl_loader.hpp" + +// TODO not implemented?!? +namespace assets +{ + +class material_library_loader : public base_dynamic_loader< + material_components::flags, mtl_loader > { public: @@ -25,12 +30,14 @@ public: [[nodiscard]] std::error_code load( loader_id_type loader_id, const ztu::string_list& directories, - dynamic_material_library_store& store, - dynamic_material_store& material_store, + material_library_store& store, + material_store& material_store, material_library_prefetch_lookup& id_lookup, bool pedantic = false ); private: - dynamic_material_library_buffer m_buffer{}; + material_library_data m_buffer{}; }; + +} diff --git a/include/assets/dynamic_data_loaders/dynamic_material_loader.hpp b/include/assets/data_loaders/material_loader.hpp similarity index 66% rename from include/assets/dynamic_data_loaders/dynamic_material_loader.hpp rename to include/assets/data_loaders/material_loader.hpp index 934f87f..b35eb8d 100644 --- a/include/assets/dynamic_data_loaders/dynamic_material_loader.hpp +++ b/include/assets/data_loaders/material_loader.hpp @@ -4,14 +4,17 @@ #include "assets/components/material_components.hpp" #include "generic/base_dynamic_loader.hpp" -#include "assets/data_loaders/mtl_loader.hpp" -#include "assets/dynamic_data_stores/dynamic_material_store.hpp" +#include "assets/data_stores/material_store.hpp" +#include "assets/data/material_data.hpp" #include "assets/prefetch_lookups/material_prefetch_lookup.hpp" #include "util/string_list.hpp" -class dynamic_material_loader : public base_dynamic_loader< - components::material::flags - // TODO no loaders +namespace assets +{ + +class material_loader : public base_dynamic_loader< + material_components::flags + // TODO no loaders (mtl is for material libraries) > { public: @@ -24,11 +27,13 @@ public: [[nodiscard]] std::error_code load( loader_id_type loader_id, const ztu::string_list& directories, - dynamic_material_store& store, + material_store& store, material_prefetch_lookup& id_lookup, bool pedantic = false ); private: - dynamic_material_buffer m_buffer{}; + material_data m_buffer{}; }; + +} diff --git a/include/assets/dynamic_data_loaders/dynamic_mesh_loader.hpp b/include/assets/data_loaders/mesh_loader.hpp similarity index 57% rename from include/assets/dynamic_data_loaders/dynamic_mesh_loader.hpp rename to include/assets/data_loaders/mesh_loader.hpp index 3d02ed4..2dbfb0f 100644 --- a/include/assets/dynamic_data_loaders/dynamic_mesh_loader.hpp +++ b/include/assets/data_loaders/mesh_loader.hpp @@ -3,15 +3,17 @@ #include "generic/base_dynamic_loader.hpp" #include -#include "assets/dynamic_read_buffers/dynamic_mesh_buffer.hpp" -#include "assets/dynamic_data_stores/dynamic_mesh_store.hpp" -#include "assets/data_loaders/obj_loader.hpp" -#include "assets/data_loaders/stl_loader.hpp" +#include "assets/data/mesh_data.hpp" +#include "assets/data_stores/mesh_store.hpp" +#include "assets/file_parsers/obj_loader.hpp" +#include "assets/file_parsers/stl_loader.hpp" #include "assets/prefetch_lookups/mesh_prefetch_lookup.hpp" +namespace assets +{ -class dynamic_mesh_loader : public base_dynamic_loader< - components::mesh_vertex::flags, +class mesh_loader : public base_dynamic_loader< + mesh_vertex_components::flags, obj_loader, stl_loader > { @@ -25,11 +27,13 @@ public: [[nodiscard]] std::error_code load( loader_id_type loader_id, const ztu::string_list& directories, - dynamic_mesh_store& store, + mesh_store& store, mesh_prefetch_lookup& id_lookup, bool pedantic = false ); private: - dynamic_mesh_buffer m_buffer{}; + mesh_data m_buffer{}; }; + +} diff --git a/include/assets/dynamic_data_loaders/dynamic_point_cloud_loader.hpp b/include/assets/data_loaders/point_cloud_loader.hpp similarity index 54% rename from include/assets/dynamic_data_loaders/dynamic_point_cloud_loader.hpp rename to include/assets/data_loaders/point_cloud_loader.hpp index 7c7b601..8f90738 100644 --- a/include/assets/dynamic_data_loaders/dynamic_point_cloud_loader.hpp +++ b/include/assets/data_loaders/point_cloud_loader.hpp @@ -5,20 +5,22 @@ #include "assets/prefetch_queue.hpp" #include "generic/base_dynamic_loader.hpp" -#include "assets/dynamic_read_buffers/dynamic_point_cloud_buffer.hpp" -#include "assets/dynamic_data_stores/dynamic_point_cloud_store.hpp" - -#include "assets/data_loaders/kitti_loader.hpp" -#include "assets/data_loaders/uos_loader.hpp" -#include "assets/data_loaders/uos_normal_loader.hpp" -#include "assets/data_loaders/uos_rgb_loader.hpp" -#include "assets/data_loaders/uosr_loader.hpp" +#include "assets/data/point_cloud_data.hpp" +#include "assets/data_stores/point_cloud_store.hpp" #include "assets/prefetch_lookups/point_cloud_prefetch_lookup.hpp" - #include "util/string_list.hpp" -class dynamic_point_cloud_loader : public base_dynamic_loader< - components::point_cloud_vertex::flags, +#include "assets/file_parsers/kitti_loader.hpp" +#include "assets/file_parsers/uos_loader.hpp" +#include "assets/file_parsers/uos_normal_loader.hpp" +#include "assets/file_parsers/uos_rgb_loader.hpp" +#include "assets/file_parsers/uosr_loader.hpp" + +namespace assets +{ + +class point_cloud_loader : public base_dynamic_loader< + point_cloud_vertex_components::flags, kitti_loader, uos_loader, uos_normal_loader, @@ -36,11 +38,13 @@ public: [[nodiscard]] std::error_code load( loader_id_type loader_id, const ztu::string_list& directories, - dynamic_point_cloud_store& store, + point_cloud_store& store, point_cloud_prefetch_lookup& id_lookup, bool pedantic = false ); private: - dynamic_point_cloud_buffer m_buffer{}; + point_cloud_data m_buffer{}; }; + +} diff --git a/include/assets/dynamic_data_loaders/dynamic_texture_loader.hpp b/include/assets/data_loaders/texture_loader.hpp similarity index 50% rename from include/assets/dynamic_data_loaders/dynamic_texture_loader.hpp rename to include/assets/data_loaders/texture_loader.hpp index a703253..51d2ce9 100644 --- a/include/assets/dynamic_data_loaders/dynamic_texture_loader.hpp +++ b/include/assets/data_loaders/texture_loader.hpp @@ -8,35 +8,22 @@ #include "util/result.hpp" #include "assets/components/texture_components.hpp" -#include "assets/dynamic_read_buffers/dynamic_texture_buffer.hpp" -#include "assets/dynamic_data_stores/dynamic_texture_store.hpp" -#include "assets/dynamic_data_loader_ctx.hpp" +#include "assets/data/texture_data.hpp" +#include "assets/data_stores/texture_store.hpp" +#include "assets/dynamic_data_store.hpp" #include "assets/prefetch_queue.hpp" #include "assets/prefetch_lookups/texture_prefetch_lookup.hpp" #include "util/string_list.hpp" -/* -* [[nodiscard]] std::error_code prefetch( -loader_id_type loader_id, -const ztu::string_list& directories, -prefetch_queue& queue -); +namespace assets +{ -[[nodiscard]] std::error_code load( -loader_id_type loader_id, -const ztu::string_list& directories, -dynamic_point_cloud_store& store, -point_cloud_prefetch_lookup& id_lookup, -bool pedantic = false -); -*/ - -class dynamic_texture_loader +class texture_loader { public: - using loader_id_type = ztu::id_type_for; + using loader_id_type = ztu::id_type_for; - explicit dynamic_texture_loader(components::texture::flags enabled_components); + explicit texture_loader(texture_components::flags enabled_components); [[nodiscard]] std::optional find_loader(const std::string_view& name); @@ -49,12 +36,14 @@ public: [[nodiscard]] std::error_code load( loader_id_type loader_id, const ztu::string_list& directories, - dynamic_texture_store& store, + texture_store& store, texture_prefetch_lookup& id_lookup, bool pedantic = false ); private: ztu::string_lookup m_loader_id_lookup{}; - components::texture::flags m_enabled_components{ components::texture::flags::none }; + texture_components::flags m_enabled_components{ texture_components::flags::none }; }; + +} diff --git a/include/assets/dynamic_data_stores/generic/generic_dynamic_store.hpp b/include/assets/data_stores/generic/generic_basic_store.hpp similarity index 72% rename from include/assets/dynamic_data_stores/generic/generic_dynamic_store.hpp rename to include/assets/data_stores/generic/generic_basic_store.hpp index ebb6f4f..0101725 100644 --- a/include/assets/dynamic_data_stores/generic/generic_dynamic_store.hpp +++ b/include/assets/data_stores/generic/generic_basic_store.hpp @@ -7,10 +7,10 @@ #include "util/id_type.hpp" template -class generic_dynamic_store +class generic_basic_store { public: - using id_type = ztu::id_type_for; + using id_type = ztu::id_type_for; using container_type = std::vector; using iterator_type = typename container_type::iterator; using const_iterator = typename container_type::const_iterator; @@ -35,6 +35,6 @@ private: id_type m_next_data_id{ 1 }; }; -#define INCLUDE_GENERIC_DYNAMIC_STORE_IMPLEMENTATION -#include "assets/dynamic_data_stores/generic_dynamic_store.ipp" -#undef INCLUDE_GENERIC_DYNAMIC_STORE_IMPLEMENTATION +#define INCLUDE_GENERIC_BASIC_STORE_IMPLEMENTATION +#include "assets/data_stores/generic/generic_basic_store.ipp" +#undef INCLUDE_GENERIC_BASIC_STORE_IMPLEMENTATION diff --git a/include/assets/data_stores/generic/generic_material_store.hpp b/include/assets/data_stores/generic/generic_material_store.hpp new file mode 100644 index 0000000..6e162d8 --- /dev/null +++ b/include/assets/data_stores/generic/generic_material_store.hpp @@ -0,0 +1,155 @@ +#pragma once + +#include "assets/components/material_components.hpp" +#include "assets/data/material_data.hpp" +#include "assets/data_views/material_view.hpp" + + +namespace assets::detail +{ + +template +class generic_material_store; + +template +class generic_material_store_iterator +{ +public: + using size_type = std::size_t; + using count_type = ztu::u32; + using component_flag_type = material_components::flags; + using id_type = ztu::id_type_for, ztu::u32>; + using value_type = std::pair; + using flag_count_type = std::tuple; + + using id_iterator_type = id_type*; + using component_iterator_type = std::tuple...>; + using flag_count_iterator_type = const flag_count_type*; + + using offsets_type = std::array; + using difference_type = std::ptrdiff_t; + using pointer = value_type*; + using reference = value_type; + using iterator_category = std::random_access_iterator_tag; + +private: + friend generic_material_store; + + generic_material_store_iterator( + id_iterator_type ids, + const component_iterator_type& components, + flag_count_iterator_type flag_counts, + std::size_t index, + const offsets_type& offsets + ); + +public: + constexpr generic_material_store_iterator() noexcept = default; + + constexpr generic_material_store_iterator(const generic_material_store_iterator&) noexcept = default; + constexpr generic_material_store_iterator(generic_material_store_iterator&&) noexcept = default; + + constexpr generic_material_store_iterator& operator=(const generic_material_store_iterator&) noexcept = default; + constexpr generic_material_store_iterator& operator=(generic_material_store_iterator&&) noexcept = default; + + reference operator*() const; + + generic_material_store_iterator& operator++(); + generic_material_store_iterator operator++(int); + generic_material_store_iterator& operator--(); + generic_material_store_iterator operator--(int); + + generic_material_store_iterator& operator+=(difference_type n); + generic_material_store_iterator& operator-=(difference_type n); + generic_material_store_iterator operator+(difference_type n) const; + generic_material_store_iterator operator-(difference_type n) const; + difference_type operator-(const generic_material_store_iterator& other) const; + + reference operator[](difference_type n) const; + + bool operator==(const generic_material_store_iterator& other) const; + bool operator!=(const generic_material_store_iterator& other) const; + bool operator<(const generic_material_store_iterator& other) const; + bool operator<=(const generic_material_store_iterator& other) const; + bool operator>(const generic_material_store_iterator& other) const; + bool operator>=(const generic_material_store_iterator& other) const; + +protected: + template + static bool is_component_enabled(component_flag_type flag); + + template + void calc_offsets(std::index_sequence, difference_type n); + + template + reference dereference(std::index_sequence) const; + +private: + id_iterator_type m_ids{}; + component_iterator_type m_components{}; + flag_count_iterator_type m_flag_counts{}; + size_type m_index{}; + offsets_type m_offsets{}; +}; + + +template +class generic_material_store +{ +public: + using size_type = std::size_t; + using count_type = ztu::u32; + using component_flag_type = material_components::flags; + + using iterator_type = generic_material_store_iterator; + using const_iterator = generic_material_store_iterator...>; + using view_type = std::ranges::subrange; + using const_view_type = std::ranges::subrange; + using id_type = ztu::id_type_for; + + id_type add(const material_data& material); + + [[nodiscard]] std::pair find(id_type id); + + [[nodiscard]] std::pair find(id_type id) const; + + void remove(const iterator_type& it); + + void clear(); + + iterator_type begin(); + + iterator_type end(); + + const_iterator begin() const; + + const_iterator end() const; + + const_iterator cbegin() const; + + const_iterator cend() const; + + view_type view(); + + const_view_type view() const; + +protected: + std::tuple...> component_iterators(); + + std::tuple>...> component_iterators() const; + + std::array array_counts() const; + +private: + std::vector m_ids; + std::tuple...> m_component_arrays; + std::vector m_component_flag_counts; + id_type m_next_data_id{ 1 }; +}; + +} + + +#define INCLUDE_GENERIC_MATERIAL_STORE_IMPLEMENTATION +#include "assets/data_stores/generic/generic_material_store.ipp" +#undef INCLUDE_GENERIC_MATERIAL_STORE_IMPLEMENTATION diff --git a/include/assets/data_stores/generic/generic_mesh_store.hpp b/include/assets/data_stores/generic/generic_mesh_store.hpp new file mode 100644 index 0000000..3ab9bf0 --- /dev/null +++ b/include/assets/data_stores/generic/generic_mesh_store.hpp @@ -0,0 +1,167 @@ +#pragma once + +#include "assets/components/mesh_vertex_components.hpp" +#include "assets/data_stores/material_store.hpp" +#include "assets/data/mesh_data.hpp" +#include "assets/data_views/mesh_view.hpp" + +namespace assets::detail +{ + +template +class generic_mesh_store; + +template +class generic_mesh_store_iterator +{ +public: + using size_type = std::size_t; + using count_type = ztu::u32; + using index_type = mesh_data::index_type; + using material_id_type = material_store::id_type; + using component_flag_type = mesh_vertex_components::flags; + using id_type = ztu::id_type_for, ztu::u32>; + using value_type = std::pair; + using flag_count_type = std::tuple; + + using id_iterator_type = id_type*; + using component_iterator_type = std::tuple...>; + using index_iterator_type = index_type*; + using flag_count_iterator_type = const flag_count_type*; + using material_id_iterator_type = material_id_type*; + + using offsets_type = std::array; + using difference_type = std::ptrdiff_t; + using pointer = value_type*; + using reference = value_type; + using iterator_category = std::random_access_iterator_tag; + +private: + friend generic_mesh_store; + + generic_mesh_store_iterator( + id_iterator_type ids, + index_iterator_type indices, + const component_iterator_type& components, + material_id_iterator_type material_ids, + flag_count_iterator_type flag_counts, + std::size_t index, + const offsets_type& offsets + ); + +public: + constexpr generic_mesh_store_iterator() noexcept = default; + + constexpr generic_mesh_store_iterator(const generic_mesh_store_iterator&) noexcept = default; + constexpr generic_mesh_store_iterator(generic_mesh_store_iterator&&) noexcept = default; + + constexpr generic_mesh_store_iterator& operator=(const generic_mesh_store_iterator&) noexcept = default; + constexpr generic_mesh_store_iterator& operator=(generic_mesh_store_iterator&&) noexcept = default; + + reference operator*() const; + + generic_mesh_store_iterator& operator++(); + generic_mesh_store_iterator operator++(int); + generic_mesh_store_iterator& operator--(); + generic_mesh_store_iterator operator--(int); + + generic_mesh_store_iterator& operator+=(difference_type n); + generic_mesh_store_iterator& operator-=(difference_type n); + generic_mesh_store_iterator operator+(difference_type n) const; + generic_mesh_store_iterator operator-(difference_type n) const; + difference_type operator-(const generic_mesh_store_iterator& other) const; + + reference operator[](difference_type n) const; + + bool operator==(const generic_mesh_store_iterator& other) const; + bool operator!=(const generic_mesh_store_iterator& other) const; + bool operator<(const generic_mesh_store_iterator& other) const; + bool operator<=(const generic_mesh_store_iterator& other) const; + bool operator>(const generic_mesh_store_iterator& other) const; + bool operator>=(const generic_mesh_store_iterator& other) const; + +protected: + template + static bool is_component_enabled(component_flag_type flag); + + template + void calc_offsets(std::index_sequence, difference_type n); + + template + reference dereference(std::index_sequence) const; + +private: + id_iterator_type m_ids{}; + index_iterator_type m_indices{}; + component_iterator_type m_components{}; + material_id_iterator_type m_material_ids{}; + flag_count_iterator_type m_flag_counts{}; + size_type m_index{}; + offsets_type m_offsets{}; +}; + + +template +class generic_mesh_store +{ +public: + using size_type = std::size_t; + using count_type = ztu::u32; + using index_type = mesh_data::index_type; + using component_flag_type = mesh_vertex_components::flags; + using material_id_type = material_store::id_type; + + using iterator_type = generic_mesh_store_iterator; + using const_iterator = generic_mesh_store_iterator...>; + using view_type = std::ranges::subrange; + using const_view_type = std::ranges::subrange; + using id_type = ztu::id_type_for; + + id_type add(const mesh_data& mesh); + + [[nodiscard]] std::pair find(id_type id); + + [[nodiscard]] std::pair find(id_type id) const; + + void remove(const iterator_type& it); + + void clear(); + + iterator_type begin(); + + iterator_type end(); + + const_iterator begin() const; + + const_iterator end() const; + + const_iterator cbegin() const; + + const_iterator cend() const; + + view_type view(); + + const_view_type view() const; + +protected: + std::tuple...> component_iterators(); + + std::tuple>...> component_iterators() const; + + std::array array_counts() const; + +private: + std::vector m_ids; + std::vector m_indices; + std::tuple...> m_component_arrays; + std::vector> m_component_flag_counts; + std::vector m_material_ids; + id_type m_next_data_id{ 1 }; +}; + +} + + +#define INCLUDE_GENERIC_MESH_STORE_IMPLEMENTATION +#include "assets/data_stores/generic/generic_mesh_store.ipp" +#undef INCLUDE_GENERIC_MESH_STORE_IMPLEMENTATION diff --git a/include/assets/data_stores/generic/generic_point_cloud_store.hpp b/include/assets/data_stores/generic/generic_point_cloud_store.hpp new file mode 100644 index 0000000..c7fa9bf --- /dev/null +++ b/include/assets/data_stores/generic/generic_point_cloud_store.hpp @@ -0,0 +1,161 @@ +#pragma once + +#include "util/uix.hpp" +#include "util/id_type.hpp" +#include "assets/components/point_cloud_vertex_components.hpp" +#include "assets/data/point_cloud_data.hpp" +#include "assets/data_views/point_cloud_view.hpp" + +namespace assets +{ + +template +class generic_point_cloud_store; + +namespace detail +{ + +template +class generic_point_cloud_store_iterator +{ +public: + using size_type = std::size_t; + using count_type = ztu::u32; + using component_flag_type = point_cloud_vertex_components::flags; + using id_type = ztu::id_type_for, ztu::u32>; + using value_type = std::pair; + using flag_count_type = std::tuple; + + using id_iterator_type = id_type*; + using component_iterator_type = std::tuple...>; + using flag_count_iterator_type = const flag_count_type*; + + using offsets_type = std::array; + using difference_type = std::ptrdiff_t; + using pointer = value_type*; + using reference = value_type; + using iterator_category = std::random_access_iterator_tag; + +private: + friend generic_point_cloud_store; + + generic_point_cloud_store_iterator( + id_iterator_type ids, + const component_iterator_type& components, + flag_count_iterator_type flag_counts, + std::size_t index, + const offsets_type& offsets + ); + +public: + constexpr generic_point_cloud_store_iterator() noexcept = default; + + constexpr generic_point_cloud_store_iterator(const generic_point_cloud_store_iterator&) noexcept = default; + constexpr generic_point_cloud_store_iterator(generic_point_cloud_store_iterator&&) noexcept = default; + + constexpr generic_point_cloud_store_iterator& operator=(const generic_point_cloud_store_iterator&) noexcept = default; + constexpr generic_point_cloud_store_iterator& operator=(generic_point_cloud_store_iterator&&) noexcept = default; + + reference operator*() const; + + generic_point_cloud_store_iterator& operator++(); + generic_point_cloud_store_iterator operator++(int); + generic_point_cloud_store_iterator& operator--(); + generic_point_cloud_store_iterator operator--(int); + + generic_point_cloud_store_iterator& operator+=(difference_type n); + generic_point_cloud_store_iterator& operator-=(difference_type n); + generic_point_cloud_store_iterator operator+(difference_type n) const; + generic_point_cloud_store_iterator operator-(difference_type n) const; + difference_type operator-(const generic_point_cloud_store_iterator& other) const; + + reference operator[](difference_type n) const; + + bool operator==(const generic_point_cloud_store_iterator& other) const; + bool operator!=(const generic_point_cloud_store_iterator& other) const; + bool operator<(const generic_point_cloud_store_iterator& other) const; + bool operator<=(const generic_point_cloud_store_iterator& other) const; + bool operator>(const generic_point_cloud_store_iterator& other) const; + bool operator>=(const generic_point_cloud_store_iterator& other) const; + +protected: + template + static bool is_component_enabled(component_flag_type flag); + + template + void calc_offsets(std::index_sequence, difference_type n); + + template + reference dereference(std::index_sequence) const; + +private: + id_iterator_type m_ids{}; + component_iterator_type m_components{}; + flag_count_iterator_type m_flag_counts{}; + size_type m_index{}; + offsets_type m_offsets{}; +}; + + +template +class generic_point_cloud_store +{ +public: + using size_type = std::size_t; + using count_type = ztu::u32; + using component_flag_type = point_cloud_vertex_components::flags; + + using iterator_type = generic_point_cloud_store_iterator; + using const_iterator = generic_point_cloud_store_iterator...>; + using view_type = std::ranges::subrange; + using const_view_type = std::ranges::subrange; + using id_type = ztu::id_type_for; + + id_type add(const point_cloud_data& point_cloud); + + [[nodiscard]] std::pair find(id_type id); + + [[nodiscard]] std::pair find(id_type id) const; + + void remove(const iterator_type& it); + + void clear(); + + iterator_type begin(); + + iterator_type end(); + + const_iterator begin() const; + + const_iterator end() const; + + const_iterator cbegin() const; + + const_iterator cend() const; + + view_type view(); + + const_view_type view() const; + +protected: + std::tuple...> component_iterators(); + + std::tuple>...> component_iterators() const; + + std::array array_counts() const; + +private: + std::vector m_ids; + std::tuple...> m_component_arrays; + std::vector> m_component_flag_counts; + id_type m_next_data_id{ 1 }; +}; + +} + +} + + +#define INCLUDE_GENERIC_POINT_CLOUD_STORE_IMPLEMENTATION +#include "assets/data_stores/generic/generic_point_cloud_store.ipp" +#undef INCLUDE_GENERIC_POINT_CLOUD_STORE_IMPLEMENTATION diff --git a/include/assets/data_stores/material_library_store.hpp b/include/assets/data_stores/material_library_store.hpp new file mode 100644 index 0000000..7886024 --- /dev/null +++ b/include/assets/data_stores/material_library_store.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "generic/generic_basic_store.hpp" +#include "assets/data/material_library_data.hpp" + +namespace assets +{ + +using material_library_store = generic_basic_store; + +} diff --git a/include/assets/data_stores/material_store.hpp b/include/assets/data_stores/material_store.hpp new file mode 100644 index 0000000..18d7fe7 --- /dev/null +++ b/include/assets/data_stores/material_store.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "generic/generic_material_store.hpp" + +namespace assets +{ + +using material_store = detail::generic_material_store< + material_components::surface_properties, + material_components::transparency, + texture_store::id_type, + texture_store::id_type, + texture_store::id_type, + texture_store::id_type, + texture_store::id_type, + texture_store::id_type +>; + +} diff --git a/include/assets/data_stores/mesh_store.hpp b/include/assets/data_stores/mesh_store.hpp new file mode 100644 index 0000000..aba7524 --- /dev/null +++ b/include/assets/data_stores/mesh_store.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "generic/generic_mesh_store.hpp" + +namespace assets +{ + +using mesh_store = detail::generic_mesh_store< + mesh_vertex_components::position, + mesh_vertex_components::normal, + mesh_vertex_components::tex_coord, + mesh_vertex_components::color, + mesh_vertex_components::reflectance +>; + +} diff --git a/include/assets/data_stores/point_cloud_store.hpp b/include/assets/data_stores/point_cloud_store.hpp new file mode 100644 index 0000000..6b76a80 --- /dev/null +++ b/include/assets/data_stores/point_cloud_store.hpp @@ -0,0 +1,17 @@ +#pragma once + +#pragma once + +#include "generic/generic_point_cloud_store.hpp" + +namespace assets +{ + +using point_cloud_store = detail::generic_point_cloud_store< + point_cloud_vertex_components::position, + point_cloud_vertex_components::normal, + point_cloud_vertex_components::color, + point_cloud_vertex_components::reflectance +>; + +} diff --git a/include/assets/data_stores/pose_store.hpp b/include/assets/data_stores/pose_store.hpp new file mode 100644 index 0000000..804db17 --- /dev/null +++ b/include/assets/data_stores/pose_store.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "generic/generic_basic_store.hpp" +#include "assets/data/pose_data.hpp" + +namespace assets +{ + +using pose_store = generic_basic_store; + +} diff --git a/include/assets/data_stores/shader_source_store.hpp b/include/assets/data_stores/shader_source_store.hpp new file mode 100644 index 0000000..a2c9735 --- /dev/null +++ b/include/assets/data_stores/shader_source_store.hpp @@ -0,0 +1,137 @@ +#pragma once + +#include "generic/generic_basic_store.hpp" +#include "assets/data/shader_source_data.hpp" +#include "assets/data_views/shader_source_view.hpp" + +namespace assets +{ + +class shader_source_store; + +template +class shader_source_store_iterator +{ +public: + using size_type = std::size_t; + using length_type = ztu::u32; + using id_type = ztu::id_type_for; + using value_type = std::pair; + + using id_iterator_type = id_type const*; + using string_iterator_type = Char*; + using length_iterator_type = const length_type*; + + using offset_type = size_type; + using difference_type = std::ptrdiff_t; + using pointer = value_type*; + using reference = value_type; + using iterator_category = std::random_access_iterator_tag; + +private: + friend shader_source_store; + + shader_source_store_iterator( + id_iterator_type ids, + string_iterator_type strings, + length_iterator_type lengths, + std::size_t index, + const offset_type& offset + ); + +public: + constexpr shader_source_store_iterator() noexcept = default; + + constexpr shader_source_store_iterator(const shader_source_store_iterator&) noexcept = default; + constexpr shader_source_store_iterator(shader_source_store_iterator&&) noexcept = default; + + constexpr shader_source_store_iterator& operator=(const shader_source_store_iterator&) noexcept = default; + constexpr shader_source_store_iterator& operator=(shader_source_store_iterator&&) noexcept = default; + + reference operator*() const; + + shader_source_store_iterator& operator++(); + shader_source_store_iterator operator++(int); + shader_source_store_iterator& operator--(); + shader_source_store_iterator operator--(int); + + shader_source_store_iterator& operator+=(difference_type n); + shader_source_store_iterator& operator-=(difference_type n); + shader_source_store_iterator operator+(difference_type n) const; + shader_source_store_iterator operator-(difference_type n) const; + difference_type operator-(const shader_source_store_iterator& other) const; + + reference operator[](difference_type n) const; + + bool operator==(const shader_source_store_iterator& other) const; + bool operator!=(const shader_source_store_iterator& other) const; + bool operator<(const shader_source_store_iterator& other) const; + bool operator<=(const shader_source_store_iterator& other) const; + bool operator>(const shader_source_store_iterator& other) const; + bool operator>=(const shader_source_store_iterator& other) const; + +protected: + + void calc_offset(difference_type n); + + reference dereference() const; + +private: + id_iterator_type m_ids{}; + string_iterator_type m_strings{}; + length_iterator_type m_lengths{}; + size_type m_index{}; + offset_type m_offset{}; +}; + + +class shader_source_store +{ +public: + using size_type = std::size_t; + using count_type = ztu::u32; + + using iterator_type = shader_source_store_iterator; + using const_iterator = shader_source_store_iterator; + using view_type = std::ranges::subrange; + using const_view_type = std::ranges::subrange; + using id_type = ztu::id_type_for; + + inline id_type add(const shader_source_data& shader_source); + + [[nodiscard]] inline std::pair find(id_type id); + + [[nodiscard]] inline std::pair find(id_type id) const; + + inline void remove(const iterator_type& it); + + inline void clear(); + + [[nodiscard]] inline iterator_type begin(); + + [[nodiscard]] inline iterator_type end(); + + [[nodiscard]] inline const_iterator begin() const; + + [[nodiscard]] inline const_iterator end() const; + + [[nodiscard]] inline const_iterator cbegin() const; + + [[nodiscard]] inline const_iterator cend() const; + + [[nodiscard]] inline view_type view(); + + [[nodiscard]] inline const_view_type view() const; + +private: + std::vector m_ids; + std::vector m_strings; + std::vector m_lengths; + id_type m_next_data_id{ 1 }; +}; + +} + +#define INCLUDE_SHADER_SOURCE_STORE_IMPLEMENTATION +#include "assets/data_stores/shader_source_store.ipp" +#undef INCLUDE_SHADER_SOURCE_STORE_IMPLEMENTATION diff --git a/include/assets/data_stores/texture_store.hpp b/include/assets/data_stores/texture_store.hpp new file mode 100644 index 0000000..f29dc9f --- /dev/null +++ b/include/assets/data_stores/texture_store.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "generic/generic_basic_store.hpp" +#include "assets/data/texture_data.hpp" + +namespace assets +{ + +using texture_store = generic_basic_store; + +} + diff --git a/include/assets/data_views/material_view.hpp b/include/assets/data_views/material_view.hpp new file mode 100644 index 0000000..0f9361d --- /dev/null +++ b/include/assets/data_views/material_view.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "assets/data/material_data.hpp" + +namespace assets +{ + +using material_view = material_data; + +} \ No newline at end of file diff --git a/include/assets/data_views/mesh_view.hpp b/include/assets/data_views/mesh_view.hpp new file mode 100644 index 0000000..6210315 --- /dev/null +++ b/include/assets/data_views/mesh_view.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include +#include + +#include "assets/components/mesh_vertex_components.hpp" +#include "assets/data/mesh_data.hpp" +#include "assets/data_stores/material_store.hpp" + +namespace assets +{ + +namespace detail +{ +template +struct generic_mesh_view +{ + mesh_vertex_components::flags component_flags; + std::span indices; + std::tuple...> vertex_component_arrays; + material_store::id_type material_id; +}; + +} + +using mesh_view = detail::generic_mesh_view< + mesh_vertex_components::position, + mesh_vertex_components::normal, + mesh_vertex_components::tex_coord, + mesh_vertex_components::color, + mesh_vertex_components::reflectance +>; +} \ No newline at end of file diff --git a/include/assets/data_views/point_cloud_view.hpp b/include/assets/data_views/point_cloud_view.hpp new file mode 100644 index 0000000..3af6fc8 --- /dev/null +++ b/include/assets/data_views/point_cloud_view.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include +#include + +#include "assets/components/point_cloud_vertex_components.hpp" + +namespace assets +{ + +namespace detail +{ +template +struct generic_point_cloud_view +{ + point_cloud_vertex_components::flags vertex_components; + std::tuple...> vertex_component_arrays; +}; +} + +using point_cloud_view = detail::generic_point_cloud_view< + point_cloud_vertex_components::position, + point_cloud_vertex_components::normal, + point_cloud_vertex_components::color, + point_cloud_vertex_components::reflectance +>; + +} \ No newline at end of file diff --git a/include/assets/data_views/shader_source_view.hpp b/include/assets/data_views/shader_source_view.hpp new file mode 100644 index 0000000..7c4f1a1 --- /dev/null +++ b/include/assets/data_views/shader_source_view.hpp @@ -0,0 +1,5 @@ +#pragma once + +#include + +using shader_source_view = std::string_view; diff --git a/include/assets/data_views/texture_view.hpp b/include/assets/data_views/texture_view.hpp new file mode 100644 index 0000000..da644bf --- /dev/null +++ b/include/assets/data_views/texture_view.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "assets/data/material_data.hpp" + +namespace assets +{ + +struct texture_view +{ + std::weak_ptr data; + int width, height; + texture_components::flags component_flags; +}; + +} \ No newline at end of file diff --git a/include/assets/dynamic_data_store.hpp b/include/assets/dynamic_data_store.hpp index 8c138b9..79e7e47 100644 --- a/include/assets/dynamic_data_store.hpp +++ b/include/assets/dynamic_data_store.hpp @@ -1,21 +1,25 @@ #pragma once -#include "dynamic_data_stores/dynamic_material_library_store.hpp" -#include "dynamic_data_stores/dynamic_material_store.hpp" -#include "dynamic_data_stores/dynamic_mesh_store.hpp" -#include "dynamic_data_stores/dynamic_point_cloud_store.hpp" -#include "dynamic_data_stores/dynamic_pose_store.hpp" -#include "dynamic_data_stores/dynamic_shader_source_store.hpp" -#include "dynamic_data_stores/dynamic_texture_store.hpp" +#include "data_stores/material_library_store.hpp" +#include "data_stores/material_store.hpp" +#include "data_stores/mesh_store.hpp" +#include "data_stores/point_cloud_store.hpp" +#include "data_stores/pose_store.hpp" +#include "data_stores/shader_source_store.hpp" +#include "data_stores/texture_store.hpp" + +namespace assets +{ struct dynamic_data_store { - dynamic_material_library_store material_libraries; - dynamic_material_store materials; - dynamic_mesh_store meshes; - dynamic_point_cloud_store point_clouds; - dynamic_pose_store poses; - dynamic_shader_store shaders; - dynamic_texture_store textures; + material_library_store material_libraries; + material_store materials; + mesh_store meshes; + point_cloud_store point_clouds; + pose_store poses; + shader_source_store shader_sources; + texture_store textures; }; +} diff --git a/include/assets/dynamic_data_stores/dynamic_material_library_store.hpp b/include/assets/dynamic_data_stores/dynamic_material_library_store.hpp deleted file mode 100644 index a180507..0000000 --- a/include/assets/dynamic_data_stores/dynamic_material_library_store.hpp +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "generic/generic_dynamic_store.hpp" -#include "assets/dynamic_read_buffers/dynamic_material_library_buffer.hpp" - -using dynamic_material_library_store = generic_dynamic_store; diff --git a/include/assets/dynamic_data_stores/dynamic_material_store.hpp b/include/assets/dynamic_data_stores/dynamic_material_store.hpp deleted file mode 100644 index cfb849f..0000000 --- a/include/assets/dynamic_data_stores/dynamic_material_store.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include "dynamic_texture_store.hpp" -#include "generic/generic_dynamic_component_store.hpp" -#include "assets/dynamic_read_buffers/dynamic_material_buffer.hpp" - -class dynamic_material_store { - using store_type = generic_dynamic_component_store< - components::material::flags, - components::material::surface_properties, - components::material::transparency, - dynamic_texture_store::id_type, - dynamic_texture_store::id_type, - dynamic_texture_store::id_type, - dynamic_texture_store::id_type, - dynamic_texture_store::id_type, - dynamic_texture_store::id_type - >; - -public: - using id_type = store_type::id_type; - using iterator_type = store_type::iterator_type; - using const_iterator = store_type::const_iterator; - - id_type add(const dynamic_material_buffer& data); - - [[nodiscard]] std::pair find(id_type id); - - [[nodiscard]] std::pair find(id_type id) const; - - void remove(const iterator_type& it); - - void clear(); - -private: - store_type m_store; -}; diff --git a/include/assets/dynamic_data_stores/dynamic_mesh_store.hpp b/include/assets/dynamic_data_stores/dynamic_mesh_store.hpp deleted file mode 100644 index 2268d97..0000000 --- a/include/assets/dynamic_data_stores/dynamic_mesh_store.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include "assets/dynamic_data_stores/generic/generic_dynamic_indexed_component_array_store.hpp" - -#include "assets/components/mesh_vertex_components.hpp" -#include "assets/dynamic_read_buffers/dynamic_mesh_buffer.hpp" - -class dynamic_mesh_store -{ - using store_type = generic_dynamic_indexed_component_array_store< - components::mesh_vertex::flags, - ztu::u32, - components::mesh_vertex::position, - components::mesh_vertex::normal, - components::mesh_vertex::tex_coord, - components::mesh_vertex::color, - components::mesh_vertex::reflectance - >; - -public: - using id_type = store_type::id_type; - using iterator_type = store_type::iterator_type; - using const_iterator = store_type::const_iterator; - - id_type add(const dynamic_mesh_buffer& mesh_buffer); - - [[nodiscard]] std::pair find(id_type id); - - [[nodiscard]] std::pair find(id_type id) const; - - void remove(const iterator_type& it); - - void clear(); - -private: - store_type m_store; -}; \ No newline at end of file diff --git a/include/assets/dynamic_data_stores/dynamic_point_cloud_store.hpp b/include/assets/dynamic_data_stores/dynamic_point_cloud_store.hpp deleted file mode 100644 index f86b9c2..0000000 --- a/include/assets/dynamic_data_stores/dynamic_point_cloud_store.hpp +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include "assets/dynamic_data_stores/generic/generic_dynamic_component_array_store.hpp" - -#include "assets/components/point_cloud_vertex_components.hpp" -#include "assets/dynamic_read_buffers/dynamic_point_cloud_buffer.hpp" - - -class dynamic_point_cloud_store -{ - using store_type = generic_dynamic_component_array_store< - components::point_cloud_vertex::flags, - components::point_cloud_vertex::position, - components::point_cloud_vertex::normal, - components::point_cloud_vertex::color, - components::point_cloud_vertex::reflectance - >; - -public: - using id_type = store_type::id_type; - using iterator_type = store_type::iterator_type; - using const_iterator = store_type::const_iterator; - - id_type add(const dynamic_point_cloud_buffer& point_cloud_buffer); - - [[nodiscard]] std::pair find(id_type id); - - [[nodiscard]] std::pair find(id_type id) const; - - void remove(const iterator_type& it); - - void clear(); - -private: - store_type m_store; -}; diff --git a/include/assets/dynamic_data_stores/dynamic_pose_store.hpp b/include/assets/dynamic_data_stores/dynamic_pose_store.hpp deleted file mode 100644 index 9c59d68..0000000 --- a/include/assets/dynamic_data_stores/dynamic_pose_store.hpp +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "generic/generic_dynamic_store.hpp" -#include "glm/mat4x4.hpp" - -using dynamic_pose_store = generic_dynamic_store; diff --git a/include/assets/dynamic_data_stores/dynamic_shader_source_store.hpp b/include/assets/dynamic_data_stores/dynamic_shader_source_store.hpp deleted file mode 100644 index e6a6947..0000000 --- a/include/assets/dynamic_data_stores/dynamic_shader_source_store.hpp +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include "generic/generic_dynamic_store.hpp" -#include "assets/dynamic_read_buffers/dynamic_shader_buffer.hpp" - -// TODO use compressed store where all shaders are condensed into one vector -using dynamic_shader_source_store = generic_dynamic_store; diff --git a/include/assets/dynamic_data_stores/dynamic_texture_store.hpp b/include/assets/dynamic_data_stores/dynamic_texture_store.hpp deleted file mode 100644 index 52437c3..0000000 --- a/include/assets/dynamic_data_stores/dynamic_texture_store.hpp +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "generic/generic_dynamic_store.hpp" -#include "assets/dynamic_read_buffers/dynamic_texture_buffer.hpp" - -using dynamic_texture_store = generic_dynamic_store; diff --git a/include/assets/dynamic_data_stores/dynamic_vertex_store.hpp b/include/assets/dynamic_data_stores/dynamic_vertex_store.hpp deleted file mode 100644 index 77f0e5c..0000000 --- a/include/assets/dynamic_data_stores/dynamic_vertex_store.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include -#include -#include -#include "util/id_type.hpp" -#include "util/uix.hpp" - -#include "GL/glew.h" - -template -class dynamic_vertex_store { -public: - using id_type = ztu::id_type_for; - - void add( - C component_flags, - std::span... components - ); - - void build_vertex_buffer( - std::vector& vertex_buffer, - std::size_t& component_count, - std::array& component_types, - std::array& component_lengths, - GLsizei& stride - ) const; - -protected: - std::tuple...> m_component_buffers{}; - std::vector vertex_counts; - std::vector m_components{ 0 }; -}; - -#define INCLUDE_DYNAMIC_MODEL_DATA_IMPLEMENTATION -#include "assets/dynamic_read_buffers/dynamic_model_buffer.ipp" -#undef INCLUDE_DYNAMIC_MODEL_DATA_IMPLEMENTATION diff --git a/include/assets/dynamic_data_stores/generic/generic_dynamic_component_array_store.hpp b/include/assets/dynamic_data_stores/generic/generic_dynamic_component_array_store.hpp deleted file mode 100644 index 94dec73..0000000 --- a/include/assets/dynamic_data_stores/generic/generic_dynamic_component_array_store.hpp +++ /dev/null @@ -1,149 +0,0 @@ -#pragma once - -#include -#include - -#include "util/uix.hpp" -#include "util/id_type.hpp" - -#include -#include -#include -#include -#include -#include -#include - -template -class generic_dynamic_component_array_store; - -template -class component_array_iterator { -public: - using value_type = std::tuple...>; - using size_type = std::size_t; - using count_type = ztu::u32; - using flag_count_type = std::pair; - using component_array_pointer_type = std::tuple...>; - using flag_count_pointer_type = const flag_count_type*; - using offsets_type = std::array; - using difference_type = std::ptrdiff_t; - using pointer = value_type*; - using reference = value_type; - using iterator_category = std::random_access_iterator_tag; - -private: - friend generic_dynamic_component_array_store; - - component_array_iterator( - component_array_pointer_type components, - flag_count_pointer_type flags, - std::size_t index, - const offsets_type& offsets - ); - -public: - constexpr component_array_iterator() noexcept = default; - - constexpr component_array_iterator(const component_array_iterator&) noexcept = default; - constexpr component_array_iterator(component_array_iterator&&) noexcept = default; - - constexpr component_array_iterator& operator=(const component_array_iterator&) noexcept = default; - constexpr component_array_iterator& operator=(component_array_iterator&&) noexcept = default; - - reference operator*() const; - - component_array_iterator& operator++(); - component_array_iterator operator++(int); - component_array_iterator& operator--(); - component_array_iterator operator--(int); - - component_array_iterator& operator+=(difference_type n); - component_array_iterator& operator-=(difference_type n); - component_array_iterator operator+(difference_type n) const; - component_array_iterator operator-(difference_type n) const; - difference_type operator-(const component_array_iterator& other) const; - - reference operator[](difference_type n) const; - - bool operator==(const component_array_iterator& other) const; - bool operator!=(const component_array_iterator& other) const; - bool operator<(const component_array_iterator& other) const; - bool operator<=(const component_array_iterator& other) const; - bool operator>(const component_array_iterator& other) const; - bool operator>=(const component_array_iterator& other) const; - -protected: - template - static bool is_component_enabled(C flag); - - template - void calc_offsets(std::index_sequence, difference_type n); - - template - reference dereference(std::index_sequence) const; - - template - std::tuple_element_t get_span() const; - -private: - value_type m_components{}; - const flag_count_type* m_flag_counts{}; - size_type m_index{}; - offsets_type m_offsets{}; -}; - -template -class generic_dynamic_component_array_store -{ -public: - using id_type = ztu::id_type_for; - using count_type = ztu::u32; - using iterator_type = component_array_iterator; - using const_iterator = component_array_iterator...>; - using view_type = std::ranges::subrange; - using const_view_type = std::ranges::subrange; - - id_type add(const std::tuple...>& component_arrays); - - [[nodiscard]] std::pair find(id_type id); - - [[nodiscard]] std::pair find(id_type id) const; - - void remove(const iterator_type& it); - - void clear(); - - iterator_type begin(); - - iterator_type end(); - - const_iterator begin() const; - - const_iterator end() const; - - const_iterator cbegin() const; - - const_iterator cend() const; - - view_type view(); - - const_view_type view() const; - -protected: - std::tuple...> data_ptrs(); - - std::tuple>...> data_ptrs() const; - - std::array data_counts() const; - -private: - std::tuple...> m_component_arrays; - std::vector> m_component_flag_counts; - std::vector m_ids; - id_type m_next_data_id{ 1 }; -}; - -#define INCLUDE_GENERIC_DYNAMIC_COMPONENT_ARRAY_STORE_IMPLEMENTATION -#include "assets/dynamic_data_stores/generic/generic_dynamic_component_array_store.ipp" -#undef INCLUDE_GENERIC_DYNAMIC_COMPONENT_ARRAY_STORE_IMPLEMENTATION diff --git a/include/assets/dynamic_data_stores/generic/generic_dynamic_component_store.hpp b/include/assets/dynamic_data_stores/generic/generic_dynamic_component_store.hpp deleted file mode 100644 index 0dbac6f..0000000 --- a/include/assets/dynamic_data_stores/generic/generic_dynamic_component_store.hpp +++ /dev/null @@ -1,147 +0,0 @@ -#pragma once - -#include -#include - -#include "util/uix.hpp" -#include "util/id_type.hpp" - -#include -#include -#include -#include -#include -#include -#include - -template -class generic_dynamic_component_store; - -template -class component_iterator { -public: - - - using value_type = std::tuple...>; - using size_type = std::size_t; - using offsets_type = std::array; - using difference_type = std::ptrdiff_t; - using pointer = value_type*; - using reference = value_type; - using iterator_category = std::random_access_iterator_tag; - -private: - friend generic_dynamic_component_store; - - component_iterator( - value_type components, - const C* flags, - std::size_t index, - const offsets_type& offsets - ); - -public: - - constexpr component_iterator() noexcept = default; - - constexpr component_iterator(const component_iterator&) noexcept = default; - constexpr component_iterator(component_iterator&&) noexcept = default; - - constexpr component_iterator& operator=(const component_iterator&) noexcept = default; - constexpr component_iterator& operator=(component_iterator&&) noexcept = default; - - reference operator*() const; - - component_iterator& operator++(); - component_iterator operator++(int); - component_iterator& operator--(); - component_iterator operator--(int); - - component_iterator& operator+=(difference_type n); - component_iterator& operator-=(difference_type n); - component_iterator operator+(difference_type n) const; - component_iterator operator-(difference_type n) const; - difference_type operator-(const component_iterator& other) const; - - reference operator[](difference_type n) const; - - bool operator==(const component_iterator& other) const; - bool operator!=(const component_iterator& other) const; - bool operator<(const component_iterator& other) const; - bool operator<=(const component_iterator& other) const; - bool operator>(const component_iterator& other) const; - bool operator>=(const component_iterator& other) const; - -protected: - template - static bool is_component_enabled(C flag); - - template - void calc_offsets(std::index_sequence, difference_type n); - - template - reference dereference(std::index_sequence) const; - - template - std::tuple_element_t get_pointer() const; - -private: - value_type m_components{}; - const C* m_flags{}; - size_type m_index{}; - offsets_type m_offsets{}; -}; - -template -class generic_dynamic_component_store -{ -public: - using id_type = ztu::id_type_for; - using iterator_type = component_iterator; - using const_iterator = component_iterator...>; - using view_type = std::ranges::subrange; - using const_view_type = std::ranges::subrange; - - id_type add(const std::tuple...>& data); - - [[nodiscard]] std::pair find(id_type id); - - [[nodiscard]] std::pair find(id_type id) const; - - void remove(const iterator_type& it); - - void clear(); - - iterator_type begin(); - - iterator_type end(); - - const_iterator begin() const; - - const_iterator end() const; - - const_iterator cbegin() const; - - const_iterator cend() const; - - view_type view(); - - const_view_type view() const; - -protected: - std::tuple...> data_ptrs(); - - std::tuple>...> data_ptrs() const; - - std::array data_counts() const; - -private: - std::tuple...> m_components; - std::vector m_component_flags; - std::vector m_ids; - id_type m_next_data_id{ 1 }; -}; - -#define INCLUDE_GENERIC_DYNAMIC_COMPONENT_STORE_IMPLEMENTATION -#include "assets/dynamic_data_stores/generic_dynamic_component_store.ipp" -#undef INCLUDE_GENERIC_DYNAMIC_COMPONENT_STORE_IMPLEMENTATION diff --git a/include/assets/dynamic_data_stores/generic/generic_dynamic_indexed_component_array_store.hpp b/include/assets/dynamic_data_stores/generic/generic_dynamic_indexed_component_array_store.hpp deleted file mode 100644 index 8c47f0d..0000000 --- a/include/assets/dynamic_data_stores/generic/generic_dynamic_indexed_component_array_store.hpp +++ /dev/null @@ -1,157 +0,0 @@ -#pragma once - -#include -#include - -#include "util/uix.hpp" -#include "util/id_type.hpp" - -#include -#include -#include -#include -#include -#include -#include - -template -class generic_dynamic_indexed_component_array_store; - -template -class indexed_component_array_iterator { -public: - using index_type = I; - using value_type = std::tuple, std::span...>; - using size_type = std::size_t; - using count_type = ztu::u32; - using flag_count_type = std::tuple; - using index_array_pointer_type = const index_type*; - using component_array_pointer_type = std::tuple...>; - using flag_count_pointer_type = const flag_count_type*; - - using offsets_type = std::array; - using difference_type = std::ptrdiff_t; - using pointer = value_type*; - using reference = value_type; - using iterator_category = std::random_access_iterator_tag; - -private: - friend generic_dynamic_indexed_component_array_store; - - indexed_component_array_iterator( - index_array_pointer_type indices, - const component_array_pointer_type& components, - flag_count_pointer_type flag_counts, - std::size_t index, - const offsets_type& offsets - ); - -public: - constexpr indexed_component_array_iterator() noexcept = default; - - constexpr indexed_component_array_iterator(const indexed_component_array_iterator&) noexcept = default; - constexpr indexed_component_array_iterator(indexed_component_array_iterator&&) noexcept = default; - - constexpr indexed_component_array_iterator& operator=(const indexed_component_array_iterator&) noexcept = default; - constexpr indexed_component_array_iterator& operator=(indexed_component_array_iterator&&) noexcept = default; - - reference operator*() const; - - indexed_component_array_iterator& operator++(); - indexed_component_array_iterator operator++(int); - indexed_component_array_iterator& operator--(); - indexed_component_array_iterator operator--(int); - - indexed_component_array_iterator& operator+=(difference_type n); - indexed_component_array_iterator& operator-=(difference_type n); - indexed_component_array_iterator operator+(difference_type n) const; - indexed_component_array_iterator operator-(difference_type n) const; - difference_type operator-(const indexed_component_array_iterator& other) const; - - reference operator[](difference_type n) const; - - bool operator==(const indexed_component_array_iterator& other) const; - bool operator!=(const indexed_component_array_iterator& other) const; - bool operator<(const indexed_component_array_iterator& other) const; - bool operator<=(const indexed_component_array_iterator& other) const; - bool operator>(const indexed_component_array_iterator& other) const; - bool operator>=(const indexed_component_array_iterator& other) const; - -protected: - template - static bool is_component_enabled(C flag); - - template - void calc_offsets(std::index_sequence, difference_type n); - - template - reference dereference(std::index_sequence) const; - -private: - index_array_pointer_type m_indices{}; - component_array_pointer_type m_components{}; - flag_count_pointer_type m_flag_counts{}; - size_type m_index{}; - offsets_type m_offsets{}; -}; - -template -class generic_dynamic_indexed_component_array_store -{ -public: - using id_type = ztu::id_type_for; - using count_type = ztu::u32; - using iterator_type = indexed_component_array_iterator; - using const_iterator = indexed_component_array_iterator...>; - using view_type = std::ranges::subrange; - using const_view_type = std::ranges::subrange; - - id_type add( - std::span indices, - const std::tuple...>& component_arrays - ); - - [[nodiscard]] std::pair find(id_type id); - - [[nodiscard]] std::pair find(id_type id) const; - - void remove(const iterator_type& it); - - void clear(); - - iterator_type begin(); - - iterator_type end(); - - const_iterator begin() const; - - const_iterator end() const; - - const_iterator cbegin() const; - - const_iterator cend() const; - - view_type view(); - - const_view_type view() const; - -protected: - - - std::tuple...> component_array_ptrs(); - - std::tuple>...> component_array_ptrs() const; - - std::array array_counts() const; - -private: - std::vector m_indices; - std::tuple...> m_component_arrays; - std::vector> m_component_flag_counts; - std::vector m_ids; - id_type m_next_data_id{ 1 }; -}; - -#define INCLUDE_GENERIC_DYNAMIC_INDEXED_COMPONENT_ARRAY_STORE_IMPLEMENTATION -#include "assets/dynamic_data_stores/generic/generic_dynamic_indexed_component_array_store.ipp" -#undef INCLUDE_GENERIC_DYNAMIC_INDEXED_COMPONENT_ARRAY_STORE_IMPLEMENTATION diff --git a/include/assets/dynamic_read_buffers/dynamic_material_buffer.hpp b/include/assets/dynamic_read_buffers/dynamic_material_buffer.hpp deleted file mode 100755 index 03dc4c1..0000000 --- a/include/assets/dynamic_read_buffers/dynamic_material_buffer.hpp +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -#include - -#include "assets/components/material_components.hpp" -#include "assets/dynamic_data_stores/dynamic_texture_store.hpp" - -struct dynamic_material_buffer { - - dynamic_material_buffer() = default; - - components::material::surface_properties& initialized_surface_properties(); - - [[nodiscard]] inline std::optional& surface_properties(); - [[nodiscard]] inline std::optional& transparency(); - [[nodiscard]] inline std::optional& ambient_color_texture_id(); - [[nodiscard]] inline std::optional& diffuse_color_texture_id(); - [[nodiscard]] inline std::optional& specular_color_texture_id(); - [[nodiscard]] inline std::optional& shininess_texture_id(); - [[nodiscard]] inline std::optional& alpha_texture_id(); - [[nodiscard]] inline std::optional& bump_texture_id(); - - [[nodiscard]] inline const std::optional& surface_properties() const; - [[nodiscard]] inline const std::optional& transparency() const; - [[nodiscard]] inline const std::optional& ambient_color_texture_id() const; - [[nodiscard]] inline const std::optional& diffuse_color_texture_id() const; - [[nodiscard]] inline const std::optional& specular_color_texture_id() const; - [[nodiscard]] inline const std::optional& shininess_texture_id() const; - [[nodiscard]] inline const std::optional& alpha_texture_id() const; - [[nodiscard]] inline const std::optional& bump_texture_id() const; - - inline void clear(); - - std::tuple< - std::optional, - std::optional, - std::optional, - std::optional, - std::optional, - std::optional, - std::optional, - std::optional - > data{ - std::nullopt, std::nullopt, std::nullopt, std::nullopt, std::nullopt, std::nullopt, std::nullopt, std::nullopt - }; -}; - -#define INCLUDE_DYNAMIC_MATERIAL_DATA_IMPLEMENTATION -#include "assets/dynamic_read_buffers/dynamic_material_buffer.ipp" -#undef INCLUDE_DYNAMIC_MATERIAL_DATA_IMPLEMENTATION diff --git a/include/assets/dynamic_read_buffers/dynamic_material_library_buffer.hpp b/include/assets/dynamic_read_buffers/dynamic_material_library_buffer.hpp deleted file mode 100644 index 13b03a6..0000000 --- a/include/assets/dynamic_read_buffers/dynamic_material_library_buffer.hpp +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "util/string_lookup.hpp" -#include "assets/dynamic_data_stores/dynamic_material_store.hpp" - -using dynamic_material_library_buffer = ztu::string_lookup; diff --git a/include/assets/dynamic_read_buffers/dynamic_mesh_buffer.hpp b/include/assets/dynamic_read_buffers/dynamic_mesh_buffer.hpp deleted file mode 100644 index 370f9cd..0000000 --- a/include/assets/dynamic_read_buffers/dynamic_mesh_buffer.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include -#include - -#include "util/uix.hpp" -#include "assets/components/mesh_vertex_components.hpp" -#include "generic/dynamic_vertex_buffer.hpp" -#include "assets/dynamic_data_stores/dynamic_material_store.hpp" - -class dynamic_mesh_buffer : public dynamic_vertex_buffer< - components::mesh_vertex::flags, - components::mesh_vertex::position, - components::mesh_vertex::normal, - components::mesh_vertex::tex_coord, - components::mesh_vertex::color, - components::mesh_vertex::reflectance -> { -public: - using index_type = ztu::u32; - using triangle_type = std::array; - - [[nodiscard]] inline std::vector& positions(); - [[nodiscard]] inline std::vector& normals(); - [[nodiscard]] inline std::vector& tex_coords(); - [[nodiscard]] inline std::vector& colors(); - [[nodiscard]] inline std::vector& reflectances(); - [[nodiscard]] inline std::vector& triangles(); - [[nodiscard]] inline auto& material_id(); - - [[nodiscard]] inline const std::vector& positions() const; - [[nodiscard]] inline const std::vector& normals() const; - [[nodiscard]] inline const std::vector& tex_coords() const; - [[nodiscard]] inline const std::vector& colors() const; - [[nodiscard]] inline const std::vector& reflectances() const; - [[nodiscard]] inline const std::vector& triangles() const; - [[nodiscard]] inline const auto& material_id() const; - - inline void clear(); - -private: - std::vector m_triangles{}; - dynamic_material_store::id_type m_material_id{}; -}; - -#define INCLUDE_DYNAMIC_MESH_DATA_IMPLEMENTATION -#include "assets/dynamic_read_buffers/dynamic_mesh_buffer.ipp" -#undef INCLUDE_DYNAMIC_MESH_DATA_IMPLEMENTATION diff --git a/include/assets/dynamic_read_buffers/dynamic_point_cloud_buffer.hpp b/include/assets/dynamic_read_buffers/dynamic_point_cloud_buffer.hpp deleted file mode 100644 index 142bc72..0000000 --- a/include/assets/dynamic_read_buffers/dynamic_point_cloud_buffer.hpp +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "assets/components/point_cloud_vertex_components.hpp" - -#include -#include -#include "generic/dynamic_vertex_buffer.hpp" - -class dynamic_point_cloud_buffer : public dynamic_vertex_buffer< - components::point_cloud_vertex::flags, - components::point_cloud_vertex::position, - components::point_cloud_vertex::normal, - components::point_cloud_vertex::color, - components::point_cloud_vertex::reflectance -> { -public: - [[nodiscard]] inline std::vector& positions(); - [[nodiscard]] inline std::vector& normals(); - [[nodiscard]] inline std::vector& colors(); - [[nodiscard]] inline std::vector& reflectances(); - - [[nodiscard]] inline const std::vector& positions() const; - [[nodiscard]] inline const std::vector& normals() const; - [[nodiscard]] inline const std::vector& colors() const; - [[nodiscard]] inline const std::vector& reflectances() const; - - inline void clear(); -}; - -#define INCLUDE_DYNAMIC_TEXTURE_DATA_IMPLEMENTATION -#include "assets/dynamic_read_buffers/dynamic_point_cloud_buffer.ipp" -#undef INCLUDE_DYNAMIC_TEXTURE_DATA_IMPLEMENTATION \ No newline at end of file diff --git a/include/assets/dynamic_read_buffers/dynamic_pose_buffer.hpp b/include/assets/dynamic_read_buffers/dynamic_pose_buffer.hpp deleted file mode 100644 index 50181de..0000000 --- a/include/assets/dynamic_read_buffers/dynamic_pose_buffer.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include "glm/mat4x4.hpp" - -using dynamic_pose_buffer = glm::mat4; diff --git a/include/assets/dynamic_read_buffers/dynamic_shader_buffer.hpp b/include/assets/dynamic_read_buffers/dynamic_shader_buffer.hpp deleted file mode 100644 index 9a3f46a..0000000 --- a/include/assets/dynamic_read_buffers/dynamic_shader_buffer.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include -#include "GL/glew.h" - -struct dynamic_shader_buffer -{ - std::vector source{}; - GLenum type{ GL_INVALID_ENUM }; - - inline void clear() - { - source.clear(); - type = GL_INVALID_ENUM; - } -}; diff --git a/include/assets/data_loaders/generic/generic_3dtk_loader.hpp b/include/assets/file_parsers/generic/generic_3dtk_loader.hpp similarity index 81% rename from include/assets/data_loaders/generic/generic_3dtk_loader.hpp rename to include/assets/file_parsers/generic/generic_3dtk_loader.hpp index c92d7fa..c66b65b 100644 --- a/include/assets/data_loaders/generic/generic_3dtk_loader.hpp +++ b/include/assets/file_parsers/generic/generic_3dtk_loader.hpp @@ -9,8 +9,8 @@ #include "util/string_list.hpp" #include "assets/prefetch_queue.hpp" -#include "assets/dynamic_read_buffers/dynamic_point_cloud_buffer.hpp" -#include "assets/dynamic_data_stores/dynamic_point_cloud_store.hpp" +#include "../../read_buffers" +#include "../../data_stores" #include "assets/prefetch_lookup.hpp" @@ -42,7 +42,7 @@ protected: ); void transform_point_cloud( - std::span points, + std::span points, const glm::mat4& pose ); @@ -54,5 +54,5 @@ private: }; #define INCLUDE_GENERIC_3DTK_LOADER_IMPLEMENTATION -#include "assets/data_loaders/generic/generic_3dtk_loader.ipp" +#include "../../data_parsers" #undef INCLUDE_GENERIC_3DTK_LOADER_IMPLEMENTATION diff --git a/include/assets/data_loaders/glsl_loader.hpp b/include/assets/file_parsers/glsl_loader.hpp similarity index 81% rename from include/assets/data_loaders/glsl_loader.hpp rename to include/assets/file_parsers/glsl_loader.hpp index 5387189..a6a652f 100644 --- a/include/assets/data_loaders/glsl_loader.hpp +++ b/include/assets/file_parsers/glsl_loader.hpp @@ -8,9 +8,12 @@ #include "assets/prefetch_lookup.hpp" #include "assets/prefetch_queue.hpp" #include "assets/prefetch_lookups/mesh_prefetch_lookup.hpp" -#include "assets/dynamic_read_buffers/dynamic_shader_buffer.hpp" +#include "assets/data/shader_source_data.hpp" #include "util/string_list.hpp" +namespace assets +{ + struct glsl_loader { static constexpr auto name = std::string_view("glsl"); @@ -21,10 +24,12 @@ struct glsl_loader ); [[nodiscard]] static std::error_code load( - dynamic_shader_buffer& buffer, + shader_source_data& buffer, const file_dir_list& paths, prefetch_lookup& id_lookup, - dynamic_shader_source_store& store, + shader_source_store& store, bool pedantic = false ); -}; \ No newline at end of file +}; + +} diff --git a/include/assets/data_loaders/interface.txt b/include/assets/file_parsers/interface.txt similarity index 100% rename from include/assets/data_loaders/interface.txt rename to include/assets/file_parsers/interface.txt diff --git a/include/assets/data_loaders/kitti_loader.hpp b/include/assets/file_parsers/kitti_loader.hpp similarity index 79% rename from include/assets/data_loaders/kitti_loader.hpp rename to include/assets/file_parsers/kitti_loader.hpp index ccf97b3..ef012af 100644 --- a/include/assets/data_loaders/kitti_loader.hpp +++ b/include/assets/file_parsers/kitti_loader.hpp @@ -6,13 +6,16 @@ #include "assets/dynamic_data_store.hpp" #include "assets/components/point_cloud_vertex_components.hpp" -#include "assets/dynamic_read_buffers/dynamic_point_cloud_buffer.hpp" -#include "assets/dynamic_data_stores/dynamic_point_cloud_store.hpp" +#include "assets/data/point_cloud_data.hpp" +#include "assets/data_stores/point_cloud_store.hpp" #include "assets/prefetch_lookup.hpp" #include "assets/prefetch_queue.hpp" #include "glm/mat4x4.hpp" #include "util/result.hpp" +namespace assets +{ + struct kitti_loader { static constexpr auto name = std::string_view("kitti"); @@ -23,10 +26,10 @@ struct kitti_loader ); [[nodiscard]] static std::error_code load( - dynamic_point_cloud_buffer& buffer, + point_cloud_data& buffer, const file_dir_list& paths, prefetch_lookup& id_lookup, - dynamic_shader_source_store& store, + shader_source_store& store, bool pedantic = false ); @@ -43,7 +46,7 @@ private: ); static void transform_point_cloud( - std::span points, + std::span points, const glm::mat4& pose ); @@ -51,3 +54,6 @@ private: }; + +} + diff --git a/include/assets/data_loaders/kitti_pose_loader.hpp b/include/assets/file_parsers/kitti_pose_loader.hpp similarity index 82% rename from include/assets/data_loaders/kitti_pose_loader.hpp rename to include/assets/file_parsers/kitti_pose_loader.hpp index 7fefe1c..f00fbee 100644 --- a/include/assets/data_loaders/kitti_pose_loader.hpp +++ b/include/assets/file_parsers/kitti_pose_loader.hpp @@ -6,8 +6,8 @@ #include "assets/prefetch_lookup.hpp" #include "assets/prefetch_queue.hpp" #include "util/string_list.hpp" -#include "assets/dynamic_data_stores/dynamic_pose_store.hpp" -#include "assets/dynamic_read_buffers/dynamic_pose_buffer.hpp" +#include "../data_stores" +#include "assets/data" #include "assets/prefetch_lookups/pose_prefetch_lookup.hpp" struct kitti_pose_loader @@ -23,7 +23,7 @@ struct kitti_pose_loader dynamic_pose_buffer& buffer, const file_dir_list& paths, prefetch_lookup& id_lookup, - dynamic_shader_source_store& store, + shader_source_store& store, bool pedantic = false ); diff --git a/include/assets/data_loaders/mtl_loader.hpp b/include/assets/file_parsers/mtl_loader.hpp similarity index 83% rename from include/assets/data_loaders/mtl_loader.hpp rename to include/assets/file_parsers/mtl_loader.hpp index 9d9df81..efd8ea6 100644 --- a/include/assets/data_loaders/mtl_loader.hpp +++ b/include/assets/file_parsers/mtl_loader.hpp @@ -6,9 +6,9 @@ #include "assets/dynamic_data_store.hpp" #include "assets/prefetch_lookup.hpp" #include "assets/prefetch_queue.hpp" -#include "assets/dynamic_read_buffers/dynamic_material_buffer.hpp" -#include "assets/dynamic_data_stores/dynamic_material_library_store.hpp" -#include "assets/dynamic_data_stores/dynamic_material_store.hpp" +#include "assets/data" +#include "../data_stores" +#include "../data_stores" #include "util/string_lookup.hpp" #include "util/result.hpp" @@ -41,7 +41,7 @@ struct mtl_loader dynamic_material_library_buffer& material_library_buffer, const file_dir_list& paths, prefetch_lookup& id_lookup, - dynamic_shader_source_store& store, + shader_source_store& store, bool pedantic = false ); diff --git a/include/assets/data_loaders/obj_loader.hpp b/include/assets/file_parsers/obj_loader.hpp similarity index 93% rename from include/assets/data_loaders/obj_loader.hpp rename to include/assets/file_parsers/obj_loader.hpp index 197f998..8d9596e 100755 --- a/include/assets/data_loaders/obj_loader.hpp +++ b/include/assets/file_parsers/obj_loader.hpp @@ -3,8 +3,8 @@ #include #include #include -#include "assets/dynamic_data_loaders/dynamic_material_loader.hpp" -#include "assets/dynamic_data_stores/dynamic_mesh_store.hpp" +#include "../data_loaders" +#include "../data_stores" #include "assets/prefetch_lookup.hpp" #include diff --git a/include/assets/data_loaders/stl_loader.hpp b/include/assets/file_parsers/stl_loader.hpp similarity index 78% rename from include/assets/data_loaders/stl_loader.hpp rename to include/assets/file_parsers/stl_loader.hpp index cee3a8c..1d4b3ff 100644 --- a/include/assets/data_loaders/stl_loader.hpp +++ b/include/assets/file_parsers/stl_loader.hpp @@ -5,8 +5,8 @@ #include #include "assets/dynamic_data_store.hpp" -#include "assets/dynamic_read_buffers/dynamic_mesh_buffer.hpp" -#include "assets/dynamic_data_stores/dynamic_mesh_store.hpp" +#include "assets/data" +#include "../data_stores" #include "assets/prefetch_lookup.hpp" #include "assets/prefetch_queue.hpp" @@ -24,7 +24,7 @@ struct stl_loader { dynamic_mesh_buffer& buffer, const file_dir_list& paths, prefetch_lookup& id_lookup, - dynamic_shader_source_store& store, + shader_source_store& store, bool pedantic = false ); }; diff --git a/include/assets/data_loaders/threedtk_pose_loader.hpp b/include/assets/file_parsers/threedtk_pose_loader.hpp similarity index 89% rename from include/assets/data_loaders/threedtk_pose_loader.hpp rename to include/assets/file_parsers/threedtk_pose_loader.hpp index b545a05..aabf515 100644 --- a/include/assets/data_loaders/threedtk_pose_loader.hpp +++ b/include/assets/file_parsers/threedtk_pose_loader.hpp @@ -5,7 +5,7 @@ #include "assets/dynamic_data_store.hpp" #include "assets/prefetch_lookup.hpp" #include "assets/prefetch_queue.hpp" -#include "assets/dynamic_read_buffers/dynamic_pose_buffer.hpp" +#include "assets/data" #include "util/string_list.hpp" #include "util/result.hpp" #include "assets/prefetch_lookups/pose_prefetch_lookup.hpp" @@ -23,7 +23,7 @@ struct threedtk_pose_loader dynamic_pose_buffer& buffer, const file_dir_list& paths, prefetch_lookup& id_lookup, - dynamic_shader_source_store& store, + shader_source_store& store, bool pedantic = false ); diff --git a/include/assets/data_loaders/uos_loader.hpp b/include/assets/file_parsers/uos_loader.hpp similarity index 100% rename from include/assets/data_loaders/uos_loader.hpp rename to include/assets/file_parsers/uos_loader.hpp diff --git a/include/assets/data_loaders/uos_normal_loader.hpp b/include/assets/file_parsers/uos_normal_loader.hpp similarity index 100% rename from include/assets/data_loaders/uos_normal_loader.hpp rename to include/assets/file_parsers/uos_normal_loader.hpp diff --git a/include/assets/data_loaders/uos_rgb_loader.hpp b/include/assets/file_parsers/uos_rgb_loader.hpp similarity index 100% rename from include/assets/data_loaders/uos_rgb_loader.hpp rename to include/assets/file_parsers/uos_rgb_loader.hpp diff --git a/include/assets/data_loaders/uosr_loader.hpp b/include/assets/file_parsers/uosr_loader.hpp similarity index 100% rename from include/assets/data_loaders/uosr_loader.hpp rename to include/assets/file_parsers/uosr_loader.hpp diff --git a/include/assets/prefetch_lookup.hpp b/include/assets/prefetch_lookup.hpp index 33c034c..0bb48cf 100644 --- a/include/assets/prefetch_lookup.hpp +++ b/include/assets/prefetch_lookup.hpp @@ -8,6 +8,9 @@ #include "prefetch_lookups/shader_prefetch_lookup.hpp" #include "prefetch_lookups/texture_prefetch_lookup.hpp" +namespace assets +{ + struct prefetch_lookup { texture_prefetch_lookup textures; @@ -16,5 +19,7 @@ struct prefetch_lookup mesh_prefetch_lookup meshes; pose_prefetch_lookup poses; point_cloud_prefetch_lookup point_clouds; - shader_prefetch_lookup shaders; -}; \ No newline at end of file + shader_source_prefetch_lookup shader_sources; +}; + +} diff --git a/include/assets/prefetch_lookups/material_library_prefetch_lookup.hpp b/include/assets/prefetch_lookups/material_library_prefetch_lookup.hpp index e4b1a71..0bcfc6a 100644 --- a/include/assets/prefetch_lookups/material_library_prefetch_lookup.hpp +++ b/include/assets/prefetch_lookups/material_library_prefetch_lookup.hpp @@ -2,6 +2,11 @@ #include #include -#include "assets/dynamic_data_stores/dynamic_material_library_store.hpp" +#include "assets/data_stores/material_library_store.hpp" -using material_library_prefetch_lookup = std::unordered_map; +namespace assets +{ + +using material_library_prefetch_lookup = std::unordered_map; + +} diff --git a/include/assets/prefetch_lookups/material_prefetch_lookup.hpp b/include/assets/prefetch_lookups/material_prefetch_lookup.hpp index efe5bdd..d9f4833 100644 --- a/include/assets/prefetch_lookups/material_prefetch_lookup.hpp +++ b/include/assets/prefetch_lookups/material_prefetch_lookup.hpp @@ -2,6 +2,11 @@ #include #include -#include "assets/dynamic_data_stores/dynamic_material_store.hpp" +#include "assets/data_stores/material_store.hpp" -using material_prefetch_lookup = std::unordered_map; +namespace assets +{ + +using material_prefetch_lookup = std::unordered_map; + +} diff --git a/include/assets/prefetch_lookups/mesh_prefetch_lookup.hpp b/include/assets/prefetch_lookups/mesh_prefetch_lookup.hpp index 3e60670..41e0b55 100644 --- a/include/assets/prefetch_lookups/mesh_prefetch_lookup.hpp +++ b/include/assets/prefetch_lookups/mesh_prefetch_lookup.hpp @@ -2,6 +2,11 @@ #include #include -#include "assets/dynamic_data_stores/dynamic_mesh_store.hpp" +#include "assets/data_stores/mesh_store.hpp" -using mesh_prefetch_lookup = std::unordered_map; +namespace assets +{ + +using mesh_prefetch_lookup = std::unordered_map; + +} diff --git a/include/assets/prefetch_lookups/point_cloud_prefetch_lookup.hpp b/include/assets/prefetch_lookups/point_cloud_prefetch_lookup.hpp index 1eef821..b6f4936 100644 --- a/include/assets/prefetch_lookups/point_cloud_prefetch_lookup.hpp +++ b/include/assets/prefetch_lookups/point_cloud_prefetch_lookup.hpp @@ -2,6 +2,11 @@ #include #include -#include "assets/dynamic_data_stores/dynamic_point_cloud_store.hpp" +#include "assets/data_stores/point_cloud_store.hpp" -using point_cloud_prefetch_lookup = std::unordered_map; +namespace assets +{ + +using point_cloud_prefetch_lookup = std::unordered_map; + +} diff --git a/include/assets/prefetch_lookups/pose_prefetch_lookup.hpp b/include/assets/prefetch_lookups/pose_prefetch_lookup.hpp index b80cfc0..3b41d11 100644 --- a/include/assets/prefetch_lookups/pose_prefetch_lookup.hpp +++ b/include/assets/prefetch_lookups/pose_prefetch_lookup.hpp @@ -3,43 +3,47 @@ #include #include -#include "assets/dynamic_data_stores/dynamic_pose_store.hpp" #include "util/uix.hpp" +#include "assets/data_stores/pose_store.hpp" -class pose_prefetch_lookup { +namespace assets +{ + +class pose_prefetch_lookup +{ public: using index_type = ztu::u32; using directory_lookup = std::unordered_map; using directory_iterator = std::pair; using index_lookup = std::vector; using index_iterator = index_lookup::iterator; - using lookup_type = std::vector; + using lookup_type = std::vector; using iterator = lookup_type::iterator; void emplace( const std::filesystem::path& directory, index_type index, - dynamic_pose_store::id_type id + pose_store::id_type id ); void emplace_hint_dir( directory_iterator directory_it, index_type index, - dynamic_pose_store::id_type id + pose_store::id_type id ); void emplace_hint_dir_index( directory_iterator directory_it, index_iterator index_it, index_type index, - dynamic_pose_store::id_type id + pose_store::id_type id ); std::pair find_directory( const std::filesystem::path& directory ); - std::pair find_index( + std::pair find_index( directory_iterator directory_it, index_type index ); @@ -54,3 +58,5 @@ private: index_lookup m_directory_indices; // count before indices, indices sorted per dir lookup_type m_pose_ids; // offset by 1 }; + +} diff --git a/include/assets/prefetch_lookups/shader_prefetch_lookup.hpp b/include/assets/prefetch_lookups/shader_prefetch_lookup.hpp index 7cdd980..8b04f81 100644 --- a/include/assets/prefetch_lookups/shader_prefetch_lookup.hpp +++ b/include/assets/prefetch_lookups/shader_prefetch_lookup.hpp @@ -2,6 +2,11 @@ #include #include -#include "assets/dynamic_data_stores/dynamic_shader_st +#include "assets/data_stores/shader_source_store.hpp" -using texture_prefetch_lookup = std::unordered_map; +namespace assets +{ + +using shader_source_prefetch_lookup = std::unordered_map; + +} diff --git a/include/assets/prefetch_lookups/texture_prefetch_lookup.hpp b/include/assets/prefetch_lookups/texture_prefetch_lookup.hpp index c345f9d..b65837c 100644 --- a/include/assets/prefetch_lookups/texture_prefetch_lookup.hpp +++ b/include/assets/prefetch_lookups/texture_prefetch_lookup.hpp @@ -2,6 +2,11 @@ #include #include -#include "assets/dynamic_data_stores/dynamic_texture_store.hpp" +#include "assets/data_stores/texture_store.hpp" -using texture_prefetch_lookup = std::unordered_map; +namespace assets +{ + +using texture_prefetch_lookup = std::unordered_map; + +} diff --git a/include/assets/prefetch_queue.hpp b/include/assets/prefetch_queue.hpp index da77caa..b1e6f9e 100644 --- a/include/assets/prefetch_queue.hpp +++ b/include/assets/prefetch_queue.hpp @@ -2,12 +2,16 @@ #include "util/string_list.hpp" +namespace assets +{ + struct file_dir_list { ztu::string_list files; ztu::string_list directories; }; + struct prefetch_queue { file_dir_list obj_queue; @@ -25,4 +29,6 @@ struct prefetch_queue file_dir_list kitti_pose_queue; file_dir_list glsl_queue; -}; \ No newline at end of file +}; + +} diff --git a/include/geometry/normal_estimation.hpp b/include/geometry/normal_estimation.hpp index 4d8bbb0..b4446b9 100644 --- a/include/geometry/normal_estimation.hpp +++ b/include/geometry/normal_estimation.hpp @@ -8,7 +8,7 @@ #include "assets/components/mesh_vertex_components.hpp" void estimate_normals( - std::span vertices, + std::span vertices, std::span> triangles, - std::vector& normals + std::vector& normals ); \ No newline at end of file diff --git a/include/opengl/data/material_data.hpp b/include/opengl/data/material_data.hpp index 8322263..9d2c319 100644 --- a/include/opengl/data/material_data.hpp +++ b/include/opengl/data/material_data.hpp @@ -20,16 +20,16 @@ private: const std::optional& surface_properties_handle, const std::optional& alpha_handle, std::optional&& texture_data, - components::material::flags components + material_components::flags components ); public: material_data() = default; [[nodiscard]] static std::error_code build_from( - const std::optional& texture_opt, - const std::optional& surface_properties_opt, - const std::optional& transparency_opt, + const std::optional& texture_opt, + const std::optional& surface_properties_opt, + const std::optional& transparency_opt, material_component::flags components, material_data& data ); diff --git a/include/opengl/data/mesh_data.hpp b/include/opengl/data/mesh_data.hpp index 734261a..b345989 100755 --- a/include/opengl/data/mesh_data.hpp +++ b/include/opengl/data/mesh_data.hpp @@ -19,7 +19,7 @@ private: GLuint index_vbo_id, GLuint vao_id, ztu::u32 material_id, - components::mesh_vertex::flags components, + mesh_vertex_components::flags components, GLsizei index_count ); @@ -33,7 +33,7 @@ public: GLsizei stride, std::span index_buffer, ztu::u32 material_id, - components::mesh_vertex::flags components, + mesh_vertex_components::flags components, mesh_data& data ); @@ -47,7 +47,7 @@ public: [[nodiscard]] mesh_handle handle() const; - [[nodiscard]] components::mesh_vertex::flags components() const; + [[nodiscard]] mesh_vertex_components::flags components() const; [[nodiscard]] ztu::u32 material_id() const; @@ -57,8 +57,8 @@ private: GLuint m_vertex_vbo_id{ 0 }; GLuint m_index_vbo_id{ 0 }; ztu::u32 m_material_id{ 0 }; - components::mesh_vertex::flags m_component_types{ - components::mesh_vertex::flags::none + mesh_vertex_components::flags m_component_types{ + mesh_vertex_components::flags::none }; }; } diff --git a/include/opengl/data/point_cloud_data.hpp b/include/opengl/data/point_cloud_data.hpp index 9beeaee..c100dc1 100644 --- a/include/opengl/data/point_cloud_data.hpp +++ b/include/opengl/data/point_cloud_data.hpp @@ -39,13 +39,13 @@ public: [[nodiscard]] point_cloud_handle handle() const; - [[nodiscard]] components::point_cloud_vertex::flags components() const; + [[nodiscard]] point_cloud_vertex_components::flags components() const; private: point_cloud_handle m_handle{}; GLuint m_vertex_vbo_id{ 0 }; - components::point_cloud_vertex::flags m_component_types{ - components::point_cloud_vertex::flags::none + point_cloud_vertex_components::flags m_component_types{ + point_cloud_vertex_components::flags::none }; }; } diff --git a/include/opengl/data_managers/buffer_manager.hpp b/include/opengl/data_managers/buffer_manager.hpp deleted file mode 100644 index ac01620..0000000 --- a/include/opengl/data_managers/buffer_manager.hpp +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -namespace zgl -{ - -class buffer_manager -{ -public: - using store_type = dynamic_texture_store; - using store_id_type = store_type::id_type; - using resource_manager_type = resource_manager; - using resource_type = resource_manager_type::resource_handle; - using handle_type = texture_handle; - - static constexpr std::size_t min_garbage_collection_count = 4; - - void process(store_type& store); - - std::optional get_handle(store_id_type id); - - void collect_garbage(bool force = false); - -private: - - resource_manager m_resource_manager; - - std::vector> m_texture_buffer; - std::vector m_texture_id_buffer; - - - -}; - - -} - diff --git a/include/opengl/data_managers/mesh_index_buffer_manager.hpp b/include/opengl/data_managers/mesh_index_buffer_manager.hpp new file mode 100644 index 0000000..ad03446 --- /dev/null +++ b/include/opengl/data_managers/mesh_index_buffer_manager.hpp @@ -0,0 +1,35 @@ +#pragma once + +#include "../../assets/data_stores" +#include "opengl/resource_management/resource_manager.hpp" +#include "opengl/handles/index_buffer_handle.hpp" +#include "opengl/metadata/index_buffer_metadata.hpp" + +namespace zgl +{ +class mesh_index_buffer_manager +{ +public: + using store_type = dynamic_mesh_store; + using store_id_type = store_type::id_type; + using metadata_type = index_buffer_metadata; + using handle_type = index_buffer_handle; + using resource_manager_type = resource_manager; + using entry_type = std::pair; + + static constexpr std::size_t min_garbage_collection_count = 4; + + void process(store_type& store); + + std::optional get_handle(store_id_type id); + + void collect_garbage(bool force = false); + +protected: + resource_manager_type m_resource_manager; + +private: + std::vector m_mesh_buffer; + std::vector m_buffer_id_buffer; +}; +} diff --git a/include/opengl/data_managers/mesh_vertex_buffer_manager.hpp b/include/opengl/data_managers/mesh_vertex_buffer_manager.hpp index cbd459c..9261bc9 100644 --- a/include/opengl/data_managers/mesh_vertex_buffer_manager.hpp +++ b/include/opengl/data_managers/mesh_vertex_buffer_manager.hpp @@ -1,32 +1,38 @@ #pragma once -#include "assets/dynamic_data_stores/dynamic_mesh_store.hpp" +#include "assets/data_stores/mesh_store.hpp" #include "opengl/resource_management/resource_manager.hpp" #include "opengl/handles/vertex_buffer_handle.hpp" -#include "opengl/metadata/vertex_buffer_metadata.hpp" +#include "opengl/metadata/mesh_vertex_buffer_metadata.hpp" namespace zgl { class mesh_vertex_buffer_manager { public: - using store_type = dynamic_mesh_store; + using store_type = assets::mesh_store; using store_id_type = store_type::id_type; - using metadata_type = vertex_buffer_metadata; + using metadata_type = mesh_vertex_buffer_metadata; using handle_type = vertex_buffer_handle; using resource_manager_type = resource_manager; - using texture_entry_type = std::pair; + using entry_type = std::pair; static constexpr std::size_t min_garbage_collection_count = 4; void process(store_type& store); - std::optional get_handle(store_id_type id); + std::optional get_handle(store_id_type id); void collect_garbage(bool force = false); -private: +protected: resource_manager_type m_resource_manager; + +private: + std::vector m_mesh_buffer; + std::vector m_buffer_id_buffer; + + std::vector m_byte_buffer; }; } diff --git a/include/opengl/data_managers/point_cloud_vertex_buffer_manager.hpp b/include/opengl/data_managers/point_cloud_vertex_buffer_manager.hpp new file mode 100644 index 0000000..8ad971a --- /dev/null +++ b/include/opengl/data_managers/point_cloud_vertex_buffer_manager.hpp @@ -0,0 +1,38 @@ +#pragma once + +#include "assets/data_stores/point_cloud_store.hpp" +#include "opengl/resource_management/resource_manager.hpp" +#include "opengl/handles/vertex_buffer_handle.hpp" +#include "opengl/metadata/point_cloud_vertex_buffer_metadata.hpp" + +namespace zgl +{ + +class point_cloud_vertex_buffer_manager +{ +public: + using store_type = assets::point_cloud_store; + using store_id_type = store_type::id_type; + using metadata_type = point_cloud_vertex_buffer_metadata; + using handle_type = vertex_buffer_handle; + using resource_manager_type = resource_manager; + using entry_type = std::pair; + + static constexpr std::size_t min_garbage_collection_count = 4; + + void process(store_type& store); + + std::optional get_handle(store_id_type id); + + void collect_garbage(bool force = false); + +protected: + resource_manager_type m_resource_manager; + +private: + std::vector m_point_cloud_buffer; + std::vector m_buffer_id_buffer; + std::vector m_byte_buffer; +}; + +} diff --git a/include/opengl/data_managers/shader_manager.hpp b/include/opengl/data_managers/shader_manager.hpp index f96af0c..eecb2c4 100644 --- a/include/opengl/data_managers/shader_manager.hpp +++ b/include/opengl/data_managers/shader_manager.hpp @@ -6,7 +6,7 @@ #include #include -#include "assets/dynamic_data_stores/dynamic_shader_source_store.hpp" +#include "assets/data_stores/shader_source_store.hpp" #include "opengl/shader_program_lookup.hpp" #include "opengl/handles/shader_handle.hpp" #include "util/string_lookup.hpp" @@ -26,11 +26,11 @@ class shader_manager public: void process( - const dynamic_shader_source_store& shader_sources + const assets::shader_source_store& shader_sources ); void get_handles( - const dynamic_shader_source_store& shader_sources, + const assets::shader_source_store& shader_sources, std::span requirements, std::span metadata, std::span shader_sets diff --git a/include/opengl/data_managers/shader_program_manager.hpp b/include/opengl/data_managers/shader_program_manager.hpp index 010717e..478e317 100644 --- a/include/opengl/data_managers/shader_program_manager.hpp +++ b/include/opengl/data_managers/shader_program_manager.hpp @@ -1,7 +1,7 @@ #pragma once #include "shader_manager.hpp" -#include "assets/dynamic_data_stores/dynamic_shader_source_store.hpp" +#include "assets/data_stores/shader_source_store.hpp" #include "opengl/data/shader_program_data.hpp" #include "opengl/shading/requirements/shader_program_requirements.hpp" #include "opengl/metadata/shader_program_metadata.hpp" @@ -18,11 +18,11 @@ class shader_program_manager public: void process( - const dynamic_shader_source_store& shader_sources + const assets::shader_source_store& shader_sources ); void get_handles( - const dynamic_shader_source_store& shader_sources, + const assets::shader_source_store& shader_sources, std::span requirements, std::span metadata, std::span shader_programs diff --git a/include/opengl/data_managers/shader_source_manager.hpp b/include/opengl/data_managers/shader_source_manager.hpp index 8e214c9..8d2e5a4 100644 --- a/include/opengl/data_managers/shader_source_manager.hpp +++ b/include/opengl/data_managers/shader_source_manager.hpp @@ -6,11 +6,11 @@ #include #include "util/string_lookup.hpp" -#include "../metadata/shader_source_metadata.hpp" +#include "opengl/metadata/shader_source_metadata.hpp" #include "opengl/shading/requirements/shader_source_requirements.hpp" #include "opengl/metadata/preprocessed_shader_source_metadata.hpp" -#include "assets/dynamic_data_stores/dynamic_shader_source_store.hpp" +#include "assets/data_stores/shader_source_store.hpp" #include "opengl/shading/shader_source_set.hpp" namespace zgl { @@ -19,11 +19,11 @@ class shader_source_manager { public: void process( - const dynamic_shader_source_store& shader_sources + const assets::shader_source_store& shader_sources ); void get_shader_sources( - const dynamic_shader_source_store& shader_sources, + const assets::shader_source_store& shader_sources, std::span requirements, std::span metadata, std::vector& shader_strings @@ -79,7 +79,7 @@ private: std::vector m_declaration_token_count_buffer; std::array m_declaration_type_index_buffer; - using source_lookup_entry_type = std::pair; + using source_lookup_entry_type = std::pair; using source_lookup_type = std::vector; source_lookup_type m_shader_source_lookup; diff --git a/include/opengl/data_managers/texture_manager.hpp b/include/opengl/data_managers/texture_manager.hpp index 2895719..899eb3a 100644 --- a/include/opengl/data_managers/texture_manager.hpp +++ b/include/opengl/data_managers/texture_manager.hpp @@ -2,8 +2,8 @@ #include -#include "assets/dynamic_read_buffers/dynamic_texture_buffer.hpp" -#include "assets/dynamic_data_stores/dynamic_texture_store.hpp" +#include "../../assets/read_buffers" +#include "../../assets/data_stores" #include "opengl/handles/texture_handle.hpp" #include @@ -20,20 +20,20 @@ public: using metadata_type = texture_metadata; using handle_type = texture_handle; using resource_manager_type = resource_manager; - using texture_entry_type = std::pair; + using entry_type = std::pair; static constexpr std::size_t min_garbage_collection_count = 4; void process(store_type& store); - std::optional get_handle(store_id_type id); + std::optional get_handle(store_id_type id); void collect_garbage(bool force = false); -private: - +protected: resource_manager_type m_resource_manager; +private: std::vector> m_texture_buffer; std::vector m_texture_id_buffer; }; diff --git a/include/opengl/handles/index_buffer_handle.hpp b/include/opengl/handles/index_buffer_handle.hpp index 0372f0d..904ce04 100644 --- a/include/opengl/handles/index_buffer_handle.hpp +++ b/include/opengl/handles/index_buffer_handle.hpp @@ -2,6 +2,7 @@ #include "opengl/resource_management/resource_handle.hpp" + namespace zgl { diff --git a/include/opengl/metadata/index_buffer_metadata.hpp b/include/opengl/metadata/index_buffer_metadata.hpp new file mode 100644 index 0000000..73ca62e --- /dev/null +++ b/include/opengl/metadata/index_buffer_metadata.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include + +#include "GL/glew.h" + +namespace zgl +{ + +struct index_buffer_metadata +{ + GLsizei count; + GLenum index_type; +}; + +} diff --git a/include/opengl/metadata/mesh_vertex_buffer_metadata.hpp b/include/opengl/metadata/mesh_vertex_buffer_metadata.hpp new file mode 100644 index 0000000..022f33e --- /dev/null +++ b/include/opengl/metadata/mesh_vertex_buffer_metadata.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "assets/components/mesh_vertex_components.hpp" +#include "assets/data_stores/material_store.hpp" + +namespace zgl +{ + +struct mesh_vertex_buffer_metadata +{ + assets::mesh_vertex_components::flags component_flags; + assets::material_store::id_type material_id{}; +}; + +} diff --git a/include/opengl/metadata/point_cloud_vertex_buffer_metadata.hpp b/include/opengl/metadata/point_cloud_vertex_buffer_metadata.hpp new file mode 100644 index 0000000..bb587aa --- /dev/null +++ b/include/opengl/metadata/point_cloud_vertex_buffer_metadata.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include "assets/components/point_cloud_vertex_components.hpp" + +namespace zgl +{ + +struct point_cloud_vertex_buffer_metadata +{ + assets::point_cloud_vertex_components::flags component_flags; + std::size_t point_count; +}; + +} diff --git a/include/opengl/metadata/texture_metadata.hpp b/include/opengl/metadata/texture_metadata.hpp index 7f11651..daea143 100644 --- a/include/opengl/metadata/texture_metadata.hpp +++ b/include/opengl/metadata/texture_metadata.hpp @@ -7,7 +7,7 @@ namespace zgl struct texture_metadata { - components::texture::flags components; + texture_components::flags components; }; } diff --git a/include/opengl/metadata/vertex_buffer_metadata.hpp b/include/opengl/metadata/vertex_buffer_metadata.hpp deleted file mode 100644 index 80cf2b9..0000000 --- a/include/opengl/metadata/vertex_buffer_metadata.hpp +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include "assets/components/texture_components.hpp" -#include - -#include "GL/glew.h" - -namespace zgl -{ - -struct vertex_buffer_metadata -{ - static constexpr std::size_t max_component_count = 8; - - struct component - { - GLenum type{ GL_INVALID_ENUM }; - GLint length{ 0 }; - }; - - std::array components{}; - GLuint component_count{}; - GLsizei stride{}; -}; - -} diff --git a/include/opengl/vertex_buffer_utils.hpp b/include/opengl/vertex_buffer_utils.hpp new file mode 100644 index 0000000..82a0d8c --- /dev/null +++ b/include/opengl/vertex_buffer_utils.hpp @@ -0,0 +1,127 @@ +#pragma once + +#include "opengl/type_utils.hpp" +#include "opengl/metadata/vertex_buffer_metadata.hpp" +#include "util/specialised_lambda.hpp" +#include +#include +#include +#include +#include + +namespace zgl::vertex_buffer_utils +{ + +namespace detail +{ + +template +concept numeric_type = std::integral or std::floating_point; + +template +void for_enabled_components( + const C components, + auto&& f, + std::span buffers... +) { + ( + [&, index = std::size_t{}](const auto& buffer) + { + if ((components & static_cast(1 << index)) != C{}) + { + f(buffer, index); + } + ++index; + }(buffers), + ... + ); +}; + +} + +template +vertex_buffer_metadata generate_metadata( + const C components, + std::span buffers... +) { + + auto meta = vertex_buffer_metadata{}; + + detail::for_enabled_components( + components, + ztu::specialised_lambda + { + // Visitor for scalar values + [&](const std::span&, std::size_t index) + { + auto& component = meta.components[index]; + component.type = type_utils::to_gl_type(); + component.count = 1; + ++meta.component_count; + }, + // Visitor for numbers + [&](const std::span>&, std::size_t index) + { + auto& component = meta.components[index]; + component.type = type_utils::to_gl_type(); + component.count = Count; + ++meta.component_count; + } + }, + buffers... + ); + + for (const auto& component : std::span(meta.components).subspan(0, meta.component_count)) + { + meta.stride += type_utils::size_of(component.type) * component.count; + } + + return meta; +} + +template +void interlace( + std::vector& vertex_buffer, + const C components, + std::span buffers... +) { + std::array byte_offsets; + auto stride = std::size_t{}; + + detail::for_enabled_components( + components, + [&]( + const std::span&, + std::size_t index + ) { + byte_offsets[index] = stride; + stride += sizeof(Component); + }, + buffers... + ); + + const auto vertex_count = std::min({ buffers.size()... }); + const auto buffer_size = stride * vertex_count; + + vertex_buffer.resize(buffer_size); + + detail::for_enabled_components( + components, + [&](const std::span& buffer, std::size_t index) + { + const auto byte_offset = byte_offsets[index]; + for (const auto& value : buffer.subspan(0, vertex_count)) + { + std::memcpy( + &vertex_buffer[byte_offset], + &value, + sizeof(value) + ); + byte_offset += stride; + } + }, + buffers... + ); +}; + +} diff --git a/include/rendering/batch_renderers/mesh_batch_renderer.hpp b/include/rendering/batch_renderers/mesh_batch_renderer.hpp index f8f6fd0..e3b384c 100644 --- a/include/rendering/batch_renderers/mesh_batch_renderer.hpp +++ b/include/rendering/batch_renderers/mesh_batch_renderer.hpp @@ -18,7 +18,7 @@ class mesh_batch_renderer { public: using batch_components_type = std::pair< - components::mesh_vertex::flags, + mesh_vertex_components::flags, material_component::flags >; using batch_type = mesh_batch; diff --git a/include/rendering/batch_renderers/point_cloud_batch_renderer.hpp b/include/rendering/batch_renderers/point_cloud_batch_renderer.hpp index ee9eecc..9866932 100644 --- a/include/rendering/batch_renderers/point_cloud_batch_renderer.hpp +++ b/include/rendering/batch_renderers/point_cloud_batch_renderer.hpp @@ -15,7 +15,7 @@ namespace rendering class point_cloud_batch_renderer { public: - using batch_components_type = components::point_cloud_vertex::flags; + using batch_components_type = point_cloud_vertex_components::flags; using batch_type = point_cloud_batch; using batch_index_type = ztu::u32; using batch_id_type = batch_index_type; diff --git a/include/rendering/requirements/mesh_requirements.hpp b/include/rendering/requirements/mesh_requirements.hpp index 0ae33e1..567146e 100644 --- a/include/rendering/requirements/mesh_requirements.hpp +++ b/include/rendering/requirements/mesh_requirements.hpp @@ -13,11 +13,11 @@ namespace rendering::requirements::mesh struct type { shading::features::mesh::indices::type shader_program_requirement_index{}; - components::mesh_vertex::flags vertex_requirements{ - components::mesh_vertex::flags::none + mesh_vertex_components::flags vertex_requirements{ + mesh_vertex_components::flags::none }; - components::material::flags material_requirements{ - components::material::flags::none + material_components::flags material_requirements{ + material_components::flags::none }; }; @@ -34,13 +34,13 @@ enum class flags : std::uint8_t constexpr inline auto position = type{ .shader_program_requirement_index = shading::features::mesh::indices::position, - .vertex_requirements = components::mesh_vertex::flags::position + .vertex_requirements = mesh_vertex_components::flags::position }; constexpr inline auto lit = type{ .shader_program_requirement_index = shading::features::mesh::indices::lit, - .vertex_requirements = components::mesh_vertex::flags::normal, - .material_requirements = components::material::flags::surface_properties + .vertex_requirements = mesh_vertex_components::flags::normal, + .material_requirements = material_components::flags::surface_properties }; constexpr inline auto point = type{ @@ -49,8 +49,8 @@ constexpr inline auto point = type{ constexpr inline auto textured = type{ .shader_program_requirement_index = shading::features::mesh::indices::textured, - .vertex_requirements = components::mesh_vertex::flags::tex_coord, - .material_requirements = components::material::flags::texture, + .vertex_requirements = mesh_vertex_components::flags::tex_coord, + .material_requirements = material_components::flags::texture, }; constexpr inline auto uniform_color = type{ @@ -59,7 +59,7 @@ constexpr inline auto uniform_color = type{ constexpr inline auto uniform_alpha = type{ .shader_program_requirement_index = shading::features::mesh::indices::uniform_alpha, - .material_requirements = components::material::flags::transparency + .material_requirements = material_components::flags::transparency }; constexpr inline auto all = std::array{ diff --git a/include/rendering/requirements/point_cloud_requirements.hpp b/include/rendering/requirements/point_cloud_requirements.hpp index 8578746..653528c 100644 --- a/include/rendering/requirements/point_cloud_requirements.hpp +++ b/include/rendering/requirements/point_cloud_requirements.hpp @@ -12,8 +12,8 @@ namespace rendering::requirements::point_cloud struct type { shading::features::point_cloud::indices::type shader_program_requirement_index{}; - components::point_cloud_vertex::flags vertex_requirements{ - components::point_cloud_vertex::flags::none + point_cloud_vertex_components::flags vertex_requirements{ + point_cloud_vertex_components::flags::none }; }; @@ -32,7 +32,7 @@ enum class flags : std::uint8_t constexpr inline auto position = type{ .shader_program_requirement_index = shading::features::point_cloud::indices::position, - .vertex_requirements = components::point_cloud_vertex::flags::position + .vertex_requirements = point_cloud_vertex_components::flags::position }; constexpr inline auto rainbow = type{ @@ -41,7 +41,7 @@ constexpr inline auto rainbow = type{ constexpr inline auto vertex_color = type{ .shader_program_requirement_index = shading::features::point_cloud::indices::vertex_color, - .vertex_requirements = components::point_cloud_vertex::flags::color + .vertex_requirements = point_cloud_vertex_components::flags::color }; constexpr inline auto uniform_color = type{ @@ -50,12 +50,12 @@ constexpr inline auto uniform_color = type{ constexpr inline auto normal = type{ .shader_program_requirement_index = shading::features::point_cloud::indices::normal, - .vertex_requirements = components::point_cloud_vertex::flags::normal + .vertex_requirements = point_cloud_vertex_components::flags::normal }; constexpr inline auto reflectance = type{ .shader_program_requirement_index = shading::features::point_cloud::indices::reflectance, - .vertex_requirements = components::point_cloud_vertex::flags::reflectance + .vertex_requirements = point_cloud_vertex_components::flags::reflectance }; constexpr inline auto all = std::array{ diff --git a/include/viewer/asset_loader.hpp b/include/viewer/asset_loader.hpp index 81d0af2..d8d9921 100644 --- a/include/viewer/asset_loader.hpp +++ b/include/viewer/asset_loader.hpp @@ -4,7 +4,7 @@ #include #include -#include "assets/data_loaders/glsl_loader.hpp" +#include "../assets/data_parsers" #include "../assets/dynamic_read_buffers" #include "opengl/handles/mesh_handle.hpp" #include "opengl/handles/material_handle.hpp" @@ -16,16 +16,16 @@ #include "opengl/data/point_cloud_data.hpp" #include "opengl/data/shader_program_data.hpp" -#include "assets/dynamic_data_loaders/dynamic_mesh_loader.hpp" -#include "assets/data_loaders/obj_loader.hpp" -#include "assets/data_loaders/stl_loader.hpp" +#include "../assets/data_loaders" +#include "../assets/data_parsers" +#include "../assets/data_parsers" -#include "assets/dynamic_data_loaders/dynamic_point_cloud_loader.hpp" -#include "assets/data_loaders/kitti_loader.hpp" -#include "assets/data_loaders/uos_loader.hpp" -#include "assets/data_loaders/uos_normal_loader.hpp" -#include "assets/data_loaders/uos_rgb_loader.hpp" -#include "assets/data_loaders/uosr_loader.hpp" +#include "../assets/data_loaders" +#include "../assets/data_parsers" +#include "../assets/data_parsers" +#include "../assets/data_parsers" +#include "../assets/data_parsers" +#include "../assets/data_parsers" #include "geometry/aabb.hpp" #include "opengl/data/shader_data.hpp" @@ -53,7 +53,7 @@ public: { zgl::point_cloud_handle handle; aabb bounding_box; - components::point_cloud_vertex::flags components; + point_cloud_vertex_components::flags components; }; struct dynamic_material_handle_type @@ -66,15 +66,15 @@ public: { zgl::mesh_handle handle; aabb bounding_box; - components::mesh_vertex::flags components; + mesh_vertex_components::flags components; }; using material_reference_entry_type = std::pair; std::error_code init( - components::mesh_vertex::flags enabled_mesh_components, + mesh_vertex_components::flags enabled_mesh_components, material_component::flags enabled_material_components, - components::point_cloud_vertex::flags enabled_point_cloud_components, + point_cloud_vertex_components::flags enabled_point_cloud_components, const dynamic_material_data& default_material ); @@ -159,15 +159,15 @@ protected: private: //sf::Context m_ctx; - components::mesh_vertex::flags m_enabled_mesh_components{ - components::mesh_vertex::flags::none + mesh_vertex_components::flags m_enabled_mesh_components{ + mesh_vertex_components::flags::none }; material_component::flags m_enabled_material_components{ material_component::flags::none }; - components::point_cloud_vertex::flags m_enabled_point_cloud_components{ - components::point_cloud_vertex::flags::none + point_cloud_vertex_components::flags m_enabled_point_cloud_components{ + point_cloud_vertex_components::flags::none }; glsl_loader m_shader_loader{}; diff --git a/include/viewer/instance.hpp b/include/viewer/instance.hpp index 969c96b..0fc31e6 100644 --- a/include/viewer/instance.hpp +++ b/include/viewer/instance.hpp @@ -49,7 +49,7 @@ public: std::optional add_mesh( const zgl::mesh_handle& mesh, const aabb& bounding_box, - components::mesh_vertex::flags mesh_components, + mesh_vertex_components::flags mesh_components, const zgl::material_handle& material, material_component::flags material_components ); @@ -57,7 +57,7 @@ public: std::optional add_point_cloud( const zgl::point_cloud_handle& point_cloud, const aabb& bounding_box, - components::point_cloud_vertex::flags point_cloud_components + point_cloud_vertex_components::flags point_cloud_components ); void add_shader_program( diff --git a/libraries/CMakeLists.txt b/libraries/CMakeLists.txt new file mode 100644 index 0000000..5aebe10 --- /dev/null +++ b/libraries/CMakeLists.txt @@ -0,0 +1,6 @@ + +# glm +target_include_directories(${PROJECT_NAME} PRIVATE glm) + +# stb +target_include_directories(${PROJECT_NAME} PRIVATE stb) diff --git a/libraries/glm b/libraries/glm new file mode 160000 index 0000000..2d4c4b4 --- /dev/null +++ b/libraries/glm @@ -0,0 +1 @@ +Subproject commit 2d4c4b4dd31fde06cfffad7915c2b3006402322f diff --git a/libraries/include/glm b/libraries/include/glm deleted file mode 160000 index 33b4a62..0000000 --- a/libraries/include/glm +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 33b4a621a697a305bc3a7610d290677b96beb181 diff --git a/libraries/stb b/libraries/stb new file mode 160000 index 0000000..f056911 --- /dev/null +++ b/libraries/stb @@ -0,0 +1 @@ +Subproject commit f0569113c93ad095470c54bf34a17b36646bbbb5 diff --git a/main.cpp b/main.cpp index 84c27a4..32ea714 100755 --- a/main.cpp +++ b/main.cpp @@ -32,11 +32,11 @@ void controller_task( std::ignore = default_material.initialized_surface_properties(); // TODO ... constexpr auto enabled_mesh_components = ( - components::mesh_vertex::flags::position | - components::mesh_vertex::flags::tex_coord | - components::mesh_vertex::flags::normal | - components::mesh_vertex::flags::color | - components::mesh_vertex::flags::reflectance + mesh_vertex_components::flags::position | + mesh_vertex_components::flags::tex_coord | + mesh_vertex_components::flags::normal | + mesh_vertex_components::flags::color | + mesh_vertex_components::flags::reflectance ); constexpr auto enabled_material_components = ( @@ -47,10 +47,10 @@ void controller_task( // TODO Add point cloud component selection to loaders or remove it all together constexpr auto enabled_point_cloud_components = ( - components::point_cloud_vertex::flags::position | - components::point_cloud_vertex::flags::normal | - components::point_cloud_vertex::flags::color | - components::point_cloud_vertex::flags::reflectance + point_cloud_vertex_components::flags::position | + point_cloud_vertex_components::flags::normal | + point_cloud_vertex_components::flags::color | + point_cloud_vertex_components::flags::reflectance ); if (const auto e = loader.init( enabled_mesh_components, @@ -199,11 +199,11 @@ void controller_task( std::ignore = default_material.initialized_surface_properties(); // TODO ... constexpr auto enabled_mesh_components = ( - components::mesh_vertex::flags::position | - components::mesh_vertex::flags::tex_coord | - components::mesh_vertex::flags::normal | - components::mesh_vertex::flags::color | - components::mesh_vertex::flags::reflectance + mesh_vertex_components::flags::position | + mesh_vertex_components::flags::tex_coord | + mesh_vertex_components::flags::normal | + mesh_vertex_components::flags::color | + mesh_vertex_components::flags::reflectance ); constexpr auto enabled_material_components = ( @@ -214,10 +214,10 @@ void controller_task( // TODO Add point cloud component selection to loaders or remove it all together constexpr auto enabled_point_cloud_components = ( - components::point_cloud_vertex::flags::position | - components::point_cloud_vertex::flags::normal | - components::point_cloud_vertex::flags::color | - components::point_cloud_vertex::flags::reflectance + point_cloud_vertex_components::flags::position | + point_cloud_vertex_components::flags::normal | + point_cloud_vertex_components::flags::color | + point_cloud_vertex_components::flags::reflectance ); if (const auto e = loader.init( enabled_mesh_components, diff --git a/source/assets/data/material_data.ipp b/source/assets/data/material_data.ipp new file mode 100644 index 0000000..32c9a7a --- /dev/null +++ b/source/assets/data/material_data.ipp @@ -0,0 +1,99 @@ +#ifndef INCLUDE_DYNAMIC_MATERIAL_DATA_IMPLEMENTATION +# error Never include this file directly include 'dynamic_material_buffer.hpp' +#endif + + +inline std::optional& assets::material_data::surface_properties() +{ + return std::get(data); +} +inline std::optional& assets::material_data::transparency() +{ + return std::get(data); +} +inline std::optional& assets::material_data::ambient_color_texture_id() +{ + return std::get(data); +} +inline std::optional& assets::material_data::diffuse_color_texture_id() +{ + return std::get(data); +} +inline std::optional& assets::material_data::specular_color_texture_id() +{ + return std::get(data); +} +inline std::optional& assets::material_data::shininess_texture_id() +{ + return std::get(data); +} +inline std::optional& assets::material_data::alpha_texture_id() +{ + return std::get(data); +} +inline std::optional& assets::material_data::bump_texture_id() +{ + return std::get& assets::material_data::surface_properties() const +{ + return std::get(data); +} + +inline const std::optional& assets::material_data::transparency() const +{ + return std::get(data); +} + +inline const std::optional& assets::material_data::ambient_color_texture_id() const +{ + return std::get(data); +} + +inline const std::optional& assets::material_data::diffuse_color_texture_id() const +{ + return std::get(data); +} + +inline const std::optional& assets::material_data::specular_color_texture_id() const +{ + return std::get(data); +} + +inline const std::optional& assets::material_data::shininess_texture_id() const +{ + return std::get(data); +} + +inline const std::optional& assets::material_data::alpha_texture_id() const +{ + return std::get(data); +} + +inline const std::optional& assets::material_data::bump_texture_id() const +{ + return std::get(data); +} + + +inline assets::material_components::surface_properties& assets::material_data::initialized_surface_properties() +{ + auto& surface_properties_opt = surface_properties(); + if (not surface_properties_opt) + { + surface_properties_opt = material_components::surface_properties{}; + } + return *surface_properties_opt; +} + +inline void assets::material_data::clear() +{ + std::apply( + [](auto&... data_opt) { + (data_opt.reset(), ...); + }, + data + ); +} + diff --git a/source/assets/data/mesh_data.ipp b/source/assets/data/mesh_data.ipp new file mode 100644 index 0000000..8a6ea62 --- /dev/null +++ b/source/assets/data/mesh_data.ipp @@ -0,0 +1,80 @@ +#ifndef INCLUDE_DYNAMIC_MESH_DATA_IMPLEMENTATION +# error Never include this file directly include 'dynamic_mesh_buffer.hpp' +#endif + +inline std::vector& assets::mesh_data::positions() +{ + return std::get(vertices); +} + +inline std::vector& assets::mesh_data::normals() +{ + return std::get(vertices); +} + +inline std::vector& assets::mesh_data::tex_coords() +{ + return std::get(vertices); +} + +inline std::vector& assets::mesh_data::colors() +{ + return std::get(vertices); +} + +inline std::vector& assets::mesh_data::reflectances() +{ + return std::get(vertices); +} + +inline std::vector& assets::mesh_data::triangles() +{ + return m_triangles; +} + +inline auto& assets::mesh_data::material_id() +{ + return m_material_id; +} + +inline const std::vector& assets::mesh_data::positions() const +{ + return std::get(vertices); +} + +inline const std::vector& assets::mesh_data::normals() const +{ + return std::get(vertices); +} + +inline const std::vector& assets::mesh_data::tex_coords() const +{ + return std::get(vertices); +} + +inline const std::vector& assets::mesh_data::colors() const +{ + return std::get(vertices); +} + +inline const std::vector& assets::mesh_data::reflectances() const +{ + return std::get(vertices); +} + +inline const std::vector& assets::mesh_data::triangles() const +{ + return m_triangles; +} + +inline const auto& assets::mesh_data::material_id() const +{ + return m_material_id; +} + +inline void assets::mesh_data::clear() +{ + clear_vertices(); + m_triangles.clear(); + m_material_id = {}; +} diff --git a/source/assets/data/point_cloud_data.ipp b/source/assets/data/point_cloud_data.ipp new file mode 100644 index 0000000..679be40 --- /dev/null +++ b/source/assets/data/point_cloud_data.ipp @@ -0,0 +1,49 @@ +#ifndef INCLUDE_DYNAMIC_TEXTURE_DATA_IMPLEMENTATION +# error Never include this file directly include 'dynamic_point_cloud_buffer.hpp' +#endif +#include "assets/components/point_cloud_vertex_components.hpp" + +inline std::vector& assets::point_cloud_data::positions() +{ + return std::get(vertices); +} + +inline std::vector& assets::point_cloud_data::normals() +{ + return std::get(vertices); +} + +inline std::vector& assets::point_cloud_data::colors() +{ + return std::get(vertices); +} + +inline std::vector& assets::point_cloud_data::reflectances() +{ + return std::get(vertices); +} + +inline const std::vector& assets::point_cloud_data::positions() const +{ + return std::get(vertices); +} + +inline const std::vector& assets::point_cloud_data::normals() const +{ + return std::get(vertices); +} + +inline const std::vector& assets::point_cloud_data::colors() const +{ + return std::get(vertices); +} + +inline const std::vector& assets::point_cloud_data::reflectances() const +{ + return std::get(vertices); +} + +inline void assets::point_cloud_data::clear() +{ + clear_vertices(); +} \ No newline at end of file diff --git a/source/assets/data/texture_data.ipp b/source/assets/data/texture_data.ipp new file mode 100644 index 0000000..b39ce61 --- /dev/null +++ b/source/assets/data/texture_data.ipp @@ -0,0 +1,159 @@ +#ifndef INCLUDE_DYNAMIC_TEXTURE_DATA_IMPLEMENTATION +# error Never include this file directly include 'dynamic_texture_buffer.hpp' +#endif + + +inline assets::texture_data::texture_data( + std::unique_ptr&& data, + const dim_type width, + const dim_type height, + const texture_components::flags components +) : + m_data{ std::move(data) }, + m_width{ width }, + m_height{ height }, + m_components{ components } +{}; + +inline assets::texture_data::texture_data(const assets::texture_data& other) : + m_data{ new value_type[other.component_count()] }, + m_width{ other.m_width }, + m_height{ other.m_height }, + m_components{ other.m_components } +{ + std::copy_n(other.m_data.get(), other.m_width * other.m_height, this->m_data.get()); +} + +inline assets::texture_data::texture_data(texture_data&& other) noexcept : + m_data{ std::move(other.m_data) }, + m_width{ other.m_width }, + m_height{ other.m_height }, + m_components{ other.m_components } +{ + other.m_width = 0; + other.m_height = 0; + other.m_components = texture_components::flags::none; +} + +inline assets::texture_data& assets::texture_data::operator=(const assets::texture_data& other) +{ + if (this != &other) [[likely]] + { + + const auto m_size = this->component_count(); + const auto o_size = other.component_count(); + + if (o_size > m_size) { + this->~texture_data(); + this->m_data.reset(new value_type[o_size]); + } + + std::copy_n(other.m_data.get(), o_size, this->m_data.get()); + + this->m_width = other.m_width; + this->m_height = other.m_height; + this->m_components = other.m_components; + } + + return *this; +} + +inline assets::texture_data& assets::texture_data::operator=(texture_data&& other) noexcept +{ + if (this != &other) [[likely]] + { + this->~texture_data(); + + this->m_data = std::move(other.m_data); + this->m_width = other.m_width; + this->m_height = other.m_height; + + other.m_width = 0; + other.m_height = 0; + other.m_components = texture_components::flags::none; + } + return *this; +} + +inline assets::texture_components::flags assets::texture_data::components() const +{ + return m_components; +} + +inline assets::texture_data::dim_type assets::texture_data::width() const +{ + return m_width; +} + +inline assets::texture_data::dim_type assets::texture_data::height() const +{ + return m_height; +} + +inline std::pair assets::texture_data::dimensions() const +{ + return { m_width, m_height }; +} + +inline assets::texture_data::size_type assets::texture_data::pixel_count() const +{ + return static_cast(m_width) * static_cast(m_height); +} + +inline assets::texture_data::size_type assets::texture_data::component_count() const +{ + return std::popcount(static_cast>(m_components)); +} + +inline assets::texture_data::size_type assets::texture_data::size() const +{ + return pixel_count() * component_count(); +} + +inline assets::texture_data::const_pointer assets::texture_data::data() const +{ + return m_data.get(); +} + +inline assets::texture_data::pointer assets::texture_data::data() +{ + return m_data.get(); +} + +inline assets::texture_data::const_iterator assets::texture_data::begin() const +{ + return data(); +} + +inline assets::texture_data::iterator assets::texture_data::begin() +{ + return data(); +} + +inline assets::texture_data::const_iterator assets::texture_data::end() const +{ + return begin() + component_count(); +} + +inline assets::texture_data::iterator assets::texture_data::end() +{ + return begin() + component_count(); +} + +inline assets::texture_data::const_iterator assets::texture_data::cbegin() const +{ + return const_cast(begin()); +} + +inline assets::texture_data::const_iterator assets::texture_data::cend() const +{ + return const_cast(begin()); +} + +inline void assets::texture_data::clear() +{ + m_data.reset(); + m_width = 0; + m_height = 0; + m_components = {}; +} \ No newline at end of file diff --git a/source/assets/dynamic_data_loaders/generic/base_dynamic_loader.ipp b/source/assets/data_loaders/generic/base_dynamic_loader.ipp similarity index 96% rename from source/assets/dynamic_data_loaders/generic/base_dynamic_loader.ipp rename to source/assets/data_loaders/generic/base_dynamic_loader.ipp index c3835e8..cee8deb 100644 --- a/source/assets/dynamic_data_loaders/generic/base_dynamic_loader.ipp +++ b/source/assets/data_loaders/generic/base_dynamic_loader.ipp @@ -5,7 +5,7 @@ #include "util/for_each.hpp" template -base_dynamic_loader::base_dynamic_loader(const C enabled_components) : +assetsbase_dynamic_loader::base_dynamic_loader(const C enabled_components) : m_enabled_components{ enabled_components } { [&](std::index_sequence) { diff --git a/source/assets/dynamic_data_loaders/dynamic_mesh_loader.cpp b/source/assets/data_loaders/mesh_loader.cpp similarity index 75% rename from source/assets/dynamic_data_loaders/dynamic_mesh_loader.cpp rename to source/assets/data_loaders/mesh_loader.cpp index 32641aa..bcd5e2f 100644 --- a/source/assets/dynamic_data_loaders/dynamic_mesh_loader.cpp +++ b/source/assets/data_loaders/mesh_loader.cpp @@ -1,6 +1,6 @@ -#include "assets/dynamic_data_loaders/dynamic_mesh_loader.hpp" +#include "assets/data_loaders/mesh_loader.hpp" -std::error_code dynamic_mesh_loader::prefetch( +std::error_code assets::mesh_loader::prefetch( loader_id_type loader_id, const ztu::string_list& directories, prefetch_queue& queue @@ -17,10 +17,10 @@ std::error_code dynamic_mesh_loader::prefetch( ); } -std::error_code dynamic_mesh_loader::load( +std::error_code assets::mesh_loader::load( loader_id_type loader_id, const ztu::string_list& directories, - dynamic_mesh_store& store, + mesh_store& store, mesh_prefetch_lookup& id_lookup, const bool pedantic ) { diff --git a/source/assets/dynamic_data_loaders/dynamic_point_cloud_loader.cpp b/source/assets/data_loaders/point_cloud_loader.cpp similarity index 73% rename from source/assets/dynamic_data_loaders/dynamic_point_cloud_loader.cpp rename to source/assets/data_loaders/point_cloud_loader.cpp index ceadafb..803b99c 100644 --- a/source/assets/dynamic_data_loaders/dynamic_point_cloud_loader.cpp +++ b/source/assets/data_loaders/point_cloud_loader.cpp @@ -1,6 +1,6 @@ -#include "assets/dynamic_data_loaders/dynamic_point_cloud_loader.hpp" +#include "assets/data_loaders/point_cloud_loader.hpp" -std::error_code dynamic_point_cloud_loader::prefetch( +std::error_code assets::point_cloud_loader::prefetch( const loader_id_type loader_id, const ztu::string_list& directories, prefetch_queue& queue @@ -17,10 +17,10 @@ std::error_code dynamic_point_cloud_loader::prefetch( ); } -std::error_code dynamic_point_cloud_loader::load( +std::error_code assets::point_cloud_loader::load( const loader_id_type loader_id, const ztu::string_list& directories, - dynamic_point_cloud_store& store, + point_cloud_store& store, point_cloud_prefetch_lookup& id_lookup, const bool pedantic ) { diff --git a/source/assets/dynamic_data_loaders/dynamic_texture_loader.cpp b/source/assets/data_loaders/texture_loader.cpp similarity index 82% rename from source/assets/dynamic_data_loaders/dynamic_texture_loader.cpp rename to source/assets/data_loaders/texture_loader.cpp index b2c3e34..b458d3f 100644 --- a/source/assets/dynamic_data_loaders/dynamic_texture_loader.cpp +++ b/source/assets/data_loaders/texture_loader.cpp @@ -1,4 +1,4 @@ -#include "assets/dynamic_data_loaders/dynamic_texture_loader.hpp" +#include "assets/data_loaders/texture_loader.hpp" #if defined(__GNUC__) || defined(__GNUG__) #pragma GCC diagnostic push @@ -17,7 +17,7 @@ #include "util/logger.hpp" -dynamic_texture_loader::dynamic_texture_loader(components::texture::flags enabled_components) : +assets::texture_loader::texture_loader(assets::texture_components::flags enabled_components) : m_enabled_components{ enabled_components }, m_loader_id_lookup{ { "jpg", loader_id_type{ 0 } }, @@ -30,7 +30,7 @@ dynamic_texture_loader::dynamic_texture_loader(components::texture::flags enable { "pic", loader_id_type{ 7 } } } {} -std::optional dynamic_texture_loader::find_loader(const std::string_view& name) +std::optional assets::texture_loader::find_loader(const std::string_view& name) { const auto it = m_loader_id_lookup.find(name); @@ -42,7 +42,7 @@ std::optional dynamic_texture_loader::fi return std::nullopt; } -std::error_code dynamic_texture_loader::prefetch( +std::error_code assets::texture_loader::prefetch( const loader_id_type loader_id, const ztu::string_list& directories, prefetch_queue& queue @@ -51,10 +51,10 @@ std::error_code dynamic_texture_loader::prefetch( return {}; } -std::error_code dynamic_texture_loader::load( - const loader_id_type loader_id, +std::error_code assets::texture_loader::load( + const loader_id_type, const ztu::string_list& directories, - dynamic_texture_store& store, + texture_store& store, texture_prefetch_lookup& id_lookup, const bool pedantic ) { @@ -85,7 +85,7 @@ std::error_code dynamic_texture_loader::load( auto data = std::unique_ptr(ptr); - using flags = components::texture::flags; + using flags = texture_components::flags; auto components = flags{}; switch (channels) @@ -107,12 +107,13 @@ std::error_code dynamic_texture_loader::load( continue; } - const auto id = store.add(dynamic_texture_buffer( + const auto id = store.add(texture_data( std::move(data), width, height, components )); + id_lookup.emplace_hint(id_it, filename, id); } diff --git a/source/assets/dynamic_data_stores/generic/generic_dynamic_store.ipp b/source/assets/data_stores/generic/generic_basic_store.ipp similarity index 59% rename from source/assets/dynamic_data_stores/generic/generic_dynamic_store.ipp rename to source/assets/data_stores/generic/generic_basic_store.ipp index 25380c3..f28b5cd 100644 --- a/source/assets/dynamic_data_stores/generic/generic_dynamic_store.ipp +++ b/source/assets/data_stores/generic/generic_basic_store.ipp @@ -1,11 +1,11 @@ -#ifndef INCLUDE_GENERIC_DYNAMIC_STORE_IMPLEMENTATION -# error Never include this file directly include 'basic_dynamic_store.hpp' +#ifndef INCLUDE_GENERIC_BASIC_STORE_IMPLEMENTATION +# error Never include this file directly include 'generic_basic_store.hpp' #endif #include template -typename generic_dynamic_store::id_type generic_dynamic_store::add(const T& data) +typename generic_basic_store::id_type generic_basic_store::add(const T& data) { auto id = id_type{ m_next_data_id.index++ }; m_data.emplace_back(data); @@ -14,9 +14,10 @@ typename generic_dynamic_store::id_type generic_dynamic_store::add(const T } template -std::pair::iterator_type, bool> generic_dynamic_store::find(id_type id) +std::pair::iterator_type, bool> generic_basic_store::find(id_type id) { const auto it = std::ranges::upper_bound(m_ids, id); + const auto found = it != m_ids.begin() and *std::prev(it) == id; const auto index = it - m_ids.begin() - found; @@ -24,9 +25,10 @@ std::pair::iterator_type, bool> generic_dynami } template -std::pair::const_iterator, bool> generic_dynamic_store::find(id_type id) const +std::pair::const_iterator, bool> generic_basic_store::find(id_type id) const { const auto it = std::ranges::upper_bound(m_ids, id); + const auto found = it != m_ids.begin() and *std::prev(it) == id; const auto index = it - m_ids.begin() - found; @@ -34,7 +36,7 @@ std::pair::const_iterator, bool> generic_dynam } template -void generic_dynamic_store::remove(iterator_type it) +void generic_basic_store::remove(iterator_type it) { const auto index = it - m_data.begin(); m_data.erase(it); @@ -42,20 +44,20 @@ void generic_dynamic_store::remove(iterator_type it) } template -void generic_dynamic_store::clear() +void generic_basic_store::clear() { m_data.clear(); m_ids.clear(); } template -std::span generic_dynamic_store::data() +std::span generic_basic_store::data() { return m_data; } template -std::span generic_dynamic_store::data() const +std::span generic_basic_store::data() const { return m_data; } diff --git a/source/assets/dynamic_data_stores/generic/generic_dynamic_component_array_store.ipp b/source/assets/data_stores/generic/generic_dynamic_component_array_store.ipp similarity index 87% rename from source/assets/dynamic_data_stores/generic/generic_dynamic_component_array_store.ipp rename to source/assets/data_stores/generic/generic_dynamic_component_array_store.ipp index bc83c1c..fbd7493 100644 --- a/source/assets/dynamic_data_stores/generic/generic_dynamic_component_array_store.ipp +++ b/source/assets/data_stores/generic/generic_dynamic_component_array_store.ipp @@ -5,11 +5,13 @@ template component_array_iterator::component_array_iterator( - component_array_pointer_type components, + id_array_pointer_type ids, + const component_array_pointer_type& components, flag_count_pointer_type flags, std::size_t index, const offsets_type& offsets ) : + m_ids{ ids }, m_components{ components }, m_flag_counts{ flags }, m_index{ index }, @@ -67,14 +69,14 @@ template component_array_iterator component_array_iterator::operator+(const difference_type n) const { auto tmp = *this; - return tmp += n; + return tmp += n; // TODO clion says n is unused } template component_array_iterator component_array_iterator::operator-(const difference_type n) const { auto tmp = *this; - return tmp -= n; + return tmp -= n; // TODO clion says n is unused } template @@ -94,7 +96,7 @@ typename component_array_iterator::reference component_array_iterator< template bool component_array_iterator::operator==(const component_array_iterator& other) const { - return m_components == other.m_components and m_index == other.m_index; + return m_ids == other.m_ids and m_index == other.m_index; } template @@ -148,10 +150,11 @@ void component_array_iterator::calc_offsets(std::index_sequence while (n--) { - const auto& [ flags, count ] = m_flag_counts[m_index + n]; + const auto& [ flags, count ] = m_flag_counts[m_index]; ([&] { - if (is_component_enabled(flags)) { + if (is_component_enabled(flags)) + { std::get(m_offsets) += step * count; } }(), ...); @@ -165,26 +168,24 @@ template typename component_array_iterator::reference component_array_iterator::dereference(std::index_sequence) const { - return std::make_tuple(get_span()...); + const auto& [ flags, component_count ] = m_flag_counts[m_index]; + + return std::make_pair( + m_ids[m_index], + std::make_tuple( + flags, + std::make_tuple( + std::span( + &std::get(m_components)[m_offsets[Is]], + is_component_enabled(flags) ? component_count : 0 + )... + ) + ) + ); } template -template -std::tuple_element_t::value_type> -component_array_iterator::get_span() const -{ - const auto& [ flags, count ] = m_flag_counts[m_index]; - - if (is_component_enabled(flags)) - { - return { &std::get(m_components)[m_offsets[N]], count }; - } - return nullptr; -} - - -template -std::tuple...> generic_dynamic_component_array_store::data_ptrs() +std::tuple...> generic_dynamic_component_array_store::component_array_ptrs() { return [&](std::index_sequence) { @@ -194,7 +195,7 @@ std::tuple...> generic_dynamic_component_array_store -std::tuple>...> generic_dynamic_component_array_store::data_ptrs() const +std::tuple>...> generic_dynamic_component_array_store::component_array_ptrs() const { return [&](std::index_sequence) { @@ -204,7 +205,7 @@ std::tuple>...> generic_dynamic_componen } template -std::array generic_dynamic_component_array_store::data_counts() const +std::array generic_dynamic_component_array_store::array_counts() const { return [&](std::index_sequence) { @@ -219,21 +220,23 @@ typename generic_dynamic_component_array_store::id_type generic_dynami ) { auto component_flags = C{}; - auto count = count_type{}; + auto min_component_count = count_type{}; [&](std::integer_sequence) { - const auto& array = std::get(component_arrays); - if (not array.empty()) + const auto& component_array = std::get(component_arrays); + if (not component_array.empty()) { - const auto array_count = static_cast(array.size()); - count = count ? std::min(array_count, count) : array_count; + const auto component_count = static_cast(component_array.size()); + if (min_component_count != 0 and component_count < min_component_count) + { + min_component_count = component_count; + } component_flags |= C{ 1 } << Is; } } (std::index_sequence_for{}); - [&](std::integer_sequence) { const auto& src_array = std::get(component_arrays); @@ -246,7 +249,7 @@ typename generic_dynamic_component_array_store::id_type generic_dynami } (std::index_sequence_for{}); - m_component_flag_counts.emplace_back(component_flags, count); + m_component_flag_counts.emplace_back(component_flags, min_component_count); const auto id = id_type{ m_next_data_id.index++ }; m_ids.push_back(id); @@ -323,7 +326,8 @@ template typename generic_dynamic_component_array_store::iterator_type generic_dynamic_component_array_store::begin() { return iterator_type{ - data_ptrs(), + m_ids.data(), + component_array_ptrs(), m_component_flag_counts.data(), 0, {} @@ -334,10 +338,11 @@ template typename generic_dynamic_component_array_store::iterator_type generic_dynamic_component_array_store::end() { return iterator_type{ - data_ptrs(), + m_ids.data(), + component_array_ptrs(), m_component_flag_counts.data(), m_component_flag_counts.size(), - data_counts() + array_counts() }; } @@ -345,7 +350,8 @@ template typename generic_dynamic_component_array_store::const_iterator generic_dynamic_component_array_store::begin() const { return iterator_type{ - data_ptrs(), + m_ids.data(), + component_array_ptrs(), m_component_flag_counts.data(), 0, {} @@ -356,10 +362,11 @@ template typename generic_dynamic_component_array_store::const_iterator generic_dynamic_component_array_store::end() const { return iterator_type{ - data_ptrs(), + m_ids.data(), + component_array_ptrs(), m_component_flag_counts.data(), m_component_flag_counts.size(), - data_counts() + array_counts() }; } diff --git a/source/assets/dynamic_data_stores/generic/generic_dynamic_indexed_component_array_store.ipp b/source/assets/data_stores/generic/generic_dynamic_indexed_component_array_store.ipp similarity index 95% rename from source/assets/dynamic_data_stores/generic/generic_dynamic_indexed_component_array_store.ipp rename to source/assets/data_stores/generic/generic_dynamic_indexed_component_array_store.ipp index dd4f067..49dab5b 100644 --- a/source/assets/dynamic_data_stores/generic/generic_dynamic_indexed_component_array_store.ipp +++ b/source/assets/data_stores/generic/generic_dynamic_indexed_component_array_store.ipp @@ -2,7 +2,6 @@ # error Never include this file directly include 'generic_dynamic_indexed_component_array_store.hpp' #endif -#pragma once #include #include @@ -13,12 +12,14 @@ template indexed_component_array_iterator::indexed_component_array_iterator( + id_array_pointer_type ids, const index_array_pointer_type indices, const component_array_pointer_type& components, const flag_count_pointer_type flag_counts, std::size_t index, const offsets_type& offsets ) : + m_ids{ ids }, m_indices{ indices }, m_components{ components }, m_flag_counts{ flag_counts }, @@ -77,14 +78,14 @@ template indexed_component_array_iterator indexed_component_array_iterator::operator+(const difference_type n) const { auto tmp = *this; - return tmp += n; + return tmp += n; // TODO clion says n is unused } template indexed_component_array_iterator indexed_component_array_iterator::operator-(const difference_type n) const { auto tmp = *this; - return tmp -= n; + return tmp -= n; // TODO clion says n is unused } template @@ -98,13 +99,13 @@ template typename indexed_component_array_iterator::reference indexed_component_array_iterator::operator[]( const difference_type n ) const { - return *((*this) + n); + return *(*this + n); } template bool indexed_component_array_iterator::operator==(const indexed_component_array_iterator& other) const { - return m_components == other.m_components and m_index == other.m_index; + return m_ids == other.m_ids and m_index == other.m_index; } template @@ -160,12 +161,13 @@ void indexed_component_array_iterator::calc_offsets( while (n--) { - const auto& [ flags, index_count, component_count ] = m_flag_counts[m_index + n]; + const auto& [ flags, index_count, component_count ] = m_flag_counts[m_index]; std::get<0>(m_offsets) += step * index_count; ([&] { - if (is_component_enabled(flags)) { + if (is_component_enabled(flags)) + { std::get<1 + Is>(m_offsets) += step * component_count; } }(), ...); @@ -181,24 +183,24 @@ indexed_component_array_iterator::dereference(std::index_sequence(flags) - ? &std::get(m_components)[m_offsets[1 + Is]] - : nullptr + return std::make_pair( + m_ids[m_index], + std::make_tuple( + flags, + std::span( + m_indices[m_offsets[0]], + index_count ), - component_count - )... + std::make_tuple( + std::span( + &std::get(m_components)[m_offsets[1 + Is]], + is_component_enabled(flags) ? component_count : 0 + )... + ) + ) ); } - - template std::tuple...> generic_dynamic_indexed_component_array_store::component_array_ptrs() { @@ -350,6 +352,7 @@ template typename generic_dynamic_indexed_component_array_store::iterator_type generic_dynamic_indexed_component_array_store::begin() { return iterator_type{ + m_ids.data(), m_indices.data(), component_array_ptrs(), m_component_flag_counts.data(), @@ -362,6 +365,7 @@ template typename generic_dynamic_indexed_component_array_store::iterator_type generic_dynamic_indexed_component_array_store::end() { return iterator_type{ + m_ids.data(), m_indices.data(), component_array_ptrs(), m_component_flag_counts.data(), @@ -374,6 +378,7 @@ template typename generic_dynamic_indexed_component_array_store::const_iterator generic_dynamic_indexed_component_array_store::begin() const { return iterator_type{ + m_ids.data(), m_indices.data(), component_array_ptrs(), m_component_flag_counts.data(), @@ -386,6 +391,7 @@ template typename generic_dynamic_indexed_component_array_store::const_iterator generic_dynamic_indexed_component_array_store::end() const { return iterator_type{ + m_ids.data(), m_indices.data(), component_array_ptrs(), m_component_flag_counts.data(), diff --git a/source/assets/data_stores/generic/generic_material_store.ipp b/source/assets/data_stores/generic/generic_material_store.ipp new file mode 100644 index 0000000..d908bf2 --- /dev/null +++ b/source/assets/data_stores/generic/generic_material_store.ipp @@ -0,0 +1,386 @@ +#ifndef INCLUDE_GENERIC_MATERIAL_STORE_IMPLEMENTATION +# error Never include this file directly include 'generic_material_store.hpp' +#endif + +#include +#include +#include +#include +#include +#include + +template +assets::detail::generic_material_store_iterator::generic_material_store_iterator( + id_iterator_type ids, + const component_iterator_type& components, + flag_count_iterator_type flag_counts, + std::size_t index, + const offsets_type& offsets +) : + m_ids{ ids }, + m_components{ components }, + m_flag_counts{ flag_counts }, + m_index{ index }, + m_offsets{ offsets } {} + + +template +typename assets::detail::generic_material_store_iterator::reference assets::detail::generic_material_store_iterator::operator*() const { + return dereference(std::index_sequence_for{}); +} + +template +assets::detail::generic_material_store_iterator& assets::detail::generic_material_store_iterator::operator++() { + adjust_offsets(std::index_sequence_for{}, 1); + ++m_index; + return *this; +} + +template +assets::detail::generic_material_store_iterator assets::detail::generic_material_store_iterator::operator++(int) { + generic_material_store_iterator tmp = *this; + ++(*this); + return tmp; +} + +template +assets::detail::generic_material_store_iterator& assets::detail::generic_material_store_iterator::operator--() { + adjust_offsets(std::index_sequence_for{}, -1); + --m_index; + return *this; +} + +template +assets::detail::generic_material_store_iterator assets::detail::generic_material_store_iterator::operator--(int) { + auto tmp = *this; + --(*this); + return tmp; +} + +template +assets::detail::generic_material_store_iterator& assets::detail::generic_material_store_iterator::operator+=(const difference_type n) +{ + adjust_offsets(std::index_sequence_for{}, n); + m_index += n; + return *this; +} + +template +assets::detail::generic_material_store_iterator& assets::detail::generic_material_store_iterator::operator-=(const difference_type n) +{ + return (*this) += -n; +} + +template +assets::detail::generic_material_store_iterator assets::detail::generic_material_store_iterator::operator+(const difference_type n) const +{ + auto tmp = *this; + return tmp += n; // TODO clion says n is unused +} + +template +assets::detail::generic_material_store_iterator assets::detail::generic_material_store_iterator::operator-(const difference_type n) const +{ + auto tmp = *this; + return tmp -= n; // TODO clion says n is unused +} + +template +typename assets::detail::generic_material_store_iterator::difference_type +assets::detail::generic_material_store_iterator::operator-(const generic_material_store_iterator& other) const +{ + return static_cast(m_index) - static_cast(other.m_index); +} + +template +typename assets::detail::generic_material_store_iterator::reference assets::detail::generic_material_store_iterator::operator[]( + const difference_type n +) const { + return *(*this + n); +} + +template +bool assets::detail::generic_material_store_iterator::operator==(const generic_material_store_iterator& other) const +{ + return m_ids == other.m_ids and m_index == other.m_index; +} + +template +bool assets::detail::generic_material_store_iterator::operator!=(const generic_material_store_iterator& other) const +{ + return not (*this == other); +} + +template +bool assets::detail::generic_material_store_iterator::operator<(const generic_material_store_iterator& other) const +{ + return m_index < other.m_index; +} + +template +bool assets::detail::generic_material_store_iterator::operator<=(const generic_material_store_iterator& other) const +{ + return m_index <= other.m_index; +} + +template +bool assets::detail::generic_material_store_iterator::operator>(const generic_material_store_iterator& other) const +{ + return m_index > other.m_index; +} + +template +bool assets::detail::generic_material_store_iterator::operator>=(const generic_material_store_iterator& other) const +{ + return m_index >= other.m_index; +} + +template +template +bool assets::detail::generic_material_store_iterator::is_component_enabled(component_flag_type flag) +{ + return (flag & (component_flag_type{ 1 } << N)) != component_flag_type{}; +} + +template +template +void assets::detail::generic_material_store_iterator::calc_offsets( + std::index_sequence, + difference_type n +) { + + const auto negative = n < difference_type{ 0 }; + const auto positive = n > difference_type{ 0 }; + const auto step = difference_type{ positive } - difference_type{ negative }; + n = negative ? -n : n; + + // TODO template optimize for single steps + + while (n--) + { + const auto& [ flags, index_count, component_count ] = m_flag_counts[m_index]; + + std::get<0>(m_offsets) += step * index_count; + + ([&] { + if (is_component_enabled(flags)) + { + std::get<1 + Is>(m_offsets) += step * component_count; + } + }(), ...); + + m_index += step; + } +} + +template +template +typename assets::detail::generic_material_store_iterator::reference +assets::detail::generic_material_store_iterator::dereference(std::index_sequence) const +{ + const auto& flags = m_flag_counts[m_index]; + + return std::make_pair( + m_ids[m_index], + material_view{ + .data = { + ( + is_component_enabled(flags) + ? std::optional{ std::get(m_components)[m_offsets[Is]] } + : std::nullopt + )... + } + } + ); +} + +template +std::tuple...> assets::detail::generic_material_store::component_iterators() +{ + return [&](std::index_sequence) + { + return std::make_tuple(std::get(m_component_arrays).data()...); + } + (std::index_sequence_for{}); +} + +template +std::tuple>...> assets::detail::generic_material_store::component_iterators() const +{ + return [&](std::index_sequence) + { + return std::make_tuple(std::get(m_component_arrays).data()...); + } + (std::index_sequence_for{}); +} + +template +std::array::count_type, 1 + sizeof...(Ts)> +assets::detail::generic_material_store::array_counts() const +{ + return [&](std::index_sequence) + { + return std::array{ + std::get(m_component_arrays).size()... + }; + } + (std::index_sequence_for{}); +} + +template +typename assets::detail::generic_material_store::id_type assets::detail::generic_material_store::add( + const material_data& material +) { + + const auto id = id_type{ m_next_data_id.index++ }; + m_ids.push_back(id); + + auto component_flags = component_flag_type{}; + + [&](std::integer_sequence) + { + if (const auto& component_opt = std::get(material.data)) + { + std::get(material.data).push_back(*component_opt); + component_flags |= component_flag_type{ 1 } << Is; + } + } + (std::index_sequence_for{}); + + m_component_flag_counts.push_back(component_flags); + + return id; +} + +template +std::pair::iterator_type, bool> assets::detail::generic_material_store::find(id_type id) +{ + const auto id_it = std::ranges::upper_bound(m_ids, id); + + const auto match = ( + id_it != m_ids.begin() and + *std::prev(id_it) == id + ); + + const auto index = id_it - m_ids.begin() - match; + + auto it = begin(); + it += index; + + return { it, match }; +} + +template +std::pair::const_iterator, bool> assets::detail::generic_material_store::find(id_type id) const +{ + const auto id_it = std::ranges::upper_bound(m_ids, id); + + const auto match = ( + id_it != m_ids.begin() and + *std::prev(id_it) == id + ); + + const auto index = id_it - m_ids.begin() - match; + + auto it = begin(); + it += index; + + return { it, match }; +} + + +template +void assets::detail::generic_material_store::remove(const iterator_type& it) +{ + m_ids.erase(m_ids.begin() + it.m_index); + + return [&](std::index_sequence) + { + auto& component_vector = std::get(m_component_arrays); + (component_vector.erase(component_vector.begin() + it.m_offsets[Is]), ...); + } (std::index_sequence_for{}); + + m_component_flag_counts.erase(m_component_flag_counts.begin() + it.m_index); +} + +template +void assets::detail::generic_material_store::clear() +{ + m_ids.clear(); + [&](std::index_sequence) + { + std::get(m_component_arrays).clear(); + } (std::index_sequence_for{}); + m_component_flag_counts.clear(); +} + +template +typename assets::detail::generic_material_store::iterator_type assets::detail::generic_material_store::begin() +{ + return iterator_type{ + m_ids.data(), + component_iterators(), + m_component_flag_counts.data(), + 0, + {} + }; +} + +template +typename assets::detail::generic_material_store::iterator_type assets::detail::generic_material_store::end() +{ + return iterator_type{ + m_ids.data(), + component_iterators(), + m_component_flag_counts.data(), + m_component_flag_counts.size(), + array_counts() + }; +} + +template +typename assets::detail::generic_material_store::const_iterator assets::detail::generic_material_store::begin() const +{ + return const_iterator{ + m_ids.data(), + component_iterators(), + m_component_flag_counts.data(), + 0, + {} + }; +} + +template +typename assets::detail::generic_material_store::const_iterator assets::detail::generic_material_store::end() const +{ + return const_iterator{ + m_ids.data(), + component_iterators(), + m_component_flag_counts.data(), + m_component_flag_counts.size(), + array_counts() + }; +} + +template +typename assets::detail::generic_material_store::const_iterator assets::detail::generic_material_store::cbegin() const +{ + return const_cast(this)->begin(); +} + +template +typename assets::detail::generic_material_store::const_iterator assets::detail::generic_material_store::cend() const +{ + return const_cast(this)->end(); +} + +template +typename assets::detail::generic_material_store::view_type assets::detail::generic_material_store::view() +{ + return { begin(), end() }; +} +template +typename assets::detail::generic_material_store::const_view_type assets::detail::generic_material_store::view() const +{ + return { begin(), end() }; +} diff --git a/source/assets/data_stores/generic/generic_mesh_store.ipp b/source/assets/data_stores/generic/generic_mesh_store.ipp new file mode 100644 index 0000000..330ecdb --- /dev/null +++ b/source/assets/data_stores/generic/generic_mesh_store.ipp @@ -0,0 +1,449 @@ +#ifndef INCLUDE_GENERIC_MESH_STORE_IMPLEMENTATION +# error Never include this file directly include 'generic_mesh_store.hpp' +#endif + +#include +#include +#include +#include +#include +#include + +template +assets::detail::generic_mesh_store_iterator::generic_mesh_store_iterator( + id_iterator_type ids, + index_iterator_type indices, + const component_iterator_type& components, + material_id_iterator_type material_ids, + flag_count_iterator_type flag_counts, + std::size_t index, + const offsets_type& offsets +) : + m_ids{ ids }, + m_indices{ indices }, + m_components{ components }, + m_material_ids{ material_ids }, + m_flag_counts{ flag_counts }, + m_index{ index }, + m_offsets{ offsets } {} + + +template +typename assets::detail::generic_mesh_store_iterator::reference assets::detail::generic_mesh_store_iterator::operator*() const { + return dereference(std::index_sequence_for{}); +} + +template +assets::detail::generic_mesh_store_iterator& assets::detail::generic_mesh_store_iterator::operator++() { + adjust_offsets(std::index_sequence_for{}, 1); + ++m_index; + return *this; +} + +template +assets::detail::generic_mesh_store_iterator assets::detail::generic_mesh_store_iterator::operator++(int) { + generic_mesh_store_iterator tmp = *this; + ++(*this); + return tmp; +} + +template +assets::detail::generic_mesh_store_iterator& assets::detail::generic_mesh_store_iterator::operator--() { + adjust_offsets(std::index_sequence_for{}, -1); + --m_index; + return *this; +} + +template +assets::detail::generic_mesh_store_iterator assets::detail::generic_mesh_store_iterator::operator--(int) { + auto tmp = *this; + --(*this); + return tmp; +} + +template +assets::detail::generic_mesh_store_iterator& assets::detail::generic_mesh_store_iterator::operator+=(const difference_type n) +{ + adjust_offsets(std::index_sequence_for{}, n); + m_index += n; + return *this; +} + +template +assets::detail::generic_mesh_store_iterator& assets::detail::generic_mesh_store_iterator::operator-=(const difference_type n) +{ + return (*this) += -n; +} + +template +assets::detail::generic_mesh_store_iterator assets::detail::generic_mesh_store_iterator::operator+(const difference_type n) const +{ + auto tmp = *this; + return tmp += n; // TODO clion says n is unused +} + +template +assets::detail::generic_mesh_store_iterator assets::detail::generic_mesh_store_iterator::operator-(const difference_type n) const +{ + auto tmp = *this; + return tmp -= n; // TODO clion says n is unused +} + +template +typename assets::detail::generic_mesh_store_iterator::difference_type +assets::detail::generic_mesh_store_iterator::operator-(const generic_mesh_store_iterator& other) const +{ + return static_cast(m_index) - static_cast(other.m_index); +} + +template +typename assets::detail::generic_mesh_store_iterator::reference assets::detail::generic_mesh_store_iterator::operator[]( + const difference_type n +) const { + return *(*this + n); +} + +template +bool assets::detail::generic_mesh_store_iterator::operator==(const generic_mesh_store_iterator& other) const +{ + return m_ids == other.m_ids and m_index == other.m_index; +} + +template +bool assets::detail::generic_mesh_store_iterator::operator!=(const generic_mesh_store_iterator& other) const +{ + return not (*this == other); +} + +template +bool assets::detail::generic_mesh_store_iterator::operator<(const generic_mesh_store_iterator& other) const +{ + return m_index < other.m_index; +} + +template +bool assets::detail::generic_mesh_store_iterator::operator<=(const generic_mesh_store_iterator& other) const +{ + return m_index <= other.m_index; +} + +template +bool assets::detail::generic_mesh_store_iterator::operator>(const generic_mesh_store_iterator& other) const +{ + return m_index > other.m_index; +} + +template +bool assets::detail::generic_mesh_store_iterator::operator>=(const generic_mesh_store_iterator& other) const +{ + return m_index >= other.m_index; +} + +template +template +bool assets::detail::generic_mesh_store_iterator::is_component_enabled(component_flag_type flag) +{ + return (flag & (component_flag_type{ 1 } << N)) != component_flag_type{}; +} + +template +template +void assets::detail::generic_mesh_store_iterator::calc_offsets( + std::index_sequence, + difference_type n +) { + + const auto negative = n < difference_type{ 0 }; + const auto positive = n > difference_type{ 0 }; + const auto step = difference_type{ positive } - difference_type{ negative }; + n = negative ? -n : n; + + // TODO template optimize for single steps + + while (n--) + { + const auto& [ flags, index_count, component_count ] = m_flag_counts[m_index]; + + std::get<0>(m_offsets) += step * index_count; + + ([&] { + if (is_component_enabled(flags)) + { + std::get<1 + Is>(m_offsets) += step * component_count; + } + }(), ...); + + m_index += step; + } +} + +template +template +typename assets::detail::generic_mesh_store_iterator::reference +assets::detail::generic_mesh_store_iterator::dereference(std::index_sequence) const +{ + const auto& [ flags, index_count, component_count ] = m_flag_counts[m_index]; + + return std::make_pair( + m_ids[m_index], + mesh_view{ + .component_flags = flags, + .indices = std::span( + m_indices[m_offsets[0]], + index_count + ), + .vertex_component_arrays = std::make_tuple( + std::span( + &std::get(m_components)[m_offsets[1 + Is]], + is_component_enabled(flags) ? component_count : 0 + )... + ) + .material_id = m_material_ids[m_index] + } + ); +} + +template +std::tuple...> assets::detail::generic_mesh_store::component_iterators() +{ + return [&](std::index_sequence) + { + return std::make_tuple(std::get(m_component_arrays).data()...); + } + (std::index_sequence_for{}); +} + +template +std::tuple>...> assets::detail::generic_mesh_store::component_iterators() const +{ + return [&](std::index_sequence) + { + return std::make_tuple(std::get(m_component_arrays).data()...); + } + (std::index_sequence_for{}); +} + +template +std::array::count_type, 1 + sizeof...(Ts)> +assets::detail::generic_mesh_store::array_counts() const +{ + return [&](std::index_sequence) + { + return std::array{ + m_indices.size(), + std::get(m_component_arrays).size()... + }; + } + (std::index_sequence_for{}); +} + +template +typename assets::detail::generic_mesh_store::id_type assets::detail::generic_mesh_store::add( + const mesh_data& mesh +) { + + const auto id = id_type{ m_next_data_id.index++ }; + m_ids.push_back(id); + + const auto& vertices = mesh.vertices; + const auto& triangles = mesh.triangles(); + const auto indices = std::span(triangles.front().data(), triangles.size() * 3); + + auto component_flags = component_flag_type{}; + auto min_component_count = count_type{}; + + // finding out correct component flags and count + [&](std::integer_sequence) + { + const auto& component_array = std::get(vertices); + if (not component_array.empty()) + { + const auto component_count = static_cast(component_array.size()); + if (min_component_count != 0 and component_count < min_component_count) + { + min_component_count = component_count; + } + component_flags |= component_flag_type{ 1 } << Is; + } + } + (std::index_sequence_for{}); + + // Insert indices + m_indices.insert(m_indices.end(), indices.begin(), indices.end()); + + // Insert vertex components + [&](std::integer_sequence) + { + const auto& src_array = std::get(vertices); + auto& dst_array = std::get(m_component_arrays); + + if (not src_array.empty()) + { + dst_array.insert(dst_array.end(), src_array.begin(), src_array.begin() + min_component_count); + } + } + (std::index_sequence_for{}); + + // Insert material + m_material_ids.emplace_back(mesh.material_id()); + + // TODO check count + m_component_flag_counts.emplace_back( + mesh.component_flags, + static_cast(indices.size()), + min_component_count + ); + + return id; +} + +template +std::pair::iterator_type, bool> assets::detail::generic_mesh_store::find(id_type id) +{ + const auto id_it = std::ranges::upper_bound(m_ids, id); + + const auto match = ( + id_it != m_ids.begin() and + *std::prev(id_it) == id + ); + + const auto index = id_it - m_ids.begin() - match; + + auto it = begin(); + it += index; + + return { it, match }; +} + +template +std::pair::const_iterator, bool> assets::detail::generic_mesh_store::find(id_type id) const +{ + const auto id_it = std::ranges::upper_bound(m_ids, id); + + const auto match = ( + id_it != m_ids.begin() and + *std::prev(id_it) == id + ); + + const auto index = id_it - m_ids.begin() - match; + + auto it = begin(); + it += index; + + return { it, match }; +} + + +template +void assets::detail::generic_mesh_store::remove(const iterator_type& it) +{ + m_ids.erase(m_ids.begin() + it.m_index); + + m_indices.erase(m_indices.begin() + it.m_offsets[0]); + + [&](std::index_sequence) + { + ([&]{ + auto& component_vector = std::get(m_component_arrays); + const auto begin = component_vector.begin() + it.m_offsets[1 + Is]; + const auto end = begin + it.m_flag_counts[it.m_index]; + component_vector.erase(begin, end); + }(), ...); + } (std::index_sequence_for{}); + + m_material_ids.erase(m_material_ids.begin() + it.m_index); + + m_component_flag_counts.erase(m_component_flag_counts.begin() + it.m_index); +} + +template +void assets::detail::generic_mesh_store::clear() +{ + m_ids.clear(); + m_indices.clear(); + [&](std::index_sequence) + { + std::get(m_component_arrays).clear(); + } (std::index_sequence_for{}); + m_component_flag_counts.clear(); + m_material_ids.clear(); +} + +template +typename assets::detail::generic_mesh_store::iterator_type assets::detail::generic_mesh_store::begin() +{ + return iterator_type{ + m_ids.data(), + m_indices.data(), + component_iterators(), + m_material_ids.data(), + m_component_flag_counts.data(), + 0, + {} + }; +} + +template +typename assets::detail::generic_mesh_store::iterator_type assets::detail::generic_mesh_store::end() +{ + return iterator_type{ + m_ids.data(), + m_indices.data(), + component_iterators(), + m_material_ids.data(), + m_component_flag_counts.data(), + m_component_flag_counts.size(), + array_counts() + }; +} + +template +typename assets::detail::generic_mesh_store::const_iterator assets::detail::generic_mesh_store::begin() const +{ + return const_iterator{ + m_ids.data(), + m_indices.data(), + component_iterators(), + m_material_ids.data(), + m_component_flag_counts.data(), + 0, + {} + }; +} + +template +typename assets::detail::generic_mesh_store::const_iterator assets::detail::generic_mesh_store::end() const +{ + return const_iterator{ + m_ids.data(), + m_indices.data(), + component_iterators(), + m_material_ids.data(), + m_component_flag_counts.data(), + m_component_flag_counts.size(), + array_counts() + }; +} + +template +typename assets::detail::generic_mesh_store::const_iterator assets::detail::generic_mesh_store::cbegin() const +{ + return const_cast(this)->begin(); +} + +template +typename assets::detail::generic_mesh_store::const_iterator assets::detail::generic_mesh_store::cend() const +{ + return const_cast(this)->end(); +} + +template +typename assets::detail::generic_mesh_store::view_type assets::detail::generic_mesh_store::view() +{ + return { begin(), end() }; +} +template +typename assets::detail::generic_mesh_store::const_view_type assets::detail::generic_mesh_store::view() const +{ + return { begin(), end() }; +} diff --git a/source/assets/data_stores/generic/generic_point_cloud_store.ipp b/source/assets/data_stores/generic/generic_point_cloud_store.ipp new file mode 100644 index 0000000..0a0bbd1 --- /dev/null +++ b/source/assets/data_stores/generic/generic_point_cloud_store.ipp @@ -0,0 +1,415 @@ +#ifndef INCLUDE_GENERIC_POINT_CLOUD_STORE_IMPLEMENTATION +# error Never include this file directly include 'generic_point_cloud_store.hpp' +#endif + +#include +#include +#include +#include +#include +#include + +template +assets::detail::generic_point_cloud_store_iterator::generic_point_cloud_store_iterator( + id_iterator_type ids, + const component_iterator_type& components, + const flag_count_iterator_type flag_counts, + std::size_t index, + const offsets_type& offsets +) : + m_ids{ ids }, + m_components{ components }, + m_flag_counts{ flag_counts }, + m_index{ index }, + m_offsets{ offsets } {} + + +template +typename assets::detail::generic_point_cloud_store_iterator::reference assets::detail::generic_point_cloud_store_iterator::operator*() const { + return dereference(std::index_sequence_for{}); +} + +template +assets::detail::generic_point_cloud_store_iterator& assets::detail::generic_point_cloud_store_iterator::operator++() { + adjust_offsets(std::index_sequence_for{}, 1); + ++m_index; + return *this; +} + +template +assets::detail::generic_point_cloud_store_iterator assets::detail::generic_point_cloud_store_iterator::operator++(int) { + generic_point_cloud_store_iterator tmp = *this; + ++(*this); + return tmp; +} + +template +assets::detail::generic_point_cloud_store_iterator& assets::detail::generic_point_cloud_store_iterator::operator--() { + adjust_offsets(std::index_sequence_for{}, -1); + --m_index; + return *this; +} + +template +assets::detail::generic_point_cloud_store_iterator assets::detail::generic_point_cloud_store_iterator::operator--(int) { + auto tmp = *this; + --(*this); + return tmp; +} + +template +assets::detail::generic_point_cloud_store_iterator& assets::detail::generic_point_cloud_store_iterator::operator+=(const difference_type n) +{ + adjust_offsets(std::index_sequence_for{}, n); + m_index += n; + return *this; +} + +template +assets::detail::generic_point_cloud_store_iterator& assets::detail::generic_point_cloud_store_iterator::operator-=(const difference_type n) +{ + return (*this) += -n; +} + +template +assets::detail::generic_point_cloud_store_iterator assets::detail::generic_point_cloud_store_iterator::operator+(const difference_type n) const +{ + auto tmp = *this; + return tmp += n; // TODO clion says n is unused +} + +template +assets::detail::generic_point_cloud_store_iterator assets::detail::generic_point_cloud_store_iterator::operator-(const difference_type n) const +{ + auto tmp = *this; + return tmp -= n; // TODO clion says n is unused +} + +template +typename assets::detail::generic_point_cloud_store_iterator::difference_type +assets::detail::generic_point_cloud_store_iterator::operator-(const generic_point_cloud_store_iterator& other) const +{ + return static_cast(m_index) - static_cast(other.m_index); +} + +template +typename assets::detail::generic_point_cloud_store_iterator::reference assets::detail::generic_point_cloud_store_iterator::operator[]( + const difference_type n +) const { + return *(*this + n); +} + +template +bool assets::detail::generic_point_cloud_store_iterator::operator==(const generic_point_cloud_store_iterator& other) const +{ + return m_ids == other.m_ids and m_index == other.m_index; +} + +template +bool assets::detail::generic_point_cloud_store_iterator::operator!=(const generic_point_cloud_store_iterator& other) const +{ + return not (*this == other); +} + +template +bool assets::detail::generic_point_cloud_store_iterator::operator<(const generic_point_cloud_store_iterator& other) const +{ + return m_index < other.m_index; +} + +template +bool assets::detail::generic_point_cloud_store_iterator::operator<=(const generic_point_cloud_store_iterator& other) const +{ + return m_index <= other.m_index; +} + +template +bool assets::detail::generic_point_cloud_store_iterator::operator>(const generic_point_cloud_store_iterator& other) const +{ + return m_index > other.m_index; +} + +template +bool assets::detail::generic_point_cloud_store_iterator::operator>=(const generic_point_cloud_store_iterator& other) const +{ + return m_index >= other.m_index; +} + +template +template +bool assets::detail::generic_point_cloud_store_iterator::is_component_enabled(component_flag_type flag) +{ + return (flag & (component_flag_type{ 1 } << N)) != component_flag_type{}; +} + +template +template +void assets::detail::generic_point_cloud_store_iterator::calc_offsets( + std::index_sequence, + difference_type n +) { + + const auto negative = n < difference_type{ 0 }; + const auto positive = n > difference_type{ 0 }; + const auto step = difference_type{ positive } - difference_type{ negative }; + n = negative ? -n : n; + + // TODO template optimize for single steps + + while (n--) + { + const auto& [ flags, index_count, component_count ] = m_flag_counts[m_index]; + + std::get<0>(m_offsets) += step * index_count; + + ([&] { + if (is_component_enabled(flags)) + { + std::get<1 + Is>(m_offsets) += step * component_count; + } + }(), ...); + + m_index += step; + } +} + +template +template +typename assets::detail::generic_point_cloud_store_iterator::reference +assets::detail::generic_point_cloud_store_iterator::dereference(std::index_sequence) const +{ + const auto& [ flags, index_count, component_count ] = m_flag_counts[m_index]; + + return std::make_pair( + m_ids[m_index], + point_cloud_view{ + .vertex_components = flags, + .vertex_component_arrays = std::make_tuple( + std::span( + &std::get(m_components)[m_offsets[1 + Is]], + is_component_enabled(flags) ? component_count : 0 + )... + ) + } + ); +} + +template +std::tuple...> assets::detail::generic_point_cloud_store::component_iterators() +{ + return [&](std::index_sequence) + { + return std::make_tuple(std::get(m_component_arrays).data()...); + } + (std::index_sequence_for{}); +} + +template +std::tuple>...> assets::detail::generic_point_cloud_store::component_iterators() const +{ + return [&](std::index_sequence) + { + return std::make_tuple(std::get(m_component_arrays).data()...); + } + (std::index_sequence_for{}); +} + +template +std::array::count_type, 1 + sizeof...(Ts)> +assets::detail::generic_point_cloud_store::array_counts() const +{ + return [&](std::index_sequence) + { + return std::array{ + std::get(m_component_arrays).size()... + }; + } + (std::index_sequence_for{}); +} + +template +typename assets::detail::generic_point_cloud_store::id_type assets::detail::generic_point_cloud_store::add( + const point_cloud_data& point_cloud +) { + + const auto id = id_type{ m_next_data_id.index++ }; + m_ids.push_back(id); + + const auto& vertices = point_cloud.vertices; + + auto component_flags = component_flag_type{}; + auto min_component_count = count_type{}; + + // finding out correct component flags and count + [&](std::integer_sequence) + { + const auto& component_array = std::get(vertices); + if (not component_array.empty()) + { + const auto component_count = static_cast(component_array.size()); + if (min_component_count != 0 and component_count < min_component_count) + { + min_component_count = component_count; + } + component_flags |= component_flag_type{ 1 } << Is; + } + } + (std::index_sequence_for{}); + + // Insert vertex components + [&](std::integer_sequence) + { + const auto& src_array = std::get(vertices); + auto& dst_array = std::get(m_component_arrays); + + if (not src_array.empty()) + { + dst_array.insert(dst_array.end(), src_array.begin(), src_array.begin() + min_component_count); + } + } + (std::index_sequence_for{}); + + // TODO check count + m_component_flag_counts.emplace_back( + point_cloud.component_flags, + min_component_count + ); + + return id; +} + +template +std::pair::iterator_type, bool> assets::detail::generic_point_cloud_store::find(id_type id) +{ + const auto id_it = std::ranges::upper_bound(m_ids, id); + + const auto match = ( + id_it != m_ids.begin() and + *std::prev(id_it) == id + ); + + const auto index = id_it - m_ids.begin() - match; + + auto it = begin(); + it += index; + + return { it, match }; +} + +template +std::pair::const_iterator, bool> assets::detail::generic_point_cloud_store::find(id_type id) const +{ + const auto id_it = std::ranges::upper_bound(m_ids, id); + + const auto match = ( + id_it != m_ids.begin() and + *std::prev(id_it) == id + ); + + const auto index = id_it - m_ids.begin() - match; + + auto it = begin(); + it += index; + + return { it, match }; +} + + +template +void assets::detail::generic_point_cloud_store::remove(const iterator_type& it) +{ + [&](std::index_sequence) + { + ([&]{ + auto& component_vector = std::get(m_component_arrays); + const auto begin = component_vector.begin() + it.m_offsets[1 + Is]; + const auto end = begin + it.m_flag_counts[it.m_index]; + component_vector.erase(begin, end); + }(), ...); + } (std::index_sequence_for{}); + + m_component_flag_counts.erase(m_component_flag_counts.begin() + it.m_index); + m_ids.erase(m_ids.begin() + it.m_index); +} + +template +void assets::detail::generic_point_cloud_store::clear() +{ + m_ids.clear(); + [&](std::index_sequence) + { + std::get(m_component_arrays).clear(); + } (std::index_sequence_for{}); + m_component_flag_counts.clear(); +} + +template +typename assets::detail::generic_point_cloud_store::iterator_type assets::detail::generic_point_cloud_store::begin() +{ + return iterator_type{ + m_ids.data(), + component_iterators(), + m_component_flag_counts.data(), + 0, + {} + }; +} + +template +typename assets::detail::generic_point_cloud_store::iterator_type assets::detail::generic_point_cloud_store::end() +{ + return iterator_type{ + m_ids.data(), + component_iterators(), + m_component_flag_counts.data(), + m_component_flag_counts.size(), + array_counts() + }; +} + +template +typename assets::detail::generic_point_cloud_store::const_iterator assets::detail::generic_point_cloud_store::begin() const +{ + return const_iterator{ + m_ids.data(), + component_iterators(), + m_component_flag_counts.data(), + 0, + {} + }; +} + +template +typename assets::detail::generic_point_cloud_store::const_iterator assets::detail::generic_point_cloud_store::end() const +{ + return const_iterator{ + m_ids.data(), + component_iterators(), + m_component_flag_counts.data(), + m_component_flag_counts.size(), + array_counts() + }; +} + +template +typename assets::detail::generic_point_cloud_store::const_iterator assets::detail::generic_point_cloud_store::cbegin() const +{ + return const_cast(this)->begin(); +} + +template +typename assets::detail::generic_point_cloud_store::const_iterator assets::detail::generic_point_cloud_store::cend() const +{ + return const_cast(this)->end(); +} + +template +typename assets::detail::generic_point_cloud_store::view_type assets::detail::generic_point_cloud_store::view() +{ + return { begin(), end() }; +} +template +typename assets::detail::generic_point_cloud_store::const_view_type assets::detail::generic_point_cloud_store::view() const +{ + return { begin(), end() }; +} diff --git a/source/assets/data_stores/shader_source_store.ipp b/source/assets/data_stores/shader_source_store.ipp new file mode 100644 index 0000000..68a42e7 --- /dev/null +++ b/source/assets/data_stores/shader_source_store.ipp @@ -0,0 +1,303 @@ +#ifndef INCLUDE_SHADER_SOURCE_STORE_IMPLEMENTATION +# error Never include this file directly include 'shader_source_store.hpp' +#endif + +#include +#include +#include +#include +#include +#include + +template +assets::shader_source_store_iterator::shader_source_store_iterator( + id_iterator_type ids, + string_iterator_type strings, + length_iterator_type lengths, + std::size_t index, + const offset_type& offset +) : + m_ids{ ids }, + m_strings{ strings }, + m_lengths{ lengths }, + m_index{ index }, + m_offset{ offset } {} + + +template +typename assets::shader_source_store_iterator::reference assets::shader_source_store_iterator::operator*() const { + return dereference(std::index_sequence_for{}); +} + +template +assets::shader_source_store_iterator& assets::shader_source_store_iterator::operator++() { + adjust_offsets(std::index_sequence_for{}, 1); + ++m_index; + return *this; +} + +template +assets::shader_source_store_iterator assets::shader_source_store_iterator::operator++(int) { + shader_source_store_iterator tmp = *this; + ++(*this); + return tmp; +} + +template +assets::shader_source_store_iterator& assets::shader_source_store_iterator::operator--() { + adjust_offsets(std::index_sequence_for{}, -1); + --m_index; + return *this; +} + +template +assets::shader_source_store_iterator assets::shader_source_store_iterator::operator--(int) { + auto tmp = *this; + --(*this); + return tmp; +} + +template +assets::shader_source_store_iterator& assets::shader_source_store_iterator::operator+=(const difference_type n) +{ + adjust_offsets(std::index_sequence_for{}, n); + m_index += n; + return *this; +} + +template +assets::shader_source_store_iterator& assets::shader_source_store_iterator::operator-=(const difference_type n) +{ + return (*this) += -n; +} + +template +assets::shader_source_store_iterator assets::shader_source_store_iterator::operator+(const difference_type n) const +{ + auto tmp = *this; + return tmp += n; // TODO clion says n is unused +} + +template +assets::shader_source_store_iterator assets::shader_source_store_iterator::operator-(const difference_type n) const +{ + auto tmp = *this; + return tmp -= n; // TODO clion says n is unused +} + +template +typename assets::shader_source_store_iterator::difference_type +assets::shader_source_store_iterator::operator-(const shader_source_store_iterator& other) const +{ + return static_cast(m_index) - static_cast(other.m_index); +} + +template +typename assets::shader_source_store_iterator::reference assets::shader_source_store_iterator::operator[]( + const difference_type n +) const { + return *(*this + n); +} + +template +bool assets::shader_source_store_iterator::operator==(const shader_source_store_iterator& other) const +{ + return m_ids == other.m_ids and m_index == other.m_index; +} + +template +bool assets::shader_source_store_iterator::operator!=(const shader_source_store_iterator& other) const +{ + return not (*this == other); +} + +template +bool assets::shader_source_store_iterator::operator<(const shader_source_store_iterator& other) const +{ + return m_index < other.m_index; +} + +template +bool assets::shader_source_store_iterator::operator<=(const shader_source_store_iterator& other) const +{ + return m_index <= other.m_index; +} + +template +bool assets::shader_source_store_iterator::operator>(const shader_source_store_iterator& other) const +{ + return m_index > other.m_index; +} + +template +bool assets::shader_source_store_iterator::operator>=(const shader_source_store_iterator& other) const +{ + return m_index >= other.m_index; +} + +template +void assets::shader_source_store_iterator::calc_offset( + difference_type n +) { + + const auto negative = n < difference_type{ 0 }; + const auto positive = n > difference_type{ 0 }; + const auto step = difference_type{ positive } - difference_type{ negative }; + n = negative ? -n : n; + + // TODO template optimize for single steps + + while (n--) + { + const auto& count = m_lengths[m_index]; + m_offset += step * count; + m_index += step; + } +} + +template +template +typename assets::shader_source_store_iterator::reference +assets::shader_source_store_iterator::dereference(std::index_sequence) const +{ + return std::make_pair( + m_ids[m_index], + shader_source_view( + m_strings[m_offset], + m_lengths[m_index] + ) + ); +} + + +assets::shader_source_store::id_type assets::shader_source_store::add( + const shader_source_data& shader_source +) { + + const auto id = id_type{ m_next_data_id.index++ }; + m_ids.push_back(id); + + m_strings.reserve(m_strings.size() + shader_source.source.size() + 1); + m_strings.insert(m_strings.end(), shader_source.source.begin(), shader_source.source.end()); + m_strings.push_back('\0'); + + m_lengths.push_back(shader_source.source.size()); + + return id; +} + +std::pair assets::shader_source_store::find(id_type id) +{ + const auto id_it = std::ranges::upper_bound(m_ids, id); + + const auto match = ( + id_it != m_ids.begin() and + *std::prev(id_it) == id + ); + + const auto index = id_it - m_ids.begin() - match; + + auto it = begin(); + it += index; + + return { it, match }; +} + +std::pair assets::shader_source_store::find(id_type id) const +{ + const auto id_it = std::ranges::upper_bound(m_ids, id); + + const auto match = ( + id_it != m_ids.begin() and + *std::prev(id_it) == id + ); + + const auto index = id_it - m_ids.begin() - match; + + auto it = begin(); + it += index; + + return { it, match }; +} + +void assets::shader_source_store::remove(const iterator_type& it) +{ + m_ids.erase(m_ids.begin() + it.m_index); + + const auto begin = m_strings.begin() + it.m_offset; + const auto end = begin + it.m_lengths[it.m_index]; + m_strings.erase(begin, end); + + m_lengths.erase(m_lengths.begin() + it.m_index); +} + +void assets::shader_source_store::clear() +{ + m_ids.clear(); + m_strings.clear(); + m_lengths.clear(); +} + +assets::shader_source_store::iterator_type assets::shader_source_store::begin() +{ + return iterator_type{ + m_ids.data(), + m_strings.data(), + m_lengths.data(), + 0, + {} + }; +} + +assets::shader_source_store::iterator_type assets::shader_source_store::end() +{ + return iterator_type{ + m_ids.data(), + m_strings.data(), + m_lengths.data(), + m_lengths.size(), + m_strings.size() + }; +} + +assets::shader_source_store::const_iterator assets::shader_source_store::begin() const +{ + return const_iterator{ + m_ids.data(), + m_strings.data(), + m_lengths.data(), + 0, + {} + }; +} + +assets::shader_source_store::const_iterator assets::shader_source_store::end() const +{ + return const_iterator{ + m_ids.data(), + m_strings.data(), + m_lengths.data(), + m_lengths.size(), + m_strings.size() + }; +} + +assets::shader_source_store::const_iterator assets::shader_source_store::cbegin() const +{ + return const_cast(this)->begin(); +} + +assets::shader_source_store::const_iterator assets::shader_source_store::cend() const +{ + return const_cast(this)->end(); +} + +assets::shader_source_store::view_type assets::shader_source_store::view() +{ + return { begin(), end() }; +} + +assets::shader_source_store::const_view_type assets::shader_source_store::view() const +{ + return { begin(), end() }; +} diff --git a/source/assets/dynamic_data_stores/dynamic_material_store.cpp b/source/assets/dynamic_data_stores/dynamic_material_store.cpp deleted file mode 100644 index 70ce9ee..0000000 --- a/source/assets/dynamic_data_stores/dynamic_material_store.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "assets/dynamic_data_stores/dynamic_material_store.hpp" - -dynamic_material_store::id_type dynamic_material_store::add(const dynamic_material_buffer& buffer) -{ - return m_store.add(buffer.data); -} - -std::pair dynamic_material_store::find(const id_type id) -{ - return m_store.find(id); -} - -std::pair dynamic_material_store::find(const id_type id) const -{ - return m_store.find(id); -} - -void dynamic_material_store::remove(const iterator_type& it) -{ - m_store.remove(it); -} - -void dynamic_material_store::clear() -{ - m_store.clear(); -} diff --git a/source/assets/dynamic_data_stores/dynamic_mesh_store.cpp b/source/assets/dynamic_data_stores/dynamic_mesh_store.cpp deleted file mode 100644 index 6eb6c3d..0000000 --- a/source/assets/dynamic_data_stores/dynamic_mesh_store.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "assets/dynamic_data_stores/dynamic_mesh_store.hpp" - - -dynamic_mesh_store::id_type dynamic_mesh_store::add(const dynamic_mesh_buffer& mesh_buffer) -{ - const auto& triangles = mesh_buffer.triangles(); - return m_store.add( - std::span{ triangles.front().data(), triangles.size() * 3 }, - mesh_buffer.vertices - ); -} - -std::pair dynamic_mesh_store::find(id_type id) -{ - return m_store.find(id); -} - -std::pair dynamic_mesh_store::find(id_type id) const -{ - return m_store.find(id); -} - -void dynamic_mesh_store::remove(const iterator_type& it) -{ - m_store.remove(it); -} - -void dynamic_mesh_store::clear() -{ - m_store.clear(); -} diff --git a/source/assets/dynamic_data_stores/dynamic_point_cloud_store.cpp b/source/assets/dynamic_data_stores/dynamic_point_cloud_store.cpp deleted file mode 100644 index 25860b2..0000000 --- a/source/assets/dynamic_data_stores/dynamic_point_cloud_store.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "assets/dynamic_data_stores/dynamic_point_cloud_store.hpp" - - -dynamic_point_cloud_store::id_type dynamic_point_cloud_store::add(const dynamic_point_cloud_buffer& mesh_buffer) -{ - return m_store.add(mesh_buffer.vertices); -} - -std::pair dynamic_point_cloud_store::find(id_type id) -{ - return m_store.find(id); -} - -std::pair dynamic_point_cloud_store::find(id_type id) const -{ - return m_store.find(id); -} - -void dynamic_point_cloud_store::remove(const iterator_type& it) -{ - m_store.remove(it); -} - -void dynamic_point_cloud_store::clear() -{ - m_store.clear(); -} diff --git a/source/assets/dynamic_data_stores/generic/generic_dynamic_component_store.ipp b/source/assets/dynamic_data_stores/generic/generic_dynamic_component_store.ipp deleted file mode 100644 index 05447cd..0000000 --- a/source/assets/dynamic_data_stores/generic/generic_dynamic_component_store.ipp +++ /dev/null @@ -1,373 +0,0 @@ -#ifndef INCLUDE_GENERIC_DYNAMIC_COMPONENT_STORE_IMPLEMENTATION -# error Never include this file directly include 'basic_dynamic_component_store.hpp' -#endif - -#pragma once - -#include -#include - -#include "util/uix.hpp" -#include "util/id_type.hpp" - -#include -#include -#include -#include - -template -component_iterator::component_iterator( - const value_type components, - const C* flags, - std::size_t index, - const offsets_type& offsets -) : m_components{ components }, m_flags{ flags }, m_index{ index }, m_offsets{ offsets } {} - - -template -typename component_iterator::reference component_iterator::operator*() const { - return dereference(std::index_sequence_for{}); -} - -template -component_iterator& component_iterator::operator++() { - adjust_offsets(std::index_sequence_for{}, 1); - ++m_index; - return *this; -} - -template -component_iterator component_iterator::operator++(int) { - component_iterator tmp = *this; - ++(*this); - return tmp; -} - -template -component_iterator& component_iterator::operator--() { - adjust_offsets(std::index_sequence_for{}, -1); - --m_index; - return *this; -} - -template -component_iterator component_iterator::operator--(int) { - auto tmp = *this; - --(*this); - return tmp; -} - -template -component_iterator& component_iterator::operator+=(const difference_type n) -{ - adjust_offsets(std::index_sequence_for{}, n); - m_index += n; - return *this; -} - -template -component_iterator& component_iterator::operator-=(const difference_type n) -{ - return (*this) += -n; -} - -template -component_iterator component_iterator::operator+(const difference_type n) const -{ - auto tmp = *this; - return tmp += n; -} - -template -component_iterator component_iterator::operator-(const difference_type n) const -{ - auto tmp = *this; - return tmp -= n; -} - -template -typename component_iterator::difference_type -component_iterator::operator-(const component_iterator& other) const -{ - return static_cast(m_index) - static_cast(other.m_index); -} - -template -typename component_iterator::reference component_iterator::operator[]( - const difference_type n -) const { - return *((*this) + n); -} - -template -bool component_iterator::operator==(const component_iterator& other) const -{ - return m_components == other.m_components and m_index == other.m_index; -} - -template -bool component_iterator::operator!=(const component_iterator& other) const -{ - return not (*this == other); -} - -template -bool component_iterator::operator<(const component_iterator& other) const -{ - return m_index < other.m_index; -} - -template -bool component_iterator::operator<=(const component_iterator& other) const -{ - return m_index <= other.m_index; -} - -template -bool component_iterator::operator>(const component_iterator& other) const -{ - return m_index > other.m_index; -} - -template -bool component_iterator::operator>=(const component_iterator& other) const -{ - return m_index >= other.m_index; -} - -template -template -bool component_iterator::is_component_enabled(C flag) -{ - return (flag & (C{1} << I)) != C{}; -} - -template -template -void component_iterator::calc_offsets(std::index_sequence, difference_type n) -{ - - const auto negative = n < difference_type{ 0 }; - const auto positive = n > difference_type{ 0 }; - const auto step = difference_type{ positive } - difference_type{ negative }; - n = negative ? -n : n; - - // TODO template optimize for single steps - - while (n--) - { - const C& flag = m_flags[m_index + n]; - - ([&] { - if (is_component_enabled(flag)) { - std::get(m_offsets) += step; - } - }(), ...); - - m_index += step; - } -} - -template -template -typename component_iterator::reference -component_iterator::dereference(std::index_sequence) const -{ - return std::make_tuple(get_pointer()...); -} - -template -template -std::tuple_element_t::value_type> -component_iterator::get_pointer() const -{ - if (is_component_enabled(m_flags[m_index])) - { - return &std::get(m_components)[m_offsets[N]]; - } - return nullptr; -} - - -template -std::tuple...> component_iterator::data_ptrs() -{ - return [&](std::index_sequence) - { - return std::make_tuple(std::get(m_components).data()...); - } - (std::index_sequence_for{}); -} - -template -std::tuple>...> component_iterator::data_ptrs() const -{ - return [&](std::index_sequence) - { - return std::make_tuple(std::get(m_components).data()...); - } - (std::index_sequence_for{}); -} - -template -std::array component_iterator::data_counts() const -{ - return [&](std::index_sequence) - { - return std::array{ std::get(m_components).size()... }; - } - (std::index_sequence_for{}); -} - -template -typename generic_dynamic_component_store::id_type generic_dynamic_component_store::add( - const std::tuple...>& data -) { - - auto component_flags = C{}; - - [&](std::integer_sequence) - { - if (const auto& component_opt = std::get(data)) - { - std::get(m_components).push_back(*component_opt); - component_flags |= C{ 1 } << Is; - } - } - (std::index_sequence_for{}); - - m_component_flags.push_back(component_flags); - - const auto id = id_type{ m_next_data_id.index++ }; - m_ids.push_back(id); - - return id; -} - -template -std::pair::iterator_type, bool> generic_dynamic_component_store::find(id_type id) -{ - const auto id_it = std::ranges::upper_bound(m_ids, id); - - const auto match = ( - id_it != m_ids.begin() and - *std::prev(id_it) == id - ); - - const auto index = id_it - m_ids.begin() - match; - - auto it = begin(); - it += index; - - return { it, match }; -} - -template -std::pair::const_iterator, bool> generic_dynamic_component_store::find(id_type id) const -{ - const auto id_it = std::ranges::upper_bound(m_ids, id); - - const auto match = ( - id_it != m_ids.begin() and - *std::prev(id_it) == id - ); - - const auto index = id_it - m_ids.begin() - match; - - auto it = begin(); - it += index; - - return { it, match }; -} - - -template -void generic_dynamic_component_store::remove(const iterator_type& it) -{ - return [&](std::index_sequence) - { - auto& component_vector = std::get(m_components); - (component_vector.erase(component_vector.begin() + it.m_offsets[Is]), ...); - } (std::index_sequence_for{}); - - m_component_flags.erase(m_component_flags.begin() + it.m_index); - m_ids.erase(m_ids.begin() + it.m_index); -} - -template -void generic_dynamic_component_store::clear() -{ - return [&](std::index_sequence) - { - std::get(m_component_counts).clear(); - } (std::index_sequence_for{}); - m_component_flags.clear(); - m_ids.clear(); -} - -template -generic_dynamic_component_store::iterator_type generic_dynamic_component_store::begin() -{ - return iterator_type{ - data_ptrs(), - m_component_flags.data(), - 0, - {} - }; -} - -template -generic_dynamic_component_store::iterator_type generic_dynamic_component_store::end() -{ - return iterator_type{ - data_ptrs(), - m_component_flags.data(), - m_component_flags.size(), - data_counts() - }; -} - -template -generic_dynamic_component_store::const_iterator generic_dynamic_component_store::begin() const -{ - return iterator_type{ - data_ptrs(), - m_component_flags.data(), - 0, - {} - }; -} - -template -generic_dynamic_component_store::const_iterator generic_dynamic_component_store::end() const -{ - return iterator_type{ - data_ptrs(), - m_component_flags.data(), - m_component_flags.size(), - data_counts() - }; -} - -template -generic_dynamic_component_store::const_iterator generic_dynamic_component_store::cbegin() const -{ - return const_cast(this)->begin(); -} - -template -generic_dynamic_component_store::const_iterator generic_dynamic_component_store::cend() const -{ - return const_cast(this)->end(); -} - -template -generic_dynamic_component_store::view_type generic_dynamic_component_store::view() -{ - return { begin(), end() }; -} -template -generic_dynamic_component_store::const_view_type generic_dynamic_component_store::view() const -{ - return { begin(), end() }; -} diff --git a/source/assets/dynamic_read_buffers/dynamic_material_buffer.ipp b/source/assets/dynamic_read_buffers/dynamic_material_buffer.ipp deleted file mode 100644 index 0eb616c..0000000 --- a/source/assets/dynamic_read_buffers/dynamic_material_buffer.ipp +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef INCLUDE_DYNAMIC_MATERIAL_DATA_IMPLEMENTATION -# error Never include this file directly include 'dynamic_material_buffer.hpp' -#endif - - -inline std::optional& dynamic_material_buffer::surface_properties() -{ - return std::get(data); -} -inline std::optional& dynamic_material_buffer::transparency() -{ - return std::get(data); -} -inline std::optional& dynamic_material_buffer::ambient_color_texture_id() -{ - return std::get(data); -} -inline std::optional& dynamic_material_buffer::diffuse_color_texture_id() -{ - return std::get(data); -} -inline std::optional& dynamic_material_buffer::specular_color_texture_id() -{ - return std::get(data); -} -inline std::optional& dynamic_material_buffer::shininess_texture_id() -{ - return std::get(data); -} -inline std::optional& dynamic_material_buffer::alpha_texture_id() -{ - return std::get(data); -} -inline std::optional& dynamic_material_buffer::bump_texture_id() -{ - return std::get& dynamic_material_buffer::surface_properties() const -{ - return std::get(data); -} - -inline const std::optional& dynamic_material_buffer::transparency() const -{ - return std::get(data); -} - -inline const std::optional& dynamic_material_buffer::ambient_color_texture_id() const -{ - return std::get(data); -} - -inline const std::optional& dynamic_material_buffer::diffuse_color_texture_id() const -{ - return std::get(data); -} - -inline const std::optional& dynamic_material_buffer::specular_color_texture_id() const -{ - return std::get(data); -} - -inline const std::optional& dynamic_material_buffer::shininess_texture_id() const -{ - return std::get(data); -} - -inline const std::optional& dynamic_material_buffer::alpha_texture_id() const -{ - return std::get(data); -} - -inline const std::optional& dynamic_material_buffer::bump_texture_id() const -{ - return std::get(data); -} - - -inline components::material::surface_properties& dynamic_material_buffer::initialized_surface_properties() -{ - auto& surface_properties_opt = surface_properties(); - if (not surface_properties_opt) - { - surface_properties_opt = components::material::surface_properties{}; - } - return *surface_properties_opt; -} - -inline void dynamic_material_buffer::clear() -{ - std::apply( - [](auto&... data_opt) { - (data_opt.reset(), ...); - }, - data - ); -} - diff --git a/source/assets/dynamic_read_buffers/dynamic_mesh_buffer.ipp b/source/assets/dynamic_read_buffers/dynamic_mesh_buffer.ipp deleted file mode 100644 index b33b59a..0000000 --- a/source/assets/dynamic_read_buffers/dynamic_mesh_buffer.ipp +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef INCLUDE_DYNAMIC_MESH_DATA_IMPLEMENTATION -# error Never include this file directly include 'dynamic_mesh_buffer.hpp' -#endif - -inline std::vector& dynamic_mesh_buffer::positions() -{ - return std::get(vertices); -} - -inline std::vector& dynamic_mesh_buffer::normals() -{ - return std::get(vertices); -} - -inline std::vector& dynamic_mesh_buffer::tex_coords() -{ - return std::get(vertices); -} - -inline std::vector& dynamic_mesh_buffer::colors() -{ - return std::get(vertices); -} - -inline std::vector& dynamic_mesh_buffer::reflectances() -{ - return std::get(vertices); -} - -inline std::vector& dynamic_mesh_buffer::triangles() -{ - return m_triangles; -} - -inline auto& dynamic_mesh_buffer::material_id() -{ - return m_material_id; -} - -inline const std::vector& dynamic_mesh_buffer::positions() const -{ - return std::get(vertices); -} - -inline const std::vector& dynamic_mesh_buffer::normals() const -{ - return std::get(vertices); -} - -inline const std::vector& dynamic_mesh_buffer::tex_coords() const -{ - return std::get(vertices); -} - -inline const std::vector& dynamic_mesh_buffer::colors() const -{ - return std::get(vertices); -} - -inline const std::vector& dynamic_mesh_buffer::reflectances() const -{ - return std::get(vertices); -} - -inline const std::vector& dynamic_mesh_buffer::triangles() const -{ - return m_triangles; -} - -inline const auto& dynamic_mesh_buffer::material_id() const -{ - return m_material_id; -} - -inline void dynamic_mesh_buffer::clear() -{ - clear_vertices(); - m_triangles.clear(); - m_material_id = {}; -} diff --git a/source/assets/dynamic_read_buffers/dynamic_model_buffer.ipp b/source/assets/dynamic_read_buffers/dynamic_model_buffer.ipp deleted file mode 100644 index f30be4c..0000000 --- a/source/assets/dynamic_read_buffers/dynamic_model_buffer.ipp +++ /dev/null @@ -1,148 +0,0 @@ -#ifndef INCLUDE_DYNAMIC_MODEL_DATA_IMPLEMENTATION -# error Never include this file directly include 'dynamic_vertex_buffer.hpp' -#endif - -#include "util/specialised_lambda.hpp" -#include "opengl/type_utils.hpp" -#include -#include -#include - -template -C& dynamic_vertex_buffer::components() -{ - return m_components; -} - -template -const C& dynamic_vertex_buffer::components() const -{ - return m_components; -} - -template -concept numeric_type = std::integral or std::floating_point; - -template -void dynamic_vertex_buffer::build_vertex_buffer( - std::vector& vertex_buffer, - std::size_t& component_count, - std::array& component_types, - std::array& component_lengths, - GLsizei& stride -) const { - const auto for_all_components = [&](auto&& f, const T default_value) - { - return std::apply( - [&](const auto&... component_buffer) - { - std::array results{}; - auto i = std::size_t{}; - ( - ( - results[i] = [&](const auto& buffer, const auto index) -> T - { - if ((m_components & C{ 1 << index }) != C{}) - { - return f(buffer, index); - } - return default_value; - }(component_buffer, i), - ++i - ), - ... - ); - return results; - }, - m_component_buffers - ); - }; - - component_count = 0; - component_types = for_all_components( - ztu::specialised_lambda - { - [&component_count](const std::vector>&, std::size_t) - { - ++component_count; - return zgl::type_utils::to_gl_type(); - }, - [&component_count](const std::vector&, std::size_t) - { - ++component_count; - return zgl::type_utils::to_gl_type(); - } - }, - GLenum{ GL_INVALID_VALUE } - ); - - const auto element_counts = for_all_components( - [](const std::vector& buffer, std::size_t) - { - return buffer.size(); - }, - std::numeric_limits::max() - ); - - const auto minimum_element_count = std::ranges::min(element_counts); - - component_lengths = for_all_components( - ztu::specialised_lambda - { - [](const std::vector&, std::size_t) - { - return 1; - }, - [](const std::vector>&, std::size_t) - { - return Count; - } - }, - GLsizei{ 0 } - ); - - auto component_sizes = std::array{}; - for (std::size_t i{}; i != component_sizes.size(); ++i) - { - component_sizes[i] = component_lengths[i] * zgl::type_utils::size_of(component_types[i]); - } - - const auto total_size = minimum_element_count * std::accumulate( - component_sizes.begin(), - component_sizes.end(), - GLsizei{ 0 } - ); - - vertex_buffer.resize(total_size); - - // Calculate offsets and stride - auto component_offsets = component_sizes; - stride = 0; - for (std::size_t i{}; i != component_offsets.size(); ++i) { - component_offsets[i] = stride; - stride += component_sizes[i]; - } - - // Copy all the components over one by one - for_all_components( - [&](const std::vector& buffer, std::size_t index) - { - std::size_t pos = component_offsets[index]; - for (std::size_t i{}; i != minimum_element_count; ++i) - { - std::memcpy( - &vertex_buffer[pos], - buffer[i].data(), - component_sizes[index] - ); - pos += stride; - } - return 0; - }, - 0 - ); - - // remove values of unused components - std::ignore = std::ranges::remove(component_lengths, 0); - std::ignore = std::ranges::remove(component_types, GL_INVALID_VALUE); -} diff --git a/source/assets/dynamic_read_buffers/dynamic_point_cloud_buffer.ipp b/source/assets/dynamic_read_buffers/dynamic_point_cloud_buffer.ipp deleted file mode 100644 index 80169a2..0000000 --- a/source/assets/dynamic_read_buffers/dynamic_point_cloud_buffer.ipp +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef INCLUDE_DYNAMIC_TEXTURE_DATA_IMPLEMENTATION -# error Never include this file directly include 'dynamic_point_cloud_buffer.hpp' -#endif -#include "assets/components/point_cloud_vertex_components.hpp" - -inline std::vector& dynamic_point_cloud_buffer::positions() -{ - return std::get(vertices); -} - -inline std::vector& dynamic_point_cloud_buffer::normals() -{ - return std::get(vertices); -} - -inline std::vector& dynamic_point_cloud_buffer::colors() -{ - return std::get(vertices); -} - -inline std::vector& dynamic_point_cloud_buffer::reflectances() -{ - return std::get(vertices); -} - -inline const std::vector& dynamic_point_cloud_buffer::positions() const -{ - return std::get(vertices); -} - -inline const std::vector& dynamic_point_cloud_buffer::normals() const -{ - return std::get(vertices); -} - -inline const std::vector& dynamic_point_cloud_buffer::colors() const -{ - return std::get(vertices); -} - -inline const std::vector& dynamic_point_cloud_buffer::reflectances() const -{ - return std::get(vertices); -} - -inline void dynamic_point_cloud_buffer::clear() -{ - clear_vertices(); -} \ No newline at end of file diff --git a/source/assets/dynamic_read_buffers/dynamic_texture_buffer.ipp b/source/assets/dynamic_read_buffers/dynamic_texture_buffer.ipp deleted file mode 100644 index 205ffab..0000000 --- a/source/assets/dynamic_read_buffers/dynamic_texture_buffer.ipp +++ /dev/null @@ -1,159 +0,0 @@ -#ifndef INCLUDE_DYNAMIC_TEXTURE_DATA_IMPLEMENTATION -# error Never include this file directly include 'dynamic_texture_buffer.hpp' -#endif - - -inline dynamic_texture_buffer::dynamic_texture_buffer( - std::unique_ptr&& data, - const dim_type width, - const dim_type height, - const components::texture::flags components -) : - m_data{ std::move(data) }, - m_width{ width }, - m_height{ height }, - m_components{ components } -{}; - -inline dynamic_texture_buffer::dynamic_texture_buffer(const dynamic_texture_buffer& other) : - m_data{ new value_type[other.component_count()] }, - m_width{ other.m_width }, - m_height{ other.m_height }, - m_components{ other.m_components } -{ - std::copy_n(other.m_data.get(), other.m_width * other.m_height, this->m_data.get()); -} - -inline dynamic_texture_buffer::dynamic_texture_buffer(dynamic_texture_buffer&& other) noexcept : - m_data{ std::move(other.m_data) }, - m_width{ other.m_width }, - m_height{ other.m_height }, - m_components{ other.m_components } -{ - other.m_width = 0; - other.m_height = 0; - other.m_components = components::texture::flags::none; -} - -inline dynamic_texture_buffer& dynamic_texture_buffer::operator=(const dynamic_texture_buffer& other) -{ - if (this != &other) [[likely]] - { - - const auto m_size = this->component_count(); - const auto o_size = other.component_count(); - - if (o_size > m_size) { - this->~dynamic_texture_buffer(); - this->m_data.reset(new value_type[o_size]); - } - - std::copy_n(other.m_data.get(), o_size, this->m_data.get()); - - this->m_width = other.m_width; - this->m_height = other.m_height; - this->m_components = other.m_components; - } - - return *this; -} - -inline dynamic_texture_buffer& dynamic_texture_buffer::operator=(dynamic_texture_buffer&& other) noexcept -{ - if (this != &other) [[likely]] - { - this->~dynamic_texture_buffer(); - - this->m_data = std::move(other.m_data); - this->m_width = other.m_width; - this->m_height = other.m_height; - - other.m_width = 0; - other.m_height = 0; - other.m_components = components::texture::flags::none; - } - return *this; -} - -inline components::texture::flags dynamic_texture_buffer::components() const -{ - return m_components; -} - -inline dynamic_texture_buffer::dim_type dynamic_texture_buffer::width() const -{ - return m_width; -} - -inline dynamic_texture_buffer::dim_type dynamic_texture_buffer::height() const -{ - return m_height; -} - -inline std::pair dynamic_texture_buffer::dimensions() const -{ - return { m_width, m_height }; -} - -inline dynamic_texture_buffer::size_type dynamic_texture_buffer::pixel_count() const -{ - return static_cast(m_width) * static_cast(m_height); -} - -inline dynamic_texture_buffer::size_type dynamic_texture_buffer::component_count() const -{ - return std::popcount(static_cast>(m_components)); -} - -inline dynamic_texture_buffer::size_type dynamic_texture_buffer::size() const -{ - return pixel_count() * component_count(); -} - -inline dynamic_texture_buffer::const_pointer dynamic_texture_buffer::data() const -{ - return m_data.get(); -} - -inline dynamic_texture_buffer::pointer dynamic_texture_buffer::data() -{ - return m_data.get(); -} - -inline dynamic_texture_buffer::const_iterator dynamic_texture_buffer::begin() const -{ - return data(); -} - -inline dynamic_texture_buffer::iterator dynamic_texture_buffer::begin() -{ - return data(); -} - -inline dynamic_texture_buffer::const_iterator dynamic_texture_buffer::end() const -{ - return begin() + component_count(); -} - -inline dynamic_texture_buffer::iterator dynamic_texture_buffer::end() -{ - return begin() + component_count(); -} - -inline dynamic_texture_buffer::const_iterator dynamic_texture_buffer::cbegin() const -{ - return const_cast(begin()); -} - -inline dynamic_texture_buffer::const_iterator dynamic_texture_buffer::cend() const -{ - return const_cast(begin()); -} - -inline void dynamic_texture_buffer::clear() -{ - m_data.reset(); - m_width = 0; - m_height = 0; - m_components = {}; -} \ No newline at end of file diff --git a/source/assets/data_loaders/generic/generic_3dtk_loader.ipp b/source/assets/file_parsers/generic/generic_3dtk_loader.ipp similarity index 94% rename from source/assets/data_loaders/generic/generic_3dtk_loader.ipp rename to source/assets/file_parsers/generic/generic_3dtk_loader.ipp index e53ee1b..6ff4dd8 100644 --- a/source/assets/data_loaders/generic/generic_3dtk_loader.ipp +++ b/source/assets/file_parsers/generic/generic_3dtk_loader.ipp @@ -251,21 +251,21 @@ std::error_code generic_3dtk_loader::read_point_file constexpr auto expected_component_count = []() { - auto count = std::tuple_size_v; + auto count = std::tuple_size_v; if (Normal) { - count += std::tuple_size_v; + count += std::tuple_size_v; } if (Color) { - count += std::tuple_size_v; + count += std::tuple_size_v; } if (Reflectance) { - count += std::tuple_size_v; + count += std::tuple_size_v; } return count; @@ -293,7 +293,7 @@ std::error_code generic_3dtk_loader::read_point_file { auto line_view = std::string_view{ line }; - components::point_cloud_vertex::position position; + point_cloud_vertex_components::position position; if ((error = read_vector(line_view, position))) { return error; @@ -302,7 +302,7 @@ std::error_code generic_3dtk_loader::read_point_file if constexpr (Normal) { - components::point_cloud_vertex::normal normal; + point_cloud_vertex_components::normal normal; if ((error = read_vector(line_view, normal))) { return error; @@ -312,7 +312,7 @@ std::error_code generic_3dtk_loader::read_point_file if constexpr (Color) { - components::point_cloud_vertex::color color; + point_cloud_vertex_components::color color; if ((error = read_vector(line_view, color))) { return error; @@ -322,7 +322,7 @@ std::error_code generic_3dtk_loader::read_point_file if constexpr (Reflectance) { - components::point_cloud_vertex::reflectance reflectance; + point_cloud_vertex_components::reflectance reflectance; if ((error = read_vector(line_view, reflectance))) { return error; @@ -431,7 +431,7 @@ std::error_code base_3dtk_loader::analyze_component_format( void base_3dtk_loader::transform_point_cloud( - std::span points, + std::span points, const glm::mat4& pose ) { for (auto& [ x, y, z ] : points) { diff --git a/source/assets/data_loaders/glsl_loader.cpp b/source/assets/file_parsers/glsl_loader.cpp similarity index 93% rename from source/assets/data_loaders/glsl_loader.cpp rename to source/assets/file_parsers/glsl_loader.cpp index 43cbe31..bbaae3f 100644 --- a/source/assets/data_loaders/glsl_loader.cpp +++ b/source/assets/file_parsers/glsl_loader.cpp @@ -1,4 +1,4 @@ -#include "assets/data_loaders/glsl_loader.hpp" +#include "../../../include/assets/data_parsers" #include diff --git a/source/assets/data_loaders/kitti_loader.cpp b/source/assets/file_parsers/kitti_loader.cpp similarity index 97% rename from source/assets/data_loaders/kitti_loader.cpp rename to source/assets/file_parsers/kitti_loader.cpp index eb7c320..661b33a 100644 --- a/source/assets/data_loaders/kitti_loader.cpp +++ b/source/assets/file_parsers/kitti_loader.cpp @@ -1,4 +1,4 @@ -#include "assets/data_loaders/kitti_loader.hpp" +#include "../../../include/assets/data_parsers" #include "glm/glm.hpp" @@ -226,7 +226,7 @@ std::error_code kitti_loader::load( } void kitti_loader::transform_point_cloud( - std::span points, + std::span points, const glm::mat4& pose ) { for (auto& [ x, y, z ] : points) { @@ -266,7 +266,7 @@ std::error_code kitti_loader::load_point_file( return {}; }; - components::point_cloud_vertex::position position; + point_cloud_vertex_components::position position; auto& positions = point_cloud.positions(); diff --git a/source/assets/data_loaders/kitti_pose_loader.cpp b/source/assets/file_parsers/kitti_pose_loader.cpp similarity index 96% rename from source/assets/data_loaders/kitti_pose_loader.cpp rename to source/assets/file_parsers/kitti_pose_loader.cpp index 5d2543e..7dff7fb 100644 --- a/source/assets/data_loaders/kitti_pose_loader.cpp +++ b/source/assets/file_parsers/kitti_pose_loader.cpp @@ -1,6 +1,6 @@ -#include "assets/data_loaders/kitti_pose_loader.hpp" +#include "../../../include/assets/data_parsers" -#include "assets/dynamic_read_buffers/dynamic_pose_buffer.hpp" +#include "../../../include/assets/read_buffers" #include #include #include "util/logger.hpp" diff --git a/source/assets/data_loaders/mtl_loader.cpp b/source/assets/file_parsers/mtl_loader.cpp similarity index 97% rename from source/assets/data_loaders/mtl_loader.cpp rename to source/assets/file_parsers/mtl_loader.cpp index 5a2b209..11c2553 100644 --- a/source/assets/data_loaders/mtl_loader.cpp +++ b/source/assets/file_parsers/mtl_loader.cpp @@ -1,4 +1,4 @@ -#include "assets/data_loaders/mtl_loader.hpp" +#include "../../../include/assets/data_parsers" #include #include @@ -8,7 +8,7 @@ #include "util/for_each.hpp" #include "util/line_parser.hpp" -#include "assets/dynamic_data_loaders/dynamic_texture_loader.hpp" +#include "../../../include/assets/data_loaders" namespace mtl_loader_error { @@ -290,7 +290,7 @@ std::error_code mtl_loader::prefetch( std::error_code mtl_loader::load_directory( dynamic_data_loader_ctx& ctx, dynamic_material_store& store, - components::material::flags enabled_components, + material_components::flags enabled_components, const std::filesystem::path& path, const bool pedantic ) { @@ -332,16 +332,16 @@ std::error_code mtl_loader::load_directory( std::error_code mtl_loader::load( dynamic_data_loader_ctx& ctx, dynamic_material_store& store, - components::material::flags enabled_components, + material_components::flags enabled_components, const std::filesystem::path& filename, const bool pedantic ) { using mtl_loader_error::codes; using mtl_loader_error::make_error_code; - using flags = components::material::flags; + using flags = material_components::flags; - const auto component_disabled = [&](const components::material::flags component) { + const auto component_disabled = [&](const material_components::flags component) { return (enabled_components & component) == flags::none; }; diff --git a/source/assets/data_loaders/obj_loader.cpp b/source/assets/file_parsers/obj_loader.cpp similarity index 98% rename from source/assets/data_loaders/obj_loader.cpp rename to source/assets/file_parsers/obj_loader.cpp index 0a2d0f8..53b0425 100755 --- a/source/assets/data_loaders/obj_loader.cpp +++ b/source/assets/file_parsers/obj_loader.cpp @@ -1,11 +1,11 @@ -#include "assets/data_loaders/obj_loader.hpp" +#include "../../../include/assets/data_parsers" #include #include #include #include "assets/components/mesh_vertex_components.hpp" -#include "assets/dynamic_data_loaders/dynamic_material_loader.hpp" +#include "../../../include/assets/data_loaders" #include "util/logger.hpp" #include "util/for_each.hpp" @@ -397,7 +397,7 @@ std::error_code obj_loader::parse_file( pedantic, make_line_parser("v ", ztu::is_repeating, [&](const auto& param) { - components::mesh_vertex::position position; + mesh_vertex_components::position position; if (parse_numeric_vector(param, position) != std::errc{}) [[unlikely]] { return codes::malformed_vertex; @@ -409,7 +409,7 @@ std::error_code obj_loader::parse_file( }), make_line_parser("vt ", ztu::is_repeating, [&](const auto& param) { - components::mesh_vertex::tex_coord coord; + mesh_vertex_components::tex_coord coord; if (parse_numeric_vector(param, coord) != std::errc{}) [[unlikely]] { return codes::malformed_texture_coordinate; @@ -421,7 +421,7 @@ std::error_code obj_loader::parse_file( }), make_line_parser("vn ", ztu::is_repeating, [&](const auto& param) { - components::mesh_vertex::normal normal; + mesh_vertex_components::normal normal; if (parse_numeric_vector(param, normal) != std::errc{}) [[unlikely]] { return codes::malformed_normal; diff --git a/source/assets/data_loaders/stl_loader.cpp b/source/assets/file_parsers/stl_loader.cpp similarity index 87% rename from source/assets/data_loaders/stl_loader.cpp rename to source/assets/file_parsers/stl_loader.cpp index ec35eaf..3b6fee3 100644 --- a/source/assets/data_loaders/stl_loader.cpp +++ b/source/assets/file_parsers/stl_loader.cpp @@ -1,4 +1,4 @@ -#include "assets/data_loaders/stl_loader.hpp" +#include "../../../include/assets/data_parsers" #include "util/binary_ifstream.hpp" #include "util/unroll_bool_template.hpp" @@ -8,8 +8,8 @@ template std::error_code read_body( binary_ifstream& in, const std::uint32_t expected_triangle_count, - std::vector& positions, - std::vector& normals, + std::vector& positions, + std::vector& normals, std::vector>& triangles ) { @@ -29,7 +29,7 @@ std::error_code read_body( for (std::uint32_t i{}; i != expected_triangle_count; ++i) { - auto normal = components::mesh_vertex::normal{}; + auto normal = mesh_vertex_components::normal{}; if constexpr (Normals) { if (const auto e = read_vector(normal)) @@ -42,7 +42,7 @@ std::error_code read_body( for (auto& index : triangle) { - auto position = components::mesh_vertex::position{}; + auto position = mesh_vertex_components::position{}; if (const auto e = read_vector(position)) { return e; @@ -92,7 +92,7 @@ std::error_code read_body( std::error_code stl_loader::read_directory( const std::filesystem::path& path, std::vector& meshes, - components::mesh_vertex::flags enabled_components::mesh_vertexs, + mesh_vertex_components::flags enabled_mesh_vertex_componentss, std::vector& materials, material_component::flags enabled_material_components, const ztu::u32 base_material_id, @@ -116,7 +116,7 @@ std::error_code stl_loader::read_directory( if (const auto e = read( file_path, meshes, - enabled_components::mesh_vertexs, + enabled_mesh_vertex_componentss, materials, enabled_material_components, base_material_id, @@ -138,7 +138,7 @@ std::error_code stl_loader::read_directory( std::error_code stl_loader::read( const std::filesystem::path& filename, std::vector& meshes, - components::mesh_vertex::flags enabled_components::mesh_vertexs, + mesh_vertex_components::flags enabled_mesh_vertex_componentss, std::vector&, material_component::flags, ztu::u32, @@ -212,7 +212,7 @@ std::error_code stl_loader::read( triangles.reserve(expected_triangle_count); const auto normals_enabled = ( - (enabled_components::mesh_vertexs & components::mesh_vertex::flags::normal) != components::mesh_vertex::flags::none + (enabled_mesh_vertex_componentss & mesh_vertex_components::flags::normal) != mesh_vertex_components::flags::none ); error = unroll_bool_function_template([&]() { @@ -238,13 +238,13 @@ std::error_code stl_loader::read( if (not positions.empty()) { - mesh.components() |= components::mesh_vertex::flags::position; + mesh.components() |= mesh_vertex_components::flags::position; } if (not normals.empty()) { ztu::logger::debug("Enabling normals!!!"); - mesh.components() |= components::mesh_vertex::flags::normal; + mesh.components() |= mesh_vertex_components::flags::normal; } meshes.emplace_back(std::move(mesh)); diff --git a/source/assets/data_loaders/threedtk_pose_loader.cpp b/source/assets/file_parsers/threedtk_pose_loader.cpp similarity index 96% rename from source/assets/data_loaders/threedtk_pose_loader.cpp rename to source/assets/file_parsers/threedtk_pose_loader.cpp index 724acb0..8454218 100644 --- a/source/assets/data_loaders/threedtk_pose_loader.cpp +++ b/source/assets/file_parsers/threedtk_pose_loader.cpp @@ -1,6 +1,6 @@ -#include "assets/data_loaders/threedtk_pose_loader.hpp" +#include "../../../include/assets/data_parsers" -#include "assets/dynamic_read_buffers/dynamic_pose_buffer.hpp" +#include "../../../include/assets/read_buffers" #include #include diff --git a/source/geometry/normal_estimation.cpp b/source/geometry/normal_estimation.cpp index 4b279d9..ee0574e 100644 --- a/source/geometry/normal_estimation.cpp +++ b/source/geometry/normal_estimation.cpp @@ -4,9 +4,9 @@ #include void estimate_normals( - std::span vertices, + std::span vertices, std::span> triangles, - std::vector& normals + std::vector& normals ) { normals.resize(vertices.size()); @@ -59,7 +59,7 @@ void estimate_normals( } } - using normal_component_type = components::mesh_vertex::normal::component_type; + using normal_component_type = mesh_vertex_components::normal::component_type; constexpr auto epsilon = std::numeric_limits::epsilon(); for (auto& [ x, y, z ] : normals) diff --git a/source/opengl/data/mesh_data.cpp b/source/opengl/data/mesh_data.cpp index 48e1075..9ffd6b7 100644 --- a/source/opengl/data/mesh_data.cpp +++ b/source/opengl/data/mesh_data.cpp @@ -15,7 +15,7 @@ std::error_code zgl::mesh_data::build_from( const GLsizei stride, const std::span index_buffer, const ztu::u32 material_id, - const components::mesh_vertex::flags components, + const mesh_vertex_components::flags components, mesh_data& data ) { if (not std::ranges::all_of(component_types, type_utils::is_valid_type)) diff --git a/source/opengl/data/mesh_data.ipp b/source/opengl/data/mesh_data.ipp index 152112f..e705a2f 100644 --- a/source/opengl/data/mesh_data.ipp +++ b/source/opengl/data/mesh_data.ipp @@ -9,7 +9,7 @@ inline mesh_data::mesh_data( const GLuint index_vbo_id, const GLuint vao_id, const ztu::u32 material_id, - const components::mesh_vertex::flags components, + const mesh_vertex_components::flags components, const GLsizei index_count ) : m_handle{ @@ -38,7 +38,7 @@ inline mesh_data& mesh_data::operator=(mesh_data&& other) noexcept other.m_vertex_vbo_id = 0; other.m_index_vbo_id = 0; other.m_material_id = 0; - other.m_component_types = components::mesh_vertex::flags::none; + other.m_component_types = mesh_vertex_components::flags::none; } return *this; @@ -56,7 +56,7 @@ inline mesh_data::mesh_data(mesh_data&& other) noexcept : other.m_vertex_vbo_id = 0; other.m_index_vbo_id = 0; other.m_material_id = 0; - other.m_component_types = components::mesh_vertex::flags::none; + other.m_component_types = mesh_vertex_components::flags::none; } inline mesh_data::~mesh_data() { @@ -77,7 +77,7 @@ inline mesh_handle mesh_data::handle() const return m_handle; } -inline components::mesh_vertex::flags mesh_data::components() const +inline mesh_vertex_components::flags mesh_data::components() const { return m_component_types; } diff --git a/source/opengl/data/point_cloud_data.ipp b/source/opengl/data/point_cloud_data.ipp index 6268a54..9915659 100644 --- a/source/opengl/data/point_cloud_data.ipp +++ b/source/opengl/data/point_cloud_data.ipp @@ -59,7 +59,7 @@ inline point_cloud_handle point_cloud_data::handle() const return m_handle; } -inline components::point_cloud_vertex::flags point_cloud_data::components() const +inline point_cloud_vertex_components::flags point_cloud_data::components() const { return m_component_types; } diff --git a/source/opengl/data_managers/mesh_index_buffer_manager.cpp b/source/opengl/data_managers/mesh_index_buffer_manager.cpp new file mode 100644 index 0000000..feea741 --- /dev/null +++ b/source/opengl/data_managers/mesh_index_buffer_manager.cpp @@ -0,0 +1,106 @@ +#include "opengl/data_managers/mesh_index_buffer_manager.hpp" + +#include "util/logger.hpp" +#include "opengl/error.hpp" +#include "opengl/type_utils.hpp" + +void zgl::mesh_index_buffer_manager::process(store_type& store) +{ + for (const auto& [ id, mesh ] : store) + { + if (not m_resource_manager.has_resource(id)) + { + m_mesh_buffer.emplace_back(id, mesh); + } + } + + m_buffer_id_buffer.resize(m_mesh_buffer.size()); + + glGenBuffers(m_buffer_id_buffer.size(), m_buffer_id_buffer.data()); + if (const auto e = get_error()) + { + ztu::logger::error("Error while creating % index buffers: %.", m_buffer_id_buffer.size(), e.message()); + return; + } + + for (auto [ entry, buffer_id ] : std::ranges::views::zip(m_mesh_buffer, m_buffer_id_buffer)) + { + auto [ store_id, mesh ] = entry; + + const auto& [ components, indices, buffers ] = mesh; + + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer_id); + if (const auto e = get_error()) + { + ztu::logger::error("Error while binding index buffer %: %.", buffer_id, e.message()); + continue; + } + + glBufferData( + GL_ELEMENT_ARRAY_BUFFER, + static_cast(indices.size_bytes()), // TODO check count + indices.data(), + GL_STATIC_DRAW + ); + if (const auto e = get_error()) + { + ztu::logger::error("Error while setting index buffer data: %.", e.message()); + continue; + } + + const auto meta = index_buffer_metadata{ + .count = static_cast(indices.size()), // TODO check count + .index_type = type_utils::to_gl_type() + }; + m_resource_manager.add_resource(store_id, buffer_id, meta); + + buffer_id = {}; + } + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + const auto valid_buffer_ids = std::ranges::remove( + m_buffer_id_buffer, + 0 + ); + + const auto invalid_buffer_count = m_buffer_id_buffer.size() - valid_buffer_ids.size(); + + glDeleteBuffers( + invalid_buffer_count, + m_buffer_id_buffer.data() + ); + if (const auto e = get_error()) + { + ztu::logger::error("Error while deleting % buffers: %.", invalid_buffer_count, e.message()); + } +} + +std::optional zgl::mesh_index_buffer_manager::get_handle( + const store_id_type id +) { + return m_resource_manager + .get_resource(id) + .transform( + [](auto& resource) + { + return *reinterpret_cast(resource); + } + ); +} + + +void zgl::mesh_index_buffer_manager::collect_garbage(const bool force) +{ + m_resource_manager.collect_garbage(); + if (force or m_resource_manager.count_garbage() >= min_garbage_collection_count) + { + m_buffer_id_buffer.clear(); + m_resource_manager.extract_garbage(m_buffer_id_buffer); + glDeleteBuffers( + m_buffer_id_buffer.size(), + m_buffer_id_buffer.data() + ); + } +} \ No newline at end of file diff --git a/source/opengl/data_managers/mesh_vertex_buffer_manager.cpp b/source/opengl/data_managers/mesh_vertex_buffer_manager.cpp index fb0af2b..a007fe1 100644 --- a/source/opengl/data_managers/mesh_vertex_buffer_manager.cpp +++ b/source/opengl/data_managers/mesh_vertex_buffer_manager.cpp @@ -1,133 +1,115 @@ #include "opengl/data_managers/mesh_vertex_buffer_manager.hpp" +#include "util/logger.hpp" +#include "opengl/error.hpp" +#include "opengl/vertex_buffer_utils.hpp" + + void zgl::mesh_vertex_buffer_manager::process(store_type& store) { for (const auto& [ id, mesh ] : store) { - // The ireator must reutrn a pair containing the components and a tuple of spans + if (not m_resource_manager.has_resource(id)) + { + m_mesh_buffer.emplace_back(id, mesh); + } } -} -template -void dynamic_vertex_buffer::build_vertex_buffer( - std::vector& vertex_buffer, - std::size_t& component_count, - std::array& component_types, - std::array& component_lengths, - GLsizei& stride -) const { - const auto for_all_components = [&](auto&& f, const T default_value) + m_buffer_id_buffer.resize(m_mesh_buffer.size()); + + glGenBuffers(m_buffer_id_buffer.size(), m_buffer_id_buffer.data()); + if (const auto e = get_error()) { - return std::apply( - [&](const auto&... component_buffer) + ztu::logger::error("Error while creating % vertex buffers: %.", m_buffer_id_buffer.size(), e.message()); + return; + } + + for (auto [ entry, buffer_id ] : std::ranges::views::zip(m_mesh_buffer, m_buffer_id_buffer)) + { + auto [ store_id, mesh ] = entry; + + m_byte_buffer.clear(); + + std::apply( + [&](const auto&... component_buffers) { - std::array results{}; - auto i = std::size_t{}; - ( - ( - results[i] = [&](const auto& buffer, const auto index) -> T - { - if ((m_components & C{ 1 << index }) != C{}) - { - return f(buffer, index); - } - return default_value; - }(component_buffer, i), - ++i - ), - ... - ); - return results; + vertex_buffer_utils::interlace(m_byte_buffer, mesh.component_flags, component_buffers...); }, - m_component_buffers + mesh.vertex_component_arrays ); - }; - component_count = 0; - component_types = for_all_components( - ztu::specialised_lambda + glBindBuffer(GL_ARRAY_BUFFER, buffer_id); + if (const auto e = get_error()) { - [&component_count](const std::vector>&, std::size_t) - { - ++component_count; - return zgl::type_utils::to_gl_type(); - }, - [&component_count](const std::vector&, std::size_t) - { - ++component_count; - return zgl::type_utils::to_gl_type(); - } - }, - GLenum{ GL_INVALID_VALUE } - ); + ztu::logger::error("Error while binding vertex buffer %: %.", buffer_id, e.message()); + continue; + } - const auto element_counts = for_all_components( - [](const std::vector& buffer, std::size_t) + glBufferData( + GL_ARRAY_BUFFER, + static_cast(m_byte_buffer.size()), + m_byte_buffer.data(), + GL_STATIC_DRAW + ); + if (const auto e = get_error()) { - return buffer.size(); - }, - std::numeric_limits::max() - ); + ztu::logger::error("Error while setting vertex buffer data: %.", e.message()); + continue; + } - const auto minimum_element_count = std::ranges::min(element_counts); + const auto meta = mesh_vertex_buffer_metadata{ + .component_flags = mesh.component_flags, + .material_id = mesh.material_id + }; - component_lengths = for_all_components( - ztu::specialised_lambda - { - [](const std::vector&, std::size_t) - { - return 1; - }, - [](const std::vector>&, std::size_t) - { - return Count; - } - }, - GLsizei{ 0 } - ); + m_resource_manager.add_resource(store_id, buffer_id, meta); - auto component_sizes = std::array{}; - for (std::size_t i{}; i != component_sizes.size(); ++i) - { - component_sizes[i] = component_lengths[i] * zgl::type_utils::size_of(component_types[i]); + buffer_id = {}; } - const auto total_size = minimum_element_count * std::accumulate( - component_sizes.begin(), - component_sizes.end(), - GLsizei{ 0 } - ); + glBindBuffer(GL_ARRAY_BUFFER, 0); - vertex_buffer.resize(total_size); - - // Calculate offsets and stride - auto component_offsets = component_sizes; - stride = 0; - for (std::size_t i{}; i != component_offsets.size(); ++i) { - component_offsets[i] = stride; - stride += component_sizes[i]; - } - - // Copy all the components over one by one - for_all_components( - [&](const std::vector& buffer, std::size_t index) - { - std::size_t pos = component_offsets[index]; - for (std::size_t i{}; i != minimum_element_count; ++i) - { - std::memcpy( - &vertex_buffer[pos], - buffer[i].data(), - component_sizes[index] - ); - pos += stride; - } - return 0; - }, + const auto valid_buffer_ids = std::ranges::remove( + m_buffer_id_buffer, 0 ); - // remove values of unused components - std::ignore = std::ranges::remove(component_lengths, 0); - std::ignore = std::ranges::remove(component_types, GL_INVALID_VALUE); + const auto invalid_buffer_count = m_buffer_id_buffer.size() - valid_buffer_ids.size(); + + glDeleteBuffers( + invalid_buffer_count, + m_buffer_id_buffer.data() + ); + if (const auto e = get_error()) + { + ztu::logger::error("Error while deleting % buffers: %.", invalid_buffer_count, e.message()); + } +} + +std::optional zgl::mesh_vertex_buffer_manager::get_handle( + const store_id_type id +) { + return m_resource_manager + .get_resource(id) + .transform( + [](auto& resource) + { + return *reinterpret_cast(resource); + } + ); +} + + +void zgl::mesh_vertex_buffer_manager::collect_garbage(const bool force) +{ + m_resource_manager.collect_garbage(); + if (force or m_resource_manager.count_garbage() >= min_garbage_collection_count) + { + m_buffer_id_buffer.clear(); + m_resource_manager.extract_garbage(m_buffer_id_buffer); + glDeleteBuffers( + m_buffer_id_buffer.size(), + m_buffer_id_buffer.data() + ); + } } \ No newline at end of file diff --git a/source/opengl/data_managers/point_cloud_vertex_buffer_manager.cpp b/source/opengl/data_managers/point_cloud_vertex_buffer_manager.cpp new file mode 100644 index 0000000..8c1a864 --- /dev/null +++ b/source/opengl/data_managers/point_cloud_vertex_buffer_manager.cpp @@ -0,0 +1,113 @@ +#include "opengl/data_managers/point_cloud_vertex_buffer_manager.hpp" + +#include "util/logger.hpp" +#include "opengl/error.hpp" +#include "opengl/vertex_buffer_utils.hpp" + + +void zgl::point_cloud_vertex_buffer_manager::process(store_type& store) +{ + for (const auto& [ id, point_cloud ] : store) + { + if (not m_resource_manager.has_resource(id)) + { + m_point_cloud_buffer.emplace_back(id, point_cloud); + } + } + + m_buffer_id_buffer.resize(m_point_cloud_buffer.size()); + + glGenBuffers(m_buffer_id_buffer.size(), m_buffer_id_buffer.data()); + if (const auto e = get_error()) + { + ztu::logger::error("Error while creating % vertex buffers: %.", m_buffer_id_buffer.size(), e.message()); + return; + } + + for (auto [ entry, buffer_id ] : std::ranges::views::zip(m_point_cloud_buffer, m_buffer_id_buffer)) + { + auto [ store_id, point_cloud ] = entry; + + const auto& [ components, buffers ] = point_cloud; + + m_byte_buffer.clear(); + + const auto meta = std::apply( + [&](const auto&... component_buffers) + { + vertex_buffer_utils::interlace(m_byte_buffer, components, component_buffers...); + return vertex_buffer_utils::generate_metadata(components, component_buffers...); + }, + buffers + ); + + glBindBuffer(GL_ARRAY_BUFFER, buffer_id); + if (const auto e = get_error()) + { + ztu::logger::error("Error while binding vertex buffer %: %.", buffer_id, e.message()); + continue; + } + + glBufferData( + GL_ARRAY_BUFFER, + static_cast(m_byte_buffer.size()), + m_byte_buffer.data(), + GL_STATIC_DRAW + ); + if (const auto e = get_error()) + { + ztu::logger::error("Error while setting vertex buffer data: %.", e.message()); + continue; + } + + m_resource_manager.add_resource(store_id, buffer_id, meta); + + buffer_id = {}; + } + + glBindBuffer(GL_ARRAY_BUFFER, 0); + + const auto valid_buffer_ids = std::ranges::remove( + m_buffer_id_buffer, + 0 + ); + + const auto invalid_buffer_count = m_buffer_id_buffer.size() - valid_buffer_ids.size(); + + glDeleteBuffers( + invalid_buffer_count, + m_buffer_id_buffer.data() + ); + if (const auto e = get_error()) + { + ztu::logger::error("Error while deleting % buffers: %.", invalid_buffer_count, e.message()); + } +} + +std::optional zgl::point_cloud_vertex_buffer_manager::get_handle( + const store_id_type id +) { + return m_resource_manager + .get_resource(id) + .transform( + [](auto& resource) + { + return *reinterpret_cast(resource); + } + ); +} + + +void zgl::point_cloud_vertex_buffer_manager::collect_garbage(const bool force) +{ + m_resource_manager.collect_garbage(); + if (force or m_resource_manager.count_garbage() >= min_garbage_collection_count) + { + m_buffer_id_buffer.clear(); + m_resource_manager.extract_garbage(m_buffer_id_buffer); + glDeleteBuffers( + m_buffer_id_buffer.size(), + m_buffer_id_buffer.data() + ); + } +} \ No newline at end of file diff --git a/source/opengl/data_managers/shader_manager.cpp b/source/opengl/data_managers/shader_manager.cpp index 6a8bc1b..31e41a4 100644 --- a/source/opengl/data_managers/shader_manager.cpp +++ b/source/opengl/data_managers/shader_manager.cpp @@ -80,7 +80,7 @@ std::optional> zgl::shader_m } void zgl::shader_manager::get_handles( - const dynamic_shader_source_store& shader_sources, + const assets::shader_source_store& shader_sources, std::span requirements, std::span metadata, std::span shader_sets @@ -258,7 +258,7 @@ bool zgl::shader_manager::compile_shader( } void zgl::shader_manager::process( - const dynamic_shader_source_store& shader_sources + const assets::shader_source_store& shader_sources ) { m_preprocessor.process(shader_sources); } \ No newline at end of file diff --git a/source/opengl/data_managers/shader_program_manager.cpp b/source/opengl/data_managers/shader_program_manager.cpp index e162f87..c25e36b 100644 --- a/source/opengl/data_managers/shader_program_manager.cpp +++ b/source/opengl/data_managers/shader_program_manager.cpp @@ -25,13 +25,13 @@ struct prioritized_metadata_comparator }; void zgl::shader_program_manager::process( - const dynamic_shader_source_store& shader_sources + const assets::shader_source_store& shader_sources ) { m_shader_manager.preprocess(shader_sources); } void zgl::shader_program_manager::get_handles( - const dynamic_shader_source_store& shader_sources, + const assets::shader_source_store& shader_sources, std::span requirements, std::span metadata, std::span shader_programs diff --git a/source/opengl/data_managers/shader_source_manager.cpp b/source/opengl/data_managers/shader_source_manager.cpp index 1ff1afd..ba5d7c4 100644 --- a/source/opengl/data_managers/shader_source_manager.cpp +++ b/source/opengl/data_managers/shader_source_manager.cpp @@ -77,7 +77,7 @@ private: void zgl::shader_source_manager::process( - const dynamic_shader_source_store& shader_sources + const assets::shader_source_store& shader_sources ) { namespace language = shading::shader_metadata_language; @@ -119,7 +119,7 @@ void zgl::shader_source_manager::process( } void zgl::shader_source_manager::get_shader_sources( - const dynamic_shader_source_store& shader_sources, + const assets::shader_source_store& shader_sources, std::span requirements, std::span metadata, std::vector& shader_strings @@ -152,7 +152,7 @@ void zgl::shader_source_manager::get_shader_sources( } ); - dynamic_shader_source_store::id_type source_id{}; + assets::shader_source_store::id_type source_id{}; shading::features::generic::type to_be_enabled{}; while ( diff --git a/source/opengl/data_managers/texture_manager.cpp b/source/opengl/data_managers/texture_manager.cpp index 8dda669..0c480ee 100644 --- a/source/opengl/data_managers/texture_manager.cpp +++ b/source/opengl/data_managers/texture_manager.cpp @@ -33,7 +33,7 @@ void zgl::texture_manager::process( GLenum format; switch (texture.components()) { - using enum components::texture::flags; + using enum texture_components::flags; case luminance: format = GL_LUMINANCE; break; @@ -56,7 +56,7 @@ void zgl::texture_manager::process( if (const auto e = get_error()) { ztu::logger::error("Error while binding texture %: %.", texture_id, e.message()); - return; + continue; } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); diff --git a/source/rendering/batch_renderers/mesh_batch_renderer.cpp b/source/rendering/batch_renderers/mesh_batch_renderer.cpp index b610264..1dab961 100644 --- a/source/rendering/batch_renderers/mesh_batch_renderer.cpp +++ b/source/rendering/batch_renderers/mesh_batch_renderer.cpp @@ -74,7 +74,7 @@ std::optional mesh_batch_renderer::add( if ( ( - requirement.vertex_requirements != components::mesh_vertex::flags::none and + requirement.vertex_requirements != mesh_vertex_components::flags::none and (vertex_comps & requirement.vertex_requirements) == requirement.vertex_requirements ) and @@ -271,7 +271,7 @@ void mesh_batch_renderer::render( const auto [ vertex_components, material_components ] = batch_components; const auto textured = ( - (vertex_components & components::mesh_vertex::flags::tex_coord) != components::mesh_vertex::flags::none + (vertex_components & mesh_vertex_components::flags::tex_coord) != mesh_vertex_components::flags::none and (material_components & material_component::flags::texture) != material_component::flags::none ); diff --git a/source/rendering/batch_renderers/point_cloud_batch_renderer.cpp b/source/rendering/batch_renderers/point_cloud_batch_renderer.cpp index f20a2a3..af55dfd 100644 --- a/source/rendering/batch_renderers/point_cloud_batch_renderer.cpp +++ b/source/rendering/batch_renderers/point_cloud_batch_renderer.cpp @@ -60,7 +60,7 @@ std::optional point_cloud_batch_renderer::a const auto& requirement = requirements::point_cloud::all[i]; if ( - (vertex_comps & requirement.vertex_requirements) != components::point_cloud_vertex::flags::none + (vertex_comps & requirement.vertex_requirements) != point_cloud_vertex_components::flags::none ) { base_requirements |= requirements::point_cloud::flags{ 1 << i }; } @@ -208,7 +208,7 @@ void point_cloud_batch_renderer::render( const auto& [ batch, vertex_components ] = m_batches[i]; - const auto normals = static_cast(vertex_components & components::point_cloud_vertex::flags::normal); + const auto normals = static_cast(vertex_components & point_cloud_vertex_components::flags::normal); const auto& shader_program = m_shader_programs[i * m_render_mode_count + render_mode_index]; diff --git a/source/viewer/asset_loader.cpp b/source/viewer/asset_loader.cpp index 9deab25..bf4db7b 100644 --- a/source/viewer/asset_loader.cpp +++ b/source/viewer/asset_loader.cpp @@ -9,9 +9,9 @@ namespace viewer { std::error_code asset_loader::init( - components::mesh_vertex::flags enabled_mesh_components, + mesh_vertex_components::flags enabled_mesh_components, material_component::flags enabled_material_components, - components::point_cloud_vertex::flags enabled_point_cloud_components, + point_cloud_vertex_components::flags enabled_point_cloud_components, const dynamic_material_data& default_material ) { @@ -393,8 +393,8 @@ std::error_code asset_loader::create_gl_materials() void asset_loader::create_gl_meshes(std::span material_references) { - auto component_type_buffer = std::array(components::mesh_vertex::count)>{}; - auto component_length_buffer = std::array(components::mesh_vertex::count)>{}; + auto component_type_buffer = std::array(mesh_vertex_components::count)>{}; + auto component_length_buffer = std::array(mesh_vertex_components::count)>{}; auto component_stride = GLsizei{}; auto component_count = ztu::u32{}; @@ -430,7 +430,7 @@ void asset_loader::create_gl_meshes(std::span(mesh_data.positions()); + mesh_box.add_points(mesh_data.positions()); mesh_data.build_vertex_buffer( m_vertex_buffer, @@ -488,8 +488,8 @@ void asset_loader::create_gl_meshes(std::span(components::point_cloud_vertex::count)>{}; - auto component_length_buffer = std::array(components::point_cloud_vertex::count)>{}; + auto component_type_buffer = std::array(point_cloud_vertex_components::count)>{}; + auto component_length_buffer = std::array(point_cloud_vertex_components::count)>{}; auto component_stride = GLsizei{}; auto component_count = ztu::u32{}; @@ -502,7 +502,7 @@ void asset_loader::create_gl_point_clouds() } auto point_cloud_box = aabb{}; - point_cloud_box.add_points(point_cloud_data.positions()); + point_cloud_box.add_points(point_cloud_data.positions()); point_cloud_data.build_vertex_buffer( m_vertex_buffer, diff --git a/source/viewer/instance.cpp b/source/viewer/instance.cpp index da81b45..00a366f 100644 --- a/source/viewer/instance.cpp +++ b/source/viewer/instance.cpp @@ -83,7 +83,7 @@ void instance::set_background_color(const glm::vec4& color) std::optional instance::add_mesh( const zgl::mesh_handle& mesh, const aabb& bounding_box, - const components::mesh_vertex::flags mesh_components, + const mesh_vertex_components::flags mesh_components, const zgl::material_handle& material, const material_component::flags material_components ) { @@ -107,7 +107,7 @@ std::optional instance::add_mesh( std::optional instance::add_point_cloud( const zgl::point_cloud_handle& point_cloud, const aabb& bounding_box, - const components::point_cloud_vertex::flags point_cloud_components + const point_cloud_vertex_components::flags point_cloud_components ) { const auto point_cloud_id = m_point_cloud_renderer.add( point_cloud_components,