Selects default shaders based on topology set at construction. Always enables alpha blending and disables depth testing. Caller may override shaders via config fields.
55{
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
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()) {
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)
140
141 ++slot;
142 }
143 }
144
147}
std::shared_ptr< Buffers::BufferProcessingChain > get_processing_chain() override
Access the buffer's processing chain.
Portal::Graphics::RenderConfig RenderConfig
void apply_render_config(const RenderConfig &config, const ShaderConfig &shader_config)
Configure the internal m_render_processor from a RenderConfig.
std::shared_ptr< RenderProcessor > m_render_processor
void set_default_render_config(const RenderConfig &config)
Called by derived classes to set their context-specific defaults.
PrimitiveTopology topology