-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathModuleProgram.cpp
More file actions
120 lines (104 loc) · 2.49 KB
/
ModuleProgram.cpp
File metadata and controls
120 lines (104 loc) · 2.49 KB
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
#include "Application.h"
#include "ModuleProgram.h"
#include "SDL.h"
#include "glew-2.1.0/include/GL/glew.h"
ModuleProgram::ModuleProgram()
{
}
// Destructor
ModuleProgram::~ModuleProgram()
{
}
// Called before render is available
bool ModuleProgram::Init()
{
char* vrtx_source = LoadShaderSource("default_vertex.glsl");
char* frag_source = LoadShaderSource("default_fragment.glsl");
unsigned vertex_shader = CompileShader(GL_VERTEX_SHADER, vrtx_source);
unsigned fragment_shader = CompileShader(GL_FRAGMENT_SHADER, frag_source);
program = CreateProgram(vertex_shader, fragment_shader);
return true;
}
update_status ModuleProgram::PreUpdate()
{
return UPDATE_CONTINUE;
}
// Called every draw update
update_status ModuleProgram::Update()
{
return UPDATE_CONTINUE;
}
update_status ModuleProgram::PostUpdate()
{
return UPDATE_CONTINUE;
}
// Called before quitting
bool ModuleProgram::CleanUp()
{
glDeleteProgram(program);
return true;
}
char* ModuleProgram::LoadShaderSource(const char* shader_file_name)
{
char* data = nullptr;
FILE* file = nullptr;
fopen_s(&file, shader_file_name, "rb");
if (file)
{
fseek(file, 0, SEEK_END);
int size = ftell(file);
data = (char*)malloc(size + 1);
fseek(file, 0, SEEK_SET);
fread(data, 1, size, file);
data[size] = 0;
fclose(file);
}
return data;
}
unsigned ModuleProgram::CompileShader(unsigned type, const char* source)
{
unsigned shader_id = glCreateShader(type);
glShaderSource(shader_id, 1, &source, 0);
glCompileShader(shader_id);
int res = GL_FALSE;
glGetShaderiv(shader_id, GL_COMPILE_STATUS, &res);
if (res == GL_FALSE)
{
int len = 0;
glGetShaderiv(shader_id, GL_INFO_LOG_LENGTH, &len);
if (len > 0)
{
int written = 0;
char* info = (char*)malloc(len);
glGetShaderInfoLog(shader_id, len, &written, info);
LOG("Log Info: %s", info);
free(info);
}
}
return shader_id;
}
unsigned ModuleProgram::CreateProgram(unsigned vtx_shader, unsigned frg_shader)
{
unsigned program_id = glCreateProgram();
glAttachShader(program_id, vtx_shader);
glAttachShader(program_id, frg_shader);
glLinkProgram(program_id);
int res;
glGetProgramiv(program_id, GL_LINK_STATUS, &res);
if (res == GL_FALSE)
{
int len = 0;
glGetProgramiv(program_id, GL_INFO_LOG_LENGTH, &len);
if (len > 0)
{
int written = 0;
char* info = (char*)malloc(len);
glGetProgramInfoLog(program_id, len, &written, info);
LOG("Program Log Info: %s", info);
free(info);
}
}
glDeleteShader(vtx_shader);
glDeleteShader(frg_shader);
return program_id;
}