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_SRC_SCENE_MANAGER_H
17 #define SCENE_SRC_SCENE_MANAGER_H
18
19 #include <scene/interface/intf_render_context.h>
20 #include <scene/interface/intf_scene_manager.h>
21
22 #include <meta/ext/object_container.h>
23
SCENE_BEGIN_NAMESPACE()24 SCENE_BEGIN_NAMESPACE()
25
26 class SceneManager : public META_NS::IntroduceInterfaces<META_NS::CommonObjectContainerFwd, ISceneManager> {
27 META_OBJECT(SceneManager, ClassId::SceneManager, IntroduceInterfaces, META_NS::ClassId::ObjectContainer)
28 public:
29 bool Build(const META_NS::IMetadata::Ptr&) override;
30
31 /**
32 * @brief Create an empty scene with default options
33 * @return Null scene pointer if creation failed
34 */
35 Future<IScene::Ptr> CreateScene() override;
36 /**
37 * @brief Create an empty scene
38 * @param opts Options for creation
39 * @return Null scene pointer if creation failed
40 */
41 Future<IScene::Ptr> CreateScene(SceneOptions opts) override;
42 /**
43 * @brief Load scene from a file. Multiple formats are supported
44 * @param uri Location of the scene file, for example file://myscene.gltf or file://myscene.scene
45 * @return Null scene pointer if creation failed
46 * @note Supports 2 types of .scene files. First tries with older loader. If that fails, then newer one with index
47 */
48 Future<IScene::Ptr> CreateScene(BASE_NS::string_view uri) override;
49 /**
50 * @brief Load scene from a file. Multiple formats are supported
51 * @param uri Location of the scene file, for example file://myscene.gltf or file://myscene.scene
52 * @param opts Options for creation
53 * @return Null scene pointer if creation failed
54 * @note Supports 2 types of .scene files. First tries with older loader. If that fails, then newer one with index
55 */
56 Future<IScene::Ptr> CreateScene(BASE_NS::string_view uri, SceneOptions opts) override;
57
58 IRenderContext::Ptr GetContext() const override
59 {
60 return context_;
61 }
62
63 private:
64 META_NS::IMetadata::Ptr CreateContext(SceneOptions opts) const;
65
66 // Load a scene by using an index file. See GuessIndexFilePath
67 static IScene::Ptr LoadSceneWithIndex(const IRenderContext::Ptr& context, BASE_NS::string_view uri);
68
69 static void LoadDefaultResourcesIfNeeded(const CORE_NS::IResourceManager::Ptr& resources);
70
71 enum class ProjectPathAction { REGISTER, UNREGISTER };
72 // Register/unregister the given uri with the file manager
73 static bool SetProjectPath(
74 const IRenderContext::Ptr& renderContext, BASE_NS::string_view uri, ProjectPathAction action);
75
76 // GuessIndexFilePath("schema://default.scene2") == "schema://default.res"
77 static BASE_NS::string GuessIndexFilePath(BASE_NS::string_view uri);
78
79 // GuessProjectPath("schema://path/to/PROJECT/assets/default.scene2") == "schema://path/to/PROJECT"
80 static BASE_NS::string GuessProjectPath(BASE_NS::string_view uri);
81
82 private:
83 IRenderContext::Ptr context_;
84 SceneOptions opts_;
85 };
86
87 SCENE_END_NAMESPACE()
88
89 #endif
90