Subastra
Loading...
Searching...
No Matches
instances.h
Go to the documentation of this file.
1#ifndef __H__RENDERING_INSTANCES__
2#define __H__RENDERING_INSTANCES__
3
4#include <GL/glew.h>
5
6#include "../list.h"
7#include "../memory.h"
8#include "../vec2.h"
9
14
15static void instance_init(instance_t *instance, vec2 position, u32 tile_index) {
16 instance->position = position;
17 instance->tile_index = tile_index;
18}
19
28
30 sz capacity) {
31 buffer->capacity = capacity;
32 buffer->instances = allocator_alloc_ty(instance_t, alloc, buffer->capacity);
33 memset(buffer->instances, 0, buffer->capacity * sizeof(instance_t));
34
35 buffer->size = 0;
36
37 list_init_ty(u32, &buffer->write_indices, alloc);
38
39 glGenBuffers(1, &buffer->vbo);
40 glBindBuffer(GL_ARRAY_BUFFER, buffer->vbo);
41 glBufferData(GL_ARRAY_BUFFER, sizeof(instance_t) * buffer->capacity,
42 buffer->instances, GL_DYNAMIC_DRAW);
43
44 glEnableVertexAttribArray(2);
45 glVertexAttribIPointer(2, 1, GL_UNSIGNED_INT, sizeof(instance_t), (void *)0);
46 glVertexAttribDivisor(2, 1);
47
48 glEnableVertexAttribArray(3);
49 glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, sizeof(instance_t),
50 (void *)sizeof(u32));
51 glVertexAttribDivisor(3, 1);
52
53 glBindVertexArray(0);
54
55 glBindBuffer(GL_ARRAY_BUFFER, 0);
56}
57
59 instance_t instance) {
60 ASSERT__(buffer->size != buffer->capacity);
61
62 sz at = buffer->size++;
63 buffer->instances[at] = instance;
64 list_push(&buffer->write_indices, &at);
65}
66
68 buffer->size = 0;
69 list_clear(&buffer->write_indices);
70}
71
73 glBindBuffer(GL_ARRAY_BUFFER, buffer->vbo);
74
75 for (sz i = 0; i < buffer->write_indices.size; i++) {
76 u32 idx = list_get_ty(u32, &buffer->write_indices, i);
77 GLsizeiptr offset = idx * sizeof(instance_t);
78 glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(instance_t),
79 &buffer->instances[i]);
80 }
81}
82
83#endif
#define ASSERT__(expr)
Definition defs.h:21
size_t sz
Definition defs.h:51
uint32_t u32
Definition defs.h:45
static void instance_buffer_clear(instance_buffer_t *buffer)
Definition instances.h:67
static void instance_buffer_flush(instance_buffer_t *buffer)
Definition instances.h:72
static void instance_init(instance_t *instance, vec2 position, u32 tile_index)
Definition instances.h:15
static void instance_buffer_init(instance_buffer_t *buffer, allocator_t alloc, sz capacity)
Definition instances.h:29
static void instance_buffer_push(instance_buffer_t *buffer, instance_t instance)
Definition instances.h:58
#define list_init_ty(ty, ls, alloc)
Definition list.h:36
#define list_get_ty(ty, ls, idx)
Definition list.h:130
static void list_push(list_t *ls, const void *data)
Definition list.h:72
static void list_clear(list_t *ls)
Definition list.h:161
A generic allocator type passed by value. Contains a fallback allocator and a set of function pointer...
Definition memory.h:30
Definition instances.h:20
instance_t * instances
Definition instances.h:22
sz size
Definition instances.h:24
GLuint vbo
Definition instances.h:21
sz capacity
Definition instances.h:23
list_t write_indices
Definition instances.h:26
Definition instances.h:10
vec2 position
Definition instances.h:12
u32 tile_index
Definition instances.h:11
Definition list.h:13
sz size
Definition list.h:17
Definition vec2.h:11