Toast Engine
Loading...
Searching...
No Matches
material_runtime.hpp
Go to the documentation of this file.
1
6
7#pragma once
8
9#include "shader_cache.hpp"
10#include "vulkan_sampler.hpp"
11
12#include <cstddef>
13#include <memory>
14#include <optional>
17#include <unordered_map>
18#include <vector>
19#include <vulkan/vulkan_raii.hpp>
20
21namespace renderer {
22class VulkanCore;
23
24class MaterialRuntime {
25public:
26 MaterialRuntime(const VulkanCore& core, assets::Material* material);
27
28 [[nodiscard]]
29 auto material() const -> assets::Material* {
30 return m_material;
31 }
32
33 [[nodiscard]]
34 auto reflection() const -> const ShaderReflection& {
35 return m_merged;
36 }
37
38 [[nodiscard]]
39 auto shaderEntries() const -> const std::vector<std::shared_ptr<const ShaderCache::Entry>>& {
40 return m_entries;
41 }
42
43 void rebuild();
44
45 void markValuesDirty() { m_values_dirty = true; }
46
47 struct UboBlob {
48 uint32_t set = 0;
49 uint32_t binding = 0;
50 std::vector<std::byte> bytes;
51 };
52
53 auto uniformBlobs() -> const std::vector<UboBlob>&;
54
55 auto pushBlob() -> const std::vector<std::byte>&;
56
57 [[nodiscard]]
58 auto modelOffset() const -> std::optional<uint32_t> {
59 return m_model_offset;
60 }
61
62 [[nodiscard]]
63 auto jointOffsetOffset() const -> std::optional<uint32_t> {
64 return m_joint_offset_offset;
65 }
66
67 [[nodiscard]]
68 auto instanceBaseOffset() const -> std::optional<uint32_t> {
69 return m_instance_base_offset;
70 }
71
72 struct TextureSlot {
73 uint32_t set = 0;
74 uint32_t binding = 0;
76 vk::Sampler sampler;
77 std::string default_fallback;
78 bool linear_data = false;
79 };
80
81 auto textureSlots() -> const std::vector<TextureSlot>&;
82
83private:
84 void bakeValues();
85 void bakeTextures();
86
87 [[nodiscard]]
88 auto groupTomlKey(const std::string& group) const -> std::string;
89
90 [[nodiscard]]
91 auto resolveMemberValue(const ShaderBlockMember& member) const -> const assets::DataValue*;
92 auto samplerFor(const assets::DataValue* params, std::string_view debug_name) -> vk::Sampler;
93
94 const VulkanCore* m_core = nullptr;
95 assets::Material* m_material = nullptr;
96
98
99 ShaderReflection m_merged;
100 std::vector<std::shared_ptr<const ShaderCache::Entry>> m_entries;
101
102 std::vector<UboBlob> m_ubo_blobs;
103 std::vector<std::byte> m_push_blob;
104 std::optional<uint32_t> m_model_offset;
105 std::optional<uint32_t> m_joint_offset_offset;
106 std::optional<uint32_t> m_instance_base_offset;
107 std::vector<TextureSlot> m_texture_slots;
108 bool m_values_dirty = true;
109 bool m_textures_dirty = true;
110
111 std::unordered_map<uint64_t, std::unique_ptr<VulkanSampler>> m_samplers;
112};
113
114}
Typed value for TOML files.
Definition data_value.hpp:50
Type-safe smart pointer for assets.
Definition core_types.hpp:149
Shader-driven material asset.
Definition material.hpp:49
Definition vulkan_core.hpp:48
Material asset backed by TOML data.
Definition material_runtime.hpp:72
Definition material_runtime.hpp:47
Definition shader_reflection.hpp:53
Definition shader_reflection.hpp:87