• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 #ifndef SCENE_JS_H
17 #define SCENE_JS_H
18 #include <meta/api/threading/mutex.h>
19 #include <meta/interface/animation/intf_animation.h>
20 #include <meta/interface/intf_object.h>
21 #include <scene/interface/intf_mesh.h>
22 #include <scene/interface/intf_scene.h>
23 #include <scene/interface/intf_scene_manager.h>
24 #include <scene/interface/resource/intf_render_resource_manager.h>
25 
26 #include <base/containers/unordered_map.h>
27 #ifdef __SCENE_ADAPTER__
28 #include "scene_adapter/intf_scene_adapter.h"
29 #endif
30 #include "BaseObjectJS.h"
31 #include "DisposeContainer.h"
32 #include "MeshResourceJS.h"
33 #include "RenderContextJS.h"
34 
35 class SceneJS : public BaseObject {
36 public:
37     static constexpr uint32_t ID = 4;
38     static void Init(napi_env env, napi_value exports);
39     static void RegisterEnums(NapiApi::Object exports);
40 
41     SceneJS(napi_env, napi_callback_info);
42     ~SceneJS() override;
43     void* GetInstanceImpl(uint32_t) override;
44 #ifdef __SCENE_ADAPTER__
45     std::shared_ptr<OHOS::Render3D::ISceneAdapter> scene_ = nullptr;
46 #endif
47 
48     void DisposeHook(uintptr_t token, NapiApi::Object);
49     void ReleaseDispose(uintptr_t token);
50 
51     void StrongDisposeHook(uintptr_t token, NapiApi::Object);
52     void ReleaseStrongDispose(uintptr_t token);
53 
54 private:
55     // Helpers
56     static void AddScene(META_NS::IObjectRegistry* obr, SCENE_NS::IScene::Ptr scene);
57     static void FlushScenes();
58     napi_value Dispose(NapiApi::FunctionContext<>& ctx);
59     void DisposeNative(void*) override;
60     void Finalize(napi_env env) override;
61     // Helper for different Node types.
62     napi_value CreateNode(
63         const NapiApi::FunctionContext<>& ctx, BASE_NS::string_view jsClassName, META_NS::ObjectId classId);
64 
65     // JS properties
66     napi_value GetRoot(NapiApi::FunctionContext<>& ctx);
67 
68     napi_value GetAnimations(NapiApi::FunctionContext<>& ctx);
69 
70     napi_value GetEnvironment(NapiApi::FunctionContext<>& ctx);
71     void SetEnvironment(NapiApi::FunctionContext<NapiApi::Object>& ctx);
72 
73     napi_value GetRenderMode(NapiApi::FunctionContext<>& ctx);
74     void SetRenderMode(NapiApi::FunctionContext<uint32_t>& ctx);
75 
76     // JS methods
77     napi_value GetNode(NapiApi::FunctionContext<BASE_NS::string>& ctx);
78     napi_value GetResourceFactory(NapiApi::FunctionContext<>& ctx);
79 
80     napi_value CreateCamera(NapiApi::FunctionContext<NapiApi::Object>& ctx);
81     napi_value CreateLight(NapiApi::FunctionContext<NapiApi::Object, uint32_t>& ctx);
82     napi_value CreateNode(NapiApi::FunctionContext<NapiApi::Object>& ctx);
83     napi_value CreateTextNode(NapiApi::FunctionContext<NapiApi::Object>& ctx);
84     napi_value CreateEnvironment(NapiApi::FunctionContext<NapiApi::Object>& ctx);
85     napi_value CreateImage(NapiApi::FunctionContext<NapiApi::Object>& ctx);
86 
87     napi_value CreateShader(NapiApi::FunctionContext<NapiApi::Object>& ctx);
88     napi_value CreateMaterial(NapiApi::FunctionContext<NapiApi::Object, uint32_t>& ctx);
89     napi_value CreateScene(NapiApi::FunctionContext<>& ctx);
90     napi_value CreateSampler(NapiApi::FunctionContext<NapiApi::Object>& ctx);
91     napi_value CreateMeshResource(NapiApi::FunctionContext<NapiApi::Object, NapiApi::Object>& ctx);
92     napi_value CreateGeometry(NapiApi::FunctionContext<NapiApi::Object, NapiApi::Object>& ctx);
93 
94     napi_value ImportNode(NapiApi::FunctionContext<BASE_NS::string, NapiApi::Object, NapiApi::Object>& ctx);
95     napi_value ImportScene(NapiApi::FunctionContext<BASE_NS::string, NapiApi::Object, NapiApi::Object>& ctx);
96 
97     napi_value RenderFrame(NapiApi::FunctionContext<>& ctx);
98 
99     napi_value CreateComponent(NapiApi::FunctionContext<NapiApi::Object, BASE_NS::string>& ctx);
100     napi_value GetComponent(NapiApi::FunctionContext<NapiApi::Object, BASE_NS::string>& ctx);
101     napi_value GetRenderContext(NapiApi::FunctionContext<>& ctx);
102 
103     // static js method
104     static napi_value Load(NapiApi::FunctionContext<>& ctx);
105     // Based on the file extension, supply the scene manager a file resource manager to handle loading.
106     static SCENE_NS::ISceneManager::Ptr CreateSceneManager(BASE_NS::string_view uri);
107     static BASE_NS::string_view ExtractPathToProject(BASE_NS::string_view uri);
108 
109     // make a storage of all bitmaps..
110     CORE_NS::Mutex mutex_;
111     NapiApi::StrongRef renderContextJS_;
112     BASE_NS::shared_ptr<RenderResources> resources_;
113     NapiApi::StrongRef environmentJS_;
114     BASE_NS::unordered_map<uintptr_t, NapiApi::StrongRef> strongDisposables_;
115     BASE_NS::unordered_map<uintptr_t, NapiApi::WeakRef> disposables_;
116     napi_env env_;
117     SCENE_NS::IRenderResourceManager::Ptr renderMan_;
118     bool currentAlwaysRender_ = true;
119 
120 public:
121     NapiApi::Object CreateEnvironment(NapiApi::Object, NapiApi::Object);
122 };
123 #endif
124