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

◆ add_render_sink()

MAYAFLUX_API 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 DataWriteProcessor 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::VERTICES_3D);
109
110 auto writer = std::make_shared<Buffers::DataWriteProcessor>();
111 buf->set_default_processor(writer);
112 mgr.add_buffer(buf, Buffers::ProcessingToken::GRAPHICS_BACKEND);
113
114 auto rc = config;
115
116 if (rc.vertex_shader.empty() || rc.fragment_shader.empty()) {
117 switch (rc.topology) {
118 case Portal::Graphics::PrimitiveTopology::LINE_LIST:
119 case Portal::Graphics::PrimitiveTopology::LINE_STRIP:
120 if (rc.vertex_shader.empty())
121 rc.vertex_shader = "line.vert.spv";
122 if (rc.fragment_shader.empty())
123 rc.fragment_shader = "line.frag.spv";
124#ifndef MAYAFLUX_PLATFORM_MACOS
125 if (rc.geometry_shader.empty())
126 rc.geometry_shader = "line.geom.spv";
127#else
128 rc.topology = Portal::Graphics::PrimitiveTopology::TRIANGLE_LIST;
129#endif
130 break;
131 case Portal::Graphics::PrimitiveTopology::TRIANGLE_LIST:
132 case Portal::Graphics::PrimitiveTopology::TRIANGLE_STRIP:
133 if (rc.vertex_shader.empty())
134 rc.vertex_shader = "triangle.vert.spv";
135 if (rc.fragment_shader.empty())
136 rc.fragment_shader = "triangle.frag.spv";
137 break;
138 default:
139 if (rc.vertex_shader.empty())
140 rc.vertex_shader = "point.vert.spv";
141 if (rc.fragment_shader.empty())
142 rc.fragment_shader = "point.frag.spv";
143 break;
144 }
145 }
146
147 auto renderer = std::make_shared<Buffers::RenderProcessor>(Buffers::ShaderConfig { rc.vertex_shader });
148 renderer->set_fragment_shader(rc.fragment_shader);
149
150 if (!rc.geometry_shader.empty())
151 renderer->set_geometry_shader(rc.geometry_shader);
152
153 renderer->set_primitive_topology(rc.topology);
154 renderer->set_polygon_mode(rc.polygon_mode);
155 renderer->set_cull_mode(rc.cull_mode);
156
157 renderer->enable_depth_test();
158 buf->set_needs_depth_attachment(true);
159
160 renderer->set_target_window(rc.target_window, buf);
161 buf->set_render_processor(renderer);
162 buf->get_processing_chain()->add_final_processor(renderer, buf);
163
164 auto& sink = sinks.emplace_back(RenderSink {
165 .buf = buf,
166 .writer = std::move(writer),
167 .renderer = std::move(renderer),
168 .fn = std::move(fn),
169 .fn_name = std::move(fn_name),
170 .window = rc.target_window,
171 });
172
173 if (!sink.fn && initial_position.has_value()) {
174 sink.writer->set_data(std::vector<Kakshya::DataVariant> {
175 Kakshya::DataVariant { std::vector<glm::vec3> { *initial_position } },
176 });
177 }
178
179 MF_DEBUG(Journal::Component::Buffers, Journal::Context::Init,
180 "Nexus: render sink added");
181}
#define MF_DEBUG(comp, ctx,...)
void add_buffer(const std::shared_ptr< Buffer > &buffer, ProcessingToken token, uint32_t channel=0)
Adds a buffer to a token and channel.

References MayaFlux::Buffers::BufferManager::add_buffer(), MayaFlux::Nexus::RenderSink::buf, MayaFlux::Journal::Buffers, MayaFlux::Buffers::GRAPHICS_BACKEND, MayaFlux::Journal::Init, MayaFlux::Portal::Graphics::LINE_LIST, MayaFlux::Portal::Graphics::LINE_STRIP, MF_DEBUG, MayaFlux::Portal::Graphics::TRIANGLE_LIST, MayaFlux::Portal::Graphics::TRIANGLE_STRIP, MayaFlux::Portal::Graphics::RenderConfig::vertex_shader, and MayaFlux::Kakshya::VERTICES_3D.

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: