diff --git a/src/engine/systems/DrawPair.cpp b/src/engine/systems/DrawPair.cpp index e920c5e..620217a 100644 --- a/src/engine/systems/DrawPair.cpp +++ b/src/engine/systems/DrawPair.cpp @@ -24,7 +24,9 @@ namespace fgl::engine ZoneScoped; std::unordered_map< DrawKey, DrawPair > draw_pairs {}; - for ( auto* node : root.getAllLeafsInFrustum( frustum ) ) + const auto nodes { root.getAllLeafsInFrustum( frustum ) }; + + for ( auto* node : nodes ) { ZoneScopedN( "Process leaf" ); for ( const auto& obj : *node ) @@ -39,19 +41,21 @@ namespace fgl::engine for ( const Primitive& primitive : obj.getModel()->m_primitives ) { + if ( !primitive.ready() ) continue; + //assert( primitive.m_texture ); const ModelMatrixInfo matrix_info { .model_matrix = obj.getTransform().mat4(), - .texture_idx = primitive.getTextureID() }; + .texture_idx = primitive.getAlbedoTextureID() }; // If the textureless flag is on and we have a texture then skip the primitive.c if ( options & TEXTURELESS ) { - if ( primitive.m_texture ) continue; + if ( primitive.m_textures.hasTextures() ) continue; } else { // Flag is not present - if ( !primitive.m_texture ) continue; + if ( !primitive.m_textures.hasTextures() ) continue; } const auto key { std::make_pair( matrix_info.texture_idx, primitive.m_index_buffer.getOffset() ) }; diff --git a/src/engine/systems/EntityRendererSystem.cpp b/src/engine/systems/EntityRendererSystem.cpp index 96a311e..533caa3 100644 --- a/src/engine/systems/EntityRendererSystem.cpp +++ b/src/engine/systems/EntityRendererSystem.cpp @@ -7,12 +7,9 @@ #include #include -#include - #include "DrawPair.hpp" #include "engine/literals/size.hpp" #include "engine/tree/octtree/OctTreeNode.hpp" -#include "spdlog/fmt/bundled/compile.h" namespace fgl::engine { @@ -68,48 +65,7 @@ namespace fgl::engine TracyVkZone( info.tracy_ctx, *command_buffer, "Render entities" ); texturelessPass( info ); - //texturedPass( info ); - - /* - auto [ draw_commands, model_matricies ] = - getDrawCallsFromTree( info.game_objects, info.camera_frustum, IS_VISIBLE | IS_ENTITY ); - - if ( draw_commands.size() == 0 ) return; - - //Setup model matrix info buffers - auto& model_matrix_info_buffer { m_model_matrix_info_buffers[ info.frame_idx ] }; - - model_matrix_info_buffer = - std::make_unique< ModelMatrixInfoBufferSuballocation >( info.model_matrix_info_buffer, model_matricies ); - - assert( model_matrix_info_buffer->size() == model_matricies.size() ); - - // Setup draw parameter buffer - TracyCZoneN( draw_zone_TRACY, "Submit draw data", true ); - auto& draw_parameter_buffer { m_draw_parameter_buffers[ info.frame_idx ] }; - - draw_parameter_buffer = - std::make_unique< DrawParameterBufferSuballocation >( info.draw_parameter_buffer, draw_commands ); - - const auto& draw_params { draw_parameter_buffer }; - assert( draw_params->size() == draw_commands.size() ); - assert( draw_params->stride() == sizeof( vk::DrawIndexedIndirectCommand ) ); - - TracyCZoneEnd( draw_zone_TRACY ); - - const std::vector< vk::Buffer > vertex_buffers { m_vertex_buffer->getVkBuffer(), - model_matrix_info_buffer->getVkBuffer() }; - - command_buffer.bindVertexBuffers( 0, vertex_buffers, { 0, model_matrix_info_buffer->getOffset() } ); - command_buffer.bindIndexBuffer( m_index_buffer->getVkBuffer(), 0, vk::IndexType::eUint32 ); - -#if ENABLE_IMGUI - ImGui::Text( "Indirect draws: %lu", static_cast< std::size_t >( draw_params->size() ) ); -#endif - - command_buffer.drawIndexedIndirect( - draw_params->getVkBuffer(), draw_params->getOffset(), draw_params->size(), draw_params->stride() ); - */ + texturedPass( info ); } void EntityRendererSystem::texturelessPass( FrameInfo& info ) @@ -156,4 +112,44 @@ namespace fgl::engine draw_parameter_buffer->stride() ); } + void EntityRendererSystem::texturedPass( FrameInfo& info ) + { + ZoneScopedN( "Textured pass" ); + auto& command_buffer { info.command_buffer }; + TracyVkZone( info.tracy_ctx, *command_buffer, "Render textured entities" ); + + m_textured_pipeline->bind( command_buffer ); + + m_textured_pipeline + ->bindDescriptor( command_buffer, GlobalDescriptorSet::m_set_idx, info.global_descriptor_set ); + + m_textured_pipeline + ->bindDescriptor( command_buffer, TextureDescriptorSet::m_set_idx, Texture::getTextureDescriptorSet() ); + + auto [ draw_commands, model_matricies ] = + getDrawCallsFromTree( info.game_objects, info.camera_frustum, IS_VISIBLE | IS_ENTITY ); + + if ( draw_commands.empty() ) return; + + auto& model_matrix_info_buffer { m_textured_model_matrix_info_buffers[ info.frame_idx ] }; + model_matrix_info_buffer = + std::make_unique< ModelMatrixInfoBufferSuballocation >( info.model_matrix_info_buffer, model_matricies ); + + auto& draw_parameter_buffer { m_draw_textured_parameter_buffers[ info.frame_idx ] }; + draw_parameter_buffer = + std::make_unique< DrawParameterBufferSuballocation >( info.draw_parameter_buffer, draw_commands ); + + const std::vector< vk::Buffer > vert_buffers { info.model_vertex_buffer.getVkBuffer(), + model_matrix_info_buffer->getVkBuffer() }; + + command_buffer.bindVertexBuffers( 0, vert_buffers, { 0, model_matrix_info_buffer->getOffset() } ); + command_buffer.bindIndexBuffer( info.model_index_buffer.getVkBuffer(), 0, vk::IndexType::eUint32 ); + + command_buffer.drawIndexedIndirect( + draw_parameter_buffer->getVkBuffer(), + draw_parameter_buffer->getOffset(), + draw_parameter_buffer->size(), + draw_parameter_buffer->stride() ); + }; + } // namespace fgl::engine diff --git a/src/engine/systems/EntityRendererSystem.hpp b/src/engine/systems/EntityRendererSystem.hpp index 1cc2f21..106c1bd 100644 --- a/src/engine/systems/EntityRendererSystem.hpp +++ b/src/engine/systems/EntityRendererSystem.hpp @@ -6,7 +6,7 @@ #include -#include "engine/descriptors/DescriptorSetCollection.hpp" +#include "engine/buffers/vector/HostVector.hpp" #include "engine/model/Model.hpp" #include "engine/pipeline/PipelineT.hpp" #include "engine/rendering/SwapChain.hpp" diff --git a/src/engine/systems/GuiSystem.cpp b/src/engine/systems/GuiSystem.cpp index 30a0efc..3019bb8 100644 --- a/src/engine/systems/GuiSystem.cpp +++ b/src/engine/systems/GuiSystem.cpp @@ -5,6 +5,7 @@ #include "GuiSystem.hpp" #include "engine/FrameInfo.hpp" +#include "engine/debug_defines.hpp" #include "engine/gui/core.hpp" #include "engine/rendering/Device.hpp" diff --git a/src/engine/systems/TerrainSystem.cpp b/src/engine/systems/TerrainSystem.cpp index cbeb9d7..551fc3d 100644 --- a/src/engine/systems/TerrainSystem.cpp +++ b/src/engine/systems/TerrainSystem.cpp @@ -7,6 +7,7 @@ #include #include "DrawPair.hpp" +#include "engine/literals/size.hpp" namespace fgl::engine { diff --git a/src/engine/texture/Texture.cpp b/src/engine/texture/Texture.cpp index 85c7108..243a5b4 100644 --- a/src/engine/texture/Texture.cpp +++ b/src/engine/texture/Texture.cpp @@ -18,8 +18,8 @@ #pragma GCC diagnostic ignored "-Weffc++" #pragma GCC diagnostic ignored "-Wold-style-cast" #pragma GCC diagnostic ignored "-Wconversion" -#include "objectloaders/stb_image.h" #include "imgui/backends/imgui_impl_vulkan.h" +#include "objectloaders/stb_image.h" #pragma GCC diagnostic pop namespace fgl::engine diff --git a/src/engine/tree/octtree/OctTreeNode.cpp b/src/engine/tree/octtree/OctTreeNode.cpp index 2c0d64f..f5d563a 100644 --- a/src/engine/tree/octtree/OctTreeNode.cpp +++ b/src/engine/tree/octtree/OctTreeNode.cpp @@ -208,8 +208,8 @@ namespace fgl::engine } else { + log::debug( "Added game object" ); objects.emplace_back( std::move( obj ) ); - log::info( "Added object" ); return this; } } diff --git a/src/engine/tree/octtree/OctTreeNode.hpp b/src/engine/tree/octtree/OctTreeNode.hpp index 4821116..4ad83fe 100644 --- a/src/engine/tree/octtree/OctTreeNode.hpp +++ b/src/engine/tree/octtree/OctTreeNode.hpp @@ -117,7 +117,7 @@ namespace fgl::engine [[nodiscard]] inline std::vector< OctTreeNodeLeaf* > getAllLeafs() { ZoneScoped; - std::vector< OctTreeNodeLeaf* > leafs; + std::vector< OctTreeNodeLeaf* > leafs {}; leafs.reserve( LEAF_RESERVE_SIZE ); this->getAllLeafs( leafs ); return leafs;