A 3D game engine from scratch.
1// (c) 2020 Vlad-Stefan Harbuz <vlad@vladh.net>
2
3#include "entities.hpp"
4#include "engine.hpp"
5
6
7entities::State *entities::state = nullptr;
8
9
10entities::Handle
11entities::make_handle()
12{
13 if (entities::state->next_handle == NO_ENTITY_HANDLE) {
14 entities::state->next_handle++;
15 }
16 return entities::state->next_handle++;
17}
18
19
20entities::Entity *
21entities::add_entity_to_set(char const *debug_name)
22{
23 Handle new_handle = make_handle();
24 Entity *new_entity = get_entity(new_handle);
25 new_entity->handle = new_handle;
26 strcpy(new_entity->debug_name, debug_name);
27 return new_entity;
28}
29
30
31void
32entities::mark_first_non_internal_handle()
33{
34 entities::state->first_non_internal_handle = entities::state->next_handle;
35}
36
37
38entities::Handle
39entities::get_first_non_internal_handle()
40{
41 return entities::state->first_non_internal_handle;
42}
43
44
45void
46entities::destroy_non_internal_entities()
47{
48 for (
49 u32 idx = entities::state->first_non_internal_handle;
50 idx < entities::state->entities.length;
51 idx++
52 ) {
53 drawable::destroy_component(drawable::get_component(idx));
54 }
55
56 entities::state->next_handle = entities::state->first_non_internal_handle;
57
58 entities::state->entities.delete_elements_after_index(
59 entities::state->first_non_internal_handle);
60
61 lights::get_components()->delete_elements_after_index(
62 entities::state->first_non_internal_handle);
63 spatial::get_components()->delete_elements_after_index(
64 entities::state->first_non_internal_handle);
65 drawable::get_components()->delete_elements_after_index(
66 entities::state->first_non_internal_handle);
67 behavior::get_components()->delete_elements_after_index(
68 entities::state->first_non_internal_handle);
69 anim::get_components()->delete_elements_after_index(
70 entities::state->first_non_internal_handle);
71}
72
73
74u32
75entities::get_n_entities()
76{
77 return entities::state->entities.length;
78}
79
80
81Array<entities::Entity> *
82entities::get_entities()
83{
84 return &entities::state->entities;
85}
86
87
88entities::Entity *
89entities::get_entity(entities::Handle entity_handle)
90{
91 return entities::state->entities[entity_handle];
92}
93
94
95void
96entities::init(entities::State *entities_state, memory::Pool *asset_memory_pool)
97{
98 entities::state = entities_state;
99 entities::state->entities = Array<entities::Entity>(
100 asset_memory_pool, MAX_N_ENTITIES, "entities", true, 1);
101}