mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-10 15:14:28 +02:00
31
src/cache.h
31
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);
|
||||
|
10
src/core.h
10
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;
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
77
src/level.h
77
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;
|
||||
|
@@ -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);
|
||||
|
||||
|
22
src/ui.h
22
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);
|
||||
|
Reference in New Issue
Block a user