MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ add_render_sink()

void MayaFlux::Nexus::add_render_sink ( std::vector< RenderSink > &  sinks,
Buffers::BufferManager mgr,
const Portal::Graphics::RenderConfig config,
RenderFn  fn = {},
std::string  fn_name = {},
const std::optional< glm::vec3 > &  initial_position = {} 
)

Create and register a render sink targeting window.

Allocates a VKBuffer (VERTEX, POINT_LIST), attaches a GeometryWriteProcessor and a RenderProcessor with point.vert.spv / point.frag.spv defaults, and registers the buffer with mgr.

Parameters
sinksSink vector owned by the calling Emitter or Agent.
mgrBufferManager to register the VKBuffer with.
windowTarget window for presentation.
fnOptional producer called each dispatch with InfluenceContext. Leave empty when geometry is supplied via push_geometry().
fn_nameOptional identifier for state encoding, empty if anonymous.
initial_positionOptional initial position to write if no producer fn is set.

Definition at line 95 of file Sinks.cpp.

102{
103 constexpr size_t k_initial_bytes = 4096;
104
105 auto buf = std::make_shared<Buffers::VKBuffer>(
106 k_initial_bytes,
107 Buffers::VKBuffer::Usage::VERTEX,
108 Kakshya::DataModality::VERTEX_POSITIONS_3D);
109
110 auto writer = std::make_shared<Buffers::GeometryWriteProcessor>();
111
112 const bool is_line = config.topology == Portal::Graphics::PrimitiveTopology::LINE_LIST
113 || config.topology == Portal::Graphics::PrimitiveTopology::LINE_STRIP;
114 const bool is_mesh = config.topology == Portal::Graphics::PrimitiveTopology::TRIANGLE_LIST
115 || config.topology == Portal::Graphics::PrimitiveTopology::TRIANGLE_STRIP;
116
117 if (is_line) {
118 writer->set_mode(Buffers::GeometryWriteMode::LINE);
119 } else if (is_mesh) {
120 writer->set_mode(Buffers::GeometryWriteMode::MESH);
121 } else {
122 writer->set_mode(Buffers::GeometryWriteMode::POINT);
123 }
124
125 buf->set_default_processor(writer);
126
127 mgr.add_buffer(buf, Buffers::ProcessingToken::GRAPHICS_BACKEND);
128
129 std::string vert = config.vertex_shader;
130 std::string frag = config.fragment_shader;
131 std::string geom = config.geometry_shader;
132
133 if (vert.empty() || frag.empty()) {
134 switch (config.topology) {
135 case Portal::Graphics::PrimitiveTopology::LINE_LIST:
136 case Portal::Graphics::PrimitiveTopology::LINE_STRIP:
137 if (frag.empty())
138 frag = "line.frag.spv";
139#ifndef MAYAFLUX_PLATFORM_MACOS
140 if (vert.empty())
141 vert = "line.vert.spv";
142 if (geom.empty())
143 geom = "line.geom.spv";
144#else
145 if (vert.empty())
146 vert = "line_fallback.vert.spv";
147#endif
148 break;
149 case Portal::Graphics::PrimitiveTopology::TRIANGLE_LIST:
150 case Portal::Graphics::PrimitiveTopology::TRIANGLE_STRIP:
151 if (vert.empty())
152 vert = "triangle.vert.spv";
153 if (frag.empty())
154 frag = "triangle.frag.spv";
155 break;
156 default:
157 if (vert.empty())
158 vert = "point.vert.spv";
159 if (frag.empty())
160 frag = "point.frag.spv";
161 break;
162 }
163 }
164
165 auto renderer = std::make_shared<Buffers::RenderProcessor>(Buffers::ShaderConfig { vert });
166 renderer->set_fragment_shader(frag);
167 if (!geom.empty())
168 renderer->set_geometry_shader(geom);
169
170 renderer->set_primitive_topology(config.topology);
171 renderer->set_polygon_mode(config.polygon_mode);
172 renderer->set_cull_mode(config.cull_mode);
173 renderer->set_target_window(config.target_window, buf);
174 buf->get_processing_chain()->add_final_processor(renderer, buf);
175
176 auto& sink = sinks.emplace_back(RenderSink {
177 .buf = buf,
178 .writer = std::move(writer),
179 .renderer = std::move(renderer),
180 .fn = std::move(fn),
181 .fn_name = std::move(fn_name),
182 .window = config.target_window,
183 });
184
185 if (!sink.fn && initial_position.has_value()) {
186 sink.writer->set_data(
187 Kakshya::DataVariant { std::vector<glm::vec3> { *initial_position } });
188 }
189
190 MF_DEBUG(Journal::Component::Buffers, Journal::Context::Init,
191 "Nexus: render sink added");
192}
#define MF_DEBUG(comp, ctx,...)
std::string fn_name
void add_buffer(const std::shared_ptr< Buffer > &buffer, ProcessingToken token, uint32_t channel=0)
Adds a buffer to a token and channel.
std::shared_ptr< Core::Window > target_window

References MayaFlux::Buffers::BufferManager::add_buffer(), MayaFlux::Nexus::RenderSink::buf, MayaFlux::Journal::Buffers, MayaFlux::Portal::Graphics::RenderConfig::cull_mode, fn_name, MayaFlux::Portal::Graphics::RenderConfig::fragment_shader, MayaFlux::Portal::Graphics::RenderConfig::geometry_shader, MayaFlux::Buffers::GRAPHICS_BACKEND, MayaFlux::Journal::Init, MayaFlux::Buffers::LINE, MayaFlux::Portal::Graphics::LINE_LIST, MayaFlux::Portal::Graphics::LINE_STRIP, MayaFlux::Buffers::MESH, MF_DEBUG, MayaFlux::Buffers::POINT, MayaFlux::Portal::Graphics::RenderConfig::polygon_mode, MayaFlux::Portal::Graphics::RenderConfig::target_window, MayaFlux::Portal::Graphics::RenderConfig::topology, MayaFlux::Portal::Graphics::TRIANGLE_LIST, MayaFlux::Portal::Graphics::TRIANGLE_STRIP, MayaFlux::Buffers::VKBuffer::VERTEX, MayaFlux::Kakshya::VERTEX_POSITIONS_3D, and MayaFlux::Portal::Graphics::RenderConfig::vertex_shader.

Referenced by MayaFlux::Nexus::Agent::render(), MayaFlux::Nexus::Emitter::render(), MayaFlux::Nexus::Agent::render(), and MayaFlux::Nexus::Emitter::render().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: