-
Notifications
You must be signed in to change notification settings - Fork 0
/
debug_graphics.c
119 lines (96 loc) · 3.69 KB
/
debug_graphics.c
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
#include "debug_graphics.h"
#include "macros.h"
#include "effects.h"
#include "math/utility.h"
#include "math/bpos.h"
#include "shader_utils.h"
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>
//Externs that could be useful.
extern amat4 inv_eye_frame;
extern amat4 ship_frame;
extern float far_distance;
extern float near_distance;
extern bpos_origin eye_sector;
extern float log_depth_intermediate_factor;
//Global state data I might want to access outside.
struct debug_graphics_globals debug_graphics = {
.is_init = false,
};
void debug_graphics_init()
{
if (debug_graphics.is_init)
return;
glGenVertexArrays(1, &debug_graphics.vao);
checkErrors("debug_graphics vao gen");
glBindVertexArray(debug_graphics.vao);
checkErrors("debug_graphics vao bind");
glUseProgram(effects.debug_graphics.handle);
checkErrors("debug_graphics use program");
glGenBuffers(1, &debug_graphics.vbo);
checkErrors("debug_graphics gen buffers");
glUniform1f(effects.debug_graphics.log_depth_intermediate_factor, log_depth_intermediate_factor);
checkErrors("debug_graphics gl uniform");
//Whatever setup I need for debug graphics. Can derive this from the similar stars init.
glBindVertexArray(0);
checkErrors("bind vao 0");
debug_graphics.is_init = true;
}
void debug_graphics_deinit()
{
if (!debug_graphics.is_init)
return;
glDeleteVertexArrays(1, &debug_graphics.vao);
glDeleteBuffers(1, &debug_graphics.vbo);
debug_graphics.is_init = false;
}
int buffer_lines()
{
glEnableVertexAttribArray(effects.debug_graphics.vPos);
glVertexAttribPointer(effects.debug_graphics.vPos, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), NULL);
glEnableVertexAttribArray(effects.debug_graphics.vColor);
glVertexAttribPointer(effects.debug_graphics.vColor, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), (void *)(3*sizeof(GLfloat)));
GLfloat lines[] = { //Position, color, interleaved vertex attributes.
VEC3_COORDS(debug_graphics.lines.ship_to_planet.start), 0.0, 0.8, 0.0,
VEC3_COORDS(debug_graphics.lines.ship_to_planet.end), 0.0, 0.1, 0.0
};
glBufferData(GL_ARRAY_BUFFER, sizeof(lines), lines, GL_DYNAMIC_DRAW);
return 2; //Current number of vertices.
}
int buffer_points()
{
glEnableVertexAttribArray(effects.debug_graphics.vPos);
glVertexAttribPointer(effects.debug_graphics.vPos, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), NULL);
glEnableVertexAttribArray(effects.debug_graphics.vColor);
glVertexAttribPointer(effects.debug_graphics.vColor, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), (void *)(3*sizeof(GLfloat)));
GLfloat points[] = { //Position, color, interleaved vertex attributes.
VEC3_COORDS(debug_graphics.points.ship_to_planet_intersection.pos), 0.0, 0.3, 0.9,
};
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_DYNAMIC_DRAW);
return 1; //Current number of vertices.
}
void debug_graphics_draw(amat4 eye_frame, float proj_view_mat[16])
{
if (!debug_graphics.is_init)
return;
glBindVertexArray(debug_graphics.vao);
glUseProgram(effects.debug_graphics.handle);
glUniform3f(effects.debug_graphics.eye_pos, eye_frame.t.x, eye_frame.t.y, eye_frame.t.z);
glUniformMatrix4fv(effects.debug_graphics.model_view_projection_matrix, 1, GL_TRUE, proj_view_mat);
//I can just reallocate the buffer every time I want to draw a different kind of debug graphics primitive.
//For simplicity, they don't need to run fast.
if (debug_graphics.lines.ship_to_planet.enabled) {
glBindBuffer(GL_ARRAY_BUFFER, debug_graphics.vbo);
int num = buffer_lines();
glDrawArrays(GL_LINES, 0, num);
}
if (debug_graphics.points.ship_to_planet_intersection.enabled) {
glBindBuffer(GL_ARRAY_BUFFER, debug_graphics.vbo);
int num = buffer_points();
glDrawArrays(GL_POINTS, 0, num);
}
glBindVertexArray(0);
glUseProgram(0);
}