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

#include "model.hpp"

#include <mirrage/ecs/component.hpp>


8
namespace mirrage::renderer {
9

10
11
12
13
14
	// 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.


15
16
17
18
19
20
21
22
23
24
25
26
	class Material_property_comp : public ecs::Component<Material_property_comp> {
	  public:
		static constexpr const char* name() { return "Material_property"; }

		Material_property_comp() = default;
		Material_property_comp(ecs::Entity_handle owner, ecs::Entity_manager& em) : Component(owner, em) {}

		glm::vec3 emissive_color = glm::vec3(200, 200, 200);
	};
	sf2_structDef(Material_property_comp, emissive_color);


27
	class Model_comp : public ecs::Component<Model_comp> {
28
29
30
	  public:
		static constexpr const char* name() { return "Model_loaded"; }
		static constexpr const char* name_save_as() { return "Model"; }
31
32
		friend void                  load_component(ecs::Deserializer& state, Model_comp&);
		friend void                  save_component(ecs::Serializer& state, const Model_comp&);
33
34

		Model_comp() = default;
Florian Oetke's avatar
Florian Oetke committed
35
36
		Model_comp(ecs::Entity_handle owner, ecs::Entity_manager& em, Model_ptr model = {})
		  : Component(owner, em), _model(std::move(model))
37
38
		{
		}
39

40
		auto model_aid() const -> auto& { return _model.aid(); }
41
42
43
44
		auto model() const -> auto& { return _model; }
		void model(Model_ptr model) { _model = std::move(model); }

	  private:
45
		Model_ptr _model;
46
47
	};

48
	class Model_unloaded_comp : public ecs::Component<Model_unloaded_comp> {
49
50
	  public:
		static constexpr const char* name() { return "Model"; }
51
52
		friend void                  load_component(ecs::Deserializer& state, Model_unloaded_comp&);
		friend void                  save_component(ecs::Serializer& state, const Model_unloaded_comp&);
53

54
		Model_unloaded_comp() = default;
Florian Oetke's avatar
Florian Oetke committed
55
56
		Model_unloaded_comp(ecs::Entity_handle owner, ecs::Entity_manager& em, asset::AID model_aid = {})
		  : Component(owner, em), _model_aid(std::move(model_aid))
57
58
		{
		}
59

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

62
63
	  private:
		asset::AID _model_aid;
64
65
66
	};

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

		Model_loading_comp() = default;
Florian Oetke's avatar
Florian Oetke committed
74
75
		Model_loading_comp(ecs::Entity_handle owner, ecs::Entity_manager& em, Model_ptr model = {})
		  : Component(owner, em), _model(std::move(model))
76
77
		{
		}
78

79
		auto model_aid() const -> auto& { return _model.aid(); }
80
81
82
83
		auto model() const -> auto& { return _model; }
		auto model() -> auto& { return _model; }

	  private:
84
		Model_ptr _model;
85
	};
86
} // namespace mirrage::renderer