Subastra
Loading...
Searching...
No Matches
require.h
Go to the documentation of this file.
1#ifndef __H__SYSTEMS_REQUIRE__
2#define __H__SYSTEMS_REQUIRE__
3
4#include "../engine/entity.h"
5#include "../engine/input.h"
6#include "../engine/world.h"
7#include "../names.h"
8#include "../rendering/context.h"
9
20
21static const char *system_phase_to_str(system_phase_t phase) {
22 switch (phase) {
24 return "PRE_UPDATE";
26 return "UPDATE";
28 return "FIXED_UPDATE";
30 return "POST_UPDATE";
32 return "PRE_RENDER";
34 return "RENDER";
36 return "RENDER";
37 default:
38 return 0;
39 }
40}
41
44#define SYSTEM_REQ_PTR_REQUIRED ((void *)1)
47#define SYSTEM_REQ_PTR_UNUSED ((void *)0)
48
49#define SYSTEM_REQ_NO_DEPS 0, 0
50
63
64typedef void (*system_runner_f)(system_payload_t payload,
65 allocator_t temporary_allocator);
66
73
88
104
106 rendering_ctx_t *rendering_ctx,
107 double dt, double fdt) {
108 system_payload_t ret = {};
109
110 ret.system_specific_data = 0;
111 ret._entity_kinds_const = 0;
112 ret._entity_kinds_mut = 0;
113
114 ret.world = world;
115 ret.input = input;
116 ret.rendering_ctx = rendering_ctx;
117
118 ret.delta_time = dt;
119 ret.fixed_delta_time = fdt;
120
121 return ret;
122}
123
128 system_payload_t *parent) {
129 bool needs_system_specific_ptr =
131 ASSERT__(needs_system_specific_ptr ^ (parent->system_specific_data == 0));
132
133 system_payload_t ret = {};
134
135 if (parent == 0)
136 return ret;
137
138 if (requirements.resources & SYSTEM_RESOURCE_MASK_WORLD ||
139 requirements._entity_kinds_const || requirements._entity_kinds_mut) {
140 ASSERT__(parent->world);
141 ret.world = parent->world;
142 }
143
144 if (requirements.resources & SYSTEM_RESOURCE_MASK_INPUT) {
145 ASSERT__(parent->input);
146 ret.input = parent->input;
147 }
148
150 ASSERT__(parent->rendering_ctx);
151 ret.rendering_ctx = parent->rendering_ctx;
152 }
153
155 ASSERT__(requirements.system_specific_data);
157 }
158
159 ASSERT__(__builtin_popcount(parent->_entity_kinds_mut) <=
160 __builtin_popcount(parent->_entity_kinds_const));
161
163 parent->_entity_kinds_const | parent->_entity_kinds_mut;
165
166 return ret;
167}
168
170 system_resource_mask_t resources) {
171 system_req_t ret;
172
175
176 ret.depends_on = 0;
177 ret.depends_on_count = 0;
178
179 ret.pin_to_main = false;
180
181 ret.name = name;
182 ret.resources = resources;
183 ret.system_specific_data = 0;
184
185 return ret;
186}
187
189 entity_kind_mask_t entity_kind_mask) {
191 (entity_kind_mask_t)((int)req->_entity_kinds_mut | (int)entity_kind_mask);
192}
193
195 entity_kind_mask_t entity_kind_mask) {
196 req->_entity_kinds_mut =
197 (entity_kind_mask_t)((int)req->_entity_kinds_mut | (int)entity_kind_mask);
198 system_req_entity_kinds_const(req, entity_kind_mask);
199}
200
202 ASSERT_(payload->world,
203 "World must be requested to retrieve the entity iterator");
204
206 payload->world, (entity_kind_mask_t)((u32)payload->_entity_kinds_const |
207 (u32)payload->_entity_kinds_mut));
208
209 return iter;
210}
211
212#endif
#define ASSERT__(expr)
Definition defs.h:21
#define ASSERT_(expr, msg)
Definition defs.h:29
uint32_t u32
Definition defs.h:45
entity_kind_t
Definition entity.h:33
entity_kind_t entity_kind_mask_t
Definition entity.h:41
u64 name_t
Definition names.h:14
static entity_iter_t system_payload_entity_iter(system_payload_t *payload)
Definition require.h:201
static void system_req_entity_kinds_mut(system_req_t *req, entity_kind_mask_t entity_kind_mask)
Definition require.h:194
static system_payload_t system_payload_new_inherit(system_req_t requirements, system_payload_t *parent)
Copy the parameters specified in the requirements into a new payload.
Definition require.h:127
void(* system_runner_f)(system_payload_t payload, allocator_t temporary_allocator)
Definition require.h:64
static const char * system_phase_to_str(system_phase_t phase)
Definition require.h:21
static system_payload_t system_payload_new(world_t *world, input_t *input, rendering_ctx_t *rendering_ctx, double dt, double fdt)
Definition require.h:105
static void system_req_entity_kinds_const(system_req_t *req, entity_kind_mask_t entity_kind_mask)
Definition require.h:188
system_resource_mask_t
Definition require.h:67
@ SYSTEM_RESOURCE_MASK_WORLD
Definition require.h:68
@ SYSTEM_RESOURCE_MASK_SYSTEM_SPECIFIC_DATA
Definition require.h:71
@ SYSTEM_RESOURCE_MASK_RENDERING_CONTEXT
Definition require.h:70
@ SYSTEM_RESOURCE_MASK_INPUT
Definition require.h:69
system_phase_t
Definition require.h:10
@ SYSTEM_PHASE_UPDATE
Definition require.h:12
@ SYSTEM_PHASE_count
Definition require.h:18
@ SYSTEM_PHASE_POST_UPDATE
Definition require.h:14
@ SYSTEM_PHASE_PRE_RENDER
Definition require.h:15
@ SYSTEM_PHASE_RENDER
Definition require.h:16
@ SYSTEM_PHASE_POST_RENDER
Definition require.h:17
@ SYSTEM_PHASE_FIXED_UPDATE
Definition require.h:13
@ SYSTEM_PHASE_PRE_UPDATE
Definition require.h:11
static system_req_t system_req_new(name_t name, system_resource_mask_t resources)
Definition require.h:169
A generic allocator type passed by value. Contains a fallback allocator and a set of function pointer...
Definition memory.h:30
Definition world.h:111
Definition input.h:10
Definition context.h:11
Definition require.h:51
double fixed_delta_time
Definition require.h:61
input_t * input
Definition require.h:54
entity_kind_mask_t _entity_kinds_const
Definition require.h:58
void * system_specific_data
Definition require.h:52
entity_kind_mask_t _entity_kinds_mut
Definition require.h:57
double delta_time
Definition require.h:60
rendering_ctx_t * rendering_ctx
Definition require.h:55
world_t * world
Definition require.h:53
Definition require.h:74
system_resource_mask_t resources
Definition require.h:83
name_t name
Definition require.h:76
entity_kind_mask_t _entity_kinds_const
Definition require.h:78
system_phase_t phase
Definition require.h:75
u32 depends_on_count
Definition require.h:81
void * system_specific_data
Definition require.h:84
entity_kind_mask_t _entity_kinds_mut
Definition require.h:77
name_t * depends_on
Definition require.h:80
bool pin_to_main
Definition require.h:86
Definition require.h:89
system_resource_mask_t resources
Definition require.h:99
entity_kind_mask_t entities_mut
Definition require.h:94
system_phase_t phase
Definition require.h:91
const char ** dependencies
Definition require.h:96
entity_kind_mask_t entities_const
Definition require.h:93
const char * name
Definition require.h:90
system_runner_f runner
Definition require.h:102
u32 dependency_count
Definition require.h:97
bool pin_to_main
Definition require.h:100
Definition world.h:12
static world_t world
Definition world.c:5
static entity_iter_t world_entity_iter_masked(world_t *world, entity_kind_mask_t mask)
Definition world.h:127