• 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_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