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

◆ setup_rendering()

void MayaFlux::Buffers::FormaBuffer::setup_rendering ( const RenderConfig config)

Attach a RenderProcessor targeting the given window.

Selects default shaders based on topology set at construction. Always enables alpha blending and disables depth testing. Caller may override shaders via config fields.

Definition at line 54 of file FormaBuffer.cpp.

55{
56 RenderConfig resolved = config;
57 resolved.topology = m_topology;
58
59 const bool single_tex = !config.default_texture_binding.empty();
60 const auto multi_count = static_cast<uint32_t>(config.additional_textures.size());
61 const bool multi_tex = multi_count > 0;
62
63 switch (resolved.topology) {
65 if (resolved.vertex_shader.empty())
66 resolved.vertex_shader = "point.vert.spv";
67 if (resolved.fragment_shader.empty())
68 resolved.fragment_shader = "point.frag.spv";
69 break;
70
73 if (resolved.fragment_shader.empty())
74 resolved.fragment_shader = "line.frag.spv";
75#ifndef MAYAFLUX_PLATFORM_MACOS
76 if (resolved.vertex_shader.empty())
77 resolved.vertex_shader = "line.vert.spv";
78 if (resolved.geometry_shader.empty())
79 resolved.geometry_shader = "line.geom.spv";
80#else
81 if (resolved.vertex_shader.empty())
82 resolved.vertex_shader = "line_fallback.vert.spv";
84#endif
85
86 break;
87
90 if (resolved.vertex_shader.empty())
91 resolved.vertex_shader = multi_tex ? "triangle_multi.vert.spv" : "triangle.vert.spv";
92 if (resolved.fragment_shader.empty()) {
93 if (multi_tex) {
94 resolved.fragment_shader = "forma_multi.frag.spv";
95 } else if (single_tex) {
96 resolved.fragment_shader = "forma_textured.frag.spv";
97 } else {
98 resolved.fragment_shader = "triangle.frag.spv";
99 }
100 }
101 break;
102
103 default:
104 if (resolved.vertex_shader.empty())
105 resolved.vertex_shader = "point.vert.spv";
106 if (resolved.fragment_shader.empty())
107 resolved.fragment_shader = "point.frag.spv";
108 break;
109 }
110
111 ShaderConfig sc { resolved.vertex_shader };
112 if (multi_tex) {
113 const uint32_t total = single_tex ? 1 + multi_count : multi_count;
114 sc.bindings["textures"] = ShaderBinding(
115 0, 1, vk::DescriptorType::eCombinedImageSampler, total);
116 } else if (single_tex) {
117 sc.bindings[config.default_texture_binding] = ShaderBinding(
118 0, 1, vk::DescriptorType::eCombinedImageSampler);
119 }
120
121 apply_render_config(resolved, sc);
122 m_render_processor->enable_alpha_blending();
123
124 if (multi_tex) {
125 uint32_t slot = 1;
126 if (single_tex && !config.default_texture_binding.empty()) {
127 auto it = std::ranges::find_if(config.additional_textures,
128 [&](const auto& p) { return p.first == config.default_texture_binding; });
129 if (it != config.additional_textures.end()) {
130 m_render_processor->bind_texture(slot, it->second);
131 ++slot;
132 }
133 }
134 for (const auto& [name, img] : config.additional_textures) {
135 if (single_tex && name == config.default_texture_binding)
136 continue;
137
138 if (img)
139 m_render_processor->bind_texture(slot, img);
140
141 ++slot;
142 }
143 }
144
145 get_processing_chain()->add_final_processor(m_render_processor, shared_from_this());
147}
Portal::Graphics::PrimitiveTopology m_topology
std::shared_ptr< Buffers::BufferProcessingChain > get_processing_chain() override
Access the buffer's processing chain.
Definition VKBuffer.cpp:286
Portal::Graphics::RenderConfig RenderConfig
Definition VKBuffer.hpp:69
void apply_render_config(const RenderConfig &config, const ShaderConfig &shader_config)
Configure the internal m_render_processor from a RenderConfig.
Definition VKBuffer.cpp:359
std::shared_ptr< RenderProcessor > m_render_processor
Definition VKBuffer.hpp:618
void set_default_render_config(const RenderConfig &config)
Called by derived classes to set their context-specific defaults.
Definition VKBuffer.hpp:595

References MayaFlux::Portal::Graphics::RenderConfig::additional_textures, MayaFlux::Buffers::VKBuffer::apply_render_config(), MayaFlux::Portal::Graphics::RenderConfig::default_texture_binding, MayaFlux::Portal::Graphics::RenderConfig::fragment_shader, MayaFlux::Portal::Graphics::RenderConfig::geometry_shader, MayaFlux::Buffers::VKBuffer::get_processing_chain(), MayaFlux::Portal::Graphics::LINE_LIST, MayaFlux::Portal::Graphics::LINE_STRIP, MayaFlux::Buffers::VKBuffer::m_render_processor, m_topology, MayaFlux::Portal::Graphics::POINT_LIST, MayaFlux::Buffers::VKBuffer::set_default_render_config(), MayaFlux::Portal::Graphics::RenderConfig::topology, MayaFlux::Portal::Graphics::TRIANGLE_LIST, MayaFlux::Portal::Graphics::TRIANGLE_STRIP, and MayaFlux::Portal::Graphics::RenderConfig::vertex_shader.

+ Here is the call graph for this function: