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:
19
src/cache.h
19
src/cache.h
@@ -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++;
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
11
src/core.h
11
src/core.h
@@ -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
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user