MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
GeometryBuffer.cpp
Go to the documentation of this file.
1#include "GeometryBuffer.hpp"
2
5
7
8namespace MayaFlux::Buffers {
9
11 std::shared_ptr<Nodes::GpuSync::GeometryWriterNode> node,
12 const std::string& binding_name,
13 float over_allocate_factor)
14 : VKBuffer(
15 calculate_buffer_size(node, over_allocate_factor),
16 Usage::VERTEX,
17 Kakshya::DataModality::VERTEX_POSITIONS_3D)
18 , m_geometry_node(std::move(node))
19 , m_binding_name(binding_name)
20{
21 if (!m_geometry_node) {
22 error<std::invalid_argument>(
25 std::source_location::current(),
26 "Cannot create GeometryBuffer with null GeometryWriterNode");
27 }
28
30 "Created GeometryBuffer '{}' for {} vertices ({} bytes, stride: {})",
32 m_geometry_node->get_vertex_count(),
34 m_geometry_node->get_vertex_stride());
35}
36
38{
39 auto self = std::dynamic_pointer_cast<GeometryBuffer>(shared_from_this());
40
41 m_bindings_processor = std::make_shared<GeometryBindingsProcessor>();
42 m_bindings_processor->set_processing_token(token);
43 m_bindings_processor->bind_geometry_node(
46 self);
47
49
50 auto chain = get_processing_chain();
51 if (!chain) {
52 chain = std::make_shared<BufferProcessingChain>();
54 }
55 chain->set_preferred_token(token);
56}
57
59{
60 RenderConfig resolved_config = config;
61
63 && m_geometry_node->get_primitive_topology()
65 resolved_config.topology = m_geometry_node->get_primitive_topology();
66 }
67
68 switch (resolved_config.topology) {
70 if (config.vertex_shader.empty())
71 resolved_config.vertex_shader = "point.vert.spv";
72 if (config.fragment_shader.empty())
73 resolved_config.fragment_shader = "point.frag.spv";
74 break;
75
78
79 if (config.fragment_shader.empty())
80 resolved_config.fragment_shader = "line.frag.spv";
81
82#ifndef MAYAFLUX_PLATFORM_MACOS
83 if (config.vertex_shader.empty())
84 resolved_config.vertex_shader = "line.vert.spv";
85 if (config.geometry_shader.empty())
86 resolved_config.geometry_shader = "line.geom.spv";
87#else
88 if (config.vertex_shader.empty())
89 resolved_config.vertex_shader = "line_fallback.vert.spv";
90
92#endif
93
94 break;
95
98 if (config.vertex_shader.empty())
99 resolved_config.vertex_shader = "triangle.vert.spv";
100 if (config.fragment_shader.empty())
101 resolved_config.fragment_shader = "triangle.frag.spv";
102 break;
103
104 default:
105 if (config.vertex_shader.empty())
106 resolved_config.vertex_shader = "point.vert.spv";
107 if (config.fragment_shader.empty())
108 resolved_config.fragment_shader = "point.frag.spv";
109 }
110
111 if (!m_render_processor) {
112 m_render_processor = std::make_shared<RenderProcessor>(ShaderConfig { resolved_config.vertex_shader });
113 } else {
114 m_render_processor->set_shader(resolved_config.vertex_shader);
115 }
116
117 m_render_processor->set_fragment_shader(resolved_config.fragment_shader);
118 if (!resolved_config.geometry_shader.empty()) {
119 m_render_processor->set_geometry_shader(resolved_config.geometry_shader);
120 }
121 m_render_processor->set_target_window(config.target_window, std::dynamic_pointer_cast<VKBuffer>(shared_from_this()));
122 m_render_processor->set_primitive_topology(resolved_config.topology);
123 m_render_processor->set_polygon_mode(config.polygon_mode);
124 m_render_processor->set_cull_mode(config.cull_mode);
125
126 get_processing_chain()->add_final_processor(m_render_processor, shared_from_this());
127
128 set_default_render_config(resolved_config);
129}
130
132 const std::shared_ptr<Nodes::GpuSync::GeometryWriterNode>& node,
133 float over_allocate_factor)
134{
135 if (!node) {
136 return 0;
137 }
138
139 size_t base_size = node->get_vertex_buffer_size_bytes();
140
141 if (base_size == 0) {
143 "GeometryWriterNode has zero-size vertex buffer. "
144 "Did you forget to call set_vertex_stride() or resize_vertex_buffer()?");
145 return 4096;
146 }
147
148 auto allocated_size = static_cast<size_t>(
149 static_cast<float>(base_size) * over_allocate_factor);
150
151 if (over_allocate_factor > 1.0F) {
153 "Over-allocated geometry buffer: {} → {} bytes ({}x)",
154 base_size, allocated_size, over_allocate_factor);
155 }
156
157 return allocated_size;
158}
159
160} // namespace MayaFlux::Buffers
#define MF_INFO(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
std::shared_ptr< Nodes::GpuSync::GeometryWriterNode > m_geometry_node
void setup_processors(ProcessingToken token) override
Initialize the buffer and its processors.
void setup_rendering(const RenderConfig &config)
Setup rendering with RenderProcessor.
static size_t calculate_buffer_size(const std::shared_ptr< Nodes::GpuSync::GeometryWriterNode > &node, float over_allocate_factor)
Calculate initial buffer size with optional over-allocation.
std::shared_ptr< RenderProcessor > m_render_processor
GeometryBuffer(std::shared_ptr< Nodes::GpuSync::GeometryWriterNode > node, const std::string &binding_name="geometry", float over_allocate_factor=1.5F)
Create geometry buffer from generative node.
std::shared_ptr< GeometryBindingsProcessor > m_bindings_processor
std::shared_ptr< Buffers::BufferProcessingChain > get_processing_chain() override
Access the buffer's processing chain.
Definition VKBuffer.cpp:314
void set_default_processor(const std::shared_ptr< BufferProcessor > &processor) override
Set the buffer's default processor.
Definition VKBuffer.cpp:298
vk::DeviceSize get_size_bytes() const
Definition VKBuffer.hpp:278
void set_processing_chain(const std::shared_ptr< BufferProcessingChain > &chain, bool force=false) override
Replace the buffer's processing chain.
Definition VKBuffer.cpp:319
void set_default_render_config(const RenderConfig &config)
Called by derived classes to set their context-specific defaults.
Definition VKBuffer.hpp:597
Vulkan-backed buffer wrapper used in processing chains.
Definition VKBuffer.hpp:67
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
@ BufferManagement
Buffer Management (Buffers::BufferManager, creating buffers)
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.
std::shared_ptr< Core::Window > target_window
Unified rendering configuration for graphics buffers.