// 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); }
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 handleInput(GameState* gs, InputState* is) { double te = gs->frameSpan; float moveSpeed = gs->settings.keyScroll * te; // should load from config float rotateSpeed = gs->settings.keyRotate * te; // 20.8 degrees float keyZoom = gs->settings.keyZoom * te; float mouseZoom = gs->settings.mouseZoom * te; if(is->clickButton == 1) { /* flattenArea(gs->map.tb, gs->cursorPos.x - 5, gs->cursorPos.y - 5, gs->cursorPos.x + 5, gs->cursorPos.y + 5 ); setZone(&gs->map, gs->cursorPos.x - 5, gs->cursorPos.y - 5, gs->cursorPos.x + 5, gs->cursorPos.y + 5, gs->activeTool + 1 ); checkMapDirty(&gs->map); */ } if(is->buttonDown == 1) { gs->mouseDownPos.x = gs->cursorPos.x; gs->mouseDownPos.y = gs->cursorPos.y; printf("start dragging at (%d,%d)\n", (int)gs->cursorPos.x, (int)gs->cursorPos.y); } if(is->buttonUp == 1) { //vCopy(&gs->cursorPos, &gs->mouseDownPos); printf("stopped dragging at (%d,%d)\n", (int)gs->cursorPos.x, (int)gs->cursorPos.y); } if(is->clickButton == 2) { gs->activeTool = (gs->activeTool + 1) % 3; } // look direction if(is->keyState[38] & IS_KEYDOWN) { gs->direction += rotateSpeed; } if(is->keyState[39] & IS_KEYDOWN) { gs->direction -= rotateSpeed; } // keep rotation in [0,F_2PI) gs->direction = fmodf(F_2PI + gs->direction, F_2PI); // zoom if(is->keyState[52] & IS_KEYDOWN) { gs->zoom += keyZoom; gs->zoom = fmin(gs->zoom, -10.0); } if(is->keyState[53] & IS_KEYDOWN) { gs->zoom -= keyZoom; } if(is->clickButton == 4) { gs->zoom += mouseZoom; gs->zoom = fmin(gs->zoom, -10.0); } if(is->clickButton == 5) { gs->zoom -= mouseZoom; } // movement Vector move = { .x = moveSpeed * sin(F_PI - gs->direction), .y = moveSpeed * cos(F_PI - gs->direction), .z = 0.0f }; if(is->keyState[111] & IS_KEYDOWN) { vAdd(&gs->lookCenter, &move, &gs->lookCenter); } if(is->keyState[116] & IS_KEYDOWN) { vSub(&gs->lookCenter, &move, &gs->lookCenter); } // flip x and y to get ccw normal, using move.z as the temp move.z = move.x; move.x = -move.y; move.y = move.z; move.z = 0.0f; if(is->keyState[113] & IS_KEYDOWN) { vSub(&gs->lookCenter, &move, &gs->lookCenter); } if(is->keyState[114] & IS_KEYDOWN) { vAdd(&gs->lookCenter, &move, &gs->lookCenter); } if(is->keyState[110] & IS_KEYDOWN) { nearPlane += 50 * te; printf("near: %f, far: %f\n", nearPlane, farPlane); } if(is->keyState[115] & IS_KEYDOWN) { nearPlane -= 50 * te; printf("near: %f, far: %f\n", nearPlane, farPlane); } if(is->keyState[112] & IS_KEYDOWN) { farPlane += 250 * te; printf("near: %f, far: %f\n", nearPlane, farPlane); } if(is->keyState[117] & IS_KEYDOWN) { farPlane -= 250 * te; printf("near: %f, far: %f\n", nearPlane, farPlane); } static lastChange = 0; if(is->keyState[119] & IS_KEYDOWN) { if(gs->frameTime > lastChange + 1) { gs->debugMode = (gs->debugMode + 1) % 5; lastChange = gs->frameTime; } } } void setGameSettings(GameSettings* g, UserConfig* u) { const float rotateFactor = 0.7260f; const float scrollFactor = 300.0f; const float zoomFactor = 600.0f; g->keyRotate = rotateFactor * fclampNorm(u->keyRotateSensitivity); g->keyScroll = scrollFactor * fclampNorm(u->keyScrollSensitivity); g->keyZoom = zoomFactor * fclampNorm(u->keyZoomSensitivity); g->mouseRotate = rotateFactor * fclampNorm(u->mouseRotateSensitivity); g->mouseScroll = scrollFactor * fclampNorm(u->mouseScrollSensitivity); g->mouseZoom = 4 * zoomFactor * fclampNorm(u->mouseZoomSensitivity); printf("keyRotate %.3f\n", g->keyRotate); printf("keyScroll %.3f\n", g->keyScroll); printf("keyZoom %.3f\n", g->keyZoom); printf("mouseRotate %.3f\n", g->mouseRotate); printf("mouseScroll %.3f\n", g->mouseScroll); printf("mouseZoom %.3f\n", g->mouseZoom); } void setUpView(GameState* gs) { } void depthPrepass(XStuff* xs, GameState* gs, InputState* is) { // draw UI renderUIPicking(xs, gs); // draw terrain // TODO: factor all the math into the frame setup function //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 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); // draw terrain // drawTerrainBlockDepth(&gs->map, msGetTop(&gs->model), msGetTop(&gs->view), msGetTop(&gs->proj)); drawTerrainDepth(&gs->map, msGetTop(&gs->view), msGetTop(&gs->proj), &gs->screen.wh); msPop(&gs->view); msPop(&gs->proj); }