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