model_comp.hpp 2.77 KB
Newer Older
1
2
3
4
5
6
#pragma once

#include "model.hpp"

#include <mirrage/ecs/component.hpp>

7
8
#include <future>

9

10
namespace mirrage {
11
12
namespace renderer {

13
14
15
16
17
	// model components are intially loaded as Model_unloaded_comp, replaced by Model_loading_comp
	//   once the loading of the model data has begun and finally replaced by Model_comp afterwards.
	// Client code should only care about the Model_comp class as it represents an actually usable model.


18
19
	class Model_comp : public ecs::Component<Model_comp> {
		public:
20
21
			static constexpr const char* name() {return "Model_loaded";}
			static constexpr const char* name_save_as() {return "Model";}
22
23
24
25
			friend void load_component(ecs::Deserializer& state, Model_comp&);
			friend void save_component(ecs::Serializer& state, const Model_comp&);

			Model_comp() = default;
26
27
28
29
30
			Model_comp(ecs::Entity_manager& manager, ecs::Entity_handle owner,
			           asset::AID model_aid={}, Model_ptr  model={})
			    : Component(manager, owner)
			    , _model_aid(std::move(model_aid))
			    , _model(std::move(model)) {}
31
32
33
34
35
36
37
38
39
40
41
42

			auto model_aid()const -> auto& {return _model_aid;}
			auto model()const -> auto& {return _model;}
			void model(Model_ptr model) {
				_model = std::move(model);
			}

		private:
			asset::AID _model_aid;
			Model_ptr  _model;
	};

43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
	class Model_unloaded_comp : public ecs::Component<Model_unloaded_comp> {
		public:
			static constexpr const char* name() {return "Model";}
			friend void load_component(ecs::Deserializer& state, Model_unloaded_comp&);
			friend void save_component(ecs::Serializer& state, const Model_unloaded_comp&);

			Model_unloaded_comp() = default;
			Model_unloaded_comp(ecs::Entity_manager& manager, ecs::Entity_handle owner,
			                    asset::AID model_aid={})
			    : Component(manager, owner), _model_aid(std::move(model_aid)) {}

			auto model_aid()const -> auto& {return _model_aid;}

		private:
			asset::AID _model_aid;
	};

	class Model_loading_comp : public ecs::Component<Model_loading_comp> {
		public:
			static constexpr const char* name() {return "Model_loading";}
			static constexpr const char* name_save_as() {return "Model";}
			friend void load_component(ecs::Deserializer& state, Model_loading_comp&);
			friend void save_component(ecs::Serializer& state, const Model_loading_comp&);

			Model_loading_comp() = default;
			Model_loading_comp(ecs::Entity_manager& manager, ecs::Entity_handle owner,
69
                               asset::AID model_aid={}, future<Model_ptr> model={})
70
71
72
73
74
			    : Component(manager, owner), _model_aid(std::move(model_aid))
			    , _model(std::move(model)) {}

			auto model_aid()const -> auto& {return _model_aid;}
			auto model()const -> auto& {return _model;}
75
            auto model() -> auto& {return _model;}
76
77
78

		private:
			asset::AID _model_aid;
79
            future<Model_ptr> _model;
80
81
	};

82
83
}
}