1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef SCENEPLUGINAPI_MATERIAL_H
17 #define SCENEPLUGINAPI_MATERIAL_H
18
19 #include <scene_plugin/api/material_uid.h>
20 #include <scene_plugin/interface/intf_scene.h>
21
22 #include <meta/api/internal/object_api.h>
SCENE_BEGIN_NAMESPACE()23 SCENE_BEGIN_NAMESPACE()
24
25 /**
26 * @brief The TextureInfo class
27 */
28 class TextureInfo final : public META_NS::Internal::ObjectInterfaceAPI<TextureInfo, ClassId::TextureInfo> {
29 META_API(TextureInfo)
30 META_API_OBJECT_CONVERTIBLE(ITextureInfo)
31 META_API_CACHE_INTERFACE(ITextureInfo, TextureInfo)
32 };
33
34 /**
35 * @brief The CustomPropertiesHolder class
36 */
37 class CustomPropertiesHolder final
38 : public META_NS::Internal::ObjectInterfaceAPI<CustomPropertiesHolder, ClassId::CustomPropertiesHolder> {
39 META_API(CustomPropertiesHolder)
40 META_API_OBJECT_CONVERTIBLE(META_NS::IMetadata)
41 };
42
43 /**
44 * @brief The Shader class
45 */
46 class Shader final : public META_NS::Internal::ObjectInterfaceAPI<Shader, ClassId::Shader> {
47 META_API(Shader)
48 META_API_OBJECT_CONVERTIBLE(IShader)
49 META_API_CACHE_INTERFACE(IShader, Shader)
50 META_API_INTERFACE_PROPERTY_CACHED(Shader, Uri, BASE_NS::string)
51 };
52
53 /**
54 * @brief The GraphicsState class
55 */
56 class GraphicsState final : public META_NS::Internal::ObjectInterfaceAPI<GraphicsState, ClassId::GraphicsState> {
57 META_API(GraphicsState)
58 META_API_OBJECT_CONVERTIBLE(IGraphicsState)
59 META_API_CACHE_INTERFACE(IGraphicsState, GraphicsState)
60 public:
61 META_API_INTERFACE_PROPERTY_CACHED(GraphicsState, Uri, BASE_NS::string)
62 META_API_INTERFACE_PROPERTY_CACHED(GraphicsState, Variant, BASE_NS::string)
63 };
64
65 /**
66 * @brief The Material class
67 */
68 class Material final : public META_NS::Internal::ObjectInterfaceAPI<Material, ClassId::Material> {
69 META_API(Material)
META_API_OBJECT_CONVERTIBLE(IMaterial)70 META_API_OBJECT_CONVERTIBLE(IMaterial)
71 META_API_CACHE_INTERFACE(IMaterial, Material)
72 META_API_OBJECT_CONVERTIBLE(INode)
73 META_API_CACHE_INTERFACE(INode, Node)
74 public:
75 // From Node
76 META_API_INTERFACE_PROPERTY_CACHED(Node, Name, BASE_NS::string)
77 META_API_INTERFACE_PROPERTY_CACHED(Material, AlphaCutoff, float)
78 META_API_INTERFACE_READONLY_PROPERTY_CACHED(Material, CustomProperties, META_NS::IObject::Ptr)
79 META_API_INTERFACE_ARRAY_PROPERTY_CACHED(Material, Inputs, SCENE_NS::ITextureInfo::Ptr)
80
81 public:
82 /**
83 * @brief Material
84 * @param node
85 */
86 explicit Material(const INode::Ptr& node)
87 {
88 Initialize(interface_pointer_cast<META_NS::IObject>(node));
89 }
90
91 /**
92 * @brief Material
93 * @param node
94 */
Material(const IMaterial::Ptr & node)95 Material(const IMaterial::Ptr& node)
96 {
97 Initialize(interface_pointer_cast<META_NS::IObject>(node));
98 }
99
100 /**
101 * @brief OnLoaded
102 * @return
103 */
OnLoaded()104 auto OnLoaded()
105 {
106 return META_API_CACHED_INTERFACE(Node)->OnLoaded();
107 }
108
109 /**
110 * @brief OnLoaded
111 * @param callback
112 * @return
113 */
114 template<class Callback>
OnLoaded(Callback && callback)115 auto OnLoaded(Callback&& callback)
116 {
117 OnLoaded()->AddHandler(META_NS::MakeCallback<META_NS::IOnChanged>(callback));
118 return *this;
119 }
120
121 // Material Base Color
META_API_INTERFACE_PROPERTY_CACHED(Material,BaseColor,SCENE_NS::Color)122 META_API_INTERFACE_PROPERTY_CACHED(Material, BaseColor, SCENE_NS::Color)
123
124 // Material Normal Texture
125 META_API_INTERFACE_PROPERTY_CACHED(Material, NormalMapScale, float)
126
127 // Metallic Roughness types
128 META_API_INTERFACE_PROPERTY_CACHED(Material, MetallicRoughness, float)
129 META_API_INTERFACE_PROPERTY_CACHED(Material, Metallic, float)
130 META_API_INTERFACE_PROPERTY_CACHED(Material, MetallicReflectance, float)
131
132 // Specular Glossiness
133 META_API_INTERFACE_PROPERTY_CACHED(Material, SpecularGlossinessColor, SCENE_NS::Color)
134 META_API_INTERFACE_PROPERTY_CACHED(Material, SpecularGlossiness, float)
135
136 // Emissive
137 META_API_INTERFACE_PROPERTY_CACHED(Material, EmissiveColor, SCENE_NS::Color)
138 META_API_INTERFACE_PROPERTY_CACHED(Material, EmissiveColorIntensity, float)
139
140 // Ambient Occlusion
141 META_API_INTERFACE_PROPERTY_CACHED(Material, AmbientOcclusionStrength, float)
142
143 // Clear Coat
144 META_API_INTERFACE_PROPERTY_CACHED(Material, ClearCoatIntensity, float)
145 META_API_INTERFACE_PROPERTY_CACHED(Material, ClearCoatRoughness, float)
146 META_API_INTERFACE_PROPERTY_CACHED(Material, ClearCoatNormalScale, float)
147
148 // Sheen
149 META_API_INTERFACE_PROPERTY_CACHED(Material, SheenColor, SCENE_NS::Color)
150 META_API_INTERFACE_PROPERTY_CACHED(Material, SheenRoughness, float)
151
152 // Transmission
153 META_API_INTERFACE_PROPERTY_CACHED(Material, Transmission, float)
154
155 // Specular color
156 META_API_INTERFACE_PROPERTY_CACHED(Material, SpecularColor, SCENE_NS::Color)
157 META_API_INTERFACE_PROPERTY_CACHED(Material, SpecularColorStrength, float)
158
159 CustomPropertiesHolder GetCustomProperties()
160 {
161 CustomPropertiesHolder ret;
162 ret.Initialize(META_API_CACHED_INTERFACE(Material)->CustomProperties()->GetValue());
163 return ret;
164 }
165 };
166
167 SCENE_END_NAMESPACE()
168
169 #endif // SCENEPLUGINAPI_MATERIAL_H
170