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