Reimplement textured rendering and some cleanup
This commit is contained in:
@@ -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() ) };
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <tracy/Tracy.hpp>
|
||||
|
||||
#include "DrawPair.hpp"
|
||||
#include "engine/literals/size.hpp"
|
||||
|
||||
namespace fgl::engine
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user