Subastra
Loading...
Searching...
No Matches
entity.h
Go to the documentation of this file.
1#ifndef __H__ENGINE_ENTITY__
2#define __H__ENGINE_ENTITY__
3
4#include "../defs.h"
5#include "../mat4.h"
6#include "../rendering/context.h"
7#include "../rendering/instances.h"
8#include "../vec2i.h"
9#include "construct.h"
10
12
13#define ENTITY_ID_IDENTITY_MASK ((entity_id_t)0x000FFFFFFFFFFFFF)
14
16 u64 mask = ~ENTITY_ID_IDENTITY_MASK;
17 return (id & mask) >> __builtin_ctzl(mask);
18}
19
23
24static u64 entity_id_new(u32 gen, u64 id) {
25 u32 generation = gen % (~ENTITY_ID_IDENTITY_MASK >>
26 __builtin_ctzl(~ENTITY_ID_IDENTITY_MASK));
27 u64 identity = id & ENTITY_ID_IDENTITY_MASK;
28
29 return ((u64)generation << __builtin_ctzl(~ENTITY_ID_IDENTITY_MASK)) |
30 identity;
31}
32
40
42
43typedef struct entity_t {
46
47 // The position relative to the parent chunk
48 // 0,0 for child entitites
51
52 union {
54 struct {
56 float scale;
58 };
60
61static void entity_init_construct(entity_t *entity, allocator_t alloc,
62 vec2i chunk_relative, vec2 chunk_local) {
64 entity->chunk_relative_position = chunk_relative;
65 entity->chunk_local_position = chunk_local;
66
67 construct_init(&entity->as_construct, alloc);
68}
69
71 block_t block) {
73 block.offset = at;
74 list_push_var(&entity->as_construct.blocks, block);
75 entity->as_construct.is_dirty = true;
76}
77
78static void entity_init_camera(entity_t *entity, allocator_t alloc,
79 vec2i chunk_relative, vec2 chunk_local,
80 float scale) {
81 entity->kind = ENTITY_KIND_CAMERA;
82 entity->chunk_relative_position = chunk_relative;
83 entity->chunk_local_position = chunk_local;
84
85 entity->as_camera.scale = scale;
86}
87
89 const entity_t *entity) {
91
92 float scale = entity->as_camera.scale;
93 float ar = scale * (float)ctx->width / (float)ctx->height;
94 float left = -ar, right = ar;
95 float bottom = -scale, top = scale;
96
97 vec2 v = entity->chunk_local_position;
98
99 mat4 mat = mat4_zero();
100 float data[16] = {
101 2.f / (right - left),
102 0,
103 0,
104 0,
105 0,
106 2.f / (top - bottom),
107 0,
108 0,
109 0,
110 0,
111 -1,
112 0,
113 (-(right + left) - 2.f * v.x) / (right - left),
114 (-(top + bottom) - 2.f * v.y) / (top - bottom),
115 0,
116 1,
117 };
118
119 memcpy(&mat.data, data, sizeof data);
120
121 return mat;
122}
123
124#endif
uint64_t u64
Definition defs.h:46
#define ASSERT__(expr)
Definition defs.h:21
uint32_t u32
Definition defs.h:45
static void construct_init(construct_t *construct, allocator_t alloc)
Definition construct.h:73
entity_kind_t
Definition entity.h:33
@ ENTITY_KIND_count
Definition entity.h:38
@ ENTITY_KIND_CONSTRUCT
Definition entity.h:36
@ ENTITY_KIND_MASK_EMPTY
Definition entity.h:34
@ ENTITY_KIND_CAMERA
Definition entity.h:37
@ ENTITY_KIND_TOMBSTONE
Definition entity.h:35
static void entity_construct_add_block(entity_t *entity, vec2i at, block_t block)
Definition entity.h:70
static mat4 entity_camera_calculate_projection(const rendering_ctx_t *ctx, const entity_t *entity)
Definition entity.h:88
static void entity_init_construct(entity_t *entity, allocator_t alloc, vec2i chunk_relative, vec2 chunk_local)
Definition entity.h:61
u64 entity_id_t
Definition entity.h:11
static u64 entity_id_new(u32 gen, u64 id)
Definition entity.h:24
static u64 entity_id_get_identity(entity_id_t id)
Definition entity.h:20
#define ENTITY_ID_IDENTITY_MASK
Definition entity.h:13
static u32 entity_id_get_generation(entity_id_t id)
Definition entity.h:15
entity_kind_t entity_kind_mask_t
Definition entity.h:41
static void entity_init_camera(entity_t *entity, allocator_t alloc, vec2i chunk_relative, vec2 chunk_local, float scale)
Definition entity.h:78
#define list_push_var(ls, var)
Definition list.h:83
static mat4 mat4_zero()
Definition mat4.h:11
A generic allocator type passed by value. Contains a fallback allocator and a set of function pointer...
Definition memory.h:30
Definition construct.h:36
vec2i offset
Definition construct.h:38
Definition construct.h:64
list_t blocks
Definition construct.h:65
bool is_dirty
Definition construct.h:68
Definition entity.h:43
entity_id_t self_id
Definition entity.h:45
float scale
Definition entity.h:56
vec2i chunk_relative_position
Definition entity.h:49
construct_t as_construct
Definition entity.h:53
entity_id_t target
Definition entity.h:55
entity_kind_t kind
Definition entity.h:44
vec2 chunk_local_position
Definition entity.h:50
struct entity_t::@4::@6 as_camera
Definition mat4.h:7
float data[16]
Definition mat4.h:8
Definition context.h:11
i32 height
Definition context.h:12
i32 width
Definition context.h:12
Definition vec2.h:11
float y
Definition vec2.h:12
float x
Definition vec2.h:12
Definition vec2i.h:7