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

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: