Skip to content

Commit cc6fa61

Browse files
committed
feat: material update
1 parent c4171b7 commit cc6fa61

File tree

4 files changed

+358
-150
lines changed

4 files changed

+358
-150
lines changed

Engine/Source/Common/Include/Common/Concepts.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <unordered_map>
1515
#include <set>
1616
#include <map>
17+
#include <variant>
1718

1819
namespace Common {
1920
template <typename T> concept BaseEqualComparable = requires(const T& lhs, const T& rhs) { { lhs == rhs } -> std::same_as<bool>; { lhs != rhs } -> std::same_as<bool>; };
@@ -64,12 +65,13 @@ namespace Common {
6465

6566
namespace Common {
6667
// some types can perform operator== compare, but it requires element type also support operator== compare, so we test it further
67-
template <typename T> struct EqualComparableTest<std::optional<T>> { static constexpr bool value = BaseEqualComparable<T>; };
68-
template <typename T> struct EqualComparableTest<std::vector<T>> { static constexpr bool value = BaseEqualComparable<T>; };
69-
template <typename T> struct EqualComparableTest<std::unordered_set<T>> { static constexpr bool value = BaseEqualComparable<T>; };
70-
template <typename T> struct EqualComparableTest<std::set<T>> { static constexpr bool value = BaseEqualComparable<T>; };
71-
template <typename T, size_t N> struct EqualComparableTest<std::array<T, N>> { static constexpr bool value = BaseEqualComparable<T>; };
72-
template <typename K, typename V> struct EqualComparableTest<std::pair<K, V>> { static constexpr bool value = BaseEqualComparable<K> && BaseEqualComparable<V>; };
73-
template <typename K, typename V> struct EqualComparableTest<std::unordered_map<K, V>> { static constexpr bool value = BaseEqualComparable<K> && BaseEqualComparable<V>; };
74-
template <typename K, typename V> struct EqualComparableTest<std::map<K, V>> { static constexpr bool value = BaseEqualComparable<K> && BaseEqualComparable<V>; };
68+
template <typename T> struct EqualComparableTest<std::optional<T>> { static constexpr bool value = EqualComparableTest<T>::value; };
69+
template <typename T> struct EqualComparableTest<std::vector<T>> { static constexpr bool value = EqualComparableTest<T>::value; };
70+
template <typename T> struct EqualComparableTest<std::unordered_set<T>> { static constexpr bool value = EqualComparableTest<T>::value; };
71+
template <typename T> struct EqualComparableTest<std::set<T>> { static constexpr bool value = EqualComparableTest<T>::value; };
72+
template <typename T, size_t N> struct EqualComparableTest<std::array<T, N>> { static constexpr bool value = EqualComparableTest<T>::value; };
73+
template <typename K, typename V> struct EqualComparableTest<std::pair<K, V>> { static constexpr bool value = std::conjunction_v<EqualComparableTest<K>, EqualComparableTest<V>>; };
74+
template <typename K, typename V> struct EqualComparableTest<std::unordered_map<K, V>> { static constexpr bool value = std::conjunction_v<EqualComparableTest<K>, EqualComparableTest<V>>; };
75+
template <typename K, typename V> struct EqualComparableTest<std::map<K, V>> { static constexpr bool value = std::conjunction_v<EqualComparableTest<K>, EqualComparableTest<V>>; };
76+
template <typename... T> struct EqualComparableTest<std::variant<T...>> { static constexpr bool value = std::conjunction_v<EqualComparableTest<T>...>; };
7577
}

Engine/Source/Runtime/Include/Runtime/Asset/Material.h

Lines changed: 170 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99
#include <Common/Math/Vector.h>
1010
#include <Common/Math/Matrix.h>
11-
1211
#include <Runtime/Asset/Asset.h>
12+
#include <Runtime/Asset/Texture.h>
1313
#include <Runtime/Meta.h>
1414
#include <Runtime/Api.h>
1515

@@ -21,98 +21,207 @@ namespace Runtime {
2121
max
2222
};
2323

24-
enum class EEnum() MaterialParameterType : uint8_t {
25-
tInt,
26-
tFloat,
27-
tFVec2,
28-
tFVec3,
29-
tFVec4,
30-
tFMat4x4,
31-
max
24+
struct RUNTIME_API EClass() MaterialBoolVariantField {
25+
EClassBody(MaterialBoolVariantField)
26+
27+
MaterialBoolVariantField();
28+
29+
EProperty() bool defaultValue;
30+
EProperty() uint8_t sortPriority;
3231
};
3332

34-
class RUNTIME_API EClass() MaterialParameter {
35-
EClassBody(MaterialParameter)
33+
struct RUNTIME_API EClass() MaterialRangedUintVariantField {
34+
EClassBody(MaterialRangedUintVariantField)
3635

37-
public:
38-
MaterialParameter();
39-
40-
EFunc() MaterialParameterType GetType() const;
41-
EFunc() int32_t GetInt() const;
42-
EFunc() float GetFloat() const;
43-
EFunc() Common::FVec2 GetFVec2() const;
44-
EFunc() Common::FVec3 GetFVec3() const;
45-
EFunc() Common::FVec4 GetFVec4() const;
46-
EFunc() Common::FMat4x4 GetFMat4x4() const;
47-
EFunc() void SetInt(int32_t inValue);
48-
EFunc() void SetFloat(float inValue);
49-
EFunc() void SetFVec2(const Common::FVec2& inValue);
50-
EFunc() void SetFVec3(const Common::FVec3& inValue);
51-
EFunc() void SetFVec4(const Common::FVec4& inValue);
52-
EFunc() void SetFMat4x4(const Common::FMat4x4& inValue);
36+
MaterialRangedUintVariantField();
5337

54-
private:
55-
std::variant<std::monostate, int32_t, float, Common::FVec2, Common::FVec3, Common::FVec4, Common::FMat4x4> parameter;
38+
EProperty() uint8_t defaultValue;
39+
EProperty() std::pair<uint8_t, uint8_t> range;
40+
EProperty() uint8_t sortPriority;
5641
};
5742

58-
class RUNTIME_API EClass() IMaterial : public Asset {
59-
EPolyClassBody(IMaterial)
43+
struct RUNTIME_API EClass() MaterialBoolParameterField {
44+
EClassBody(MaterialBoolParameterField)
6045

61-
public:
62-
using ParameterMap = std::unordered_map<std::string, MaterialParameter>;
46+
MaterialBoolParameterField();
47+
48+
EProperty() bool defaultValue;
49+
EProperty() uint8_t sortPriority;
50+
};
51+
52+
struct RUNTIME_API EClass() MaterialIntParameterField {
53+
EClassBody(MaterialIntParameterField)
54+
55+
MaterialIntParameterField();
56+
57+
EProperty() int32_t defaultValue;
58+
EProperty() std::optional<std::pair<int32_t, int32_t>> range;
59+
EProperty() uint8_t sortPriority;
60+
};
61+
62+
struct RUNTIME_API EClass() MaterialFloatParameterField {
63+
EClassBody(MaterialFloatParameterField)
64+
65+
MaterialFloatParameterField();
66+
67+
EProperty() float defaultValue;
68+
EProperty() std::optional<std::pair<float, float>> range;
69+
EProperty() uint8_t sortPriority;
70+
};
71+
72+
struct RUNTIME_API EClass() MaterialFVec2ParameterField {
73+
EClassBody(MaterialFVec2ParameterField)
74+
75+
MaterialFVec2ParameterField();
76+
77+
EProperty() Common::FVec2 defaultValue;
78+
EProperty() std::optional<std::pair<Common::FVec2, Common::FVec2>> range;
79+
EProperty() uint8_t sortPriority;
80+
};
81+
82+
struct RUNTIME_API EClass() MaterialFVec3ParameterField {
83+
EClassBody(MaterialFVec3ParameterField)
6384

64-
~IMaterial() override;
85+
MaterialFVec3ParameterField();
6586

66-
EFunc() virtual MaterialType GetType() const = 0;
67-
EFunc() virtual std::string GetSourceCode() const = 0;
68-
EFunc() virtual void SetParameter(const std::string& inName, const MaterialParameter& inParameter) = 0;
69-
EFunc() virtual ParameterMap& GetParameters() = 0;
70-
EFunc() virtual const ParameterMap& GetParameters() const = 0;
87+
EProperty() Common::FVec3 defaultValue;
88+
EProperty() std::optional<std::pair<Common::FVec3, Common::FVec3>> range;
89+
EProperty() uint8_t sortPriority;
90+
};
91+
92+
struct RUNTIME_API EClass() MaterialFVec4ParameterField {
93+
EClassBody(MaterialFVec4ParameterField)
94+
95+
MaterialFVec4ParameterField();
96+
97+
EProperty() Common::FVec4 defaultValue;
98+
EProperty() std::optional<std::pair<Common::FVec4, Common::FVec4>> range;
99+
EProperty() uint8_t sortPriority;
100+
};
101+
102+
struct RUNTIME_API EClass() MaterialFMat4x4ParameterField {
103+
EClassBody(MaterialFMat4x4ParameterField)
104+
105+
MaterialFMat4x4ParameterField();
106+
107+
EProperty() Common::FMat4x4 defaultValue;
108+
EProperty() uint8_t sortPriority;
109+
};
110+
111+
struct RUNTIME_API EClass() MaterialTextureParameterField {
112+
EClassBody(MaterialTextureParameterField)
113+
114+
MaterialTextureParameterField();
71115

72-
protected:
73-
explicit IMaterial(Core::Uri inUri);
116+
EProperty() AssetPtr<Texture> defaultValue;
117+
EProperty() uint8_t sortPriority;
74118
};
75119

76-
class RUNTIME_API EClass() Material final : public IMaterial {
120+
struct RUNTIME_API EClass() MaterialRenderTargetParameterField {
121+
EClassBody(MaterialRenderTargetParameterField)
122+
123+
MaterialRenderTargetParameterField();
124+
125+
EProperty() AssetPtr<RenderTarget> defaultValue;
126+
EProperty() uint8_t sortPriority;
127+
};
128+
129+
class RUNTIME_API EClass() Material final : public Asset {
77130
EPolyClassBody(Material)
78131

79132
public:
80-
explicit Material(Core::Uri inUri);
81-
~Material() override;
133+
using VariantField = std::variant<
134+
MaterialBoolVariantField,
135+
MaterialRangedUintVariantField
136+
>;
137+
using VariantFieldMap = std::unordered_map<std::string, VariantField>;
138+
139+
using ParameterField = std::variant<
140+
MaterialBoolParameterField,
141+
MaterialIntParameterField,
142+
MaterialFloatParameterField,
143+
MaterialFVec2ParameterField,
144+
MaterialFVec3ParameterField,
145+
MaterialFVec4ParameterField,
146+
MaterialFMat4x4ParameterField,
147+
MaterialTextureParameterField,
148+
MaterialRenderTargetParameterField
149+
>;
150+
using ParameterFieldMap = std::unordered_map<std::string, ParameterField>;
82151

83-
EFunc() MaterialType GetType() const override;
84-
EFunc() std::string GetSourceCode() const override;
85-
EFunc() void SetParameter(const std::string& inName, const MaterialParameter& inParameter) override;
86-
EFunc() ParameterMap& GetParameters() override;
87-
EFunc() const ParameterMap& GetParameters() const override;
152+
explicit Material(Core::Uri inUri);
88153

154+
EFunc() MaterialType GetType() const;
89155
EFunc() void SetType(MaterialType inType);
90-
EFunc() void SetSourceCode(const std::string& inSourceCode);
156+
EFunc() const std::string& GetSource() const;
157+
EFunc() void SetSource(const std::string& inSource);
158+
159+
EFunc() bool HasVariantField(const std::string& inName) const;
160+
EFunc() VariantField& GetVariantField(const std::string& inName);
161+
EFunc() const VariantField& GetVariantField(const std::string& inName) const;
162+
EFunc() VariantField* FindVariantField(const std::string& inName);
163+
EFunc() const VariantField* FindVariantField(const std::string& inName) const;
164+
EFunc() VariantFieldMap& GetVariantFields();
165+
EFunc() const VariantFieldMap& GetVariantFields() const;
166+
EFunc() VariantField& EmplaceVariantField(const std::string& inName);
167+
168+
EFunc() bool HasParameterField(const std::string& inName) const;
169+
EFunc() ParameterField& GetParameterField(const std::string& inName);
170+
EFunc() const ParameterField& GetParameterField(const std::string& inName) const;
171+
EFunc() ParameterField* FindParameterField(const std::string& inName);
172+
EFunc() const ParameterField* FindParameterField(const std::string& inName) const;
173+
EFunc() ParameterFieldMap& GetParameterFields();
174+
EFunc() const ParameterFieldMap& GetParameterFields() const;
175+
EFunc() ParameterField& EmplaceParameterField(const std::string& inName);
91176

92177
private:
93178
EProperty() MaterialType type;
94-
EProperty() std::string sourceCode;
95-
EProperty() ParameterMap parameters;
179+
EProperty() std::string source;
180+
EProperty() VariantFieldMap variantFields;
181+
EProperty() ParameterFieldMap parameterFields;
96182
};
97183

98-
class RUNTIME_API EClass() MaterialInstance final : public IMaterial {
184+
class RUNTIME_API EClass() MaterialInstance final : public Asset {
99185
EPolyClassBody(MaterialInstance)
100186

101187
public:
102-
explicit MaterialInstance(Core::Uri inUri);
103-
~MaterialInstance() override;
188+
using Variant = std::variant<
189+
bool,
190+
uint8_t
191+
>;
192+
using VariantMap = std::unordered_map<std::string, Variant>;
193+
194+
using Parameter = std::variant<
195+
bool,
196+
int32_t,
197+
float,
198+
Common::FVec2,
199+
Common::FVec3,
200+
Common::FVec4,
201+
Common::FMat4x4,
202+
AssetPtr<Texture>,
203+
AssetPtr<RenderTarget>
204+
>;
205+
using ParameterMap = std::unordered_map<std::string, Parameter>;
104206

105-
EFunc() MaterialType GetType() const override;
106-
EFunc() std::string GetSourceCode() const override;
107-
EFunc() void SetParameter(const std::string& inName, const MaterialParameter& inParameter) override;
108-
EFunc() ParameterMap& GetParameters() override;
109-
EFunc() const ParameterMap& GetParameters() const override;
207+
explicit MaterialInstance(Core::Uri inUri);
110208

111-
EFunc() AssetPtr<Material> GetMaterial() const;
209+
EFunc() const AssetPtr<Material>& GetMaterial() const;
112210
EFunc() void SetMaterial(const AssetPtr<Material>& inMaterial);
113211

212+
EFunc() bool HasVariant(const std::string& inName) const;
213+
EFunc() Variant GetVariant(const std::string& inName) const;
214+
EFunc() void SetVariant(const std::string& inName, const Variant& inVariant);
215+
EFunc() VariantMap GetVariants() const;
216+
217+
EFunc() bool HasParameter(const std::string& inName) const;
218+
EFunc() Parameter GetParameter(const std::string& inName) const;
219+
EFunc() void SetParameter(const std::string& inName, const Parameter& inParameter);
220+
EFunc() ParameterMap GetParameters() const;
221+
114222
private:
115223
EProperty() AssetPtr<Material> material;
224+
EProperty() VariantMap variants;
116225
EProperty() ParameterMap parameters;
117226
};
118227
}

Engine/Source/Runtime/Include/Runtime/Asset/Mesh.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ namespace Runtime {
4040
~StaticMesh() override;
4141

4242
private:
43-
EProperty() AssetPtr<IMaterial> material;
43+
EProperty() AssetPtr<MaterialInstance> material;
4444
EProperty() std::vector<StaticMeshLOD> lodVec;
4545
};
4646
}

0 commit comments

Comments
 (0)