]> git.tdb.fi Git - libs/gl.git/blob - source/render/scene.cpp
Redesign InstanceArray
[libs/gl.git] / source / render / scene.cpp
1 #include <msp/datafile/collection.h>
2 #include <msp/fs/utils.h>
3 #include <msp/strings/format.h>
4 #include "camera.h"
5 #include "objectinstance.h"
6 #include "occludedscene.h"
7 #include "orderedscene.h"
8 #include "renderer.h"
9 #include "scene.h"
10 #include "simplescene.h"
11 #include "zsortedscene.h"
12
13 using namespace std;
14
15 namespace Msp {
16 namespace GL {
17
18 Scene::GenericLoader::TypeRegistry &Scene::get_scene_registry()
19 {
20         static Scene::GenericLoader::TypeRegistry registry;
21         static bool initialized = false;
22         if(!initialized)
23         {
24                 initialized = true;
25                 register_type<SimpleScene>("simple");
26                 register_type<ZSortedScene>("zsorted");
27                 register_type<OrderedScene>("ordered");
28                 register_type<OccludedScene>("occluded");
29         }
30         return registry;
31 }
32
33
34 unsigned Scene::Loader::inline_counter = 0;
35
36 Scene::Loader::Loader(Scene &s, Collection &c, ContentMap *m):
37         DataFile::CollectionObjectLoader<Scene>(s, &c),
38         content(m)
39 {
40         add("object", &Loader::object);
41         add("object", &Loader::object_tagged);
42         add("scene", &Loader::scene);
43         add("scene", &Loader::scene_inline);
44 }
45
46 void Scene::Loader::object(const string &n)
47 {
48         object_tagged(n, string());
49 }
50
51 void Scene::Loader::object_tagged(const string &n, const string &t)
52 {
53         RefPtr<ObjectInstance> inst = new ObjectInstance(get_collection().get<GL::Object>(n));
54         load_sub(*inst);
55         get_collection().add(format("_scene_object_%d.inst", ++inline_counter), inst.get());
56         if(content && !t.empty())
57                 (*content)[t] = inst.get();
58         obj.add(*inst.release());
59 }
60
61 void Scene::Loader::scene(const string &n)
62 {
63         obj.add(get_collection().get<Scene>(n));
64 }
65
66 void Scene::Loader::scene_inline()
67 {
68         GenericLoader ldr(get_collection());
69         load_sub_with(ldr);
70         Scene *scene = ldr.store_object(get_collection(), format("_scene_%d.scene", ++inline_counter));
71         obj.add(*scene);
72 }
73
74 } // namespace GL
75 } // namespace Msp