summary refs log tree commit diff stats
path: root/src/renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/renderer.cpp')
-rw-r--r--src/renderer.cpp229
1 files changed, 115 insertions, 114 deletions
diff --git a/src/renderer.cpp b/src/renderer.cpp index ffe9d47..3945e09 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp
@@ -56,11 +56,11 @@ static GLuint mesh_normalbuffer;
56static int mesh_numvertices; 56static int mesh_numvertices;
57 57
58GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path) 58GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path)
59{ 59{
60 // Create the shaders 60 // Create the shaders
61 GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); 61 GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
62 GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); 62 GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
63 63
64 // Read the Vertex Shader code from the file 64 // Read the Vertex Shader code from the file
65 std::string VertexShaderCode; 65 std::string VertexShaderCode;
66 std::ifstream VertexShaderStream(vertex_file_path, std::ios::in); 66 std::ifstream VertexShaderStream(vertex_file_path, std::ios::in);
@@ -71,7 +71,7 @@ GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path)
71 VertexShaderCode += "\n" + Line; 71 VertexShaderCode += "\n" + Line;
72 VertexShaderStream.close(); 72 VertexShaderStream.close();
73 } 73 }
74 74
75 // Read the Fragment Shader code from the file 75 // Read the Fragment Shader code from the file
76 std::string FragmentShaderCode; 76 std::string FragmentShaderCode;
77 std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in); 77 std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in);
@@ -81,53 +81,53 @@ GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path)
81 FragmentShaderCode += "\n" + Line; 81 FragmentShaderCode += "\n" + Line;
82 FragmentShaderStream.close(); 82 FragmentShaderStream.close();
83 } 83 }
84 84
85 GLint Result = GL_FALSE; 85 GLint Result = GL_FALSE;
86 int InfoLogLength; 86 int InfoLogLength;
87 87
88 // Compile Vertex Shader 88 // Compile Vertex Shader
89 printf("Compiling shader : %s\n", vertex_file_path); 89 printf("Compiling shader : %s\n", vertex_file_path);
90 char const * VertexSourcePointer = VertexShaderCode.c_str(); 90 char const * VertexSourcePointer = VertexShaderCode.c_str();
91 glShaderSource(VertexShaderID, 1, &VertexSourcePointer , nullptr); 91 glShaderSource(VertexShaderID, 1, &VertexSourcePointer , nullptr);
92 glCompileShader(VertexShaderID); 92 glCompileShader(VertexShaderID);
93 93
94 // Check Vertex Shader 94 // Check Vertex Shader
95 glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result); 95 glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
96 glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); 96 glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
97 std::vector<char> VertexShaderErrorMessage(InfoLogLength); 97 std::vector<char> VertexShaderErrorMessage(InfoLogLength);
98 glGetShaderInfoLog(VertexShaderID, InfoLogLength, nullptr, &VertexShaderErrorMessage[0]); 98 glGetShaderInfoLog(VertexShaderID, InfoLogLength, nullptr, &VertexShaderErrorMessage[0]);
99 fprintf(stdout, "%s\n", &VertexShaderErrorMessage[0]); 99 fprintf(stdout, "%s\n", &VertexShaderErrorMessage[0]);
100 100
101 // Compile Fragment Shader 101 // Compile Fragment Shader
102 printf("Compiling shader : %s\n", fragment_file_path); 102 printf("Compiling shader : %s\n", fragment_file_path);
103 char const * FragmentSourcePointer = FragmentShaderCode.c_str(); 103 char const * FragmentSourcePointer = FragmentShaderCode.c_str();
104 glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , nullptr); 104 glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , nullptr);
105 glCompileShader(FragmentShaderID); 105 glCompileShader(FragmentShaderID);
106 106
107 // Check Fragment Shader 107 // Check Fragment Shader
108 glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result); 108 glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
109 glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); 109 glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
110 std::vector<char> FragmentShaderErrorMessage(InfoLogLength); 110 std::vector<char> FragmentShaderErrorMessage(InfoLogLength);
111 glGetShaderInfoLog(FragmentShaderID, InfoLogLength, nullptr, &FragmentShaderErrorMessage[0]); 111 glGetShaderInfoLog(FragmentShaderID, InfoLogLength, nullptr, &FragmentShaderErrorMessage[0]);
112 fprintf(stdout, "%s\n", &FragmentShaderErrorMessage[0]); 112 fprintf(stdout, "%s\n", &FragmentShaderErrorMessage[0]);
113 113
114 // Link the program 114 // Link the program
115 fprintf(stdout, "Linking program\n"); 115 fprintf(stdout, "Linking program\n");
116 GLuint ProgramID = glCreateProgram(); 116 GLuint ProgramID = glCreateProgram();
117 glAttachShader(ProgramID, VertexShaderID); 117 glAttachShader(ProgramID, VertexShaderID);
118 glAttachShader(ProgramID, FragmentShaderID); 118 glAttachShader(ProgramID, FragmentShaderID);
119 glLinkProgram(ProgramID); 119 glLinkProgram(ProgramID);
120 120
121 // Check the program 121 // Check the program
122 glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); 122 glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
123 glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); 123 glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
124 std::vector<char> ProgramErrorMessage( glm::max(InfoLogLength, int(1)) ); 124 std::vector<char> ProgramErrorMessage( glm::max(InfoLogLength, int(1)) );
125 glGetProgramInfoLog(ProgramID, InfoLogLength, nullptr, &ProgramErrorMessage[0]); 125 glGetProgramInfoLog(ProgramID, InfoLogLength, nullptr, &ProgramErrorMessage[0]);
126 fprintf(stdout, "%s\n", &ProgramErrorMessage[0]); 126 fprintf(stdout, "%s\n", &ProgramErrorMessage[0]);
127 127
128 glDeleteShader(VertexShaderID); 128 glDeleteShader(VertexShaderID);
129 glDeleteShader(FragmentShaderID); 129 glDeleteShader(FragmentShaderID);
130 130
131 return ProgramID; 131 return ProgramID;
132} 132}
133 133
@@ -135,14 +135,14 @@ void flipImageData(unsigned char* data, int width, int height, int comps)
135{ 135{
136 unsigned char* data_copy = (unsigned char*) malloc(width*height*comps*sizeof(unsigned char)); 136 unsigned char* data_copy = (unsigned char*) malloc(width*height*comps*sizeof(unsigned char));
137 memcpy(data_copy, data, width*height*comps); 137 memcpy(data_copy, data, width*height*comps);
138 138
139 int row_size = width * comps; 139 int row_size = width * comps;
140 140
141 for (int i=0;i<height;i++) 141 for (int i=0;i<height;i++)
142 { 142 {
143 memcpy(data + (row_size*i), data_copy + (row_size*(height-i-1)), row_size); 143 memcpy(data + (row_size*i), data_copy + (row_size*(height-i-1)), row_size);
144 } 144 }
145 145
146 free(data_copy); 146 free(data_copy);
147} 147}
148 148
@@ -154,11 +154,11 @@ void loadMesh(const char* filename, std::vector<glm::vec3>& out_vertices, std::v
154 fprintf(stderr, "Could not open mesh file %s\n", filename); 154 fprintf(stderr, "Could not open mesh file %s\n", filename);
155 exit(1); 155 exit(1);
156 } 156 }
157 157
158 std::vector<glm::vec3> temp_vertices; 158 std::vector<glm::vec3> temp_vertices;
159 std::vector<glm::vec2> temp_uvs; 159 std::vector<glm::vec2> temp_uvs;
160 std::vector<glm::vec3> temp_normals; 160 std::vector<glm::vec3> temp_normals;
161 161
162 for (;;) 162 for (;;)
163 { 163 {
164 char lineHeader[256]; 164 char lineHeader[256];
@@ -167,7 +167,7 @@ void loadMesh(const char* filename, std::vector<glm::vec3>& out_vertices, std::v
167 { 167 {
168 break; 168 break;
169 } 169 }
170 170
171 if (!strncmp(lineHeader, "v", 2)) 171 if (!strncmp(lineHeader, "v", 2))
172 { 172 {
173 glm::vec3 vertex; 173 glm::vec3 vertex;
@@ -187,7 +187,7 @@ void loadMesh(const char* filename, std::vector<glm::vec3>& out_vertices, std::v
187 { 187 {
188 int vertexIDs[3], uvIDs[3], normalIDs[3]; 188 int vertexIDs[3], uvIDs[3], normalIDs[3];
189 fscanf(file, "%d/%d/%d %d/%d/%d %d/%d/%d\n", &vertexIDs[0], &uvIDs[0], &normalIDs[0], &vertexIDs[1], &uvIDs[1], &normalIDs[1], &vertexIDs[2], &uvIDs[2], &normalIDs[2]); 189 fscanf(file, "%d/%d/%d %d/%d/%d %d/%d/%d\n", &vertexIDs[0], &uvIDs[0], &normalIDs[0], &vertexIDs[1], &uvIDs[1], &normalIDs[1], &vertexIDs[2], &uvIDs[2], &normalIDs[2]);
190 190
191 for (int i=0; i<3; i++) 191 for (int i=0; i<3; i++)
192 { 192 {
193 out_vertices.push_back(temp_vertices[vertexIDs[i] - 1]); 193 out_vertices.push_back(temp_vertices[vertexIDs[i] - 1]);
@@ -202,24 +202,24 @@ void setFramebufferSize(GLFWwindow* w, int width, int height)
202{ 202{
203 buffer_width = width; 203 buffer_width = width;
204 buffer_height = height; 204 buffer_height = height;
205 205
206 glDeleteFramebuffers(1, &bloom_framebuffer); 206 glDeleteFramebuffers(1, &bloom_framebuffer);
207 glDeleteRenderbuffers(1, &bloom_depthbuffer); 207 glDeleteRenderbuffers(1, &bloom_depthbuffer);
208 208
209 glGenFramebuffers(1, &bloom_framebuffer); 209 glGenFramebuffers(1, &bloom_framebuffer);
210 glBindFramebuffer(GL_FRAMEBUFFER, bloom_framebuffer); 210 glBindFramebuffer(GL_FRAMEBUFFER, bloom_framebuffer);
211 GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT1}; 211 GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT1};
212 glDrawBuffers(1, DrawBuffers); 212 glDrawBuffers(1, DrawBuffers);
213 213
214 glGenRenderbuffers(1, &bloom_depthbuffer); 214 glGenRenderbuffers(1, &bloom_depthbuffer);
215 glBindRenderbuffer(GL_RENDERBUFFER, bloom_depthbuffer); 215 glBindRenderbuffer(GL_RENDERBUFFER, bloom_depthbuffer);
216 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height); 216 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
217 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, bloom_depthbuffer); 217 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, bloom_depthbuffer);
218 218
219 glDeleteTextures(1, &preBloomTex); 219 glDeleteTextures(1, &preBloomTex);
220 glDeleteTextures(1, &bloomPassTex1); 220 glDeleteTextures(1, &bloomPassTex1);
221 glDeleteTextures(1, &bloomPassTex2); 221 glDeleteTextures(1, &bloomPassTex2);
222 222
223 glGenTextures(1, &preBloomTex); 223 glGenTextures(1, &preBloomTex);
224 glBindTexture(GL_TEXTURE_2D, preBloomTex); 224 glBindTexture(GL_TEXTURE_2D, preBloomTex);
225 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 225 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
@@ -227,7 +227,7 @@ void setFramebufferSize(GLFWwindow* w, int width, int height)
227 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 227 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
228 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 228 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
229 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 229 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
230 230
231 glGenTextures(1, &bloomPassTex1); 231 glGenTextures(1, &bloomPassTex1);
232 glBindTexture(GL_TEXTURE_2D, bloomPassTex1); 232 glBindTexture(GL_TEXTURE_2D, bloomPassTex1);
233 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width/4, height/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 233 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width/4, height/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
@@ -235,7 +235,7 @@ void setFramebufferSize(GLFWwindow* w, int width, int height)
235 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 235 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
236 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 236 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
237 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 237 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
238 238
239 glGenTextures(1, &bloomPassTex2); 239 glGenTextures(1, &bloomPassTex2);
240 glBindTexture(GL_TEXTURE_2D, bloomPassTex2); 240 glBindTexture(GL_TEXTURE_2D, bloomPassTex2);
241 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width/4, height/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 241 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width/4, height/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
@@ -252,20 +252,20 @@ GLFWwindow* initRenderer()
252 fprintf(stderr, "Renderer already initialized\n"); 252 fprintf(stderr, "Renderer already initialized\n");
253 exit(-1); 253 exit(-1);
254 } 254 }
255 255
256 // Initialize GLFW 256 // Initialize GLFW
257 if (!glfwInit()) 257 if (!glfwInit())
258 { 258 {
259 fprintf(stderr, "Failed to initialize GLFW\n"); 259 fprintf(stderr, "Failed to initialize GLFW\n");
260 exit(-1); 260 exit(-1);
261 } 261 }
262 262
263 glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing 263 glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing
264 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // We want version 3.3 264 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // We want version 3.3
265 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 265 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
266 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Mac requires this 266 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Mac requires this
267 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 267 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
268 268
269 // Create a window 269 // Create a window
270 window = glfwCreateWindow(1024, 768, "Aromatherapy", nullptr, nullptr); 270 window = glfwCreateWindow(1024, 768, "Aromatherapy", nullptr, nullptr);
271 if (window == nullptr) 271 if (window == nullptr)
@@ -274,7 +274,7 @@ GLFWwindow* initRenderer()
274 glfwTerminate(); 274 glfwTerminate();
275 exit(-1); 275 exit(-1);
276 } 276 }
277 277
278 glfwMakeContextCurrent(window); 278 glfwMakeContextCurrent(window);
279 glewExperimental = true; // Needed in core profile 279 glewExperimental = true; // Needed in core profile
280 if (glewInit() != GLEW_OK) 280 if (glewInit() != GLEW_OK)
@@ -282,37 +282,37 @@ GLFWwindow* initRenderer()
282 fprintf(stderr, "Failed to initialize GLEW\n"); 282 fprintf(stderr, "Failed to initialize GLEW\n");
283 exit(-1); 283 exit(-1);
284 } 284 }
285 285
286 glfwSetFramebufferSizeCallback(window, &setFramebufferSize); 286 glfwSetFramebufferSizeCallback(window, &setFramebufferSize);
287 287
288 // Set up vertex array object 288 // Set up vertex array object
289 glGenVertexArrays(1, &VertexArrayID); 289 glGenVertexArrays(1, &VertexArrayID);
290 glBindVertexArray(VertexArrayID); 290 glBindVertexArray(VertexArrayID);
291 291
292 // Enable depth testing 292 // Enable depth testing
293 glEnable(GL_DEPTH_TEST); 293 glEnable(GL_DEPTH_TEST);
294 glDepthFunc(GL_LESS); 294 glDepthFunc(GL_LESS);
295 295
296 // Enable blending 296 // Enable blending
297 glEnable(GL_BLEND); 297 glEnable(GL_BLEND);
298 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 298 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
299 299
300 // Set up the framebuffer 300 // Set up the framebuffer
301 glGenFramebuffers(1, &generic_framebuffer); 301 glGenFramebuffers(1, &generic_framebuffer);
302 glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); 302 glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer);
303 GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0}; 303 GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};
304 glDrawBuffers(1, DrawBuffers); 304 glDrawBuffers(1, DrawBuffers);
305 305
306 glGenFramebuffers(1, &bloom_framebuffer); 306 glGenFramebuffers(1, &bloom_framebuffer);
307 glBindFramebuffer(GL_FRAMEBUFFER, bloom_framebuffer); 307 glBindFramebuffer(GL_FRAMEBUFFER, bloom_framebuffer);
308 GLenum DrawBuffers2[1] = {GL_COLOR_ATTACHMENT1}; 308 GLenum DrawBuffers2[1] = {GL_COLOR_ATTACHMENT1};
309 glDrawBuffers(1, DrawBuffers2); 309 glDrawBuffers(1, DrawBuffers2);
310 310
311 glGenRenderbuffers(1, &bloom_depthbuffer); 311 glGenRenderbuffers(1, &bloom_depthbuffer);
312 glBindRenderbuffer(GL_RENDERBUFFER, bloom_depthbuffer); 312 glBindRenderbuffer(GL_RENDERBUFFER, bloom_depthbuffer);
313 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 1024, 768); 313 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 1024, 768);
314 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, bloom_depthbuffer); 314 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, bloom_depthbuffer);
315 315
316 // Set up the NTSC rendering buffers 316 // Set up the NTSC rendering buffers
317 glGenTextures(1, &renderedTex1); 317 glGenTextures(1, &renderedTex1);
318 glBindTexture(GL_TEXTURE_2D, renderedTex1); 318 glBindTexture(GL_TEXTURE_2D, renderedTex1);
@@ -322,7 +322,7 @@ GLFWwindow* initRenderer()
322 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 322 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
323 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 323 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
324 renderedTexBufs[0] = renderedTex1; 324 renderedTexBufs[0] = renderedTex1;
325 325
326 glGenTextures(1, &renderedTex2); 326 glGenTextures(1, &renderedTex2);
327 glBindTexture(GL_TEXTURE_2D, renderedTex2); 327 glBindTexture(GL_TEXTURE_2D, renderedTex2);
328 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, GAME_WIDTH, GAME_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 328 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, GAME_WIDTH, GAME_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
@@ -331,7 +331,7 @@ GLFWwindow* initRenderer()
331 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 331 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
332 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 332 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
333 renderedTexBufs[1] = renderedTex2; 333 renderedTexBufs[1] = renderedTex2;
334 334
335 // Set up bloom rendering buffers 335 // Set up bloom rendering buffers
336 glGenTextures(1, &preBloomTex); 336 glGenTextures(1, &preBloomTex);
337 glBindTexture(GL_TEXTURE_2D, preBloomTex); 337 glBindTexture(GL_TEXTURE_2D, preBloomTex);
@@ -340,7 +340,7 @@ GLFWwindow* initRenderer()
340 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 340 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
341 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 341 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
342 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 342 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
343 343
344 glGenTextures(1, &bloomPassTex1); 344 glGenTextures(1, &bloomPassTex1);
345 glBindTexture(GL_TEXTURE_2D, bloomPassTex1); 345 glBindTexture(GL_TEXTURE_2D, bloomPassTex1);
346 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024/4, 768/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 346 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024/4, 768/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
@@ -348,7 +348,7 @@ GLFWwindow* initRenderer()
348 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 348 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
349 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 349 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
350 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 350 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
351 351
352 glGenTextures(1, &bloomPassTex2); 352 glGenTextures(1, &bloomPassTex2);
353 glBindTexture(GL_TEXTURE_2D, bloomPassTex2); 353 glBindTexture(GL_TEXTURE_2D, bloomPassTex2);
354 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024/4, 768/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 354 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024/4, 768/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
@@ -356,31 +356,32 @@ GLFWwindow* initRenderer()
356 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 356 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
357 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 357 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
358 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 358 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
359 359
360 curBuf = 0; 360 curBuf = 0;
361 361
362 // Load the mesh! 362 // Load the mesh!
363 std::vector<glm::vec3> mesh_vertices; 363 std::vector<glm::vec3> mesh_vertices;
364 std::vector<glm::vec2> mesh_uvs; 364 std::vector<glm::vec2> mesh_uvs;
365 std::vector<glm::vec3> mesh_normals; 365 std::vector<glm::vec3> mesh_normals;
366
366 loadMesh("res/monitor-old.obj", mesh_vertices, mesh_uvs, mesh_normals); 367 loadMesh("res/monitor-old.obj", mesh_vertices, mesh_uvs, mesh_normals);
367 368
368 mesh_numvertices = mesh_vertices.size(); 369 mesh_numvertices = mesh_vertices.size();
369 370
370 glGenBuffers(1, &mesh_vertexbuffer); 371 glGenBuffers(1, &mesh_vertexbuffer);
371 glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer); 372 glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer);
372 glBufferData(GL_ARRAY_BUFFER, mesh_vertices.size() * sizeof(glm::vec3), &mesh_vertices[0], GL_STATIC_DRAW); 373 glBufferData(GL_ARRAY_BUFFER, mesh_vertices.size() * sizeof(glm::vec3), &mesh_vertices[0], GL_STATIC_DRAW);
373 374
374 glGenBuffers(1, &mesh_uvbuffer); 375 glGenBuffers(1, &mesh_uvbuffer);
375 glBindBuffer(GL_ARRAY_BUFFER, mesh_uvbuffer); 376 glBindBuffer(GL_ARRAY_BUFFER, mesh_uvbuffer);
376 glBufferData(GL_ARRAY_BUFFER, mesh_uvs.size() * sizeof(glm::vec3), &mesh_uvs[0], GL_STATIC_DRAW); 377 glBufferData(GL_ARRAY_BUFFER, mesh_uvs.size() * sizeof(glm::vec3), &mesh_uvs[0], GL_STATIC_DRAW);
377 378
378 glGenBuffers(1, &mesh_normalbuffer); 379 glGenBuffers(1, &mesh_normalbuffer);
379 glBindBuffer(GL_ARRAY_BUFFER, mesh_normalbuffer); 380 glBindBuffer(GL_ARRAY_BUFFER, mesh_normalbuffer);
380 glBufferData(GL_ARRAY_BUFFER, mesh_normals.size() * sizeof(glm::vec3), &mesh_normals[0], GL_STATIC_DRAW); 381 glBufferData(GL_ARRAY_BUFFER, mesh_normals.size() * sizeof(glm::vec3), &mesh_normals[0], GL_STATIC_DRAW);
381 382
382 // Load the vertices of a flat surface 383 // Load the vertices of a flat surface
383 GLfloat g_quad_vertex_buffer_data[] = { 384 GLfloat g_quad_vertex_buffer_data[] = {
384 -1.0f, -1.0f, 0.0f, 385 -1.0f, -1.0f, 0.0f,
385 1.0f, -1.0f, 0.0f, 386 1.0f, -1.0f, 0.0f,
386 -1.0f, 1.0f, 0.0f, 387 -1.0f, 1.0f, 0.0f,
@@ -392,7 +393,7 @@ GLFWwindow* initRenderer()
392 glGenBuffers(1, &quad_vertexbuffer); 393 glGenBuffers(1, &quad_vertexbuffer);
393 glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); 394 glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer);
394 glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW); 395 glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW);
395 396
396 glGenTextures(1, &artifactsTex); 397 glGenTextures(1, &artifactsTex);
397 glBindTexture(GL_TEXTURE_2D, artifactsTex); 398 glBindTexture(GL_TEXTURE_2D, artifactsTex);
398 int atdw, atdh; 399 int atdw, atdh;
@@ -403,7 +404,7 @@ GLFWwindow* initRenderer()
403 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 404 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
404 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); 405 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
405 glGenerateMipmap(GL_TEXTURE_2D); 406 glGenerateMipmap(GL_TEXTURE_2D);
406 407
407 glGenTextures(1, &scanlinesTex); 408 glGenTextures(1, &scanlinesTex);
408 glBindTexture(GL_TEXTURE_2D, scanlinesTex); 409 glBindTexture(GL_TEXTURE_2D, scanlinesTex);
409 int stdw, stdh; 410 int stdw, stdh;
@@ -414,7 +415,7 @@ GLFWwindow* initRenderer()
414 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 415 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
415 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); 416 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
416 glGenerateMipmap(GL_TEXTURE_2D); 417 glGenerateMipmap(GL_TEXTURE_2D);
417 418
418 // Load the shaders 419 // Load the shaders
419 ntscShader = LoadShaders("shaders/ntsc.vertex", "shaders/ntsc.fragment"); 420 ntscShader = LoadShaders("shaders/ntsc.vertex", "shaders/ntsc.fragment");
420 finalShader = LoadShaders("shaders/final.vertex", "shaders/final.fragment"); 421 finalShader = LoadShaders("shaders/final.vertex", "shaders/final.fragment");
@@ -422,9 +423,9 @@ GLFWwindow* initRenderer()
422 fillShader = LoadShaders("shaders/fill.vertex", "shaders/fill.fragment"); 423 fillShader = LoadShaders("shaders/fill.vertex", "shaders/fill.fragment");
423 bloom1Shader = LoadShaders("shaders/bloom1.vertex", "shaders/bloom1.fragment"); 424 bloom1Shader = LoadShaders("shaders/bloom1.vertex", "shaders/bloom1.fragment");
424 bloom2Shader = LoadShaders("shaders/bloom2.vertex", "shaders/bloom2.fragment"); 425 bloom2Shader = LoadShaders("shaders/bloom2.vertex", "shaders/bloom2.fragment");
425 426
426 rendererInitialized = true; 427 rendererInitialized = true;
427 428
428 return window; 429 return window;
429} 430}
430 431
@@ -435,13 +436,13 @@ void destroyRenderer()
435 fprintf(stderr, "Renderer not initialized\n"); 436 fprintf(stderr, "Renderer not initialized\n");
436 exit(-1); 437 exit(-1);
437 } 438 }
438 439
439 // Delete the plane buffer 440 // Delete the plane buffer
440 glDeleteBuffers(1, &quad_vertexbuffer); 441 glDeleteBuffers(1, &quad_vertexbuffer);
441 glDeleteBuffers(1, &mesh_vertexbuffer); 442 glDeleteBuffers(1, &mesh_vertexbuffer);
442 glDeleteBuffers(1, &mesh_uvbuffer); 443 glDeleteBuffers(1, &mesh_uvbuffer);
443 glDeleteBuffers(1, &mesh_normalbuffer); 444 glDeleteBuffers(1, &mesh_normalbuffer);
444 445
445 // Delete the shaders 446 // Delete the shaders
446 glDeleteProgram(ntscShader); 447 glDeleteProgram(ntscShader);
447 glDeleteProgram(finalShader); 448 glDeleteProgram(finalShader);
@@ -449,7 +450,7 @@ void destroyRenderer()
449 glDeleteProgram(fillShader); 450 glDeleteProgram(fillShader);
450 glDeleteProgram(bloom1Shader); 451 glDeleteProgram(bloom1Shader);
451 glDeleteProgram(bloom2Shader); 452 glDeleteProgram(bloom2Shader);
452 453
453 // Delete the NTSC rendering buffers 454 // Delete the NTSC rendering buffers
454 glDeleteTextures(1, &renderedTex1); 455 glDeleteTextures(1, &renderedTex1);
455 glDeleteTextures(1, &renderedTex2); 456 glDeleteTextures(1, &renderedTex2);
@@ -458,18 +459,18 @@ void destroyRenderer()
458 glDeleteTextures(1, &preBloomTex); 459 glDeleteTextures(1, &preBloomTex);
459 glDeleteTextures(1, &bloomPassTex1); 460 glDeleteTextures(1, &bloomPassTex1);
460 glDeleteTextures(1, &bloomPassTex2); 461 glDeleteTextures(1, &bloomPassTex2);
461 462
462 // Delete the framebuffer 463 // Delete the framebuffer
463 glDeleteRenderbuffers(1, &bloom_depthbuffer); 464 glDeleteRenderbuffers(1, &bloom_depthbuffer);
464 glDeleteFramebuffers(1, &bloom_framebuffer); 465 glDeleteFramebuffers(1, &bloom_framebuffer);
465 glDeleteFramebuffers(1, &generic_framebuffer); 466 glDeleteFramebuffers(1, &generic_framebuffer);
466 467
467 // Delete the VAO 468 // Delete the VAO
468 glDeleteVertexArrays(1, &VertexArrayID); 469 glDeleteVertexArrays(1, &VertexArrayID);
469 470
470 // Kill the window 471 // Kill the window
471 glfwTerminate(); 472 glfwTerminate();
472 473
473 rendererInitialized = false; 474 rendererInitialized = false;
474} 475}
475 476
@@ -480,10 +481,10 @@ Texture::Texture(int width, int height)
480 fprintf(stderr, "Renderer not initialized\n"); 481 fprintf(stderr, "Renderer not initialized\n");
481 exit(-1); 482 exit(-1);
482 } 483 }
483 484
484 this->width = width; 485 this->width = width;
485 this->height = height; 486 this->height = height;
486 487
487 glGenTextures(1, &texID); 488 glGenTextures(1, &texID);
488 glBindTexture(GL_TEXTURE_2D, texID); 489 glBindTexture(GL_TEXTURE_2D, texID);
489 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 490 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
@@ -500,7 +501,7 @@ Texture::Texture(const char* filename)
500 fprintf(stderr, "Renderer not initialized\n"); 501 fprintf(stderr, "Renderer not initialized\n");
501 exit(-1); 502 exit(-1);
502 } 503 }
503 504
504 glGenTextures(1, &texID); 505 glGenTextures(1, &texID);
505 glBindTexture(GL_TEXTURE_2D, texID); 506 glBindTexture(GL_TEXTURE_2D, texID);
506 unsigned char* data = stbi_load(filename, &width, &height, 0, 4); 507 unsigned char* data = stbi_load(filename, &width, &height, 0, 4);
@@ -520,14 +521,14 @@ Texture::Texture(const Texture& tex)
520 fprintf(stderr, "Renderer not initialized\n"); 521 fprintf(stderr, "Renderer not initialized\n");
521 exit(-1); 522 exit(-1);
522 } 523 }
523 524
524 width = tex.width; 525 width = tex.width;
525 height = tex.height; 526 height = tex.height;
526 527
527 unsigned char* data = (unsigned char*) malloc(4 * width * height); 528 unsigned char* data = (unsigned char*) malloc(4 * width * height);
528 glBindTexture(GL_TEXTURE_2D, tex.texID); 529 glBindTexture(GL_TEXTURE_2D, tex.texID);
529 glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 530 glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
530 531
531 glGenTextures(1, &texID); 532 glGenTextures(1, &texID);
532 glBindTexture(GL_TEXTURE_2D, texID); 533 glBindTexture(GL_TEXTURE_2D, texID);
533 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 534 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
@@ -535,7 +536,7 @@ Texture::Texture(const Texture& tex)
535 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 536 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
536 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 537 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
537 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 538 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
538 539
539 free(data); 540 free(data);
540} 541}
541 542
@@ -551,14 +552,14 @@ Texture::~Texture()
551 fprintf(stderr, "Renderer not initialized\n"); 552 fprintf(stderr, "Renderer not initialized\n");
552 exit(-1); 553 exit(-1);
553 } 554 }
554 555
555 glDeleteTextures(1, &texID); 556 glDeleteTextures(1, &texID);
556} 557}
557 558
558Texture& Texture::operator= (Texture tex) 559Texture& Texture::operator= (Texture tex)
559{ 560{
560 swap(*this, tex); 561 swap(*this, tex);
561 562
562 return *this; 563 return *this;
563} 564}
564 565
@@ -576,17 +577,17 @@ void Texture::fill(Rectangle dstrect, int r, int g, int b)
576 fprintf(stderr, "Renderer not initialized\n"); 577 fprintf(stderr, "Renderer not initialized\n");
577 exit(-1); 578 exit(-1);
578 } 579 }
579 580
580 // Target the framebuffer 581 // Target the framebuffer
581 glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); 582 glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer);
582 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0); 583 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0);
583 584
584 // Set up the vertex attributes 585 // Set up the vertex attributes
585 GLfloat minx = (GLfloat) dstrect.x / width * 2.0 - 1.0; 586 GLfloat minx = (GLfloat) dstrect.x / width * 2.0 - 1.0;
586 GLfloat miny = -((GLfloat) dstrect.y / height * 2.0 - 1.0); 587 GLfloat miny = -((GLfloat) dstrect.y / height * 2.0 - 1.0);
587 GLfloat maxx = (GLfloat) (dstrect.x + dstrect.w) / width * 2.0 - 1.0; 588 GLfloat maxx = (GLfloat) (dstrect.x + dstrect.w) / width * 2.0 - 1.0;
588 GLfloat maxy = -((GLfloat) (dstrect.y + dstrect.h) / height * 2.0 - 1.0); 589 GLfloat maxy = -((GLfloat) (dstrect.y + dstrect.h) / height * 2.0 - 1.0);
589 590
590 GLfloat vertexbuffer_data[] = { 591 GLfloat vertexbuffer_data[] = {
591 minx, miny, 592 minx, miny,
592 maxx, miny, 593 maxx, miny,
@@ -601,14 +602,14 @@ void Texture::fill(Rectangle dstrect, int r, int g, int b)
601 glBufferData(GL_ARRAY_BUFFER, sizeof(vertexbuffer_data), vertexbuffer_data, GL_STATIC_DRAW); 602 glBufferData(GL_ARRAY_BUFFER, sizeof(vertexbuffer_data), vertexbuffer_data, GL_STATIC_DRAW);
602 glEnableVertexAttribArray(0); 603 glEnableVertexAttribArray(0);
603 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); 604 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
604 605
605 glViewport(0, 0, width, height); 606 glViewport(0, 0, width, height);
606 glClear(GL_DEPTH_BUFFER_BIT); 607 glClear(GL_DEPTH_BUFFER_BIT);
607 glUseProgram(fillShader); 608 glUseProgram(fillShader);
608 glUniform3f(glGetUniformLocation(fillShader, "vecColor"), r / 255.0, g / 255.0, b / 255.0); 609 glUniform3f(glGetUniformLocation(fillShader, "vecColor"), r / 255.0, g / 255.0, b / 255.0);
609 610
610 glDrawArrays(GL_TRIANGLES, 0, 6); 611 glDrawArrays(GL_TRIANGLES, 0, 6);
611 612
612 glDisableVertexAttribArray(0); 613 glDisableVertexAttribArray(0);
613 glDeleteBuffers(1, &vertexbuffer); 614 glDeleteBuffers(1, &vertexbuffer);
614} 615}
@@ -620,19 +621,19 @@ void Texture::blit(const Texture& srctex, Rectangle srcrect, Rectangle dstrect,
620 fprintf(stderr, "Renderer not initialized\n"); 621 fprintf(stderr, "Renderer not initialized\n");
621 exit(-1); 622 exit(-1);
622 } 623 }
623 624
624 alpha = glm::clamp(alpha, 0.0, 1.0); 625 alpha = glm::clamp(alpha, 0.0, 1.0);
625 626
626 // Target the framebuffer 627 // Target the framebuffer
627 glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); 628 glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer);
628 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0); 629 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0);
629 630
630 // Set up the vertex attributes 631 // Set up the vertex attributes
631 GLfloat minx = (GLfloat) dstrect.x / width * 2.0 - 1.0; 632 GLfloat minx = (GLfloat) dstrect.x / width * 2.0 - 1.0;
632 GLfloat miny = -((GLfloat) dstrect.y / height * 2.0 - 1.0); 633 GLfloat miny = -((GLfloat) dstrect.y / height * 2.0 - 1.0);
633 GLfloat maxx = (GLfloat) (dstrect.x + dstrect.w) / width * 2.0 - 1.0; 634 GLfloat maxx = (GLfloat) (dstrect.x + dstrect.w) / width * 2.0 - 1.0;
634 GLfloat maxy = -((GLfloat) (dstrect.y + dstrect.h) / height * 2.0 - 1.0); 635 GLfloat maxy = -((GLfloat) (dstrect.y + dstrect.h) / height * 2.0 - 1.0);
635 636
636 GLfloat vertexbuffer_data[] = { 637 GLfloat vertexbuffer_data[] = {
637 minx, miny, 638 minx, miny,
638 maxx, miny, 639 maxx, miny,
@@ -645,12 +646,12 @@ void Texture::blit(const Texture& srctex, Rectangle srcrect, Rectangle dstrect,
645 glBufferData(GL_ARRAY_BUFFER, sizeof(vertexbuffer_data), vertexbuffer_data, GL_STATIC_DRAW); 646 glBufferData(GL_ARRAY_BUFFER, sizeof(vertexbuffer_data), vertexbuffer_data, GL_STATIC_DRAW);
646 glEnableVertexAttribArray(0); 647 glEnableVertexAttribArray(0);
647 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); 648 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
648 649
649 GLfloat minu = (GLfloat) srcrect.x / srctex.width; 650 GLfloat minu = (GLfloat) srcrect.x / srctex.width;
650 GLfloat minv = 1 - ((GLfloat) srcrect.y / srctex.height); 651 GLfloat minv = 1 - ((GLfloat) srcrect.y / srctex.height);
651 GLfloat maxu = (GLfloat) (srcrect.x + srcrect.w) / srctex.width; 652 GLfloat maxu = (GLfloat) (srcrect.x + srcrect.w) / srctex.width;
652 GLfloat maxv = 1 - ((GLfloat) (srcrect.y + srcrect.h) / srctex.height); 653 GLfloat maxv = 1 - ((GLfloat) (srcrect.y + srcrect.h) / srctex.height);
653 654
654 GLfloat texcoordbuffer_data[] = { 655 GLfloat texcoordbuffer_data[] = {
655 minu, minv, 656 minu, minv,
656 maxu, minv, 657 maxu, minv,
@@ -663,20 +664,20 @@ void Texture::blit(const Texture& srctex, Rectangle srcrect, Rectangle dstrect,
663 glBufferData(GL_ARRAY_BUFFER, sizeof(texcoordbuffer_data), texcoordbuffer_data, GL_STATIC_DRAW); 664 glBufferData(GL_ARRAY_BUFFER, sizeof(texcoordbuffer_data), texcoordbuffer_data, GL_STATIC_DRAW);
664 glEnableVertexAttribArray(1); 665 glEnableVertexAttribArray(1);
665 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); 666 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
666 667
667 // Set up the shader 668 // Set up the shader
668 glUseProgram(blitShader); 669 glUseProgram(blitShader);
669 glClear(GL_DEPTH_BUFFER_BIT); 670 glClear(GL_DEPTH_BUFFER_BIT);
670 glViewport(0, 0, width, height); 671 glViewport(0, 0, width, height);
671 672
672 glActiveTexture(GL_TEXTURE0); 673 glActiveTexture(GL_TEXTURE0);
673 glBindTexture(GL_TEXTURE_2D, srctex.texID); 674 glBindTexture(GL_TEXTURE_2D, srctex.texID);
674 glUniform1i(glGetUniformLocation(blitShader, "srctex"), 0); 675 glUniform1i(glGetUniformLocation(blitShader, "srctex"), 0);
675 glUniform1f(glGetUniformLocation(blitShader, "alpha"), alpha); 676 glUniform1f(glGetUniformLocation(blitShader, "alpha"), alpha);
676 677
677 // Blit! 678 // Blit!
678 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 679 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
679 680
680 // Unload everything 681 // Unload everything
681 glDisableVertexAttribArray(1); 682 glDisableVertexAttribArray(1);
682 glDisableVertexAttribArray(0); 683 glDisableVertexAttribArray(0);
@@ -691,11 +692,11 @@ void bloomPass1(GLuint srcTex, GLuint dstTex, bool horizontal, glm::vec2 srcRes,
691 glViewport(0,0,dstRes.x,dstRes.y); 692 glViewport(0,0,dstRes.x,dstRes.y);
692 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 693 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
693 glUseProgram(bloom1Shader); 694 glUseProgram(bloom1Shader);
694 695
695 glActiveTexture(GL_TEXTURE0); 696 glActiveTexture(GL_TEXTURE0);
696 glBindTexture(GL_TEXTURE_2D, srcTex); 697 glBindTexture(GL_TEXTURE_2D, srcTex);
697 glUniform1i(glGetUniformLocation(bloom1Shader, "inTex"), 0); 698 glUniform1i(glGetUniformLocation(bloom1Shader, "inTex"), 0);
698 699
699 glm::vec2 offset = glm::vec2(0.0); 700 glm::vec2 offset = glm::vec2(0.0);
700 if (horizontal) 701 if (horizontal)
701 { 702 {
@@ -703,9 +704,9 @@ void bloomPass1(GLuint srcTex, GLuint dstTex, bool horizontal, glm::vec2 srcRes,
703 } else { 704 } else {
704 offset.y = 1.2/srcRes.y; 705 offset.y = 1.2/srcRes.y;
705 } 706 }
706 707
707 glUniform2f(glGetUniformLocation(bloom1Shader, "offset"), offset.x, offset.y); 708 glUniform2f(glGetUniformLocation(bloom1Shader, "offset"), offset.x, offset.y);
708 709
709 glEnableVertexAttribArray(0); 710 glEnableVertexAttribArray(0);
710 glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); 711 glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer);
711 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 712 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
@@ -720,17 +721,17 @@ void Texture::renderScreen() const
720 fprintf(stderr, "Renderer not initialized\n"); 721 fprintf(stderr, "Renderer not initialized\n");
721 exit(-1); 722 exit(-1);
722 } 723 }
723 724
724 // First we're going to composite our frame with the previous frame 725 // First we're going to composite our frame with the previous frame
725 // We start by setting up the framebuffer 726 // We start by setting up the framebuffer
726 glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); 727 glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer);
727 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexBufs[curBuf], 0); 728 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexBufs[curBuf], 0);
728 729
729 // Set up the shader 730 // Set up the shader
730 glViewport(0,0,GAME_WIDTH,GAME_HEIGHT); 731 glViewport(0,0,GAME_WIDTH,GAME_HEIGHT);
731 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 732 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
732 glUseProgram(ntscShader); 733 glUseProgram(ntscShader);
733 734
734 // Use the current frame texture, nearest neighbor and clamped to edge 735 // Use the current frame texture, nearest neighbor and clamped to edge
735 glActiveTexture(GL_TEXTURE0); 736 glActiveTexture(GL_TEXTURE0);
736 glBindTexture(GL_TEXTURE_2D, texID); 737 glBindTexture(GL_TEXTURE_2D, texID);
@@ -739,7 +740,7 @@ void Texture::renderScreen() const
739 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 740 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
740 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 741 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
741 glUniform1i(glGetUniformLocation(ntscShader, "curFrameSampler"), 0); 742 glUniform1i(glGetUniformLocation(ntscShader, "curFrameSampler"), 0);
742 743
743 // Use the previous frame composite texture, nearest neighbor and clamped to edge 744 // Use the previous frame composite texture, nearest neighbor and clamped to edge
744 glActiveTexture(GL_TEXTURE1); 745 glActiveTexture(GL_TEXTURE1);
745 glBindTexture(GL_TEXTURE_2D, renderedTexBufs[(curBuf + 1) % 2]); 746 glBindTexture(GL_TEXTURE_2D, renderedTexBufs[(curBuf + 1) % 2]);
@@ -748,13 +749,13 @@ void Texture::renderScreen() const
748 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 749 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
749 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 750 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
750 glUniform1i(glGetUniformLocation(ntscShader, "prevFrameSampler"), 1); 751 glUniform1i(glGetUniformLocation(ntscShader, "prevFrameSampler"), 1);
751 752
752 // Load the NTSC artifact texture 753 // Load the NTSC artifact texture
753 glActiveTexture(GL_TEXTURE2); 754 glActiveTexture(GL_TEXTURE2);
754 glBindTexture(GL_TEXTURE_2D, artifactsTex); 755 glBindTexture(GL_TEXTURE_2D, artifactsTex);
755 glUniform1i(glGetUniformLocation(ntscShader, "NTSCArtifactSampler"), 2); 756 glUniform1i(glGetUniformLocation(ntscShader, "NTSCArtifactSampler"), 2);
756 glUniform1f(glGetUniformLocation(ntscShader, "NTSCLerp"), curBuf * 1.0); 757 glUniform1f(glGetUniformLocation(ntscShader, "NTSCLerp"), curBuf * 1.0);
757 758
758 if ((rand() % 60) == 0) 759 if ((rand() % 60) == 0)
759 { 760 {
760 // Change the 0.0 to a 1.0 or a 10.0 for a glitchy effect! 761 // Change the 0.0 to a 1.0 or a 10.0 for a glitchy effect!
@@ -762,7 +763,7 @@ void Texture::renderScreen() const
762 } else { 763 } else {
763 glUniform1f(glGetUniformLocation(ntscShader, "Tuning_NTSC"), 0.0); 764 glUniform1f(glGetUniformLocation(ntscShader, "Tuning_NTSC"), 0.0);
764 } 765 }
765 766
766 // Render our composition 767 // Render our composition
767 glEnableVertexAttribArray(0); 768 glEnableVertexAttribArray(0);
768 glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); 769 glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer);
@@ -776,7 +777,7 @@ void Texture::renderScreen() const
776 glViewport(0,0,buffer_width,buffer_height); 777 glViewport(0,0,buffer_width,buffer_height);
777 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 778 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
778 glUseProgram(finalShader); 779 glUseProgram(finalShader);
779 780
780 // Use the composited frame texture, linearly filtered and filling in black for the border 781 // Use the composited frame texture, linearly filtered and filling in black for the border
781 glActiveTexture(GL_TEXTURE0); 782 glActiveTexture(GL_TEXTURE0);
782 glBindTexture(GL_TEXTURE_2D, renderedTexBufs[curBuf]); 783 glBindTexture(GL_TEXTURE_2D, renderedTexBufs[curBuf]);
@@ -788,70 +789,70 @@ void Texture::renderScreen() const
788 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color); 789 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color);
789 glGenerateMipmap(GL_TEXTURE_2D); 790 glGenerateMipmap(GL_TEXTURE_2D);
790 glUniform1i(glGetUniformLocation(finalShader, "rendertex"), 0); 791 glUniform1i(glGetUniformLocation(finalShader, "rendertex"), 0);
791 792
792 // Use the scanlines texture 793 // Use the scanlines texture
793 glActiveTexture(GL_TEXTURE1); 794 glActiveTexture(GL_TEXTURE1);
794 glBindTexture(GL_TEXTURE_2D, scanlinesTex); 795 glBindTexture(GL_TEXTURE_2D, scanlinesTex);
795 glUniform1i(glGetUniformLocation(finalShader, "scanlinestex"), 1); 796 glUniform1i(glGetUniformLocation(finalShader, "scanlinestex"), 1);
796 797
797 // Initialize the MVP matrices 798 // Initialize the MVP matrices
798 glm::mat4 p_matrix = glm::perspective(glm::radians(25.0f), (float) buffer_width / (float) buffer_height, 0.1f, 100.0f); 799 glm::mat4 p_matrix = glm::perspective(glm::radians(25.0f), (float) buffer_width / (float) buffer_height, 0.1f, 100.0f);
799 glm::mat4 v_matrix = glm::lookAt(glm::vec3(3.75,0,0), glm::vec3(0,0,0), glm::vec3(0,1,0)); 800 glm::mat4 v_matrix = glm::lookAt(glm::vec3(3.75,0,0), glm::vec3(0,0,0), glm::vec3(0,1,0));
800 glm::mat4 m_matrix = glm::mat4(1.0); 801 glm::mat4 m_matrix = glm::mat4(1.0);
801 glm::mat4 mvp_matrix = p_matrix * v_matrix * m_matrix; 802 glm::mat4 mvp_matrix = p_matrix * v_matrix * m_matrix;
802 803
803 glUniformMatrix4fv(glGetUniformLocation(finalShader, "MVP"), 1, GL_FALSE, &mvp_matrix[0][0]); 804 glUniformMatrix4fv(glGetUniformLocation(finalShader, "MVP"), 1, GL_FALSE, &mvp_matrix[0][0]);
804 glUniformMatrix4fv(glGetUniformLocation(finalShader, "worldMat"), 1, GL_FALSE, &m_matrix[0][0]); 805 glUniformMatrix4fv(glGetUniformLocation(finalShader, "worldMat"), 1, GL_FALSE, &m_matrix[0][0]);
805 glUniform2f(glGetUniformLocation(finalShader, "resolution"), buffer_width, buffer_height); 806 glUniform2f(glGetUniformLocation(finalShader, "resolution"), buffer_width, buffer_height);
806 glUniform1f(glGetUniformLocation(finalShader, "iGlobalTime"), glfwGetTime()); 807 glUniform1f(glGetUniformLocation(finalShader, "iGlobalTime"), glfwGetTime());
807 glUniform3f(glGetUniformLocation(finalShader, "frameColor"), 0.76f, 0.78f, 0.81f); 808 glUniform3f(glGetUniformLocation(finalShader, "frameColor"), 0.76f, 0.78f, 0.81f);
808 809
809 glEnableVertexAttribArray(0); 810 glEnableVertexAttribArray(0);
810 glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer); 811 glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer);
811 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 812 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
812 813
813 glEnableVertexAttribArray(1); 814 glEnableVertexAttribArray(1);
814 glBindBuffer(GL_ARRAY_BUFFER, mesh_normalbuffer); 815 glBindBuffer(GL_ARRAY_BUFFER, mesh_normalbuffer);
815 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 816 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
816 817
817 glEnableVertexAttribArray(2); 818 glEnableVertexAttribArray(2);
818 glBindBuffer(GL_ARRAY_BUFFER, mesh_uvbuffer); 819 glBindBuffer(GL_ARRAY_BUFFER, mesh_uvbuffer);
819 glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); 820 glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
820 821
821 glDrawArrays(GL_TRIANGLES, 0, mesh_numvertices); 822 glDrawArrays(GL_TRIANGLES, 0, mesh_numvertices);
822 glDisableVertexAttribArray(2); 823 glDisableVertexAttribArray(2);
823 glDisableVertexAttribArray(1); 824 glDisableVertexAttribArray(1);
824 glDisableVertexAttribArray(0); 825 glDisableVertexAttribArray(0);
825 826
826 // First pass of bloom! 827 // First pass of bloom!
827 glm::vec2 buffer_size = glm::vec2(buffer_width, buffer_height); 828 glm::vec2 buffer_size = glm::vec2(buffer_width, buffer_height);
828 bloomPass1(preBloomTex, bloomPassTex1, true, buffer_size, buffer_size / 4.0f); 829 bloomPass1(preBloomTex, bloomPassTex1, true, buffer_size, buffer_size / 4.0f);
829 bloomPass1(bloomPassTex1, bloomPassTex2, false, buffer_size / 4.0f, buffer_size / 4.0f); 830 bloomPass1(bloomPassTex1, bloomPassTex2, false, buffer_size / 4.0f, buffer_size / 4.0f);
830 831
831 // Do the second pass of bloom and render to screen 832 // Do the second pass of bloom and render to screen
832 glBindFramebuffer(GL_FRAMEBUFFER, 0); 833 glBindFramebuffer(GL_FRAMEBUFFER, 0);
833 glViewport(0, 0, buffer_width, buffer_height); 834 glViewport(0, 0, buffer_width, buffer_height);
834 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 835 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
835 glUseProgram(bloom2Shader); 836 glUseProgram(bloom2Shader);
836 837
837 glActiveTexture(GL_TEXTURE0); 838 glActiveTexture(GL_TEXTURE0);
838 glBindTexture(GL_TEXTURE_2D, preBloomTex); 839 glBindTexture(GL_TEXTURE_2D, preBloomTex);
839 glUniform1i(glGetUniformLocation(bloom2Shader, "clearTex"), 0); 840 glUniform1i(glGetUniformLocation(bloom2Shader, "clearTex"), 0);
840 841
841 glActiveTexture(GL_TEXTURE1); 842 glActiveTexture(GL_TEXTURE1);
842 glBindTexture(GL_TEXTURE_2D, bloomPassTex2); 843 glBindTexture(GL_TEXTURE_2D, bloomPassTex2);
843 glUniform1i(glGetUniformLocation(bloom2Shader, "blurTex"), 1); 844 glUniform1i(glGetUniformLocation(bloom2Shader, "blurTex"), 1);
844 845
845 glUniform1f(glGetUniformLocation(bloom2Shader, "iGlobalTime"), glfwGetTime()); 846 glUniform1f(glGetUniformLocation(bloom2Shader, "iGlobalTime"), glfwGetTime());
846 847
847 glEnableVertexAttribArray(0); 848 glEnableVertexAttribArray(0);
848 glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); 849 glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer);
849 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 850 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
850 glDrawArrays(GL_TRIANGLES, 0, 6); 851 glDrawArrays(GL_TRIANGLES, 0, 6);
851 glDisableVertexAttribArray(0); 852 glDisableVertexAttribArray(0);
852 853
853 glfwSwapBuffers(window); 854 glfwSwapBuffers(window);
854 855
855 curBuf = (curBuf + 1) % 2; 856 curBuf = (curBuf + 1) % 2;
856} 857}
857 858