1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-10 15:14:28 +02:00

#15 fix touch controls #23 fix water, remove VR code

This commit is contained in:
XProger
2017-04-02 16:23:20 +03:00
parent 28afc80266
commit b5de93cd74
7 changed files with 41 additions and 114 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;

View File

@@ -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

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);