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 168bf80f4bSopenharmony_ci#include <core/intf_engine.h> 178bf80f4bSopenharmony_ci#include <core/ecs/intf_ecs.h> 188bf80f4bSopenharmony_ci#include <core/ecs/intf_system.h> 198bf80f4bSopenharmony_ci#include <core/ecs/intf_component_manager.h> 208bf80f4bSopenharmony_ci#include <core/io/intf_file_manager.h> 218bf80f4bSopenharmony_ci#include <core/plugin/intf_plugin.h> 228bf80f4bSopenharmony_ci#include <core/plugin/intf_plugin_decl.h> 238bf80f4bSopenharmony_ci#include <render/implementation_uids.h> 248bf80f4bSopenharmony_ci#include <render/intf_render_context.h> 258bf80f4bSopenharmony_ci#include <render/device/intf_shader_manager.h> 268bf80f4bSopenharmony_ci#include <render/datastore/intf_render_data_store_manager.h> 278bf80f4bSopenharmony_ci#include <render/datastore/intf_render_data_store_pod.h> 288bf80f4bSopenharmony_ci#include <render/intf_plugin.h> 298bf80f4bSopenharmony_ci 308bf80f4bSopenharmony_ci#include <3d/implementation_uids.h> 318bf80f4bSopenharmony_ci#include <3d/ecs/components/transform_component.h> 328bf80f4bSopenharmony_ci#include <3d/ecs/systems/intf_render_system.h> 338bf80f4bSopenharmony_ci 348bf80f4bSopenharmony_ci#include "dotfield/implementation_uids.h" 358bf80f4bSopenharmony_ci#include "dotfield/ecs/components/dotfield_component.h" 368bf80f4bSopenharmony_ci#include "dotfield/ecs/systems/dotfield_system.h" 378bf80f4bSopenharmony_ci#include "dotfield/render/intf_render_data_store_default_dotfield.h" 388bf80f4bSopenharmony_ci 398bf80f4bSopenharmony_ci#include "render/render_node_dotfield_render.h" 408bf80f4bSopenharmony_ci#include "render/render_node_dotfield_simulation.h" 418bf80f4bSopenharmony_ci#include "render/render_data_store_default_dotfield.h" 428bf80f4bSopenharmony_ci 438bf80f4bSopenharmony_ci// Rofs Data. 448bf80f4bSopenharmony_ciextern "C" const void* const DOTFIELD_BIN[]; 458bf80f4bSopenharmony_ciextern "C" const uint64_t DOTFIELD_BIN_SIZE; 468bf80f4bSopenharmony_ci 478bf80f4bSopenharmony_ciCORE_BEGIN_NAMESPACE() 488bf80f4bSopenharmony_ci#if defined(CORE_PLUGIN) && (CORE_PLUGIN == 1) 498bf80f4bSopenharmony_ciIPluginRegister* gPluginRegistry{ nullptr }; 508bf80f4bSopenharmony_ciIPluginRegister& GetPluginRegister() 518bf80f4bSopenharmony_ci{ 528bf80f4bSopenharmony_ci return *gPluginRegistry; 538bf80f4bSopenharmony_ci} 548bf80f4bSopenharmony_ci#endif 558bf80f4bSopenharmony_ciCORE_END_NAMESPACE() 568bf80f4bSopenharmony_ci 578bf80f4bSopenharmony_cinamespace { 588bf80f4bSopenharmony_cistatic constexpr RENDER_NS::IShaderManager::ShaderFilePathDesc SHADER_FILE_PATHS{ 598bf80f4bSopenharmony_ci "dotfieldshaders://", 608bf80f4bSopenharmony_ci "dotfieldshaderstates://", 618bf80f4bSopenharmony_ci "dotfieldpipelinelayouts://", 628bf80f4bSopenharmony_ci "dotfieldvertexinputdeclarations://", 638bf80f4bSopenharmony_ci}; 648bf80f4bSopenharmony_ci} 658bf80f4bSopenharmony_ci 668bf80f4bSopenharmony_cinamespace Dotfield { 678bf80f4bSopenharmony_ciusing CORE_NS::GetName; 688bf80f4bSopenharmony_ciusing namespace BASE_NS; 698bf80f4bSopenharmony_ciusing namespace CORE_NS; 708bf80f4bSopenharmony_ciusing namespace RENDER_NS; 718bf80f4bSopenharmony_ciusing namespace CORE3D_NS; 728bf80f4bSopenharmony_ci 738bf80f4bSopenharmony_ciconst char* GetVersionInfo(); 748bf80f4bSopenharmony_ci 758bf80f4bSopenharmony_ciconstexpr string_view ROFS = "dotfieldrofs"; 768bf80f4bSopenharmony_ciconstexpr string_view SHADERS = "dotfieldshaders"; 778bf80f4bSopenharmony_ciconstexpr string_view VIDS = "dotfieldvertexinputdeclarations"; 788bf80f4bSopenharmony_ciconstexpr string_view PIDS = "dotfieldpipelinelayouts"; 798bf80f4bSopenharmony_ciconstexpr string_view SSTATES = "dotfieldshaderstates"; 808bf80f4bSopenharmony_ci 818bf80f4bSopenharmony_ciconstexpr string_view SHADER_PATH = "dotfieldrofs://shaders/"; 828bf80f4bSopenharmony_ciconstexpr string_view VID_PATH = "dotfieldrofs://vertexinputdeclarations/"; 838bf80f4bSopenharmony_ciconstexpr string_view PID_PATH = "dotfieldrofs://pipelinelayouts/"; 848bf80f4bSopenharmony_ciconstexpr string_view SHADER_STATE_PATH = "dotfieldrofs://shaderstates/"; 858bf80f4bSopenharmony_ci 868bf80f4bSopenharmony_ciconstexpr BASE_NS::Uid PLUGIN_DEPENDENCIES[] = { RENDER_NS::UID_RENDER_PLUGIN, CORE3D_NS::UID_3D_PLUGIN }; 878bf80f4bSopenharmony_ci 888bf80f4bSopenharmony_ciIComponentManager* IDotfieldComponentManagerInstance(IEcs&); 898bf80f4bSopenharmony_ciISystem* IDotfieldSystemInstance(IEcs&); 908bf80f4bSopenharmony_ci 918bf80f4bSopenharmony_civoid IDotfieldComponentManagerDestroy(IComponentManager*); 928bf80f4bSopenharmony_civoid IDotfieldSystemDestroy(ISystem*); 938bf80f4bSopenharmony_ci 948bf80f4bSopenharmony_ciconstexpr RenderDataStoreTypeInfo RenderDataDefaultDotfieldTypeInfo = { 958bf80f4bSopenharmony_ci RenderDataStoreTypeInfo::UID, 968bf80f4bSopenharmony_ci RenderDataStoreDefaultDotfield::UID, 978bf80f4bSopenharmony_ci RenderDataStoreDefaultDotfield::TYPE_NAME, 988bf80f4bSopenharmony_ci RenderDataStoreDefaultDotfield::Create, 998bf80f4bSopenharmony_ci RenderDataStoreDefaultDotfield::Destroy, 1008bf80f4bSopenharmony_ci}; 1018bf80f4bSopenharmony_ci 1028bf80f4bSopenharmony_ciconstexpr RenderDataStoreTypeInfo gRenderDataStores[] = { 1038bf80f4bSopenharmony_ci RenderDataDefaultDotfieldTypeInfo, 1048bf80f4bSopenharmony_ci}; 1058bf80f4bSopenharmony_ci 1068bf80f4bSopenharmony_ciconstexpr RenderNodeTypeInfo RenderNodeDotfieldSimulationTypeInfo = { 1078bf80f4bSopenharmony_ci RenderNodeTypeInfo::UID, 1088bf80f4bSopenharmony_ci RenderNodeDotfieldSimulation::UID, 1098bf80f4bSopenharmony_ci RenderNodeDotfieldSimulation::TYPE_NAME, 1108bf80f4bSopenharmony_ci RenderNodeDotfieldSimulation::Create, 1118bf80f4bSopenharmony_ci RenderNodeDotfieldSimulation::Destroy, 1128bf80f4bSopenharmony_ci RenderNodeDotfieldSimulation::BACKEND_FLAGS, 1138bf80f4bSopenharmony_ci RenderNodeDotfieldSimulation::CLASS_TYPE, 1148bf80f4bSopenharmony_ci}; 1158bf80f4bSopenharmony_ci 1168bf80f4bSopenharmony_ciconstexpr RenderNodeTypeInfo RenderNodeDotfieldRenderTypeInfo = { 1178bf80f4bSopenharmony_ci RenderNodeTypeInfo::UID, 1188bf80f4bSopenharmony_ci RenderNodeDotfieldRender::UID, 1198bf80f4bSopenharmony_ci RenderNodeDotfieldRender::TYPE_NAME, 1208bf80f4bSopenharmony_ci RenderNodeDotfieldRender::Create, 1218bf80f4bSopenharmony_ci RenderNodeDotfieldRender::Destroy, 1228bf80f4bSopenharmony_ci RenderNodeDotfieldRender::BACKEND_FLAGS, 1238bf80f4bSopenharmony_ci RenderNodeDotfieldRender::CLASS_TYPE, 1248bf80f4bSopenharmony_ci}; 1258bf80f4bSopenharmony_ci 1268bf80f4bSopenharmony_ciconstexpr RenderNodeTypeInfo gRenderNodes[] = { 1278bf80f4bSopenharmony_ci RenderNodeDotfieldSimulationTypeInfo, 1288bf80f4bSopenharmony_ci RenderNodeDotfieldRenderTypeInfo, 1298bf80f4bSopenharmony_ci}; 1308bf80f4bSopenharmony_ci 1318bf80f4bSopenharmony_ciconstexpr ComponentManagerTypeInfo DotfieldComponentTypeInfo = { 1328bf80f4bSopenharmony_ci ComponentManagerTypeInfo::UID, 1338bf80f4bSopenharmony_ci IDotfieldComponentManager::UID, 1348bf80f4bSopenharmony_ci GetName<IDotfieldComponentManager>().data(), 1358bf80f4bSopenharmony_ci IDotfieldComponentManagerInstance, 1368bf80f4bSopenharmony_ci IDotfieldComponentManagerDestroy, 1378bf80f4bSopenharmony_ci}; 1388bf80f4bSopenharmony_ci 1398bf80f4bSopenharmony_ciconstexpr ComponentManagerTypeInfo gComponentManagers[] = { DotfieldComponentTypeInfo }; 1408bf80f4bSopenharmony_ci 1418bf80f4bSopenharmony_ciconstexpr Uid DotfieldSourceSystemRDeps[] = { 1428bf80f4bSopenharmony_ci ITransformComponentManager::UID, 1438bf80f4bSopenharmony_ci IDotfieldComponentManager::UID, 1448bf80f4bSopenharmony_ci}; 1458bf80f4bSopenharmony_ci 1468bf80f4bSopenharmony_ciconstexpr SystemTypeInfo gSystems[] = { 1478bf80f4bSopenharmony_ci { 1488bf80f4bSopenharmony_ci SystemTypeInfo::UID, 1498bf80f4bSopenharmony_ci IDotfieldSystem::UID, 1508bf80f4bSopenharmony_ci GetName<IDotfieldSystem>().data(), 1518bf80f4bSopenharmony_ci IDotfieldSystemInstance, 1528bf80f4bSopenharmony_ci IDotfieldSystemDestroy, 1538bf80f4bSopenharmony_ci {}, 1548bf80f4bSopenharmony_ci DotfieldSourceSystemRDeps, 1558bf80f4bSopenharmony_ci }, 1568bf80f4bSopenharmony_ci}; 1578bf80f4bSopenharmony_ci 1588bf80f4bSopenharmony_ciarray_view<const RenderDataStoreTypeInfo> GetRenderDataStores() 1598bf80f4bSopenharmony_ci{ 1608bf80f4bSopenharmony_ci return gRenderDataStores; 1618bf80f4bSopenharmony_ci} 1628bf80f4bSopenharmony_ci 1638bf80f4bSopenharmony_ciarray_view<const RenderNodeTypeInfo> GetRenderNodes() 1648bf80f4bSopenharmony_ci{ 1658bf80f4bSopenharmony_ci return gRenderNodes; 1668bf80f4bSopenharmony_ci} 1678bf80f4bSopenharmony_ci 1688bf80f4bSopenharmony_ciarray_view<const ComponentManagerTypeInfo> GetComponentManagers() 1698bf80f4bSopenharmony_ci{ 1708bf80f4bSopenharmony_ci return gComponentManagers; 1718bf80f4bSopenharmony_ci} 1728bf80f4bSopenharmony_ci 1738bf80f4bSopenharmony_ciarray_view<const SystemTypeInfo> GetSystems() 1748bf80f4bSopenharmony_ci{ 1758bf80f4bSopenharmony_ci return gSystems; 1768bf80f4bSopenharmony_ci} 1778bf80f4bSopenharmony_ci 1788bf80f4bSopenharmony_ciPluginToken Initialize(IRenderContext& context) 1798bf80f4bSopenharmony_ci{ 1808bf80f4bSopenharmony_ci auto& fm = context.GetEngine().GetFileManager(); 1818bf80f4bSopenharmony_ci // Create dotfieldrofs:// filesystem that points to embedded asset files. 1828bf80f4bSopenharmony_ci 1838bf80f4bSopenharmony_ci auto rofs = fm.CreateROFilesystem(DOTFIELD_BIN, DOTFIELD_BIN_SIZE); 1848bf80f4bSopenharmony_ci 1858bf80f4bSopenharmony_ci fm.RegisterFilesystem(ROFS, move(rofs)); 1868bf80f4bSopenharmony_ci // And register it under the needed proxy protocols. 1878bf80f4bSopenharmony_ci fm.RegisterPath(SHADERS, SHADER_PATH, false); 1888bf80f4bSopenharmony_ci fm.RegisterPath(VIDS, VID_PATH, false); 1898bf80f4bSopenharmony_ci fm.RegisterPath(PIDS, PID_PATH, false); 1908bf80f4bSopenharmony_ci fm.RegisterPath(SSTATES, SHADER_STATE_PATH, false); 1918bf80f4bSopenharmony_ci 1928bf80f4bSopenharmony_ci auto& renderDataStoreManager = context.GetRenderDataStoreManager(); 1938bf80f4bSopenharmony_ci renderDataStoreManager.Create(IRenderDataStoreDefaultDotfield::UID, "RenderDataStoreDefaultDotfield"); 1948bf80f4bSopenharmony_ci 1958bf80f4bSopenharmony_ci { 1968bf80f4bSopenharmony_ci IRenderDataStorePod* rsp = 1978bf80f4bSopenharmony_ci static_cast<IRenderDataStorePod*>(renderDataStoreManager.Create(IRenderDataStorePod::UID, "DotfieldPodStore")); 1988bf80f4bSopenharmony_ci if (rsp) { 1998bf80f4bSopenharmony_ci struct { 2008bf80f4bSopenharmony_ci Math::Vec4 texSizeInvTexSize{ 2.f, 2.f, 1.f / 2.f, 1.f / 2.f }; 2018bf80f4bSopenharmony_ci } config; 2028bf80f4bSopenharmony_ci rsp->CreatePod("TexSizeConfig", "TexSizeShaderConfig", arrayviewU8(config)); 2038bf80f4bSopenharmony_ci } 2048bf80f4bSopenharmony_ci } 2058bf80f4bSopenharmony_ci 2068bf80f4bSopenharmony_ci context.GetDevice().GetShaderManager().LoadShaderFiles(SHADER_FILE_PATHS); 2078bf80f4bSopenharmony_ci return &context; 2088bf80f4bSopenharmony_ci} 2098bf80f4bSopenharmony_ci 2108bf80f4bSopenharmony_civoid Uninitialize(PluginToken token) 2118bf80f4bSopenharmony_ci{ 2128bf80f4bSopenharmony_ci auto context = static_cast<IRenderContext*>(token); 2138bf80f4bSopenharmony_ci context->GetDevice().GetShaderManager().UnloadShaderFiles(SHADER_FILE_PATHS); 2148bf80f4bSopenharmony_ci auto& fm = context->GetEngine().GetFileManager(); 2158bf80f4bSopenharmony_ci fm.UnregisterPath(SHADERS, SHADER_PATH); 2168bf80f4bSopenharmony_ci fm.UnregisterPath(VIDS, VID_PATH); 2178bf80f4bSopenharmony_ci fm.UnregisterPath(PIDS, PID_PATH); 2188bf80f4bSopenharmony_ci fm.UnregisterFilesystem(ROFS); 2198bf80f4bSopenharmony_ci} 2208bf80f4bSopenharmony_ci 2218bf80f4bSopenharmony_ciPluginToken InitializeEcs(IEcs&) 2228bf80f4bSopenharmony_ci{ 2238bf80f4bSopenharmony_ci return {}; 2248bf80f4bSopenharmony_ci} 2258bf80f4bSopenharmony_ci 2268bf80f4bSopenharmony_civoid UninitializeEcs(PluginToken) {} 2278bf80f4bSopenharmony_ci 2288bf80f4bSopenharmony_cistatic constexpr IRenderPlugin RENDER_PLUGIN(Initialize, Uninitialize); 2298bf80f4bSopenharmony_ci 2308bf80f4bSopenharmony_cistatic constexpr IEcsPlugin ECS_PLUGIN(InitializeEcs, UninitializeEcs); 2318bf80f4bSopenharmony_ci 2328bf80f4bSopenharmony_ciPluginToken RegisterInterfaces(IPluginRegister& pluginRegistry) 2338bf80f4bSopenharmony_ci{ 2348bf80f4bSopenharmony_ci#if defined(CORE_PLUGIN) && (CORE_PLUGIN == 1) 2358bf80f4bSopenharmony_ci gPluginRegistry = &pluginRegistry; 2368bf80f4bSopenharmony_ci#endif 2378bf80f4bSopenharmony_ci for (const auto& info : gRenderDataStores) { 2388bf80f4bSopenharmony_ci pluginRegistry.RegisterTypeInfo(info); 2398bf80f4bSopenharmony_ci } 2408bf80f4bSopenharmony_ci for (const auto& info : gRenderNodes) { 2418bf80f4bSopenharmony_ci pluginRegistry.RegisterTypeInfo(info); 2428bf80f4bSopenharmony_ci } 2438bf80f4bSopenharmony_ci for (const auto& info : gComponentManagers) { 2448bf80f4bSopenharmony_ci pluginRegistry.RegisterTypeInfo(info); 2458bf80f4bSopenharmony_ci } 2468bf80f4bSopenharmony_ci for (const auto& info : gSystems) { 2478bf80f4bSopenharmony_ci pluginRegistry.RegisterTypeInfo(info); 2488bf80f4bSopenharmony_ci } 2498bf80f4bSopenharmony_ci pluginRegistry.RegisterTypeInfo(RENDER_PLUGIN); 2508bf80f4bSopenharmony_ci pluginRegistry.RegisterTypeInfo(ECS_PLUGIN); 2518bf80f4bSopenharmony_ci return &pluginRegistry; 2528bf80f4bSopenharmony_ci} 2538bf80f4bSopenharmony_ci 2548bf80f4bSopenharmony_civoid UnregisterInterfaces(PluginToken token) 2558bf80f4bSopenharmony_ci{ 2568bf80f4bSopenharmony_ci auto& pluginRegistry = *static_cast<IPluginRegister*>(token); 2578bf80f4bSopenharmony_ci for (const auto& info : gRenderDataStores) { 2588bf80f4bSopenharmony_ci pluginRegistry.UnregisterTypeInfo(info); 2598bf80f4bSopenharmony_ci } 2608bf80f4bSopenharmony_ci for (const auto& info : gRenderNodes) { 2618bf80f4bSopenharmony_ci pluginRegistry.UnregisterTypeInfo(info); 2628bf80f4bSopenharmony_ci } 2638bf80f4bSopenharmony_ci for (const auto& info : gComponentManagers) { 2648bf80f4bSopenharmony_ci pluginRegistry.UnregisterTypeInfo(info); 2658bf80f4bSopenharmony_ci } 2668bf80f4bSopenharmony_ci for (const auto& info : gSystems) { 2678bf80f4bSopenharmony_ci pluginRegistry.UnregisterTypeInfo(info); 2688bf80f4bSopenharmony_ci } 2698bf80f4bSopenharmony_ci pluginRegistry.UnregisterTypeInfo(ECS_PLUGIN); 2708bf80f4bSopenharmony_ci pluginRegistry.UnregisterTypeInfo(RENDER_PLUGIN); 2718bf80f4bSopenharmony_ci} 2728bf80f4bSopenharmony_ci 2738bf80f4bSopenharmony_ci} // namespace Dotfield 2748bf80f4bSopenharmony_ci 2758bf80f4bSopenharmony_ciextern "C" { 2768bf80f4bSopenharmony_ciPLUGIN_DATA(DotfieldPlugin){ 2778bf80f4bSopenharmony_ci { CORE_NS::IPlugin::UID }, 2788bf80f4bSopenharmony_ci "DotfieldPlugin", 2798bf80f4bSopenharmony_ci { Dotfield::UID_DOTFIELD_PLUGIN, Dotfield::GetVersionInfo }, 2808bf80f4bSopenharmony_ci Dotfield::RegisterInterfaces, 2818bf80f4bSopenharmony_ci Dotfield::UnregisterInterfaces, 2828bf80f4bSopenharmony_ci { Dotfield::PLUGIN_DEPENDENCIES }, 2838bf80f4bSopenharmony_ci}; 2848bf80f4bSopenharmony_ci}