• 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_bitmap.h>
22 #include <scene/interface/intf_mesh.h>
23 #include <scene/interface/intf_scene.h>
24 
25 #include <base/containers/unordered_map.h>
26 #ifdef __SCENE_ADAPTER__
27 #include "scene_adapter/intf_scene_adapter.h"
28 #endif
29 #include "BaseObjectJS.h"
30 #include "MeshResourceJS.h"
31 
32 class SceneJS : public BaseObject<SceneJS> {
33 public:
34     static constexpr uint32_t ID = 4;
35     static void Init(napi_env env, napi_value exports);
36     static void RegisterEnums(NapiApi::Object exports);
37 
38     SceneJS(napi_env, napi_callback_info);
39     ~SceneJS() override;
40     void* GetInstanceImpl(uint32_t) override;
41 #ifdef __SCENE_ADAPTER__
42     std::shared_ptr<OHOS::Render3D::ISceneAdapter> scene_ = nullptr;
43 #endif
44 
45     void StoreBitmap(BASE_NS::string_view uri, SCENE_NS::IBitmap::Ptr bitmap);
46     SCENE_NS::IBitmap::Ptr FetchBitmap(BASE_NS::string_view uri);
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     static void AddScene(META_NS::IObjectRegistry* obr, SCENE_NS::IScene::Ptr scene);
56     static void FlushScenes();
57     napi_value Dispose(NapiApi::FunctionContext<>& ctx);
58     void DisposeNative(void*) override;
59     void Finalize(napi_env env) override;
60     // JS properties
61     napi_value GetRoot(NapiApi::FunctionContext<>& ctx);
62 
63     napi_value GetAnimations(NapiApi::FunctionContext<>& ctx);
64 
65     napi_value GetEnvironment(NapiApi::FunctionContext<>& ctx);
66     void SetEnvironment(NapiApi::FunctionContext<NapiApi::Object>& ctx);
67 
68     napi_value GetRenderMode(NapiApi::FunctionContext<>& ctx);
69     void SetRenderMode(NapiApi::FunctionContext<uint32_t>& ctx);
70 
71     // JS methods
72     napi_value GetNode(NapiApi::FunctionContext<BASE_NS::string>& ctx);
73     napi_value GetResourceFactory(NapiApi::FunctionContext<>& ctx);
74 
75     napi_value CreateCamera(NapiApi::FunctionContext<NapiApi::Object>& ctx);
76     napi_value CreateLight(NapiApi::FunctionContext<NapiApi::Object, uint32_t>& ctx);
77     napi_value CreateNode(NapiApi::FunctionContext<NapiApi::Object>& ctx);
78     napi_value CreateTextNode(NapiApi::FunctionContext<NapiApi::Object>& ctx);
79     napi_value CreateEnvironment(NapiApi::FunctionContext<NapiApi::Object>& ctx);
80     napi_value CreateImage(NapiApi::FunctionContext<NapiApi::Object>& ctx);
81     napi_value CreateShader(NapiApi::FunctionContext<NapiApi::Object>& ctx);
82     napi_value CreateMaterial(NapiApi::FunctionContext<NapiApi::Object, uint32_t>& ctx);
83     napi_value CreateScene(NapiApi::FunctionContext<>& ctx);
84 
85     napi_value CreateMeshResource(NapiApi::FunctionContext<NapiApi::Object, NapiApi::Object>& ctx);
86     napi_value CreateGeometry(NapiApi::FunctionContext<NapiApi::Object, NapiApi::Object>& ctx);
87 
88     napi_value ImportNode(NapiApi::FunctionContext<BASE_NS::string, NapiApi::Object, NapiApi::Object>& ctx);
89     napi_value ImportScene(NapiApi::FunctionContext<BASE_NS::string, NapiApi::Object, NapiApi::Object>& ctx);
90 
91     napi_value RenderFrame(NapiApi::FunctionContext<>& ctx);
92 
93     // static js method
94     static napi_value Load(NapiApi::FunctionContext<>& ctx);
95 
96     // make a storage of all bitmaps..
97     CORE_NS::Mutex mutex_;
98     BASE_NS::unordered_map<BASE_NS::string, SCENE_NS::IBitmap::Ptr> bitmaps_;
99     NapiApi::StrongRef environmentJS_;
100     BASE_NS::unordered_map<uintptr_t, NapiApi::StrongRef> strongDisposables_;
101     BASE_NS::unordered_map<uintptr_t, NapiApi::WeakRef> disposables_;
102     napi_env env_;
103 
104 public:
105     NapiApi::Object CreateEnvironment(NapiApi::Object, NapiApi::Object);
106 };
107 #endif
108