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

◆ setup_rendering()

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

Attach a RenderProcessor with optional texture support.

Mirrors MeshBuffer::setup_rendering:

  • Topology is always TRIANGLE_LIST.
  • Defaults to triangle.vert.spv / triangle.frag.spv (untextured) or mesh_textured.frag.spv when a diffuse texture is bound.
  • RenderConfig::additional_textures registers extra texture slots.

Definition at line 71 of file MeshNetworkBuffer.cpp.

72{
73 if (!config.vertex_shader.empty())
74 m_render_config.vertex_shader = config.vertex_shader;
75 if (!config.fragment_shader.empty())
76 m_render_config.fragment_shader = config.fragment_shader;
77 if (!config.default_texture_binding.empty()) {
78 m_render_config.default_texture_binding = config.default_texture_binding;
79 m_diffuse_binding = config.default_texture_binding;
80 }
81
82 m_render_config.target_window = config.target_window;
84 m_render_config.polygon_mode = config.polygon_mode;
85 m_render_config.cull_mode = config.cull_mode;
86
87 for (const auto& [name, tex] : config.additional_textures)
88 m_render_config.additional_textures.emplace_back(name, tex);
89
90 const auto slot_count = static_cast<uint32_t>(m_network->slot_count());
91
92 const bool has_slot_textures = std::ranges::any_of(
93 m_network->slots(),
94 [](const auto& slot) { return slot.diffuse_texture != nullptr; });
95
96 const bool textured = m_diffuse_texture != nullptr
98 || has_slot_textures;
99
100 if (textured && m_render_config.default_texture_binding.empty())
102
103 if (m_render_config.vertex_shader.empty())
104 m_render_config.vertex_shader = "mesh_network.vert.spv";
105
106 if (m_render_config.fragment_shader.empty()) {
108 ? "mesh_network_textured.frag.spv"
109 : "mesh_network.frag.spv";
110 }
111
112 ShaderConfig sc { m_render_config.vertex_shader };
113
114 sc.bindings["modelMatrices"] = ShaderBinding(0, 1, vk::DescriptorType::eStorageBuffer);
115 sc.bindings["slotIndices"] = ShaderBinding(0, 2, vk::DescriptorType::eStorageBuffer);
116
117 if (has_slot_textures) {
118 sc.bindings["diffuseTex"] = ShaderBinding(
119 0, 3, vk::DescriptorType::eCombinedImageSampler, slot_count);
120 } else if (textured && !m_render_config.default_texture_binding.empty()) {
121 sc.bindings[m_render_config.default_texture_binding] = ShaderBinding(
122 0, 3, vk::DescriptorType::eCombinedImageSampler);
123 }
124
125 uint32_t binding_idx = 0;
126 for (const auto& [name, _] : m_render_config.additional_textures)
127 sc.bindings[name] = ShaderBinding(1, binding_idx++, vk::DescriptorType::eCombinedImageSampler);
128
130
131 if (has_slot_textures) {
132 const auto& slots = m_network->slots();
133 const auto& order = m_network->sorted_indices();
134 for (uint32_t i = 0; i < static_cast<uint32_t>(order.size()); ++i) {
135 const auto& slot = slots[order[i]];
136 if (slot.diffuse_texture)
137 m_render_processor->bind_texture(3 + i, slot.diffuse_texture);
138 }
141 }
142
143 for (const auto& [name, tex] : m_render_config.additional_textures)
144 m_render_processor->bind_texture(name, tex);
145
146 get_processing_chain()->add_final_processor(
148 shared_from_this());
149
151 "MeshNetworkBuffer::setup_rendering: vert={} frag={} textured={}",
154 textured);
155}
#define MF_INFO(comp, ctx,...)
std::shared_ptr< Core::VKImage > m_diffuse_texture
std::shared_ptr< Nodes::Network::MeshNetwork > m_network
std::shared_ptr< Buffers::BufferProcessingChain > get_processing_chain() override
Access the buffer's processing chain.
Definition VKBuffer.cpp:286
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
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.
std::shared_ptr< Core::Window > target_window

References MayaFlux::Portal::Graphics::RenderConfig::additional_textures, MayaFlux::Buffers::VKBuffer::apply_render_config(), MayaFlux::Journal::Buffers, MayaFlux::Portal::Graphics::RenderConfig::cull_mode, MayaFlux::Portal::Graphics::RenderConfig::default_texture_binding, MayaFlux::Portal::Graphics::RenderConfig::fragment_shader, MayaFlux::Buffers::VKBuffer::get_processing_chain(), MayaFlux::Journal::Init, m_diffuse_binding, m_diffuse_texture, m_network, m_render_config, MayaFlux::Buffers::VKBuffer::m_render_processor, MF_INFO, MayaFlux::Portal::Graphics::RenderConfig::polygon_mode, MayaFlux::Portal::Graphics::RenderConfig::target_window, MayaFlux::Portal::Graphics::RenderConfig::topology, MayaFlux::Portal::Graphics::TRIANGLE_LIST, and MayaFlux::Portal::Graphics::RenderConfig::vertex_shader.

+ Here is the call graph for this function: