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