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
129 m_render_processor = std::make_shared<RenderProcessor>(sc);
131 m_render_processor->set_target_window(
133 std::dynamic_pointer_cast<VKBuffer>(shared_from_this()));
134 m_render_processor->set_primitive_topology(m_render_config.topology);
137
138 if (has_slot_textures) {
139 const auto& slots = m_network->slots();
140 const auto& order = m_network->sorted_indices();
141 for (uint32_t i = 0; i < static_cast<uint32_t>(order.size()); ++i) {
142 const auto& slot = slots[order[i]];
143 if (slot.diffuse_texture)
144 m_render_processor->bind_texture(3 + i, slot.diffuse_texture);
145 }
148 }
149
150 for (const auto& [name, tex] : m_render_config.additional_textures)
151 m_render_processor->bind_texture(name, tex);
152
153 get_processing_chain()->add_final_processor(
155 shared_from_this());
156
158 "MeshNetworkBuffer::setup_rendering: vert={} frag={} textured={}",
161 textured);
162}
#define MF_INFO(comp, ctx,...)
std::shared_ptr< Core::VKImage > m_diffuse_texture
std::shared_ptr< RenderProcessor > m_render_processor
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:314
@ 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::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, 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: