Reimplement textured rendering and some cleanup

This commit is contained in:
2024-06-27 14:24:03 -04:00
parent db5de6096d
commit a5cf121a88
8 changed files with 55 additions and 53 deletions

View File

@@ -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() ) };

View File

@@ -7,12 +7,9 @@
#include <tracy/TracyC.h>
#include <vulkan/vulkan.hpp>
#include <set>
#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

View File

@@ -6,7 +6,7 @@
#include <memory>
#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"

View File

@@ -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"

View File

@@ -7,6 +7,7 @@
#include <tracy/Tracy.hpp>
#include "DrawPair.hpp"
#include "engine/literals/size.hpp"
namespace fgl::engine
{

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -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;