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