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#define CONSTRUCT_MAXIMUM_COMPONENTS 255
15
17 u64 mask = ~ENTITY_ID_IDENTITY_MASK;
18 return (id & mask) >> __builtin_ctzl(mask);
19}
20
24
25static u64 entity_id_new(u32 gen, u64 id) {
26 u32 generation = gen % (~ENTITY_ID_IDENTITY_MASK >>
27 __builtin_ctzl(~ENTITY_ID_IDENTITY_MASK));
28 u64 identity = id & ENTITY_ID_IDENTITY_MASK;
29
30 return ((u64)generation << __builtin_ctzl(~ENTITY_ID_IDENTITY_MASK)) |
31 identity;
32}
33
41
43
44typedef struct entity_t {
47
48 // The position relative to the parent chunk
49 // 0,0 for child entitites
52
53 union {
55 struct {
57 float scale;
59 };
61
62static void entity_init_construct(entity_t *entity, allocator_t alloc,
63 vec2i chunk_relative, vec2 chunk_local) {
65 entity->chunk_relative_position = chunk_relative;
66 entity->chunk_local_position = chunk_local;
67
68 list_init_ty(block_t, &entity->as_construct.blocks, alloc);
71 map_init_ty(vec2i, &entity->as_construct.device_map, alloc);
72 entity->as_construct.is_dirty = false;
74}
75
77 block_t block) {
78 block.offset = at;
79 list_push_var(&entity->as_construct.blocks, block);
80 entity->as_construct.is_dirty = true;
81}
82
83static void entity_init_camera(entity_t *entity, allocator_t alloc,
84 vec2i chunk_relative, vec2 chunk_local,
85 float scale) {
86 entity->kind = ENTITY_KIND_CAMERA;
87 entity->chunk_relative_position = chunk_relative;
88 entity->chunk_local_position = chunk_local;
89
90 entity->as_camera.scale = scale;
91}
92
94 const entity_t *entity) {
96
97 float scale = entity->as_camera.scale;
98 float ar = scale * (float)ctx->width / (float)ctx->height;
99 float left = -ar, right = ar;
100 float bottom = -scale, top = scale;
101
102 vec2 v = entity->chunk_local_position;
103
104 mat4 mat = mat4_zero();
105 float data[16] = {
106 2.f / (right - left),
107 0,
108 0,
109 0,
110 0,
111 2.f / (top - bottom),
112 0,
113 0,
114 0,
115 0,
116 -1,
117 0,
118 (-(right + left) - 2.f * v.x) / (right - left),
119 (-(top + bottom) - 2.f * v.y) / (top - bottom),
120 0,
121 1,
122 };
123
124 memcpy(&mat.data, data, sizeof data);
125
126 return mat;
127}
128
129#endif
uint64_t u64
Definition defs.h:46
#define ASSERT__(expr)
Definition defs.h:21
uint32_t u32
Definition defs.h:45
#define CONSTRUCT_MAXIMUM_COMPONENTS
Definition entity.h:14
entity_kind_t
Definition entity.h:34
@ ENTITY_KIND_count
Definition entity.h:39
@ ENTITY_KIND_CONSTRUCT
Definition entity.h:37
@ ENTITY_KIND_MASK_EMPTY
Definition entity.h:35
@ ENTITY_KIND_CAMERA
Definition entity.h:38
@ ENTITY_KIND_TOMBSTONE
Definition entity.h:36
static void entity_construct_add_block(entity_t *entity, vec2i at, block_t block)
Definition entity.h:76
static mat4 entity_camera_calculate_projection(const rendering_ctx_t *ctx, const entity_t *entity)
Definition entity.h:93
static void entity_init_construct(entity_t *entity, allocator_t alloc, vec2i chunk_relative, vec2 chunk_local)
Definition entity.h:62
u64 entity_id_t
Definition entity.h:11
static u64 entity_id_new(u32 gen, u64 id)
Definition entity.h:25
static u64 entity_id_get_identity(entity_id_t id)
Definition entity.h:21
#define ENTITY_ID_IDENTITY_MASK
Definition entity.h:13
static u32 entity_id_get_generation(entity_id_t id)
Definition entity.h:16
entity_kind_t entity_kind_mask_t
Definition entity.h:42
static void entity_init_camera(entity_t *entity, allocator_t alloc, vec2i chunk_relative, vec2 chunk_local, float scale)
Definition entity.h:83
static void instance_buffer_init(instance_buffer_t *buffer, allocator_t alloc, sz capacity)
Definition instances.h:29
#define list_init_ty(ty, ls, alloc)
Definition list.h:36
#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:34
vec2i offset
Definition construct.h:36
Definition construct.h:62
vec2 velocity
Definition construct.h:67
instance_buffer_t instance
Definition construct.h:64
map_t device_map
Definition construct.h:65
list_t blocks
Definition construct.h:63
bool is_dirty
Definition construct.h:66
Definition entity.h:44
entity_id_t self_id
Definition entity.h:46
float scale
Definition entity.h:57
vec2i chunk_relative_position
Definition entity.h:50
construct_t as_construct
Definition entity.h:54
entity_id_t target
Definition entity.h:56
entity_kind_t kind
Definition entity.h:45
vec2 chunk_local_position
Definition entity.h:51
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
static vec2 vec2_zero()
{.x = 0, .y = 0}
Definition vec2.h:29