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}