MayaFlux 1.0.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 from topology set at construction. Always enables alpha blending, disables depth testing. Caller may override shaders via config fields.

TRIANGLE_LIST/TRIANGLE_STRIP picks its fragment shader from texture state (forma_multi/forma_textured/triangle.frag) regardless of triangulate – PrimitiveMill's triangle pass copies UV unchanged, so texturing stays correct either way; it never falls back to milled_shape.frag, which would blank every textured scene.

POINT_LIST does switch under triangulate, to milled_shape.vert plus milled_shape.frag/_textured/_multi depending on texture state (point.frag's gl_PointCoord is meaningless once forced TRIANGLE_LIST). The multi variant's array index shares the scalar slot PrimitiveMill reads as point size – set_mill_spec(use_vertex_extent = false) decouples them; left default, size and index are the same number.

Definition at line 57 of file FormaBuffer.cpp.

58{
59 RenderConfig resolved = config;
60 resolved.topology = m_topology;
61
62 const bool single_tex = !config.default_texture_binding.empty();
63 const auto multi_count = static_cast<uint32_t>(config.additional_textures.size());
64 const bool multi_tex = multi_count > 0;
65
66 switch (resolved.topology) {
68 if (resolved.triangulate) {
69 if (resolved.vertex_shader.empty())
70 resolved.vertex_shader = "milled_shape.vert.spv";
71 if (resolved.fragment_shader.empty()) {
72 if (multi_tex) {
73 resolved.fragment_shader = "milled_shape_multi.frag.spv";
74 } else if (single_tex) {
75 resolved.fragment_shader = "milled_shape_textured.frag.spv";
76 } else {
77 resolved.fragment_shader = "milled_shape.frag.spv";
78 }
79 }
80 } else {
81 if (resolved.vertex_shader.empty())
82 resolved.vertex_shader = "point.vert.spv";
83 if (resolved.fragment_shader.empty())
84 resolved.fragment_shader = "point.frag.spv";
85 }
86 break;
87
90 if (resolved.vertex_shader.empty())
91 resolved.vertex_shader = "line.vert.spv";
92 if (resolved.fragment_shader.empty())
93 resolved.fragment_shader = "line.frag.spv";
94#ifdef MAYAFLUX_PLATFORM_MACOS
95 resolved.triangulate = true;
96#endif
97
98 if (resolved.triangulate) {
99 resolved.geometry_shader.clear();
100 } else if (resolved.geometry_shader.empty()) {
101 resolved.geometry_shader = "line.geom.spv";
102 }
103
104 break;
105
108 if (resolved.vertex_shader.empty())
109 resolved.vertex_shader = multi_tex ? "triangle_multi.vert.spv" : "triangle.vert.spv";
110 if (resolved.fragment_shader.empty()) {
111 if (multi_tex) {
112 resolved.fragment_shader = "forma_multi.frag.spv";
113 } else if (single_tex) {
114 resolved.fragment_shader = "forma_textured.frag.spv";
115 } else {
116 resolved.fragment_shader = "triangle.frag.spv";
117 }
118 }
119 break;
120
121 default:
122 if (resolved.vertex_shader.empty())
123 resolved.vertex_shader = "point.vert.spv";
124 if (resolved.fragment_shader.empty())
125 resolved.fragment_shader = "point.frag.spv";
126 break;
127 }
128
129 ShaderConfig sc { resolved.vertex_shader };
130 if (multi_tex) {
131 const uint32_t total = single_tex ? 1 + multi_count : multi_count;
132 sc.bindings["textures"] = ShaderBinding(
133 0, 1, vk::DescriptorType::eCombinedImageSampler, total);
134 } else if (single_tex) {
135 sc.bindings[config.default_texture_binding] = ShaderBinding(
136 0, 1, vk::DescriptorType::eCombinedImageSampler);
137 }
138
139 apply_render_config(resolved, sc);
140 m_render_processor->enable_alpha_blending();
141
142 if (multi_tex) {
143 uint32_t slot = 1;
144 if (single_tex && !config.default_texture_binding.empty()) {
145 auto it = std::ranges::find_if(config.additional_textures,
146 [&](const auto& p) { return p.first == config.default_texture_binding; });
147 if (it != config.additional_textures.end()) {
148 m_render_processor->bind_texture(slot, it->second);
149 ++slot;
150 }
151 }
152 for (const auto& [name, img] : config.additional_textures) {
153 if (single_tex && name == config.default_texture_binding)
154 continue;
155
156 if (img)
157 m_render_processor->bind_texture(slot, img);
158
159 ++slot;
160 }
161 }
162
163 get_processing_chain()->add_final_processor(m_render_processor, shared_from_this());
165}
uint32_t total
std::string name
Definition VKDevice.cpp:123
Portal::Graphics::PrimitiveTopology m_topology
std::shared_ptr< Buffers::BufferProcessingChain > get_processing_chain() override
Access the buffer's processing chain.
Definition VKBuffer.cpp:271
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:344
std::shared_ptr< RenderProcessor > m_render_processor
Definition VKBuffer.hpp:654
void set_default_render_config(const RenderConfig &config)
Called by derived classes to set their context-specific defaults.
Definition VKBuffer.hpp:631

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, name, MayaFlux::Portal::Graphics::POINT_LIST, MayaFlux::Buffers::VKBuffer::set_default_render_config(), MayaFlux::Portal::Graphics::RenderConfig::topology, total, MayaFlux::Portal::Graphics::TRIANGLE_LIST, MayaFlux::Portal::Graphics::TRIANGLE_STRIP, MayaFlux::Portal::Graphics::RenderConfig::triangulate, and MayaFlux::Portal::Graphics::RenderConfig::vertex_shader.

+ Here is the call graph for this function: