36 auto name()
const -> std::string_view
override {
40 ~MaterialPass()
override;
42 MaterialPass(
const MaterialPass&) =
delete;
43 auto operator=(
const MaterialPass&) -> MaterialPass& =
delete;
44 MaterialPass(MaterialPass&&) =
delete;
45 auto operator=(MaterialPass&&) -> MaterialPass& =
delete;
47 void update(uint32_t frame_index,
float dt)
override;
49 void record(vk::CommandBuffer cmd, uint32_t frame_index, uint32_t image_index)
override;
58 return m_root_material;
64 void markValuesDirty() { m_values_dirty.store(
true, std::memory_order_release); }
67 auto isValid() const ->
bool {
68 return m_built !=
nullptr;
72 auto usesCutout() const noexcept ->
bool {
73 return m_built !=
nullptr && m_built->uses_cutout;
77 auto isBlended() const ->
bool {
78 return m_root_material !=
nullptr && m_root_material->settings().blend_mode != assets::BlendMode::opaque;
83 static auto resolvedAlphaCutoffOf(MaterialRuntime& runtime) -> float;
85 struct InstanceResources {
86 std::unique_ptr<MaterialRuntime> runtime;
91 std::vector<std::optional<vma::raii::Buffer>> buffers;
94 std::vector<UboBuffer> ubo_buffers;
95 std::vector<std::vector<vk::raii::DescriptorSet>> sets;
100 uint64_t generation = 0;
102 auto operator==(
const BoundView&)
const ->
bool =
default;
105 std::vector<std::vector<BoundView>> bound_views;
114 bool uses_cutout =
false;
118 std::unordered_map<assets::Material*, InstanceResources> instances;
123 const VulkanCore* core =
nullptr;
126 vk::Format color_format = vk::Format::eUndefined;
127 vk::Format depth_format = vk::Format::eUndefined;
132 static auto build(
const BuildInputs& inputs) -> std::shared_ptr<Built>;
134 void adopt(std::shared_ptr<Built> built);
137 Built& built, vk::CommandBuffer cmd, uint32_t frame_index,
const VulkanRenderer::MeshInstanceProxy& proxy,
138 vk::Buffer posed_vertices, uint32_t posed_vertex_offset, assets::Material** bound_material, uint32_t instance_count = 1
141 auto ensureInstanceResources(Built& built, assets::Material* material) -> InstanceResources*;
142 void updateInstanceDescriptors(InstanceResources& res, uint32_t frame_index);
144 const VulkanCore* m_core =
nullptr;
145 assets::Material* m_root_material =
nullptr;
147 assets::Handle<assets::Material> m_root_material_ref;
150 vk::Format m_color_format = vk::Format::eUndefined;
151 vk::Format m_depth_format = vk::Format::eUndefined;
152 vk::Extent2D m_extent;
155 std::shared_ptr<Built> m_built;
156 std::future<std::shared_ptr<Built>> m_pending_build;
158 std::vector<std::byte> m_push_scratch;
159 std::vector<uint32_t> m_draw_order;
161 std::atomic_bool m_rebuild_pending {
false};
162 std::atomic_bool m_values_dirty {
false};