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> 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) 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 */ Material(const INode::Ptr& node)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 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 GetCustomProperties()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