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}
0 commit comments