diff --git a/src/cache.h b/src/cache.h index 1ca8336..328af98 100644 --- a/src/cache.h +++ b/src/cache.h @@ -13,14 +13,6 @@ //#define WATER_USE_GRID #define UNDERWATER_COLOR "#define UNDERWATER_COLOR vec3(0.6, 0.9, 0.9)\n" -const char DEPTH[] = - #include "shaders/depth.glsl" -; - -const char SHADOW_MASK[] = - #include "shaders/shadow.glsl" -; - const char SHADER[] = #include "shaders/shader.glsl" ; @@ -125,18 +117,16 @@ struct ShaderCache { } } - const char *passNames[] = { "DEPTH", "COMPOSE", "SHADOW", "COMPOSE", "AMBIENT", "WATER", "FILTER", "VOLUME", "GUI" }; + const char *passNames[] = { "COMPOSE", "SHADOW", "AMBIENT", "WATER", "FILTER", "VOLUME", "GUI" }; const char *src = NULL; const char *typ = NULL; switch (pass) { - case Core::passDepth : case Core::passCompose : case Core::passShadow : - case Core::passShadowMask : case Core::passAmbient : { static const char *typeNames[] = { "SPRITE", "FLASH", "ROOM", "ENTITY", "MIRROR" }; - src = (pass == Core::passDepth) ? DEPTH : SHADER; + src = SHADER; typ = typeNames[type]; int animTexRangesCount = game->getMesh()->animTexRangesCount; int animTexOffsetsCount = game->getMesh()->animTexOffsetsCount; @@ -680,9 +670,9 @@ struct WaterCache { Item &item = items[i]; if (!item.visible) continue; - // render mirror reflection Core::setTarget(reflect, true); + Core::viewport = Core::viewportDef; vec3 p = item.pos; vec3 n = vec3(0, 1, 0); @@ -704,10 +694,10 @@ struct WaterCache { game->updateParams(); camera->reflectPlane = NULL; - camera->setup(true); - Core::setTarget(NULL); + camera->setup(true); + // render water plane if (level->rooms[item.from].lightsCount) { TR::Room::Light &light = level->rooms[item.from].lights[0]; @@ -723,17 +713,8 @@ struct WaterCache { float sx = item.size.x * DETAIL / (item.data[0]->width / 2); float sz = item.size.z * DETAIL / (item.data[0]->height / 2); - float offset, scale; - if (Core::eye != 0.0f) { - offset = -Core::eye * 0.25f + 0.25f; - scale = 0.5f; - } else { - offset = 0.0f; - scale = 1.0f; - } - - Core::active.shader->setParam(uTexParam, vec4(offset, scale, sx, sz)); + Core::active.shader->setParam(uTexParam, vec4(1.0f, 1.0f, sx, sz)); refract->bind(sDiffuse); reflect->bind(sReflect); diff --git a/src/core.h b/src/core.h index 424507f..71db6e9 100644 --- a/src/core.h +++ b/src/core.h @@ -270,7 +270,7 @@ namespace Core { Texture *blackTex, *whiteTex; - enum Pass { passDepth, passCompose, passShadow, passShadowMask, passAmbient, passWater, passFilter, passVolume, passGUI, passMAX } pass; + enum Pass { passCompose, passShadow, passAmbient, passWater, passFilter, passVolume, passGUI, passMAX } pass; GLuint FBO; struct RenderTargetCache { @@ -467,7 +467,8 @@ namespace Core { for (int i = 0; i < MAX_LIGHTS; i++) lightColor[i] = vec4(0, 0, 0, 1); - + eye = 0.0f; + uint32 data = 0x00000000; blackTex = new Texture(1, 1, Texture::RGBA, false, &data, false); data = 0xFFFFFFFF; @@ -668,7 +669,8 @@ namespace Core { setViewport(int(viewportDef.x), int(viewportDef.y), int(viewportDef.z), int(viewportDef.w)); } else { - viewportDef = viewport; + if (active.target == NULL) + viewportDef = viewport; GLenum texTarget = GL_TEXTURE_2D; if (target->cube) texTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X + face; @@ -699,6 +701,8 @@ namespace Core { void beginFrame() { memset(&active, 0, sizeof(active)); + setViewport(0, 0, Core::width, Core::height); + viewportDef = viewport; setDepthTest(true); active.blendMode = bmAlpha; active.cullMode = cfNone; diff --git a/src/game.h b/src/game.h index 624c15d..d3c1d9c 100644 --- a/src/game.h +++ b/src/game.h @@ -24,7 +24,7 @@ namespace Game { Core::settings.ambient = true; Core::settings.lighting = true; Core::settings.shadows = true; - Core::settings.water = false;//Core::support.texFloat || Core::support.texHalf; + Core::settings.water = Core::support.texFloat || Core::support.texHalf; level = NULL; ui = NULL; diff --git a/src/lara.h b/src/lara.h index 3e986b2..bfc2bc6 100644 --- a/src/lara.h +++ b/src/lara.h @@ -407,12 +407,12 @@ struct Lara : Character { if (level->extra.braid > -1) braid = new Braid(this, vec3(-4.0f, 24.0f, -48.0f)); - + reset(15, vec3(70067, -256, 29104), -0.68f); // level 2 (pool) #ifdef _DEBUG //reset(14, vec3(40448, 3584, 60928), PI * 0.5f, true); // gym (pool) //reset(14, vec3(20215, 6656, 52942), PI); // level 1 (bridge) - //reset(15, vec3(70067, -256, 29104), -0.68f); // level 2 (pool) + reset(15, vec3(70067, -256, 29104), -0.68f); // level 2 (pool) //reset(61, vec3(27221, -1024, 29205), PI * 0.5f); // level 2 (blade) //reset(43, vec3(31400, -2560, 25200), PI); // level 2 (reach) //reset(16, vec3(60907, 0, 39642), PI * 3 / 2); // level 2 (hang & climb) @@ -424,7 +424,7 @@ struct Lara : Character { //reset(61, vec3(21987, -1024, 29144), PI * 3.0f * 0.5f); // level 2 (trap door) //reset(51, vec3(41015, 3584, 34494), -PI); // level 3a (t-rex) //reset(5, vec3(38643, -3072, 92370), PI * 0.5f); // level 3a (gears) - reset(43, vec3(64037, 6656, 48229), PI); // level 3b (movingblock) + //reset(43, vec3(64037, 6656, 48229), PI); // level 3b (movingblock) //reset(0, vec3(40913, -1012, 42252), PI); // level 8c //reset(10, vec3(90443, 11264 - 256, 114614), PI, true); // villa mortal 2 #endif diff --git a/src/level.h b/src/level.h index 648e73c..b62b042 100644 --- a/src/level.h +++ b/src/level.h @@ -92,36 +92,10 @@ struct Level : IGame { if (shadow) shadow->bind(sShadow); - glDepthFunc(GL_LEQUAL); Core::setDepthTest(true); Core::setDepthWrite(true); -// Core::setColorWrite(false, false, false, false); Core::pass = Core::passCompose; renderScene(roomIndex); - // Core::setColorWrite(true, true, true, true); - /* - if (genShadowMask && false) { - renderShadowVolumes(); - - Core::setDepthWrite(false); - Core::setStencilTest(true); - - glDepthFunc(GL_EQUAL); - - Core::pass = Core::passShadowMask; - glStencilFunc(GL_NOTEQUAL, 128, ~0); - renderScene(roomIndex); - - Core::pass = Core::passCompose; - glStencilFunc(GL_EQUAL, 128, ~0); - renderScene(roomIndex); - - glDepthFunc(GL_LEQUAL); - - Core::setStencilTest(false); - Core::setDepthWrite(true); - } - */ } //============================== @@ -611,7 +585,7 @@ struct Level : IGame { void setup() { PROFILE_MARKER("SETUP"); - camera->setup(Core::pass == Core::passDepth || Core::pass == Core::passCompose || Core::pass == Core::passShadowMask); + camera->setup(Core::pass == Core::passCompose); atlas->bind(sDiffuse); Core::whiteTex->bind(sNormal); @@ -764,7 +738,7 @@ struct Level : IGame { if (colorShadow) Core::setClearColor(vec4(0.0f, 0.0f, 0.0f, 0.0f)); } - +/* void renderShadowVolumes() { getLight(lara->pos, lara->getRoomIndex()); @@ -805,13 +779,13 @@ struct Level : IGame { Core::setStencilTest(false); } - +*/ void render() { Core::invalidateTarget(true, true); params->clipHeight = NO_CLIP_PLANE; params->clipSign = 1.0f; params->waterHeight = params->clipHeight; - + if (ambientCache) ambientCache->precessQueue(); if (waterCache) @@ -819,60 +793,29 @@ struct Level : IGame { if (shadow) renderShadows(lara->getRoomIndex()); - Core::setViewport(0, 0, Core::width, Core::height); - Core::setClearStencil(128); - Core::setTarget(NULL, false); + Core::setTarget(NULL, true); + Core::setViewport(0, 0, Core::width, Core::height); if (waterCache) - waterCache->checkVisibility = true; - - Core::clear(true, true, true); - camera->fov = 90.0f; + waterCache->checkVisibility = true; - Core::setViewport(0, 0, Core::width / 2, Core::height); - Core::eye = -1.0f; - renderCompose(camera->getRoomIndex(), true); - Core::setViewport(Core::width / 2, 0, Core::width / 2, Core::height); - Core::eye = 1.0f; renderCompose(camera->getRoomIndex(), true); if (waterCache) { waterCache->checkVisibility = false; if (waterCache->visible) { - Core::setViewport(0, 0, Core::width / 2, Core::height); - Core::eye = -1.0f; - camera->setup(true); waterCache->renderMask(); - - Core::setViewport(Core::width / 2, 0, Core::width / 2, Core::height); - Core::eye = 1.0f; - camera->setup(true); - waterCache->renderMask(); - - Core::setViewport(0, 0, Core::width, Core::height); waterCache->getRefract(); waterCache->simulate(); - - Core::setViewport(0, 0, Core::width / 2, Core::height); - Core::eye = -1.0f; - camera->setup(true); - waterCache->render(); - - Core::setViewport(Core::width / 2, 0, Core::width / 2, Core::height); - Core::eye = 1.0f; - camera->setup(true); waterCache->render(); } } - Core::eye = 0.0f; - - Core::setViewport(0, 0, Core::width, Core::height); - -// Core::mViewInv = camera->mViewInv; -// Core::mView = Core::mViewInv.inverse(); #ifdef _DEBUG +// Core::mViewInv = camera->mViewInv; +// Core::mView = Core::mViewInv.inverse(); + Core::setViewport(0, 0, Core::width, Core::height); camera->setup(true); static int snd_index = 0; diff --git a/src/shaders/water.glsl b/src/shaders/water.glsl index 5e3b735..c3db46e 100644 --- a/src/shaders/water.glsl +++ b/src/shaders/water.glsl @@ -142,7 +142,6 @@ uniform sampler2D sNormal; } vec4 compose() { -return vec4(0.0); vec4 value = texture2D(sNormal, vTexCoord); vec3 normal = vec3(value.z, -sqrt(1.0 - dot(value.zw, value.zw)), value.w); @@ -156,11 +155,9 @@ return vec4(0.0); float spec = pow(max(0.0, dot(rv, lv)), 64.0) * 0.5; vec2 tc = vProjCoord.xy / vProjCoord.w * 0.5 + 0.5; -// vec2 rtc = vec2(tc.x * uTexParam.y + uTexParam.x, tc.y); - vec2 rtc = vProjCoord.xy / vProjCoord.w * 0.5 + 0.5; - vec4 refrA = texture2D(sDiffuse, uParam.xy * clamp(rtc + dudv * uParam.z, 0.0, 0.999) ); - vec4 refrB = texture2D(sDiffuse, uParam.xy * (rtc) ); + vec4 refrA = texture2D(sDiffuse, uParam.xy * clamp(tc + dudv * uParam.z, 0.0, 0.999) ); + vec4 refrB = texture2D(sDiffuse, uParam.xy * tc ); vec4 refr = vec4(mix(refrA.xyz, refrB.xyz, refrA.w), 1.0); vec4 refl = texture2D(sReflect, vec2(tc.x, 1.0 - tc.y) + dudv * uParam.w); diff --git a/src/ui.h b/src/ui.h index 8dcd4b2..4938797 100644 --- a/src/ui.h +++ b/src/ui.h @@ -5,7 +5,7 @@ #include "controller.h" struct UI { - enum TouchButton { bWeapon, bWalk, bAction, bJump, bMAX }; + enum TouchButton { bNone, bWeapon, bWalk, bAction, bJump, bMAX }; enum TouchZone { zMove, zLook, zButton, zMAX }; IGame *game; @@ -93,8 +93,10 @@ struct UI { if (checkTouchZone(zLook)) Input::joy.R = vec2(0.0f); - if (checkTouchZone(zButton)) + if (checkTouchZone(zButton)) { touchSetDown(false); + btn = bNone; + } if (doubleTap) { doubleTap = false; @@ -127,7 +129,7 @@ struct UI { // set active touches as gamepad controls getTouchDir(touch[zMove], Input::joy.L); getTouchDir(touch[zLook], Input::joy.R); - if (touch[zButton] != ikNone) { + if (touch[zButton] != ikNone && btn == bNone) { getTouchButton(Input::touch[touch[zButton] - ikTouchA].pos); touchSetDown(true); } @@ -135,9 +137,9 @@ struct UI { Input::setDown(ikJoyB, true); } - void renderControl(const vec2 &pos, const vec2 &size, const vec4 &color) { - Core::active.shader->setParam(uPosScale, vec4(pos, size * vec2(1.0f / 32767.0f))); - Core::active.shader->setParam(uMaterial, color); + void renderControl(const vec2 &pos, float size, bool active) { + Core::active.shader->setParam(uPosScale, vec4(pos, vec2(size * (active ? 2.0f : 1.0f) / 32767.0f))); + Core::active.shader->setParam(uMaterial, vec4(active ? 0.7f : 0.5f)); game->getMesh()->renderCircle(); } @@ -157,13 +159,13 @@ struct UI { vec2 pos = vec2(offset, Core::height - offset); if (Input::down[touch[zMove]]) { Input::Touch &t = Input::touch[touch[zMove] - ikTouchA]; - renderControl(t.pos, vec2(btnRadius), vec4(0.5f)); + renderControl(t.pos, btnRadius, true); pos = t.start; } - renderControl(pos, vec2(btnRadius), vec4(0.5f)); + renderControl(pos, btnRadius, false); - for (int i = 0; i < bMAX; i++) - renderControl(btnPos[i], vec2(btnRadius), vec4(0.5f)); + for (int i = bWeapon; i < bMAX; i++) + renderControl(btnPos[i], btnRadius, btn == i); Core::setCulling(cfFront); Core::setBlending(bmNone);