summaryrefslogtreecommitdiff
path: root/src/rendering.c
blob: 06c14e87801f97e489679ea43d54863b39bc0f54 (plain)
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
#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);
}

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 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),
                  }};
}