1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
#include <stdio.h>
#include <string.h>
//#define GLAD_GL_IMPLEMENTATION
#include <glad/gl.h>
//#define GLFW_INCLUDE_NONE
#include <GLFW/glfw3.h>
#define ENGINE_INTERNALS
#include <engine/engine.h>
#include <engine/rendering.h>
/* Extern globals */
extern Platform* GLOBAL_PLATFORM;
/* Globals */
#define drawcall_limit (64 * 1024)
RenderDrawCall drawcalls[drawcall_limit];
i32 drawcall_len = 0;
//struct RenderObject;
/* Implementations */
/* Clear the screen,
* To be used inbetween draw calls */
void render_begin(Window* w) {
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glfwMakeContextCurrent(w->window);
w->context->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
void render_present(Window* w) {
// for (i32 i = 0; i < drawcall_len; i++) {
// RenderDrawCall dc = drawcalls[i];
// switch (dc.type) {
// case RenderDrawCallType_UITree:
// render_uitree(w, dc.data.data);
// break;
// case RenderDrawCallType_Text:
// LOG("RenderDrawCallType_Text rendering not implemented!");
// break;
// case RenderDrawCallType_Sprite: {
//#ifdef _DEBUG
// if (dc.data.sprite.sprite == NULL) {
// __asm__("int3;");
// WARN("Sprite %lx in drawcall %d/%d had NULL reference",
// dc.data.sprite.sprite, i, drawcall_len);
//
// drawcall_len = 0;
// exit(EXIT_FAILURE);
// }
//#endif
// Sprite s = *dc.data.sprite.sprite;
// Texture* t =
// ((struct Resources*)GLOBAL_PLATFORM->data)->textures[s.texture_id];
// i32 ts = t->tilesize;
// } break;
// default:
// break;
// }
// }
drawcall_len = 0;
glfwSwapBuffers(w->window);
}
void drawcall_reset(void) { drawcall_len = 0; }
void window_size_callback(GLFWwindow* window, int width, int height) {
GLOBAL_PLATFORM->window->context->Viewport(0,0, width, height);
//*GLOBAL_PLATFORM->window->game_w = width;
//*GLOBAL_PLATFORM->window->game_h = height;
GLOBAL_PLATFORM->window->windowsize.x = width;
GLOBAL_PLATFORM->window->windowsize.y = height;
}
void engine_window_resize_pointers(i32* w, i32* h) {
GLOBAL_PLATFORM->window->game_w = w;
GLOBAL_PLATFORM->window->game_h = h;
}
void engine_window_resize_pointers_reset(void) {
GLOBAL_PLATFORM->window->game_w = NULL;
GLOBAL_PLATFORM->window->game_h = NULL;
}
void engine_draw_uitree(UITree* t) {
if (drawcall_len + 1 >= drawcall_limit) return;
drawcalls[drawcall_len++] = (RenderDrawCall){
.type = RenderDrawCallType_UITree, .data.data = (void*)t};
}
void engine_draw_sprite(Sprite* s, v2_i32* pos, f32 scale) {
if (drawcall_len + 1 >= drawcall_limit) return;
#ifdef _DEBUG
if (s == NULL) __asm__("int3;");
#endif
drawcalls[drawcall_len++] =
(RenderDrawCall){.type = RenderDrawCallType_Sprite,
.data.sprite = {
.sprite = s,
.x = pos->x,
.y = pos->y,
.scale = scale,
//.mod = {0xFF, 0xFF, 0xFF, 0xFF},
}};
}
void engine_draw_sprite_ex(Sprite* s, v2_i32* pos, f32 scale,
Engine_color colormod) {
if (drawcall_len + 1 >= drawcall_limit) return;
#ifdef _DEBUG
if (s == NULL) __asm__("int3;");
#endif
drawcalls[drawcall_len++] = (RenderDrawCall){
.type = RenderDrawCallType_Sprite,
.data.sprite = {
.sprite = s,
.x = pos->x,
.y = pos->y,
.scale = scale,
//.mod = {colormod.r, colormod.g, colormod.b, colormod.a},
}};
}
Sprite sprite_new(u64 tid, u8 coord) {
const i32 ts =
((struct Resources*)GLOBAL_PLATFORM->data)->textures[tid]->tilesize;
return (Sprite){.texture_id = tid,
(v2_i32){
.x = ts * (coord & 0x0F),
.y = ts * ((coord & 0xF0) >> 4),
}};
}
|