18bf80f4bSopenharmony_ci/* 28bf80f4bSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 38bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 48bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License. 58bf80f4bSopenharmony_ci * You may obtain a copy of the License at 68bf80f4bSopenharmony_ci * 78bf80f4bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 88bf80f4bSopenharmony_ci * 98bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 108bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 118bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 128bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and 138bf80f4bSopenharmony_ci * limitations under the License. 148bf80f4bSopenharmony_ci */ 158bf80f4bSopenharmony_ci#include <scene_plugin/api/material_uid.h> 168bf80f4bSopenharmony_ci 178bf80f4bSopenharmony_ci#include <meta/ext/concrete_base_object.h> 188bf80f4bSopenharmony_ci 198bf80f4bSopenharmony_ci#include "bind_templates.inl" 208bf80f4bSopenharmony_ci#include "intf_node_private.h" 218bf80f4bSopenharmony_ci 228bf80f4bSopenharmony_ciusing IntfPtr = BASE_NS::shared_ptr<CORE_NS::IInterface>; 238bf80f4bSopenharmony_ciusing IntfWeakPtr = BASE_NS::weak_ptr<CORE_NS::IInterface>; 248bf80f4bSopenharmony_ci 258bf80f4bSopenharmony_cinamespace { 268bf80f4bSopenharmony_ciclass ShaderImpl : public META_NS::ObjectFwd<ShaderImpl, SCENE_NS::ClassId::Shader, META_NS::ClassId::Object, 278bf80f4bSopenharmony_ci SCENE_NS::IShader, ISceneHolderRef> { 288bf80f4bSopenharmony_ci META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IShader, BASE_NS::string, Uri, "") 298bf80f4bSopenharmony_ci 308bf80f4bSopenharmony_ci bool Build(const IMetadata::Ptr& data) override 318bf80f4bSopenharmony_ci { 328bf80f4bSopenharmony_ci if (!data) { 338bf80f4bSopenharmony_ci // no parameters, so legacy init 348bf80f4bSopenharmony_ci return true; 358bf80f4bSopenharmony_ci } 368bf80f4bSopenharmony_ci auto rcp = data->GetPropertyByName<IntfPtr>("RenderContext"); 378bf80f4bSopenharmony_ci if (!rcp) { 388bf80f4bSopenharmony_ci // render context not given as parameter. 398bf80f4bSopenharmony_ci return true; 408bf80f4bSopenharmony_ci } 418bf80f4bSopenharmony_ci auto urp = data->GetPropertyByName<BASE_NS::string>("uri"); 428bf80f4bSopenharmony_ci if (urp) { 438bf80f4bSopenharmony_ci // uri given as parameter 448bf80f4bSopenharmony_ci if (auto renderContext = interface_cast<RENDER_NS::IRenderContext>(rcp->GetValue())) { 458bf80f4bSopenharmony_ci // we have render context, so we can access ahder manger 468bf80f4bSopenharmony_ci auto& shaderMan = renderContext->GetDevice().GetShaderManager(); 478bf80f4bSopenharmony_ci auto uri = urp->GetValue(); 488bf80f4bSopenharmony_ci shaderMan.LoadShaderFile(uri); 498bf80f4bSopenharmony_ci renderHandleReference_ = shaderMan.GetShaderHandle(uri); 508bf80f4bSopenharmony_ci } 518bf80f4bSopenharmony_ci } 528bf80f4bSopenharmony_ci return true; 538bf80f4bSopenharmony_ci } 548bf80f4bSopenharmony_ci 558bf80f4bSopenharmony_ci RENDER_NS::RenderHandleReference GetRenderHandleReference(RENDER_NS::IShaderManager& shaderManager) override 568bf80f4bSopenharmony_ci { 578bf80f4bSopenharmony_ci if (RENDER_NS::RenderHandleUtil::IsValid(renderHandleReference_.GetHandle())) { 588bf80f4bSopenharmony_ci return renderHandleReference_; 598bf80f4bSopenharmony_ci } 608bf80f4bSopenharmony_ci 618bf80f4bSopenharmony_ci auto uri = GetValue(META_ACCESS_PROPERTY(Uri)); 628bf80f4bSopenharmony_ci 638bf80f4bSopenharmony_ci renderHandleReference_ = shaderManager.GetShaderHandle(uri); 648bf80f4bSopenharmony_ci if (!renderHandleReference_) { 658bf80f4bSopenharmony_ci shaderManager.LoadShaderFile(uri); 668bf80f4bSopenharmony_ci renderHandleReference_ = shaderManager.GetShaderHandle(uri); 678bf80f4bSopenharmony_ci } 688bf80f4bSopenharmony_ci 698bf80f4bSopenharmony_ci return renderHandleReference_; 708bf80f4bSopenharmony_ci } 718bf80f4bSopenharmony_ci 728bf80f4bSopenharmony_ci void SetSceneHolder(const SceneHolder::WeakPtr& sh) override 738bf80f4bSopenharmony_ci { 748bf80f4bSopenharmony_ci sh_ = sh; 758bf80f4bSopenharmony_ci } 768bf80f4bSopenharmony_ci 778bf80f4bSopenharmony_ci SceneHolder::Ptr SceneHolder() override 788bf80f4bSopenharmony_ci { 798bf80f4bSopenharmony_ci return sh_.lock(); 808bf80f4bSopenharmony_ci } 818bf80f4bSopenharmony_ci 828bf80f4bSopenharmony_ci void SetIndex(size_t ix) override 838bf80f4bSopenharmony_ci { 848bf80f4bSopenharmony_ci ix_ = ix; 858bf80f4bSopenharmony_ci } 868bf80f4bSopenharmony_ci 878bf80f4bSopenharmony_ciprivate: 888bf80f4bSopenharmony_ci RENDER_NS::RenderHandleReference renderHandleReference_; 898bf80f4bSopenharmony_ci SceneHolder::WeakPtr sh_; 908bf80f4bSopenharmony_ci size_t ix_ { 0 }; 918bf80f4bSopenharmony_ci}; 928bf80f4bSopenharmony_ci} // namespace 938bf80f4bSopenharmony_ciSCENE_BEGIN_NAMESPACE() 948bf80f4bSopenharmony_ci 958bf80f4bSopenharmony_civoid RegisterShaderImpl() 968bf80f4bSopenharmony_ci{ 978bf80f4bSopenharmony_ci META_NS::GetObjectRegistry().RegisterObjectType<ShaderImpl>(); 988bf80f4bSopenharmony_ci} 998bf80f4bSopenharmony_civoid UnregisterShaderImpl() 1008bf80f4bSopenharmony_ci{ 1018bf80f4bSopenharmony_ci META_NS::GetObjectRegistry().UnregisterObjectType<ShaderImpl>(); 1028bf80f4bSopenharmony_ci} 1038bf80f4bSopenharmony_ci 1048bf80f4bSopenharmony_ciSCENE_END_NAMESPACE() 105