diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2015-02-14 17:57:23 -0500 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2015-02-14 17:57:23 -0500 |
commit | 297c093d398e7d6e5fcc5dc6ba1056ede25abf6f (patch) | |
tree | 1e55ab169d6de9a6f11b4d3b6efbe9f1b4d6ab6f /src/renderer.cpp | |
parent | de5a458cb037bb8e1e80c849c5e6525f9413b43a (diff) | |
download | therapy-297c093d398e7d6e5fcc5dc6ba1056ede25abf6f.tar.gz therapy-297c093d398e7d6e5fcc5dc6ba1056ede25abf6f.tar.bz2 therapy-297c093d398e7d6e5fcc5dc6ba1056ede25abf6f.zip |
Did some lighting and added room name
Diffstat (limited to 'src/renderer.cpp')
-rw-r--r-- | src/renderer.cpp | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/src/renderer.cpp b/src/renderer.cpp index e74c6a4..ca356f3 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp | |||
@@ -345,6 +345,36 @@ Texture* loadTextureFromBMP(char* filename) | |||
345 | return tex; | 345 | return tex; |
346 | } | 346 | } |
347 | 347 | ||
348 | void saveTextureToBMP(Texture* tex, char* filename) | ||
349 | { | ||
350 | if (!rendererInitialized) | ||
351 | { | ||
352 | fprintf(stderr, "Renderer not initialized\n"); | ||
353 | exit(-1); | ||
354 | } | ||
355 | |||
356 | int size = 54 + 3*tex->width*tex->height; | ||
357 | |||
358 | char* buf = (char*) calloc(size, sizeof(char)); | ||
359 | buf[0x00] = 'B'; | ||
360 | buf[0x01] = 'M'; | ||
361 | *(int*)&(buf[0x0A]) = 54; | ||
362 | *(int*)&(buf[0x12]) = tex->width; | ||
363 | *(int*)&(buf[0x16]) = tex->height; | ||
364 | *(int*)&(buf[0x1C]) = 24; | ||
365 | *(int*)&(buf[0x1E]) = 0; | ||
366 | *(int*)&(buf[0x22]) = size; | ||
367 | |||
368 | glBindTexture(GL_TEXTURE_2D, tex->texID); | ||
369 | glGetTexImage(GL_TEXTURE_2D, 0, GL_BGR, GL_UNSIGNED_BYTE, buf + 54); | ||
370 | |||
371 | FILE* f = fopen(filename, "wb"); | ||
372 | fwrite(buf, sizeof(char), size, f); | ||
373 | fclose(f); | ||
374 | |||
375 | free(buf); | ||
376 | } | ||
377 | |||
348 | void fillTexture(Texture* tex, Rectangle* dstrect, int r, int g, int b) | 378 | void fillTexture(Texture* tex, Rectangle* dstrect, int r, int g, int b) |
349 | { | 379 | { |
350 | if (!rendererInitialized) | 380 | if (!rendererInitialized) |
@@ -478,15 +508,17 @@ void renderScreen(Texture* tex) | |||
478 | exit(-1); | 508 | exit(-1); |
479 | } | 509 | } |
480 | 510 | ||
481 | // Set up framebuffer | 511 | // First we're going to composite our frame with the previous frame |
512 | // We start by setting up the framebuffer | ||
482 | glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName); | 513 | glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName); |
483 | glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexBufs[curBuf], 0); | 514 | glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexBufs[curBuf], 0); |
484 | 515 | ||
485 | // Set up renderer | 516 | // Set up the shaer |
486 | glViewport(0,0,GAME_WIDTH,GAME_HEIGHT); | 517 | glViewport(0,0,GAME_WIDTH,GAME_HEIGHT); |
487 | glClear(GL_COLOR_BUFFER_BIT); | 518 | glClear(GL_COLOR_BUFFER_BIT); |
488 | glUseProgram(ntscShader); | 519 | glUseProgram(ntscShader); |
489 | 520 | ||
521 | // Use the current frame texture, nearest neighbor and clamped to edge | ||
490 | glActiveTexture(GL_TEXTURE0); | 522 | glActiveTexture(GL_TEXTURE0); |
491 | glBindTexture(GL_TEXTURE_2D, tex->texID); | 523 | glBindTexture(GL_TEXTURE_2D, tex->texID); |
492 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 524 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
@@ -495,6 +527,7 @@ void renderScreen(Texture* tex) | |||
495 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 527 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
496 | glUniform1i(glGetUniformLocation(ntscShader, "curFrameSampler"), 0); | 528 | glUniform1i(glGetUniformLocation(ntscShader, "curFrameSampler"), 0); |
497 | 529 | ||
530 | // Use the previous frame composite texture, nearest neighbor and clamped to edge | ||
498 | glActiveTexture(GL_TEXTURE1); | 531 | glActiveTexture(GL_TEXTURE1); |
499 | glBindTexture(GL_TEXTURE_2D, renderedTexBufs[(curBuf + 1) % 2]); | 532 | glBindTexture(GL_TEXTURE_2D, renderedTexBufs[(curBuf + 1) % 2]); |
500 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 533 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
@@ -503,12 +536,13 @@ void renderScreen(Texture* tex) | |||
503 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 536 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
504 | glUniform1i(glGetUniformLocation(ntscShader, "prevFrameSampler"), 1); | 537 | glUniform1i(glGetUniformLocation(ntscShader, "prevFrameSampler"), 1); |
505 | 538 | ||
539 | // Load the NTSC artifact texture | ||
506 | glActiveTexture(GL_TEXTURE2); | 540 | glActiveTexture(GL_TEXTURE2); |
507 | glBindTexture(GL_TEXTURE_2D, artifactsTex); | 541 | glBindTexture(GL_TEXTURE_2D, artifactsTex); |
508 | glUniform1i(glGetUniformLocation(ntscShader, "NTSCArtifactSampler"), 2); | 542 | glUniform1i(glGetUniformLocation(ntscShader, "NTSCArtifactSampler"), 2); |
509 | |||
510 | glUniform1f(glGetUniformLocation(ntscShader, "NTSCLerp"), curBuf * 1.0); | 543 | glUniform1f(glGetUniformLocation(ntscShader, "NTSCLerp"), curBuf * 1.0); |
511 | 544 | ||
545 | // Load the vertices of a flat surface | ||
512 | GLfloat g_quad_vertex_buffer_data[] = { | 546 | GLfloat g_quad_vertex_buffer_data[] = { |
513 | -1.0f, -1.0f, 0.0f, | 547 | -1.0f, -1.0f, 0.0f, |
514 | 1.0f, -1.0f, 0.0f, | 548 | 1.0f, -1.0f, 0.0f, |
@@ -523,11 +557,13 @@ void renderScreen(Texture* tex) | |||
523 | glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); | 557 | glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); |
524 | glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW); | 558 | glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW); |
525 | 559 | ||
560 | // Render our composition | ||
526 | glEnableVertexAttribArray(0); | 561 | glEnableVertexAttribArray(0); |
527 | glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); | 562 | glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); |
528 | glDrawArrays(GL_TRIANGLES, 0, 6); | 563 | glDrawArrays(GL_TRIANGLES, 0, 6); |
529 | glDisableVertexAttribArray(0); | 564 | glDisableVertexAttribArray(0); |
530 | 565 | ||
566 | // Load the normal vertices of a flat surface | ||
531 | GLfloat g_norms_data[] = { | 567 | GLfloat g_norms_data[] = { |
532 | 0.0f, 0.0f, 1.0f, | 568 | 0.0f, 0.0f, 1.0f, |
533 | 0.0f, 0.0f, 1.0f, | 569 | 0.0f, 0.0f, 1.0f, |
@@ -542,10 +578,13 @@ void renderScreen(Texture* tex) | |||
542 | glBindBuffer(GL_ARRAY_BUFFER, g_norms); | 578 | glBindBuffer(GL_ARRAY_BUFFER, g_norms); |
543 | glBufferData(GL_ARRAY_BUFFER, sizeof(g_norms_data), g_norms_data, GL_STATIC_DRAW); | 579 | glBufferData(GL_ARRAY_BUFFER, sizeof(g_norms_data), g_norms_data, GL_STATIC_DRAW); |
544 | 580 | ||
581 | // We're going to output to the window now | ||
545 | glBindFramebuffer(GL_FRAMEBUFFER, 0); | 582 | glBindFramebuffer(GL_FRAMEBUFFER, 0); |
546 | glViewport(0,0,1024,768); | 583 | glViewport(0,0,1024,768); |
547 | glClear(GL_COLOR_BUFFER_BIT); | 584 | glClear(GL_COLOR_BUFFER_BIT); |
548 | glUseProgram(finalShader); | 585 | glUseProgram(finalShader); |
586 | |||
587 | // Use the composited frame texture, linearly filtered and filling in black for the border | ||
549 | glActiveTexture(GL_TEXTURE0); | 588 | glActiveTexture(GL_TEXTURE0); |
550 | glBindTexture(GL_TEXTURE_2D, renderedTexBufs[curBuf]); | 589 | glBindTexture(GL_TEXTURE_2D, renderedTexBufs[curBuf]); |
551 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | 590 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
@@ -557,10 +596,20 @@ void renderScreen(Texture* tex) | |||
557 | glGenerateMipmap(GL_TEXTURE_2D); | 596 | glGenerateMipmap(GL_TEXTURE_2D); |
558 | glUniform1i(glGetUniformLocation(finalShader, "rendertex"), 0); | 597 | glUniform1i(glGetUniformLocation(finalShader, "rendertex"), 0); |
559 | 598 | ||
599 | // Use the scanlines texture | ||
560 | glActiveTexture(GL_TEXTURE1); | 600 | glActiveTexture(GL_TEXTURE1); |
561 | glBindTexture(GL_TEXTURE_2D, scanlinesTex); | 601 | glBindTexture(GL_TEXTURE_2D, scanlinesTex); |
562 | glUniform1i(glGetUniformLocation(finalShader, "scanlinestex"), 1); | 602 | glUniform1i(glGetUniformLocation(finalShader, "scanlinestex"), 1); |
563 | 603 | ||
604 | // Initialize the MVP matrices | ||
605 | mat4 p_matrix = perspective(90.0f, 4.0f / 4.0f, 0.1f, 100.0f); | ||
606 | mat4 v_matrix = lookAt(vec3(0,0,1), vec3(0,0,0), vec3(0,1,0)); | ||
607 | mat4 m_matrix = mat4(1.0f); | ||
608 | mat4 mvp_matrix = p_matrix * v_matrix * m_matrix; | ||
609 | |||
610 | glUniformMatrix4fv(glGetUniformLocation(finalShader, "MVP"), 1, GL_FALSE, &mvp_matrix[0][0]); | ||
611 | glUniformMatrix4fv(glGetUniformLocation(finalShader, "worldMat"), 1, GL_FALSE, &m_matrix[0][0]); | ||
612 | |||
564 | glEnableVertexAttribArray(0); | 613 | glEnableVertexAttribArray(0); |
565 | glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); | 614 | glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); |
566 | glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); | 615 | glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); |