1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-07 05:37:01 +02:00

#23 fix water level calculation

This commit is contained in:
XProger
2018-03-07 07:21:16 +03:00
parent 1e538609ab
commit a89e3f8beb
7 changed files with 33 additions and 23 deletions

View File

@@ -144,7 +144,7 @@ struct ShaderCache {
src = SHADER;
typ = typeNames[type];
sprintf(def, "%s#define PASS_%s\n#define TYPE_%s\n#define MAX_LIGHTS %d\n#define MAX_RANGES %d\n#define MAX_OFFSETS %d\n#define MAX_CONTACTS %d\n#define WATER_FOG_DIST (1.0/%d.0)\n#define SHADOW_TEX_SIZE %d.0\n", ext, passNames[pass], typ, MAX_LIGHTS, MAX_ANIM_TEX_RANGES, MAX_ANIM_TEX_OFFSETS, MAX_CONTACTS, WATER_FOG_DIST, SHADOW_TEX_SIZE);
sprintf(def, "%s#define PASS_%s\n#define TYPE_%s\n#define MAX_LIGHTS %d\n#define MAX_CONTACTS %d\n#define WATER_FOG_DIST (1.0/%d.0)\n#define SHADOW_TEX_SIZE %d.0\n", ext, passNames[pass], typ, MAX_LIGHTS, MAX_CONTACTS, WATER_FOG_DIST, SHADOW_TEX_SIZE);
#ifdef MERGE_SPRITES
if (type == Shader::SPRITE)
strcat(def, "#define ALIGN_SPRITES 1\n");
@@ -394,8 +394,8 @@ struct WaterCache {
void init(IGame *game) {
TR::Level *level = game->getLevel();
TR::Room &r = level->rooms[to]; // underwater room
int minX = r.xSectors, minZ = r.zSectors, maxX = 0, maxZ = 0, posY = 0;
ASSERT(r.flags.water);
int minX = r.xSectors, minZ = r.zSectors, maxX = 0, maxZ = 0, posY = level->rooms[to].waterLevel, caustY = posY;
for (int z = 0; z < r.zSectors; z++)
for (int x = 0; x < r.xSectors; x++) {
@@ -405,9 +405,16 @@ struct WaterCache {
minZ = min(minZ, z);
maxX = max(maxX, x);
maxZ = max(maxZ, z);
posY = level->rooms[s.roomAbove].waterLevel;
if (s.roomBelow != TR::NO_ROOM)
caust = s.roomBelow;
if (s.roomBelow != TR::NO_ROOM) {
int16 caustRoom = s.roomBelow;
int floor = int(level->getFloor(&s, vec3(float(r.info.x + x * 1024), float(posY), float(r.info.z + z * 1024)), &caustRoom));
if (floor > caustY) {
caustY = floor;
caust = caustRoom;
if (level->state.flags.flipped && level->rooms[caust].alternateRoom > -1)
caust = level->rooms[caust].alternateRoom;
}
}
}
}
maxX++;

View File

@@ -413,6 +413,7 @@ struct Camera : ICamera {
vec2 delta = Input::mouse.pos - Input::mouse.start.L;
advAngle.x -= delta.y * 0.01f;
advAngle.y += delta.x * 0.01f;
advAngle.y = clamp(advAngle.y, -PI, PI);
Input::mouse.start.L = Input::mouse.pos;
}

View File

@@ -485,11 +485,8 @@ namespace Core {
#endif
#define MAX_LIGHTS 4
#define MAX_CACHED_LIGHTS 3
#define MAX_RENDER_BUFFERS 32
#define MAX_CONTACTS 15
#define MAX_ANIM_TEX_RANGES 16
#define MAX_ANIM_TEX_OFFSETS 32
struct Shader;
struct Texture;
@@ -627,7 +624,7 @@ namespace Core {
vec4 fogParams;
vec4 contacts[MAX_CONTACTS];
Texture *whiteTex;
Texture *whiteTex, *whiteCube;
enum Pass { passCompose, passShadow, passAmbient, passWater, passFilter, passGUI, passMAX } pass;
@@ -1001,6 +998,8 @@ namespace Core {
#endif
#ifndef _PSP
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*)&defaultFBO);
glGenFramebuffers(1, &FBO);
glDepthFunc(GL_LEQUAL);
@@ -1027,7 +1026,8 @@ namespace Core {
eye = 0.0f;
uint32 data = 0xFFFFFFFF;
whiteTex = new Texture(1, 1, Texture::RGBA, Texture::NEAREST, &data);
whiteTex = new Texture(1, 1, Texture::RGBA, Texture::NEAREST, &data);
whiteCube = new Texture(1, 1, Texture::RGBA, Texture::CUBEMAP, &data);
// init settings
settings.version = SETTINGS_VERSION;
@@ -1123,6 +1123,7 @@ namespace Core {
delete eyeTex[0];
delete eyeTex[1];
delete whiteTex;
delete whiteCube;
#ifdef _PSP
delete[] cmdBuf;
#else

View File

@@ -1295,7 +1295,7 @@ namespace TR {
uint8 reverbType;
uint8 filter;
uint8 align;
uint32 waterLevel;
int32 waterLevel;
struct DynLight {
int32 id;
@@ -3893,12 +3893,14 @@ namespace TR {
return sector;
}
float getFloor(const Room::Sector *sector, const vec3 &pos) {
float getFloor(const Room::Sector *sector, const vec3 &pos, int16 *roomIndex = NULL) {
int x = int(pos.x);
int z = int(pos.z);
while (sector->roomBelow != NO_ROOM) {
Room &room = rooms[sector->roomBelow];
if (roomIndex)
*roomIndex = sector->roomBelow;
sector = room.getSector((x - room.info.x) / 1024, (z - room.info.z) / 1024);
}

View File

@@ -859,8 +859,8 @@ namespace TR {
case LVL_TR1_CAT :
case LVL_TR1_END :
case LVL_TR1_END2 : return FOG_SANDY;
default : return FOG_BLACK;
}
return FOG_BLACK;
}
}

View File

@@ -638,6 +638,8 @@ struct Lara : Character {
updateZone();
updateLights(false);
camera->changeView(camera->firstPerson);
}
TR::Entity::Type getCurrentWeaponInv() {
@@ -2588,6 +2590,9 @@ struct Lara : Character {
// scion debug (TODO: remove)
if (Input::down[ikP]) {
switch (level->id) {
case TR::LVL_TR1_2 :
reset(61, vec3(21987, -1024, 29144), PI * 3.0f * 0.5f); // level 2 (trap door)
break;
case TR::LVL_TR1_3A :
reset(51, vec3(41015, 3584, 34494), -PI); // level 3a (t-rex)
break;
@@ -2604,7 +2609,8 @@ struct Lara : Character {
reset(99, vec3(45562, -3328, 63366), 225 * DEG2RAD); // level 7a (flipmap)
break;
case TR::LVL_TR1_7B :
reset(77, vec3(36943, -4096, 62821), 270 * DEG2RAD); // level 7b (heavy trigger)
// reset(77, vec3(36943, -4096, 62821), 270 * DEG2RAD); // level 7b (heavy trigger)
reset(49, vec3(45596, -6144, 71579), 0); // level 7b (water trigger)
break;
case TR::LVL_TR2_WALL :
//reset(44, vec3(62976, 1536, 23040), 0);

View File

@@ -24,7 +24,6 @@ struct Level : IGame {
TR::Level level;
Inventory inventory;
Texture *atlas;
Texture *cube;
MeshBuilder *mesh;
Lara *players[2], *player;
@@ -375,7 +374,7 @@ struct Level : IGame {
Core::whiteTex->bind(sNormal);
Core::whiteTex->bind(sMask);
Core::whiteTex->bind(sReflect);
cube->bind(sEnvironment);
Core::whiteCube->bind(sEnvironment);
Core::basis.identity();
}
@@ -694,7 +693,6 @@ struct Level : IGame {
delete zoneCache;
delete atlas;
delete cube;
delete mesh;
Sound::stopAll();
@@ -1087,14 +1085,9 @@ struct Level : IGame {
LOG("atlas: %d x %d\n", atlas->width, atlas->height);
PROFILE_LABEL(TEXTURE, atlas->ID, "atlas");
uint32 whitePix = 0xFFFFFFFF;
cube = new Texture(1, 1, Texture::RGBA, true, &whitePix);
delete[] level.tiles;
level.tiles = NULL;
#else
cube = NULL;
#ifdef _PSP
atlas = new Texture(level.tiles4, level.tilesCount, level.cluts, level.clutsCount);
#else