18 std::shared_ptr<Nodes::Network::MeshNetwork> network,
19 float over_allocate_factor)
21 estimate_vertex_bytes(network, over_allocate_factor),
23 Kakshya::DataModality::VERTEX_POSITIONS_3D)
24 , m_network(
std::move(network))
27 error<std::invalid_argument>(
29 std::source_location::current(),
30 "MeshNetworkBuffer: null MeshNetwork");
41 "MeshNetworkBuffer: {} slots, {} bytes estimated",
57 chain = std::make_shared<BufferProcessingChain>();
60 chain->set_preferred_token(token);
63 "MeshNetworkBuffer::setup_processors with token {}",
64 static_cast<int>(token));
90 const auto slot_count =
static_cast<uint32_t
>(
m_network->slot_count());
92 const bool has_slot_textures = std::ranges::any_of(
94 [](
const auto& slot) { return slot.diffuse_texture != nullptr; });
108 ?
"mesh_network_textured.frag.spv"
109 :
"mesh_network.frag.spv";
114 sc.bindings[
"modelMatrices"] =
ShaderBinding(0, 1, vk::DescriptorType::eStorageBuffer);
115 sc.bindings[
"slotIndices"] =
ShaderBinding(0, 2, vk::DescriptorType::eStorageBuffer);
117 if (has_slot_textures) {
119 0, 3, vk::DescriptorType::eCombinedImageSampler, slot_count);
122 0, 3, vk::DescriptorType::eCombinedImageSampler);
125 uint32_t binding_idx = 0;
127 sc.bindings[name] =
ShaderBinding(1, binding_idx++, vk::DescriptorType::eCombinedImageSampler);
133 std::dynamic_pointer_cast<VKBuffer>(shared_from_this()));
138 if (has_slot_textures) {
140 const auto& order =
m_network->sorted_indices();
141 for (uint32_t i = 0; i < static_cast<uint32_t>(order.size()); ++i) {
142 const auto& slot = slots[order[i]];
143 if (slot.diffuse_texture)
158 "MeshNetworkBuffer::setup_rendering: vert={} frag={} textured={}",
169 std::shared_ptr<Core::VKImage>
image,
170 std::string_view binding_name)
180 "MeshNetworkBuffer::bind_diffuse_texture: pipeline compiled without "
181 "binding '{}' — call before setup_rendering() for correct results",
192 const std::shared_ptr<Nodes::Network::MeshNetwork>& network,
193 float over_allocate_factor)
195 constexpr size_t k_min = 4096;
196 if (!network || network->slot_count() == 0)
200 for (
const auto& slot : network->slots()) {
208 return static_cast<size_t>(
static_cast<float>(total) * over_allocate_factor);
#define MF_INFO(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
std::shared_ptr< Core::VKImage > m_diffuse_texture
void setup_rendering(const RenderConfig &config)
Attach a RenderProcessor with optional texture support.
void setup_processors(ProcessingToken token) override
Create and attach MeshNetworkProcessor as the default processor.
MeshNetworkBuffer(std::shared_ptr< Nodes::Network::MeshNetwork > network, float over_allocate_factor=1.5F)
Construct from an existing MeshNetwork.
std::shared_ptr< RenderProcessor > m_render_processor
std::shared_ptr< MeshNetworkProcessor > m_processor
std::shared_ptr< Nodes::Network::MeshNetwork > m_network
std::string m_diffuse_binding
static size_t estimate_vertex_bytes(const std::shared_ptr< Nodes::Network::MeshNetwork > &network, float over_allocate_factor)
void bind_diffuse_texture(std::shared_ptr< Core::VKImage > image, std::string_view binding_name="diffuseTex")
Bind a single shared diffuse texture for all slots.
RenderConfig m_render_config
std::shared_ptr< Buffers::BufferProcessingChain > get_processing_chain() override
Access the buffer's processing chain.
void set_default_processor(const std::shared_ptr< BufferProcessor > &processor) override
Set the buffer's default processor.
vk::DeviceSize get_size_bytes() const
void set_processing_chain(const std::shared_ptr< BufferProcessingChain > &chain, bool force=false) override
Replace the buffer's processing chain.
void set_needs_depth_attachment(bool needs)
Mark this buffer as requiring depth testing when rendered.
void set_default_render_config(const RenderConfig &config)
Called by derived classes to set their context-specific defaults.
Vulkan-backed buffer wrapper used in processing chains.
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.
Describes how a VKBuffer binds to a shader descriptor.
Vertex type for indexed triangle mesh primitives (TRIANGLE_LIST topology)
std::shared_ptr< Core::Window > target_window
std::vector< std::pair< std::string, std::shared_ptr< Core::VKImage > > > additional_textures
For child-specific fields.
PrimitiveTopology topology
std::string vertex_shader
std::string fragment_shader
std::string default_texture_binding
Unified rendering configuration for graphics buffers.