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 #include <scene_plugin/api/material_uid.h>
16 
17 #include <meta/ext/concrete_base_object.h>
18 
19 #include "bind_templates.inl"
20 #include "intf_node_private.h"
21 
22 using IntfPtr = BASE_NS::shared_ptr<CORE_NS::IInterface>;
23 using IntfWeakPtr = BASE_NS::weak_ptr<CORE_NS::IInterface>;
24 
25 namespace {
26 class ShaderImpl : public META_NS::ObjectFwd<ShaderImpl, SCENE_NS::ClassId::Shader, META_NS::ClassId::Object,
27                        SCENE_NS::IShader, ISceneHolderRef> {
28     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IShader, BASE_NS::string, Uri, "")
29 
30     bool Build(const IMetadata::Ptr& data) override
31     {
32         if (!data) {
33             // no parameters, so legacy init
34             return true;
35         }
36         auto rcp = data->GetPropertyByName<IntfPtr>("RenderContext");
37         if (!rcp) {
38             // render context not given as parameter.
39             return true;
40         }
41         auto urp = data->GetPropertyByName<BASE_NS::string>("uri");
42         if (urp) {
43             // uri given as parameter
44             if (auto renderContext = interface_cast<RENDER_NS::IRenderContext>(rcp->GetValue())) {
45                 // we have render context, so we can access ahder manger
46                 auto& shaderMan = renderContext->GetDevice().GetShaderManager();
47                 auto uri = urp->GetValue();
48                 shaderMan.LoadShaderFile(uri);
49                 renderHandleReference_  = shaderMan.GetShaderHandle(uri);
50             }
51         }
52         return true;
53     }
54 
GetRenderHandleReference(RENDER_NS::IShaderManager & shaderManager)55     RENDER_NS::RenderHandleReference GetRenderHandleReference(RENDER_NS::IShaderManager& shaderManager) override
56     {
57         if (RENDER_NS::RenderHandleUtil::IsValid(renderHandleReference_.GetHandle())) {
58             return renderHandleReference_;
59         }
60 
61         auto uri = GetValue(META_ACCESS_PROPERTY(Uri));
62 
63         renderHandleReference_ = shaderManager.GetShaderHandle(uri);
64         if (!renderHandleReference_) {
65             shaderManager.LoadShaderFile(uri);
66             renderHandleReference_ = shaderManager.GetShaderHandle(uri);
67         }
68 
69         return renderHandleReference_;
70     }
71 
SetSceneHolder(const SceneHolder::WeakPtr & sh)72     void SetSceneHolder(const SceneHolder::WeakPtr& sh) override
73     {
74         sh_ = sh;
75     }
76 
SceneHolder()77     SceneHolder::Ptr SceneHolder() override
78     {
79         return sh_.lock();
80     }
81 
SetIndex(size_t ix)82     void SetIndex(size_t ix) override
83     {
84         ix_ = ix;
85     }
86 
87 private:
88     RENDER_NS::RenderHandleReference renderHandleReference_;
89     SceneHolder::WeakPtr sh_;
90     size_t ix_ { 0 };
91 };
92 } // namespace
SCENE_BEGIN_NAMESPACE()93 SCENE_BEGIN_NAMESPACE()
94 
95 void RegisterShaderImpl()
96 {
97     META_NS::GetObjectRegistry().RegisterObjectType<ShaderImpl>();
98 }
UnregisterShaderImpl()99 void UnregisterShaderImpl()
100 {
101     META_NS::GetObjectRegistry().UnregisterObjectType<ShaderImpl>();
102 }
103 
104 SCENE_END_NAMESPACE()
105