MayaFlux 1.0.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#ifdef MAYAFLUX_PLATFORM_MACOS
125 rc.triangulate = true;
126#endif
127
128 if (rc.triangulate) {
129 rc.geometry_shader.clear();
130 } else if (rc.geometry_shader.empty()) {
131 rc.geometry_shader = "line.geom.spv";
132 }
133 break;
134 case Portal::Graphics::PrimitiveTopology::TRIANGLE_LIST:
135 case Portal::Graphics::PrimitiveTopology::TRIANGLE_STRIP:
136 if (rc.vertex_shader.empty())
137 rc.vertex_shader = "triangle.vert.spv";
138 if (rc.fragment_shader.empty())
139 rc.fragment_shader = "triangle.frag.spv";
140 break;
141 default:
142 if (rc.triangulate) {
143 if (rc.vertex_shader.empty())
144 rc.vertex_shader = "milled_shape.vert.spv";
145 if (rc.fragment_shader.empty())
146 rc.fragment_shader = "milled_shape.frag.spv";
147 } else {
148 if (rc.vertex_shader.empty())
149 rc.vertex_shader = "point.vert.spv";
150 if (rc.fragment_shader.empty())
151 rc.fragment_shader = "point.frag.spv";
152 }
153 break;
154 }
155 }
156
157 auto renderer = std::make_shared<Buffers::RenderProcessor>(Buffers::ShaderConfig { rc.vertex_shader });
158 renderer->set_fragment_shader(rc.fragment_shader);
159
160 if (!rc.geometry_shader.empty())
161 renderer->set_geometry_shader(rc.geometry_shader);
162
163 renderer->set_primitive_topology(rc.topology);
164 renderer->set_triangulate(rc.triangulate);
165 renderer->set_polygon_mode(rc.polygon_mode);
166 renderer->set_cull_mode(rc.cull_mode);
167
168 renderer->enable_depth_test();
169 buf->set_needs_depth_attachment(true);
170
171 renderer->set_target_window(rc.target_window, buf);
172 buf->set_render_processor(renderer);
173 buf->get_processing_chain()->add_final_processor(renderer, buf);
174
175 auto& sink = sinks.emplace_back(RenderSink {
176 .buf = buf,
177 .writer = std::move(writer),
178 .renderer = std::move(renderer),
179 .fn = std::move(fn),
180 .fn_name = std::move(fn_name),
181 .window = rc.target_window,
182 });
183
184 if (!sink.fn && initial_position.has_value()) {
185 sink.writer->set_data(std::vector<Kakshya::DataVariant> {
186 Kakshya::DataVariant { std::vector<glm::vec3> { *initial_position } },
187 });
188 }
189
190 MF_DEBUG(Journal::Component::Buffers, Journal::Context::Init,
191 "Nexus: render sink added");
192}
#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: