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.cpp228
1 files changed, 114 insertions, 114 deletions
diff --git a/src/renderer.cpp b/src/renderer.cpp index 99d5389..d0d2b75 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,31 @@ 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 loadMesh("res/monitor-fef.obj", mesh_vertices, mesh_uvs, mesh_normals); 366 loadMesh("res/monitor-fef.obj", mesh_vertices, mesh_uvs, mesh_normals);
367 367
368 mesh_numvertices = mesh_vertices.size(); 368 mesh_numvertices = mesh_vertices.size();
369 369
370 glGenBuffers(1, &mesh_vertexbuffer); 370 glGenBuffers(1, &mesh_vertexbuffer);
371 glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer); 371 glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer);
372 glBufferData(GL_ARRAY_BUFFER, mesh_vertices.size() * sizeof(glm::vec3), &mesh_vertices[0], GL_STATIC_DRAW); 372 glBufferData(GL_ARRAY_BUFFER, mesh_vertices.size() * sizeof(glm::vec3), &mesh_vertices[0], GL_STATIC_DRAW);
373 373
374 glGenBuffers(1, &mesh_uvbuffer); 374 glGenBuffers(1, &mesh_uvbuffer);
375 glBindBuffer(GL_ARRAY_BUFFER, mesh_uvbuffer); 375 glBindBuffer(GL_ARRAY_BUFFER, mesh_uvbuffer);
376 glBufferData(GL_ARRAY_BUFFER, mesh_uvs.size() * sizeof(glm::vec3), &mesh_uvs[0], GL_STATIC_DRAW); 376 glBufferData(GL_ARRAY_BUFFER, mesh_uvs.size() * sizeof(glm::vec3), &mesh_uvs[0], GL_STATIC_DRAW);
377 377
378 glGenBuffers(1, &mesh_normalbuffer); 378 glGenBuffers(1, &mesh_normalbuffer);
379 glBindBuffer(GL_ARRAY_BUFFER, mesh_normalbuffer); 379 glBindBuffer(GL_ARRAY_BUFFER, mesh_normalbuffer);
380 glBufferData(GL_ARRAY_BUFFER, mesh_normals.size() * sizeof(glm::vec3), &mesh_normals[0], GL_STATIC_DRAW); 380 glBufferData(GL_ARRAY_BUFFER, mesh_normals.size() * sizeof(glm::vec3), &mesh_normals[0], GL_STATIC_DRAW);
381 381
382 // Load the vertices of a flat surface 382 // Load the vertices of a flat surface
383 GLfloat g_quad_vertex_buffer_data[] = { 383 GLfloat g_quad_vertex_buffer_data[] = {
384 -1.0f, -1.0f, 0.0f, 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,
@@ -392,7 +392,7 @@ GLFWwindow* initRenderer()
392 glGenBuffers(1, &quad_vertexbuffer); 392 glGenBuffers(1, &quad_vertexbuffer);
393 glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); 393 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); 394 glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW);
395 395
396 glGenTextures(1, &artifactsTex); 396 glGenTextures(1, &artifactsTex);
397 glBindTexture(GL_TEXTURE_2D, artifactsTex); 397 glBindTexture(GL_TEXTURE_2D, artifactsTex);
398 int atdw, atdh; 398 int atdw, atdh;
@@ -403,7 +403,7 @@ GLFWwindow* initRenderer()
403 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 403 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
404 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); 404 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
405 glGenerateMipmap(GL_TEXTURE_2D); 405 glGenerateMipmap(GL_TEXTURE_2D);
406 406
407 glGenTextures(1, &scanlinesTex); 407 glGenTextures(1, &scanlinesTex);
408 glBindTexture(GL_TEXTURE_2D, scanlinesTex); 408 glBindTexture(GL_TEXTURE_2D, scanlinesTex);
409 int stdw, stdh; 409 int stdw, stdh;
@@ -414,7 +414,7 @@ GLFWwindow* initRenderer()
414 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 414 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
415 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); 415 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
416 glGenerateMipmap(GL_TEXTURE_2D); 416 glGenerateMipmap(GL_TEXTURE_2D);
417 417
418 // Load the shaders 418 // Load the shaders
419 ntscShader = LoadShaders("shaders/ntsc.vertex", "shaders/ntsc.fragment"); 419 ntscShader = LoadShaders("shaders/ntsc.vertex", "shaders/ntsc.fragment");
420 finalShader = LoadShaders("shaders/final.vertex", "shaders/final.fragment"); 420 finalShader = LoadShaders("shaders/final.vertex", "shaders/final.fragment");
@@ -422,9 +422,9 @@ GLFWwindow* initRenderer()
422 fillShader = LoadShaders("shaders/fill.vertex", "shaders/fill.fragment"); 422 fillShader = LoadShaders("shaders/fill.vertex", "shaders/fill.fragment");
423 bloom1Shader = LoadShaders("shaders/bloom1.vertex", "shaders/bloom1.fragment"); 423 bloom1Shader = LoadShaders("shaders/bloom1.vertex", "shaders/bloom1.fragment");
424 bloom2Shader = LoadShaders("shaders/bloom2.vertex", "shaders/bloom2.fragment"); 424 bloom2Shader = LoadShaders("shaders/bloom2.vertex", "shaders/bloom2.fragment");
425 425
426 rendererInitialized = true; 426 rendererInitialized = true;
427 427
428 return window; 428 return window;
429} 429}
430 430
@@ -435,13 +435,13 @@ void destroyRenderer()
435 fprintf(stderr, "Renderer not initialized\n"); 435 fprintf(stderr, "Renderer not initialized\n");
436 exit(-1); 436 exit(-1);
437 } 437 }
438 438
439 // Delete the plane buffer 439 // Delete the plane buffer
440 glDeleteBuffers(1, &quad_vertexbuffer); 440 glDeleteBuffers(1, &quad_vertexbuffer);
441 glDeleteBuffers(1, &mesh_vertexbuffer); 441 glDeleteBuffers(1, &mesh_vertexbuffer);
442 glDeleteBuffers(1, &mesh_uvbuffer); 442 glDeleteBuffers(1, &mesh_uvbuffer);
443 glDeleteBuffers(1, &mesh_normalbuffer); 443 glDeleteBuffers(1, &mesh_normalbuffer);
444 444
445 // Delete the shaders 445 // Delete the shaders
446 glDeleteProgram(ntscShader); 446 glDeleteProgram(ntscShader);
447 glDeleteProgram(finalShader); 447 glDeleteProgram(finalShader);
@@ -449,7 +449,7 @@ void destroyRenderer()
449 glDeleteProgram(fillShader); 449 glDeleteProgram(fillShader);
450 glDeleteProgram(bloom1Shader); 450 glDeleteProgram(bloom1Shader);
451 glDeleteProgram(bloom2Shader); 451 glDeleteProgram(bloom2Shader);
452 452
453 // Delete the NTSC rendering buffers 453 // Delete the NTSC rendering buffers
454 glDeleteTextures(1, &renderedTex1); 454 glDeleteTextures(1, &renderedTex1);
455 glDeleteTextures(1, &renderedTex2); 455 glDeleteTextures(1, &renderedTex2);
@@ -458,18 +458,18 @@ void destroyRenderer()
458 glDeleteTextures(1, &preBloomTex); 458 glDeleteTextures(1, &preBloomTex);
459 glDeleteTextures(1, &bloomPassTex1); 459 glDeleteTextures(1, &bloomPassTex1);
460 glDeleteTextures(1, &bloomPassTex2); 460 glDeleteTextures(1, &bloomPassTex2);
461 461
462 // Delete the framebuffer 462 // Delete the framebuffer
463 glDeleteRenderbuffers(1, &bloom_depthbuffer); 463 glDeleteRenderbuffers(1, &bloom_depthbuffer);
464 glDeleteFramebuffers(1, &bloom_framebuffer); 464 glDeleteFramebuffers(1, &bloom_framebuffer);
465 glDeleteFramebuffers(1, &generic_framebuffer); 465 glDeleteFramebuffers(1, &generic_framebuffer);
466 466
467 // Delete the VAO 467 // Delete the VAO
468 glDeleteVertexArrays(1, &VertexArrayID); 468 glDeleteVertexArrays(1, &VertexArrayID);
469 469
470 // Kill the window 470 // Kill the window
471 glfwTerminate(); 471 glfwTerminate();
472 472
473 rendererInitialized = false; 473 rendererInitialized = false;
474} 474}
475 475
@@ -480,10 +480,10 @@ Texture::Texture(int width, int height)
480 fprintf(stderr, "Renderer not initialized\n"); 480 fprintf(stderr, "Renderer not initialized\n");
481 exit(-1); 481 exit(-1);
482 } 482 }
483 483
484 this->width = width; 484 this->width = width;
485 this->height = height; 485 this->height = height;
486 486
487 glGenTextures(1, &texID); 487 glGenTextures(1, &texID);
488 glBindTexture(GL_TEXTURE_2D, texID); 488 glBindTexture(GL_TEXTURE_2D, texID);
489 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 489 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
@@ -500,7 +500,7 @@ Texture::Texture(const char* filename)
500 fprintf(stderr, "Renderer not initialized\n"); 500 fprintf(stderr, "Renderer not initialized\n");
501 exit(-1); 501 exit(-1);
502 } 502 }
503 503
504 glGenTextures(1, &texID); 504 glGenTextures(1, &texID);
505 glBindTexture(GL_TEXTURE_2D, texID); 505 glBindTexture(GL_TEXTURE_2D, texID);
506 unsigned char* data = stbi_load(filename, &width, &height, 0, 4); 506 unsigned char* data = stbi_load(filename, &width, &height, 0, 4);
@@ -520,14 +520,14 @@ Texture::Texture(const Texture& tex)
520 fprintf(stderr, "Renderer not initialized\n"); 520 fprintf(stderr, "Renderer not initialized\n");
521 exit(-1); 521 exit(-1);
522 } 522 }
523 523
524 width = tex.width; 524 width = tex.width;
525 height = tex.height; 525 height = tex.height;
526 526
527 unsigned char* data = (unsigned char*) malloc(4 * width * height); 527 unsigned char* data = (unsigned char*) malloc(4 * width * height);
528 glBindTexture(GL_TEXTURE_2D, tex.texID); 528 glBindTexture(GL_TEXTURE_2D, tex.texID);
529 glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 529 glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
530 530
531 glGenTextures(1, &texID); 531 glGenTextures(1, &texID);
532 glBindTexture(GL_TEXTURE_2D, texID); 532 glBindTexture(GL_TEXTURE_2D, texID);
533 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 533 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
@@ -535,7 +535,7 @@ Texture::Texture(const Texture& tex)
535 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 535 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
536 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 536 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); 537 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
538 538
539 free(data); 539 free(data);
540} 540}
541 541
@@ -551,14 +551,14 @@ Texture::~Texture()
551 fprintf(stderr, "Renderer not initialized\n"); 551 fprintf(stderr, "Renderer not initialized\n");
552 exit(-1); 552 exit(-1);
553 } 553 }
554 554
555 glDeleteTextures(1, &texID); 555 glDeleteTextures(1, &texID);
556} 556}
557 557
558Texture& Texture::operator= (Texture tex) 558Texture& Texture::operator= (Texture tex)
559{ 559{
560 swap(*this, tex); 560 swap(*this, tex);
561 561
562 return *this; 562 return *this;
563} 563}
564 564
@@ -576,17 +576,17 @@ void Texture::fill(Rectangle dstrect, int r, int g, int b)
576 fprintf(stderr, "Renderer not initialized\n"); 576 fprintf(stderr, "Renderer not initialized\n");
577 exit(-1); 577 exit(-1);
578 } 578 }
579 579
580 // Target the framebuffer 580 // Target the framebuffer
581 glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); 581 glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer);
582 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0); 582 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0);
583 583
584 // Set up the vertex attributes 584 // Set up the vertex attributes
585 GLfloat minx = (GLfloat) dstrect.x / width * 2.0 - 1.0; 585 GLfloat minx = (GLfloat) dstrect.x / width * 2.0 - 1.0;
586 GLfloat miny = -((GLfloat) dstrect.y / height * 2.0 - 1.0); 586 GLfloat miny = -((GLfloat) dstrect.y / height * 2.0 - 1.0);
587 GLfloat maxx = (GLfloat) (dstrect.x + dstrect.w) / width * 2.0 - 1.0; 587 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); 588 GLfloat maxy = -((GLfloat) (dstrect.y + dstrect.h) / height * 2.0 - 1.0);
589 589
590 GLfloat vertexbuffer_data[] = { 590 GLfloat vertexbuffer_data[] = {
591 minx, miny, 591 minx, miny,
592 maxx, miny, 592 maxx, miny,
@@ -601,14 +601,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); 601 glBufferData(GL_ARRAY_BUFFER, sizeof(vertexbuffer_data), vertexbuffer_data, GL_STATIC_DRAW);
602 glEnableVertexAttribArray(0); 602 glEnableVertexAttribArray(0);
603 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); 603 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
604 604
605 glViewport(0, 0, width, height); 605 glViewport(0, 0, width, height);
606 glClear(GL_DEPTH_BUFFER_BIT); 606 glClear(GL_DEPTH_BUFFER_BIT);
607 glUseProgram(fillShader); 607 glUseProgram(fillShader);
608 glUniform3f(glGetUniformLocation(fillShader, "vecColor"), r / 255.0, g / 255.0, b / 255.0); 608 glUniform3f(glGetUniformLocation(fillShader, "vecColor"), r / 255.0, g / 255.0, b / 255.0);
609 609
610 glDrawArrays(GL_TRIANGLES, 0, 6); 610 glDrawArrays(GL_TRIANGLES, 0, 6);
611 611
612 glDisableVertexAttribArray(0); 612 glDisableVertexAttribArray(0);
613 glDeleteBuffers(1, &vertexbuffer); 613 glDeleteBuffers(1, &vertexbuffer);
614} 614}
@@ -620,19 +620,19 @@ void Texture::blit(const Texture& srctex, Rectangle srcrect, Rectangle dstrect,
620 fprintf(stderr, "Renderer not initialized\n"); 620 fprintf(stderr, "Renderer not initialized\n");
621 exit(-1); 621 exit(-1);
622 } 622 }
623 623
624 alpha = glm::clamp(alpha, 0.0, 1.0); 624 alpha = glm::clamp(alpha, 0.0, 1.0);
625 625
626 // Target the framebuffer 626 // Target the framebuffer
627 glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); 627 glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer);
628 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0); 628 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0);
629 629
630 // Set up the vertex attributes 630 // Set up the vertex attributes
631 GLfloat minx = (GLfloat) dstrect.x / width * 2.0 - 1.0; 631 GLfloat minx = (GLfloat) dstrect.x / width * 2.0 - 1.0;
632 GLfloat miny = -((GLfloat) dstrect.y / height * 2.0 - 1.0); 632 GLfloat miny = -((GLfloat) dstrect.y / height * 2.0 - 1.0);
633 GLfloat maxx = (GLfloat) (dstrect.x + dstrect.w) / width * 2.0 - 1.0; 633 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); 634 GLfloat maxy = -((GLfloat) (dstrect.y + dstrect.h) / height * 2.0 - 1.0);
635 635
636 GLfloat vertexbuffer_data[] = { 636 GLfloat vertexbuffer_data[] = {
637 minx, miny, 637 minx, miny,
638 maxx, miny, 638 maxx, miny,
@@ -645,12 +645,12 @@ void Texture::blit(const Texture& srctex, Rectangle srcrect, Rectangle dstrect,
645 glBufferData(GL_ARRAY_BUFFER, sizeof(vertexbuffer_data), vertexbuffer_data, GL_STATIC_DRAW); 645 glBufferData(GL_ARRAY_BUFFER, sizeof(vertexbuffer_data), vertexbuffer_data, GL_STATIC_DRAW);
646 glEnableVertexAttribArray(0); 646 glEnableVertexAttribArray(0);
647 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); 647 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
648 648
649 GLfloat minu = (GLfloat) srcrect.x / srctex.width; 649 GLfloat minu = (GLfloat) srcrect.x / srctex.width;
650 GLfloat minv = 1 - ((GLfloat) srcrect.y / srctex.height); 650 GLfloat minv = 1 - ((GLfloat) srcrect.y / srctex.height);
651 GLfloat maxu = (GLfloat) (srcrect.x + srcrect.w) / srctex.width; 651 GLfloat maxu = (GLfloat) (srcrect.x + srcrect.w) / srctex.width;
652 GLfloat maxv = 1 - ((GLfloat) (srcrect.y + srcrect.h) / srctex.height); 652 GLfloat maxv = 1 - ((GLfloat) (srcrect.y + srcrect.h) / srctex.height);
653 653
654 GLfloat texcoordbuffer_data[] = { 654 GLfloat texcoordbuffer_data[] = {
655 minu, minv, 655 minu, minv,
656 maxu, minv, 656 maxu, minv,
@@ -663,20 +663,20 @@ void Texture::blit(const Texture& srctex, Rectangle srcrect, Rectangle dstrect,
663 glBufferData(GL_ARRAY_BUFFER, sizeof(texcoordbuffer_data), texcoordbuffer_data, GL_STATIC_DRAW); 663 glBufferData(GL_ARRAY_BUFFER, sizeof(texcoordbuffer_data), texcoordbuffer_data, GL_STATIC_DRAW);
664 glEnableVertexAttribArray(1); 664 glEnableVertexAttribArray(1);
665 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); 665 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
666 666
667 // Set up the shader 667 // Set up the shader
668 glUseProgram(blitShader); 668 glUseProgram(blitShader);
669 glClear(GL_DEPTH_BUFFER_BIT); 669 glClear(GL_DEPTH_BUFFER_BIT);
670 glViewport(0, 0, width, height); 670 glViewport(0, 0, width, height);
671 671
672 glActiveTexture(GL_TEXTURE0); 672 glActiveTexture(GL_TEXTURE0);
673 glBindTexture(GL_TEXTURE_2D, srctex.texID); 673 glBindTexture(GL_TEXTURE_2D, srctex.texID);
674 glUniform1i(glGetUniformLocation(blitShader, "srctex"), 0); 674 glUniform1i(glGetUniformLocation(blitShader, "srctex"), 0);
675 glUniform1f(glGetUniformLocation(blitShader, "alpha"), alpha); 675 glUniform1f(glGetUniformLocation(blitShader, "alpha"), alpha);
676 676
677 // Blit! 677 // Blit!
678 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 678 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
679 679
680 // Unload everything 680 // Unload everything
681 glDisableVertexAttribArray(1); 681 glDisableVertexAttribArray(1);
682 glDisableVertexAttribArray(0); 682 glDisableVertexAttribArray(0);
@@ -691,11 +691,11 @@ void bloomPass1(GLuint srcTex, GLuint dstTex, bool horizontal, glm::vec2 srcRes,
691 glViewport(0,0,dstRes.x,dstRes.y); 691 glViewport(0,0,dstRes.x,dstRes.y);
692 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 692 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
693 glUseProgram(bloom1Shader); 693 glUseProgram(bloom1Shader);
694 694
695 glActiveTexture(GL_TEXTURE0); 695 glActiveTexture(GL_TEXTURE0);
696 glBindTexture(GL_TEXTURE_2D, srcTex); 696 glBindTexture(GL_TEXTURE_2D, srcTex);
697 glUniform1i(glGetUniformLocation(bloom1Shader, "inTex"), 0); 697 glUniform1i(glGetUniformLocation(bloom1Shader, "inTex"), 0);
698 698
699 glm::vec2 offset = glm::vec2(0.0); 699 glm::vec2 offset = glm::vec2(0.0);
700 if (horizontal) 700 if (horizontal)
701 { 701 {
@@ -703,9 +703,9 @@ void bloomPass1(GLuint srcTex, GLuint dstTex, bool horizontal, glm::vec2 srcRes,
703 } else { 703 } else {
704 offset.y = 1.2/srcRes.y; 704 offset.y = 1.2/srcRes.y;
705 } 705 }
706 706
707 glUniform2f(glGetUniformLocation(bloom1Shader, "offset"), offset.x, offset.y); 707 glUniform2f(glGetUniformLocation(bloom1Shader, "offset"), offset.x, offset.y);
708 708
709 glEnableVertexAttribArray(0); 709 glEnableVertexAttribArray(0);
710 glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); 710 glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer);
711 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 711 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
@@ -720,17 +720,17 @@ void Texture::renderScreen() const
720 fprintf(stderr, "Renderer not initialized\n"); 720 fprintf(stderr, "Renderer not initialized\n");
721 exit(-1); 721 exit(-1);
722 } 722 }
723 723
724 // First we're going to composite our frame with the previous frame 724 // First we're going to composite our frame with the previous frame
725 // We start by setting up the framebuffer 725 // We start by setting up the framebuffer
726 glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); 726 glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer);
727 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexBufs[curBuf], 0); 727 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexBufs[curBuf], 0);
728 728
729 // Set up the shader 729 // Set up the shader
730 glViewport(0,0,GAME_WIDTH,GAME_HEIGHT); 730 glViewport(0,0,GAME_WIDTH,GAME_HEIGHT);
731 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 731 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
732 glUseProgram(ntscShader); 732 glUseProgram(ntscShader);
733 733
734 // Use the current frame texture, nearest neighbor and clamped to edge 734 // Use the current frame texture, nearest neighbor and clamped to edge
735 glActiveTexture(GL_TEXTURE0); 735 glActiveTexture(GL_TEXTURE0);
736 glBindTexture(GL_TEXTURE_2D, texID); 736 glBindTexture(GL_TEXTURE_2D, texID);
@@ -739,7 +739,7 @@ void Texture::renderScreen() const
739 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 739 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); 740 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
741 glUniform1i(glGetUniformLocation(ntscShader, "curFrameSampler"), 0); 741 glUniform1i(glGetUniformLocation(ntscShader, "curFrameSampler"), 0);
742 742
743 // Use the previous frame composite texture, nearest neighbor and clamped to edge 743 // Use the previous frame composite texture, nearest neighbor and clamped to edge
744 glActiveTexture(GL_TEXTURE1); 744 glActiveTexture(GL_TEXTURE1);
745 glBindTexture(GL_TEXTURE_2D, renderedTexBufs[(curBuf + 1) % 2]); 745 glBindTexture(GL_TEXTURE_2D, renderedTexBufs[(curBuf + 1) % 2]);
@@ -748,13 +748,13 @@ void Texture::renderScreen() const
748 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 748 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); 749 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
750 glUniform1i(glGetUniformLocation(ntscShader, "prevFrameSampler"), 1); 750 glUniform1i(glGetUniformLocation(ntscShader, "prevFrameSampler"), 1);
751 751
752 // Load the NTSC artifact texture 752 // Load the NTSC artifact texture
753 glActiveTexture(GL_TEXTURE2); 753 glActiveTexture(GL_TEXTURE2);
754 glBindTexture(GL_TEXTURE_2D, artifactsTex); 754 glBindTexture(GL_TEXTURE_2D, artifactsTex);
755 glUniform1i(glGetUniformLocation(ntscShader, "NTSCArtifactSampler"), 2); 755 glUniform1i(glGetUniformLocation(ntscShader, "NTSCArtifactSampler"), 2);
756 glUniform1f(glGetUniformLocation(ntscShader, "NTSCLerp"), curBuf * 1.0); 756 glUniform1f(glGetUniformLocation(ntscShader, "NTSCLerp"), curBuf * 1.0);
757 757
758 if ((rand() % 60) == 0) 758 if ((rand() % 60) == 0)
759 { 759 {
760 // Change the 0.0 to a 1.0 or a 10.0 for a glitchy effect! 760 // Change the 0.0 to a 1.0 or a 10.0 for a glitchy effect!
@@ -762,7 +762,7 @@ void Texture::renderScreen() const
762 } else { 762 } else {
763 glUniform1f(glGetUniformLocation(ntscShader, "Tuning_NTSC"), 0.0); 763 glUniform1f(glGetUniformLocation(ntscShader, "Tuning_NTSC"), 0.0);
764 } 764 }
765 765
766 // Render our composition 766 // Render our composition
767 glEnableVertexAttribArray(0); 767 glEnableVertexAttribArray(0);
768 glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); 768 glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer);
@@ -776,7 +776,7 @@ void Texture::renderScreen() const
776 glViewport(0,0,buffer_width,buffer_height); 776 glViewport(0,0,buffer_width,buffer_height);
777 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 777 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
778 glUseProgram(finalShader); 778 glUseProgram(finalShader);
779 779
780 // Use the composited frame texture, linearly filtered and filling in black for the border 780 // Use the composited frame texture, linearly filtered and filling in black for the border
781 glActiveTexture(GL_TEXTURE0); 781 glActiveTexture(GL_TEXTURE0);
782 glBindTexture(GL_TEXTURE_2D, renderedTexBufs[curBuf]); 782 glBindTexture(GL_TEXTURE_2D, renderedTexBufs[curBuf]);
@@ -788,69 +788,69 @@ void Texture::renderScreen() const
788 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color); 788 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color);
789 glGenerateMipmap(GL_TEXTURE_2D); 789 glGenerateMipmap(GL_TEXTURE_2D);
790 glUniform1i(glGetUniformLocation(finalShader, "rendertex"), 0); 790 glUniform1i(glGetUniformLocation(finalShader, "rendertex"), 0);
791 791
792 // Use the scanlines texture 792 // Use the scanlines texture
793 glActiveTexture(GL_TEXTURE1); 793 glActiveTexture(GL_TEXTURE1);
794 glBindTexture(GL_TEXTURE_2D, scanlinesTex); 794 glBindTexture(GL_TEXTURE_2D, scanlinesTex);
795 glUniform1i(glGetUniformLocation(finalShader, "scanlinestex"), 1); 795 glUniform1i(glGetUniformLocation(finalShader, "scanlinestex"), 1);
796 796
797 // Initialize the MVP matrices 797 // Initialize the MVP matrices
798 glm::mat4 p_matrix = glm::perspective(42.5f, (float) buffer_width / (float) buffer_height, 0.1f, 100.0f); 798 glm::mat4 p_matrix = glm::perspective(42.5f, (float) buffer_width / (float) buffer_height, 0.1f, 100.0f);
799 glm::mat4 v_matrix = glm::lookAt(glm::vec3(2,0,0), glm::vec3(0,0,0), glm::vec3(0,1,0)); 799 glm::mat4 v_matrix = glm::lookAt(glm::vec3(2,0,0), glm::vec3(0,0,0), glm::vec3(0,1,0));
800 glm::mat4 m_matrix = glm::mat4(1.0); 800 glm::mat4 m_matrix = glm::mat4(1.0);
801 glm::mat4 mvp_matrix = p_matrix * v_matrix * m_matrix; 801 glm::mat4 mvp_matrix = p_matrix * v_matrix * m_matrix;
802 802
803 glUniformMatrix4fv(glGetUniformLocation(finalShader, "MVP"), 1, GL_FALSE, &mvp_matrix[0][0]); 803 glUniformMatrix4fv(glGetUniformLocation(finalShader, "MVP"), 1, GL_FALSE, &mvp_matrix[0][0]);
804 glUniformMatrix4fv(glGetUniformLocation(finalShader, "worldMat"), 1, GL_FALSE, &m_matrix[0][0]); 804 glUniformMatrix4fv(glGetUniformLocation(finalShader, "worldMat"), 1, GL_FALSE, &m_matrix[0][0]);
805 glUniform2f(glGetUniformLocation(finalShader, "resolution"), buffer_width, buffer_height); 805 glUniform2f(glGetUniformLocation(finalShader, "resolution"), buffer_width, buffer_height);
806 glUniform1f(glGetUniformLocation(finalShader, "iGlobalTime"), glfwGetTime()); 806 glUniform1f(glGetUniformLocation(finalShader, "iGlobalTime"), glfwGetTime());
807 807
808 glEnableVertexAttribArray(0); 808 glEnableVertexAttribArray(0);
809 glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer); 809 glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer);
810 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 810 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
811 811
812 glEnableVertexAttribArray(1); 812 glEnableVertexAttribArray(1);
813 glBindBuffer(GL_ARRAY_BUFFER, mesh_normalbuffer); 813 glBindBuffer(GL_ARRAY_BUFFER, mesh_normalbuffer);
814 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 814 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
815 815
816 glEnableVertexAttribArray(2); 816 glEnableVertexAttribArray(2);
817 glBindBuffer(GL_ARRAY_BUFFER, mesh_uvbuffer); 817 glBindBuffer(GL_ARRAY_BUFFER, mesh_uvbuffer);
818 glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); 818 glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
819 819
820 glDrawArrays(GL_TRIANGLES, 0, mesh_numvertices); 820 glDrawArrays(GL_TRIANGLES, 0, mesh_numvertices);
821 glDisableVertexAttribArray(2); 821 glDisableVertexAttribArray(2);
822 glDisableVertexAttribArray(1); 822 glDisableVertexAttribArray(1);
823 glDisableVertexAttribArray(0); 823 glDisableVertexAttribArray(0);
824 824
825 // First pass of bloom! 825 // First pass of bloom!
826 glm::vec2 buffer_size = glm::vec2(buffer_width, buffer_height); 826 glm::vec2 buffer_size = glm::vec2(buffer_width, buffer_height);
827 bloomPass1(preBloomTex, bloomPassTex1, true, buffer_size, buffer_size / 4.0f); 827 bloomPass1(preBloomTex, bloomPassTex1, true, buffer_size, buffer_size / 4.0f);
828 bloomPass1(bloomPassTex1, bloomPassTex2, false, buffer_size / 4.0f, buffer_size / 4.0f); 828 bloomPass1(bloomPassTex1, bloomPassTex2, false, buffer_size / 4.0f, buffer_size / 4.0f);
829 829
830 // Do the second pass of bloom and render to screen 830 // Do the second pass of bloom and render to screen
831 glBindFramebuffer(GL_FRAMEBUFFER, 0); 831 glBindFramebuffer(GL_FRAMEBUFFER, 0);
832 glViewport(0, 0, buffer_width, buffer_height); 832 glViewport(0, 0, buffer_width, buffer_height);
833 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 833 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
834 glUseProgram(bloom2Shader); 834 glUseProgram(bloom2Shader);
835 835
836 glActiveTexture(GL_TEXTURE0); 836 glActiveTexture(GL_TEXTURE0);
837 glBindTexture(GL_TEXTURE_2D, preBloomTex); 837 glBindTexture(GL_TEXTURE_2D, preBloomTex);
838 glUniform1i(glGetUniformLocation(bloom2Shader, "clearTex"), 0); 838 glUniform1i(glGetUniformLocation(bloom2Shader, "clearTex"), 0);
839 839
840 glActiveTexture(GL_TEXTURE1); 840 glActiveTexture(GL_TEXTURE1);
841 glBindTexture(GL_TEXTURE_2D, bloomPassTex2); 841 glBindTexture(GL_TEXTURE_2D, bloomPassTex2);
842 glUniform1i(glGetUniformLocation(bloom2Shader, "blurTex"), 1); 842 glUniform1i(glGetUniformLocation(bloom2Shader, "blurTex"), 1);
843 843
844 glUniform1f(glGetUniformLocation(bloom2Shader, "iGlobalTime"), glfwGetTime()); 844 glUniform1f(glGetUniformLocation(bloom2Shader, "iGlobalTime"), glfwGetTime());
845 845
846 glEnableVertexAttribArray(0); 846 glEnableVertexAttribArray(0);
847 glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); 847 glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer);
848 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 848 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
849 glDrawArrays(GL_TRIANGLES, 0, 6); 849 glDrawArrays(GL_TRIANGLES, 0, 6);
850 glDisableVertexAttribArray(0); 850 glDisableVertexAttribArray(0);
851 851
852 glfwSwapBuffers(window); 852 glfwSwapBuffers(window);
853 853
854 curBuf = (curBuf + 1) % 2; 854 curBuf = (curBuf + 1) % 2;
855} 855}
856 856