GLuint initTexBufferDepth(GLuint id, int w, int h) { //GLuint id = initTexBuffer(w, h, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT); if(!id) { glGenTextures(1, &id); } glBindTexture(GL_TEXTURE_2D, id); glexit(" -- tex buffer creation"); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); glexit("a pre tex buffer creation"); //glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_RED); // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); glexit("b pre tex buffer creation"); // glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, w, h, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, w, h, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); glexit("tex buffer creation"); //glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE); return id; }
void checkCursor(GameState* gs, InputState* is) { unsigned short rgb[4]; glexit("pre selection buff"); glReadBuffer(GL_COLOR_ATTACHMENT2); glexit("selection buff"); //printf("cursor pixels: %f, %f\n", is->cursorPosPixels.x, is->cursorPosPixels.y); glReadPixels( is->cursorPosPixels.x, is->cursorPosPixels.y, 1, 1, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, &rgb); glexit("read selection"); gs->cursorPos.x = rgb[0]; gs->cursorPos.y = rgb[1]; // printf("mx: %d, my: %d, x: %d, y: %d\n", (int)is->cursorPosPixels.x, (int)is->cursorPosPixels.y, rgb[0], rgb[1]); if(is->clickButton == 3 && rgb[2] == 1) { gs->lookCenter.x = gs->cursorPos.x; gs->lookCenter.y = gs->cursorPos.y; } }
void drawFSQuad() { glBindVertexArray(fsQuadVAO); glBindBuffer(GL_ARRAY_BUFFER, fsQuadVBO); glexit("quad vbo"); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glexit("quad draw"); }
GLuint* initFBOTextures(int w, int h, FBOTexConfig* cfg) { int len, i; GLuint* texids; // calc length of the config array for(len = 0; cfg[len].internalType != 0 && cfg[len].format != 0 && cfg[len].size != 0; len++); texids = calloc(1, len + 1); printf("len %d\n" ,len); printf("w %d\n" ,w); printf("h %d\n" ,h); glGenTextures(len, texids); // allocate storage for each texture for(i = 0; i < len; i++) { glBindTexture(GL_TEXTURE_2D, texids[i]); printf("texid %d\n", texids[i]); glexit(" -- tex buffer creation"); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); printf("it %d, f %d, s %d \n", cfg[i].internalType, cfg[i].format, cfg[i].size); // just depth textures for this one if(cfg[i].format == GL_DEPTH_COMPONENT) { printf("depth \n"); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); } glexit("pre tex buffer creation"); glTexImage2D(GL_TEXTURE_2D, 0, cfg[i].internalType, w, h, 0, cfg[i].format, cfg[i].size, NULL); glexit("tex buffer creation"); } glBindTexture(GL_TEXTURE_2D, 0); glexit("end of fb tex creation"); return texids; }
void destroyFBO(Framebuffer* fb) { glDeleteFramebuffers(1, &fb->fb); glexit("delete fb"); fb->fb = 0; }
GLuint initTexBuffer(GLuint id, int w, int h, GLenum internalType, GLenum format, GLenum size) { if(!id) { glGenTextures(1, &id); } glBindTexture(GL_TEXTURE_2D, id); glexit(" -- tex buffer creation"); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glexit("pre tex buffer creation"); glTexImage2D(GL_TEXTURE_2D, 0, internalType, w, h, 0, format, size, NULL); glexit("tex buffer creation"); return id; }
// don't do dumb things like pass in null pointers or empty lists. you get what you deserve if you do. void destroyFBOTextures(GLuint* texids) { int len = 0; while(texids[len] != 0) len++; glDeleteTextures(len, texids); glexit("delete fbo textures"); }
// shitty temporary function for rendering ui void renderWindowTmp(float x, float y, int index, float glow) { msPush(&uiMat); msTrans3f(x, y, 0, &uiMat); msScale3f(50, 50, 50, &uiMat); glUniform1i(glGetUniformLocation(windowProg->id, "texIndex"), index); glexit(""); glUniform1f(glGetUniformLocation(windowProg->id, "glow"), glow); glexit(""); GLuint zz = glGetUniformLocation(windowProg->id, "mMVP"); glexit(""); glUniformMatrix4fv(zz, 1, GL_FALSE, (float*)msGetTop(&uiMat)); glexit(""); // activate vbo's glBindVertexArray(windowVAO); glexit(""); glBindBuffer(GL_ARRAY_BUFFER, windowVBO); glexit("ui vbo"); // draw geometry glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glexit("ui draw"); msPop(&uiMat); }
// temporary, for now, ish void uiPreRenderSetup() { glUseProgram(windowProg->id); glexit("ui prog"); // use program // activate vao // set up textures }
/* The ui is drawn on the actual framebuffer. */ void renderUI(XStuff* xs, GameState* gs) { if (gs->screen.resized) { resizeUI(gs); } glUseProgram(windowProg->id); glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D_ARRAY, icons->tex_id); glexit(""); glUniform1i(glGetUniformLocation(windowProg->id, "sTexture"), 3); glexit(""); // something odd is going on here with resizing, ui disappears if window is // resized larger, but squishes on resize smaller renderWindowTmp(gs->screen.wh.x - 50, 10, 2, gs->activeTool == 2 ? .5 : 0); renderWindowTmp(gs->screen.wh.x - 50, 60, 0, gs->activeTool == 0 ? .5 : 0); renderWindowTmp(gs->screen.wh.x - 50, 110, 1, gs->activeTool == 1 ? .5 : 0); }
void initFBO(Framebuffer* fb, FBOConfig* cfg) { int i, dblen = 0; GLenum status; GLenum DrawBuffers[32]; // nonsense beyond this point... glGenFramebuffers(1, &fb->fb); glBindFramebuffer(GL_FRAMEBUFFER, fb->fb); glexit("fbo creation"); // The depth buffer for(i = 0; cfg[i].texture != 0; i++) { GLenum att = cfg[i].attachment; glFramebufferTexture2D(GL_FRAMEBUFFER, att, GL_TEXTURE_2D, cfg[i].texture, 0); if(att != GL_DEPTH_ATTACHMENT && att != GL_STENCIL_ATTACHMENT) { DrawBuffers[dblen++] = att; } } glexit("fbo texture attach"); glDrawBuffers(dblen, DrawBuffers); glexit("fbo drawbuffers"); status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if(status != GL_FRAMEBUFFER_COMPLETE) { printf("fbo status invalid\n"); exit(1); } printf("FBO created.\n"); glBindFramebuffer(GL_FRAMEBUFFER, 0); glexit("unbind fb"); }
void shadingPass(GameState* gs) { Matrix world; world = IDENT_MATRIX; glUseProgram(shadingProg->id); glexit("shading prog"); glActiveTexture(GL_TEXTURE0 + 6); glexit("shading tex 1"); glBindTexture(GL_TEXTURE_2D, gs->diffuseTexBuffer); glexit("shading tex 2"); glActiveTexture(GL_TEXTURE0 + 7); glexit("shading tex 3"); glBindTexture(GL_TEXTURE_2D, gs->normalTexBuffer); glexit("shading tex 4"); glActiveTexture(GL_TEXTURE0 + 8); glexit("shading tex 5"); glBindTexture(GL_TEXTURE_2D, gs->depthTexBuffer); glexit("shading tex 6"); glActiveTexture(GL_TEXTURE0 + 9); glexit("shading tex 5"); glBindTexture(GL_TEXTURE_2D, gs->selectionTexBuffer); glexit("shading tex 6"); glUniform1i(glGetUniformLocation(shadingProg->id, "debugMode"), gs->debugMode); glUniform1i(glGetUniformLocation(shadingProg->id, "sDiffuse"), 6); glUniform1i(glGetUniformLocation(shadingProg->id, "sNormals"), 7); glUniform1i(glGetUniformLocation(shadingProg->id, "sDepth"), 8); glUniform1i(glGetUniformLocation(shadingProg->id, "sSelection"), 9); glexit("shading samplers"); glUniformMatrix4fv(glGetUniformLocation(shadingProg->id, "world"), 1, GL_FALSE, world.m); glexit("shading world"); glUniform3fv(glGetUniformLocation(shadingProg->id, "sunNormal"), 1, (float*)&gs->sunNormal); if(gs->screen.resized) { glUniform2fv(glGetUniformLocation(shadingProg->id, "resolution"), 1, (float*)&gs->screen.wh); } drawFSQuad(); glexit("post quad draw"); }
void renderFrame(XStuff* xs, GameState* gs, InputState* is) { //mModel = IDENT_MATRIX; gs->sunNormal.x = cos(gs->frameTime * gs->sunSpeed); gs->sunNormal.y = sin(gs->frameTime * gs->sunSpeed); gs->sunNormal.z = 0.0; //mScale3f(10, 10, 10, &mModel); //mRot3f(0, 1, 0, gs->direction, &mModel); msPush(&gs->proj); msPerspective(60, gs->screen.aspect, nearPlane, farPlane, &gs->proj); msPush(&gs->view); // order matters! don't mess with this. msTrans3f(0, -1, gs->zoom, &gs->view); msRot3f(1, 0, 0, F_PI / 6, &gs->view); msRot3f(0,1,0, gs->direction, &gs->view); msTrans3f(-gs->lookCenter.x, 0, -gs->lookCenter.y, &gs->view); // y-up to z-up rotation msRot3f(1, 0, 0, F_PI_2, &gs->view); msScale3f(1, 1, -1, &gs->view); // calculate cursor position Vector cursorp; Vector eyeCoord; Vector worldCoord; Matrix p, invp, invv; // device space (-1:1) Vector devCoord; devCoord.x = 0.50; devCoord.y = 0.50; devCoord.z = -1.0; // eye space mInverse(msGetTop(&gs->proj), &invp); vMatrixMul(&devCoord, &invp, &eyeCoord); vNorm(&eyeCoord, &eyeCoord); // world space mInverse(msGetTop(&gs->view), &invv); vMatrixMul(&eyeCoord, &invv, &worldCoord); vNorm(&worldCoord, &worldCoord); // mFastMul(msGetTop(&gs->view), msGetTop(&gs->proj), &mp); // mInverse(&mp, &invmp); // vMatrixMul(&devCoord, &invmp, &cursorp); //printf("(%f, %f, %f)\n", worldCoord.x, worldCoord.y, worldCoord.z); Vector2 c2; c2.x = 300; //cursorp.x; c2.y = 300; //cursorp.z; // draw terrain // drawTerrainBlock(&gs->map, msGetTop(&gs->model), msGetTop(&gs->view), msGetTop(&gs->proj), &gs->cursorPos); drawTerrain(&gs->map, msGetTop(&gs->view), msGetTop(&gs->proj), &gs->cursorPos, &gs->screen.wh); renderMarker(gs, 0,0); msPop(&gs->view); msPop(&gs->proj); glUseProgram(textProg->id); // text stuff textProj = IDENT_MATRIX; textModel = IDENT_MATRIX; mOrtho(0, gs->screen.aspect, 0, 1, -1, 100, &textProj); //mScale3f(.5,.5,.5, &textProj); mScale3f(.06, .06, .06, &textModel); GLuint tp_ul = glGetUniformLocation(textProg->id, "mProj"); GLuint tm_ul = glGetUniformLocation(textProg->id, "mModel"); GLuint ts_ul = glGetUniformLocation(textProg->id, "fontTex"); glUniformMatrix4fv(tp_ul, 1, GL_FALSE, textProj.m); glUniformMatrix4fv(tm_ul, 1, GL_FALSE, textModel.m); glexit("text matrix uniforms"); glDisable(GL_CULL_FACE); glActiveTexture(GL_TEXTURE0); glexit("active texture"); glUniform1i(ts_ul, 0); glexit("text sampler uniform"); glBindTexture(GL_TEXTURE_2D, arial->textureID); glexit("bind texture"); glBindVertexArray(strRI->vao); glexit("text vao bind"); glBindBuffer(GL_ARRAY_BUFFER, strRI->vbo); glexit("text vbo bind"); glDrawArrays(GL_TRIANGLES, 0, strRI->vertexCnt); glexit("text drawing"); }
void initGame(XStuff* xs, GameState* gs) { int ww, wh; glerr("left over error on game init"); gs->activeTool = 0; gs->debugMode = 0; gs->sunSpeed = 0; ww = xs->winAttr.width; wh = xs->winAttr.height; gs->screen.wh.x = (float)ww; gs->screen.wh.y = (float)wh; gs->screen.aspect = gs->screen.wh.x / gs->screen.wh.y; gs->screen.resized = 0; printf("w: %d, h: %d\n", ww, wh); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); initTexBuffers(gs, 0); glBindTexture(GL_TEXTURE_2D, 0); glGenFramebuffers(1, &gs->framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, gs->framebuffer); glexit("fbo creation"); // The depth buffer glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gs->diffuseTexBuffer, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, gs->normalTexBuffer, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, gs->selectionTexBuffer, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gs->depthTexBuffer, 0); glexit("fb tex2d"); //glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, gs->depthTexBuffer, 0); GLenum DrawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 }; glDrawBuffers(3, DrawBuffers); glexit("drawbuffers"); GLenum status; status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if(status != GL_FRAMEBUFFER_COMPLETE) { printf("fbo status invalid\n"); exit(1); } printf("FBO created.\n"); shadingProg = loadCombinedProgram("shading"); initFSQuad(); // check some prerequisites // GLint MaxDrawBuffers = 0; // glGetIntegerv(GL_MAX_DRAW_BUFFERS, &MaxDrawBuffers); // printf("MAX_DRAW_BUFFERS: %d\n", MaxDrawBuffers); // if(MaxDrawBuffers < 4) { // fprintf(stderr, "FATAL: GL_MAX_DRAW_BUFFERS is too low: %d. Minimum required value is 4.\n", MaxDrawBuffers); // exit(3); // }; getPrintGLEnum(GL_MAX_COLOR_ATTACHMENTS, "meh"); getPrintGLEnum(GL_MAX_DRAW_BUFFERS, "meh"); getPrintGLEnum(GL_MAX_FRAMEBUFFER_WIDTH, "meh"); getPrintGLEnum(GL_MAX_FRAMEBUFFER_HEIGHT, "meh"); getPrintGLEnum(GL_MAX_FRAMEBUFFER_LAYERS, "meh"); getPrintGLEnum(GL_MAX_FRAMEBUFFER_SAMPLES, "meh"); getPrintGLEnum(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, "meh"); getPrintGLEnum(GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS, "meh"); getPrintGLEnum(GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS, "meh"); getPrintGLEnum(GL_MAX_TEXTURE_IMAGE_UNITS, "meh"); getPrintGLEnum(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, "meh"); getPrintGLEnum(GL_MAX_ARRAY_TEXTURE_LAYERS, "meh"); getPrintGLEnum(GL_MAX_SAMPLES, "meh"); // set up matrix stacks MatrixStack* view, *proj; view = &gs->view; proj = &gs->proj; msAlloc(2, view); msAlloc(2, proj); msIdent(view); msIdent(proj); // perspective matrix, pretty standard // msPerspective(60, 1.0, 01000.0f, 100000.0f, proj); // msOrtho(0, 1, 0, 1, .01, 100000, proj); gs->zoom = -760.0; gs->direction = 0.0f; gs->lookCenter.x = 128; gs->lookCenter.y = 128; // initialize all those magic globals initMap(&gs->map); initUI(gs); initMarker(); // text rendering stuff arial = LoadFont("Arial", 64, NULL); glerr("clearing before text program load"); textProg = loadCombinedProgram("text"); unsigned int colors[] = { 0xFF0000FF, 2, 0x00FF00FF, 4, 0x0000FFFF, INT_MAX }; strRI = prepareText(arial, "FPS: --", -1, colors); /* OBJContents cube; loadOBJFile("assets/models/untitled.obj", 0, &cube); Mesh* cubem = OBJtoMesh(&cube); */ }