From 297c093d398e7d6e5fcc5dc6ba1056ede25abf6f Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Sat, 14 Feb 2015 17:57:23 -0500 Subject: Did some lighting and added room name --- src/main.cpp | 3 ++- src/map.cpp | 17 ++++++++++++--- src/renderer.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++++++---- src/renderer.h | 2 ++ src/translate_font.cpp | 32 ++++++++++++++++++++++++++++ 5 files changed, 103 insertions(+), 8 deletions(-) create mode 100644 src/translate_font.cpp (limited to 'src') diff --git a/src/main.cpp b/src/main.cpp index a2743d1..7c1a21f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -86,6 +86,7 @@ int main() while (!quit) { + /* double currentTime = glfwGetTime(); nbFrames++; if ( currentTime - lastTime >= 1.0 ){ // If last prinf() was more than 1 sec ago @@ -93,7 +94,7 @@ int main() printf("%f ms/frame\n", 1000.0/double(nbFrames)); nbFrames = 0; lastTime += 1.0; - } + }*/ if (holding_left && player->x_vel >= 0) { diff --git a/src/map.cpp b/src/map.cpp index 10cd313..0dd3e04 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -21,9 +21,9 @@ Map::Map() add_collision(GAME_WIDTH+6, 0, GAME_WIDTH, right, 1); FILE* f = fopen("../maps/bigmap.txt", "r"); - char* mapbuf = (char*) malloc(MAP_WIDTH*MAP_HEIGHT*sizeof(char)); + char* mapbuf = (char*) malloc(MAP_WIDTH*(MAP_HEIGHT-1)*sizeof(char)); - for (int i=0; iwidth*tex->height; + + char* buf = (char*) calloc(size, sizeof(char)); + buf[0x00] = 'B'; + buf[0x01] = 'M'; + *(int*)&(buf[0x0A]) = 54; + *(int*)&(buf[0x12]) = tex->width; + *(int*)&(buf[0x16]) = tex->height; + *(int*)&(buf[0x1C]) = 24; + *(int*)&(buf[0x1E]) = 0; + *(int*)&(buf[0x22]) = size; + + glBindTexture(GL_TEXTURE_2D, tex->texID); + glGetTexImage(GL_TEXTURE_2D, 0, GL_BGR, GL_UNSIGNED_BYTE, buf + 54); + + FILE* f = fopen(filename, "wb"); + fwrite(buf, sizeof(char), size, f); + fclose(f); + + free(buf); +} + void fillTexture(Texture* tex, Rectangle* dstrect, int r, int g, int b) { if (!rendererInitialized) @@ -478,15 +508,17 @@ void renderScreen(Texture* tex) exit(-1); } - // Set up framebuffer + // First we're going to composite our frame with the previous frame + // We start by setting up the framebuffer glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName); glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexBufs[curBuf], 0); - // Set up renderer + // Set up the shaer glViewport(0,0,GAME_WIDTH,GAME_HEIGHT); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(ntscShader); + // Use the current frame texture, nearest neighbor and clamped to edge glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, tex->texID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -495,6 +527,7 @@ void renderScreen(Texture* tex) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glUniform1i(glGetUniformLocation(ntscShader, "curFrameSampler"), 0); + // Use the previous frame composite texture, nearest neighbor and clamped to edge glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, renderedTexBufs[(curBuf + 1) % 2]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -503,12 +536,13 @@ void renderScreen(Texture* tex) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glUniform1i(glGetUniformLocation(ntscShader, "prevFrameSampler"), 1); + // Load the NTSC artifact texture glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, artifactsTex); glUniform1i(glGetUniformLocation(ntscShader, "NTSCArtifactSampler"), 2); - glUniform1f(glGetUniformLocation(ntscShader, "NTSCLerp"), curBuf * 1.0); + // Load the vertices of a flat surface GLfloat g_quad_vertex_buffer_data[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, @@ -523,11 +557,13 @@ void renderScreen(Texture* tex) glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW); + // Render our composition glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); glDrawArrays(GL_TRIANGLES, 0, 6); glDisableVertexAttribArray(0); - + + // Load the normal vertices of a flat surface GLfloat g_norms_data[] = { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, @@ -542,10 +578,13 @@ void renderScreen(Texture* tex) glBindBuffer(GL_ARRAY_BUFFER, g_norms); glBufferData(GL_ARRAY_BUFFER, sizeof(g_norms_data), g_norms_data, GL_STATIC_DRAW); + // We're going to output to the window now glBindFramebuffer(GL_FRAMEBUFFER, 0); glViewport(0,0,1024,768); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(finalShader); + + // Use the composited frame texture, linearly filtered and filling in black for the border glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, renderedTexBufs[curBuf]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -557,10 +596,20 @@ void renderScreen(Texture* tex) glGenerateMipmap(GL_TEXTURE_2D); glUniform1i(glGetUniformLocation(finalShader, "rendertex"), 0); + // Use the scanlines texture glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, scanlinesTex); glUniform1i(glGetUniformLocation(finalShader, "scanlinestex"), 1); + // Initialize the MVP matrices + mat4 p_matrix = perspective(90.0f, 4.0f / 4.0f, 0.1f, 100.0f); + mat4 v_matrix = lookAt(vec3(0,0,1), vec3(0,0,0), vec3(0,1,0)); + mat4 m_matrix = mat4(1.0f); + mat4 mvp_matrix = p_matrix * v_matrix * m_matrix; + + glUniformMatrix4fv(glGetUniformLocation(finalShader, "MVP"), 1, GL_FALSE, &mvp_matrix[0][0]); + glUniformMatrix4fv(glGetUniformLocation(finalShader, "worldMat"), 1, GL_FALSE, &m_matrix[0][0]); + glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); diff --git a/src/renderer.h b/src/renderer.h index de5fc31..057337c 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -1,6 +1,7 @@ #include #include #include +#include using namespace glm; @@ -35,6 +36,7 @@ void destroyRenderer(); Texture* createTexture(int width, int height); void destroyTexture(Texture* tex); Texture* loadTextureFromBMP(char* filename); +void saveTextureToBMP(Texture* tex, char* filename); void fillTexture(Texture* tex, Rectangle* loc, int r, int g, int b); void blitTexture(Texture* srctex, Texture* dsttex, Rectangle* srcrect, Rectangle* dstrect); void renderScreen(Texture* tex); diff --git a/src/translate_font.cpp b/src/translate_font.cpp new file mode 100644 index 0000000..7eb4c59 --- /dev/null +++ b/src/translate_font.cpp @@ -0,0 +1,32 @@ +#include "renderer.h" +#include + +#define min(x,y) ((x) > (y) ? (y) : (x)) + +int main() +{ + initRenderer(); + + Texture* palette = createTexture(128, 128); + fillTexture(palette, NULL, 0, 0, 0); + + Texture* wrong = loadTextureFromBMP("../res/arcadepix_regular_8.bmp"); + + FILE* desc = fopen("../res/arcadepix_regular_8.sfl", "r"); + while (!feof(desc)) + { + int ch; + Rectangle srcRect; + + fscanf(desc, "%d %d %d %d %d %*d %*d %*d \n", &ch, &(srcRect.x), &(srcRect.y), &(srcRect.w), &(srcRect.h)); + + Rectangle dstRect(ch % 16 * 8, ch / 16 * 8 + (8 - min(srcRect.h,8)), min(srcRect.w, 8), min(srcRect.h, 8)); + blitTexture(wrong, palette, &srcRect, &dstRect); + } + + fclose(desc); + + saveTextureToBMP(palette, "tex.bmp"); + + destroyRenderer(); +} -- cgit 1.4.1