TRIANGLE_LIST/TRIANGLE_STRIP picks mesh_textured.frag or triangle.frag from texture state, unaffected by triangulate (mill's triangle pass copies UV unchanged). POINT_LIST switches to milled_shape.vert, plus milled_shape_textured.frag if textured, when triangulating – point.vert/point.frag's gl_PointSize/gl_PointCoord don't work once the pipeline is forced TRIANGLE_LIST.
63{
65
68
73 }
74
75 switch (resolved_config.topology) {
77 if (resolved_config.triangulate) {
78 if (config.vertex_shader.empty())
79 resolved_config.vertex_shader = "milled_shape.vert.spv";
80 if (config.fragment_shader.empty()) {
81 resolved_config.fragment_shader = textured
82 ? "milled_shape_textured.frag.spv"
83 : "milled_shape.frag.spv";
84 }
85 } else {
86 if (config.vertex_shader.empty())
87 resolved_config.vertex_shader = "point.vert.spv";
88 if (config.fragment_shader.empty())
89 resolved_config.fragment_shader = "point.frag.spv";
90 }
91 break;
92
95
96 if (config.vertex_shader.empty())
97 resolved_config.vertex_shader = "line.vert.spv";
98
99 if (config.fragment_shader.empty())
100 resolved_config.fragment_shader = "line.frag.spv";
101
102#ifdef MAYAFLUX_PLATFORM_MACOS
103 resolved_config.triangulate = true;
104#endif
105
106 if (resolved_config.triangulate) {
107 resolved_config.geometry_shader.clear();
108 } else if (config.geometry_shader.empty()) {
109 resolved_config.geometry_shader = "line.geom.spv";
110 }
111
112 break;
113
116 if (config.vertex_shader.empty())
117 resolved_config.vertex_shader = "triangle.vert.spv";
118 if (config.fragment_shader.empty()) {
119 resolved_config.fragment_shader = textured
120 ? "mesh_textured.frag.spv"
121 : "triangle.frag.spv";
122 }
123 break;
124
125 default:
126 if (config.vertex_shader.empty())
127 resolved_config.vertex_shader = "point.vert.spv";
128 if (config.fragment_shader.empty())
129 resolved_config.fragment_shader = "point.frag.spv";
130 }
131
132 const bool frag_samples_texture = !resolved_config.default_texture_binding.empty()
133 || resolved_config.fragment_shader.find("textured") != std::string::npos;
134
135 if (textured && !frag_samples_texture) {
137 "GeometryBuffer::setup_rendering: texture supplied but fragment shader '{}' "
138 "does not sample a texture — texture will be ignored",
139 resolved_config.fragment_shader);
140 }
141
142 const bool apply_texture = textured && frag_samples_texture;
143
144 ShaderConfig sc { resolved_config.vertex_shader };
145 if (apply_texture) {
146 const std::string slot = resolved_config.default_texture_binding.empty()
148 : resolved_config.default_texture_binding;
149 sc.bindings[slot] = ShaderBinding(0, 1, vk::DescriptorType::eCombinedImageSampler);
150 }
151
153
155
158
160}
#define MF_WARN(comp, ctx,...)
std::shared_ptr< Core::VKImage > m_diffuse_texture
std::shared_ptr< Nodes::GpuSync::GeometryWriterNode > m_geometry_node
void set_texture(std::shared_ptr< Core::VKImage > image, std::string binding="diffuseTex")
Supply a diffuse texture, bound on the next graphics tick.
std::string m_diffuse_binding
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.
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.
std::string default_texture_binding