mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-09 22:56:53 +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;
|
src = SHADER;
|
||||||
typ = typeNames[type];
|
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
|
#ifdef MERGE_SPRITES
|
||||||
if (type == Shader::SPRITE)
|
if (type == Shader::SPRITE)
|
||||||
strcat(def, "#define ALIGN_SPRITES 1\n");
|
strcat(def, "#define ALIGN_SPRITES 1\n");
|
||||||
@@ -394,8 +394,8 @@ struct WaterCache {
|
|||||||
void init(IGame *game) {
|
void init(IGame *game) {
|
||||||
TR::Level *level = game->getLevel();
|
TR::Level *level = game->getLevel();
|
||||||
TR::Room &r = level->rooms[to]; // underwater room
|
TR::Room &r = level->rooms[to]; // underwater room
|
||||||
|
ASSERT(r.flags.water);
|
||||||
int minX = r.xSectors, minZ = r.zSectors, maxX = 0, maxZ = 0, posY = 0;
|
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 z = 0; z < r.zSectors; z++)
|
||||||
for (int x = 0; x < r.xSectors; x++) {
|
for (int x = 0; x < r.xSectors; x++) {
|
||||||
@@ -405,9 +405,16 @@ struct WaterCache {
|
|||||||
minZ = min(minZ, z);
|
minZ = min(minZ, z);
|
||||||
maxX = max(maxX, x);
|
maxX = max(maxX, x);
|
||||||
maxZ = max(maxZ, z);
|
maxZ = max(maxZ, z);
|
||||||
posY = level->rooms[s.roomAbove].waterLevel;
|
if (s.roomBelow != TR::NO_ROOM) {
|
||||||
if (s.roomBelow != TR::NO_ROOM)
|
int16 caustRoom = s.roomBelow;
|
||||||
caust = 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++;
|
maxX++;
|
||||||
|
@@ -413,6 +413,7 @@ struct Camera : ICamera {
|
|||||||
vec2 delta = Input::mouse.pos - Input::mouse.start.L;
|
vec2 delta = Input::mouse.pos - Input::mouse.start.L;
|
||||||
advAngle.x -= delta.y * 0.01f;
|
advAngle.x -= delta.y * 0.01f;
|
||||||
advAngle.y += delta.x * 0.01f;
|
advAngle.y += delta.x * 0.01f;
|
||||||
|
advAngle.y = clamp(advAngle.y, -PI, PI);
|
||||||
Input::mouse.start.L = Input::mouse.pos;
|
Input::mouse.start.L = Input::mouse.pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
11
src/core.h
11
src/core.h
@@ -485,11 +485,8 @@ namespace Core {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MAX_LIGHTS 4
|
#define MAX_LIGHTS 4
|
||||||
#define MAX_CACHED_LIGHTS 3
|
|
||||||
#define MAX_RENDER_BUFFERS 32
|
#define MAX_RENDER_BUFFERS 32
|
||||||
#define MAX_CONTACTS 15
|
#define MAX_CONTACTS 15
|
||||||
#define MAX_ANIM_TEX_RANGES 16
|
|
||||||
#define MAX_ANIM_TEX_OFFSETS 32
|
|
||||||
|
|
||||||
struct Shader;
|
struct Shader;
|
||||||
struct Texture;
|
struct Texture;
|
||||||
@@ -627,7 +624,7 @@ namespace Core {
|
|||||||
vec4 fogParams;
|
vec4 fogParams;
|
||||||
vec4 contacts[MAX_CONTACTS];
|
vec4 contacts[MAX_CONTACTS];
|
||||||
|
|
||||||
Texture *whiteTex;
|
Texture *whiteTex, *whiteCube;
|
||||||
|
|
||||||
enum Pass { passCompose, passShadow, passAmbient, passWater, passFilter, passGUI, passMAX } pass;
|
enum Pass { passCompose, passShadow, passAmbient, passWater, passFilter, passGUI, passMAX } pass;
|
||||||
|
|
||||||
@@ -1001,6 +998,8 @@ namespace Core {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _PSP
|
#ifndef _PSP
|
||||||
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
|
|
||||||
glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*)&defaultFBO);
|
glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*)&defaultFBO);
|
||||||
glGenFramebuffers(1, &FBO);
|
glGenFramebuffers(1, &FBO);
|
||||||
glDepthFunc(GL_LEQUAL);
|
glDepthFunc(GL_LEQUAL);
|
||||||
@@ -1027,7 +1026,8 @@ namespace Core {
|
|||||||
eye = 0.0f;
|
eye = 0.0f;
|
||||||
|
|
||||||
uint32 data = 0xFFFFFFFF;
|
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
|
// init settings
|
||||||
settings.version = SETTINGS_VERSION;
|
settings.version = SETTINGS_VERSION;
|
||||||
@@ -1123,6 +1123,7 @@ namespace Core {
|
|||||||
delete eyeTex[0];
|
delete eyeTex[0];
|
||||||
delete eyeTex[1];
|
delete eyeTex[1];
|
||||||
delete whiteTex;
|
delete whiteTex;
|
||||||
|
delete whiteCube;
|
||||||
#ifdef _PSP
|
#ifdef _PSP
|
||||||
delete[] cmdBuf;
|
delete[] cmdBuf;
|
||||||
#else
|
#else
|
||||||
|
@@ -1295,7 +1295,7 @@ namespace TR {
|
|||||||
uint8 reverbType;
|
uint8 reverbType;
|
||||||
uint8 filter;
|
uint8 filter;
|
||||||
uint8 align;
|
uint8 align;
|
||||||
uint32 waterLevel;
|
int32 waterLevel;
|
||||||
|
|
||||||
struct DynLight {
|
struct DynLight {
|
||||||
int32 id;
|
int32 id;
|
||||||
@@ -3893,12 +3893,14 @@ namespace TR {
|
|||||||
return sector;
|
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 x = int(pos.x);
|
||||||
int z = int(pos.z);
|
int z = int(pos.z);
|
||||||
|
|
||||||
while (sector->roomBelow != NO_ROOM) {
|
while (sector->roomBelow != NO_ROOM) {
|
||||||
Room &room = rooms[sector->roomBelow];
|
Room &room = rooms[sector->roomBelow];
|
||||||
|
if (roomIndex)
|
||||||
|
*roomIndex = sector->roomBelow;
|
||||||
sector = room.getSector((x - room.info.x) / 1024, (z - room.info.z) / 1024);
|
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_CAT :
|
||||||
case LVL_TR1_END :
|
case LVL_TR1_END :
|
||||||
case LVL_TR1_END2 : return FOG_SANDY;
|
case LVL_TR1_END2 : return FOG_SANDY;
|
||||||
|
default : return FOG_BLACK;
|
||||||
}
|
}
|
||||||
return FOG_BLACK;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -638,6 +638,8 @@ struct Lara : Character {
|
|||||||
|
|
||||||
updateZone();
|
updateZone();
|
||||||
updateLights(false);
|
updateLights(false);
|
||||||
|
|
||||||
|
camera->changeView(camera->firstPerson);
|
||||||
}
|
}
|
||||||
|
|
||||||
TR::Entity::Type getCurrentWeaponInv() {
|
TR::Entity::Type getCurrentWeaponInv() {
|
||||||
@@ -2588,6 +2590,9 @@ struct Lara : Character {
|
|||||||
// scion debug (TODO: remove)
|
// scion debug (TODO: remove)
|
||||||
if (Input::down[ikP]) {
|
if (Input::down[ikP]) {
|
||||||
switch (level->id) {
|
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 :
|
case TR::LVL_TR1_3A :
|
||||||
reset(51, vec3(41015, 3584, 34494), -PI); // level 3a (t-rex)
|
reset(51, vec3(41015, 3584, 34494), -PI); // level 3a (t-rex)
|
||||||
break;
|
break;
|
||||||
@@ -2604,7 +2609,8 @@ struct Lara : Character {
|
|||||||
reset(99, vec3(45562, -3328, 63366), 225 * DEG2RAD); // level 7a (flipmap)
|
reset(99, vec3(45562, -3328, 63366), 225 * DEG2RAD); // level 7a (flipmap)
|
||||||
break;
|
break;
|
||||||
case TR::LVL_TR1_7B :
|
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;
|
break;
|
||||||
case TR::LVL_TR2_WALL :
|
case TR::LVL_TR2_WALL :
|
||||||
//reset(44, vec3(62976, 1536, 23040), 0);
|
//reset(44, vec3(62976, 1536, 23040), 0);
|
||||||
|
@@ -24,7 +24,6 @@ struct Level : IGame {
|
|||||||
TR::Level level;
|
TR::Level level;
|
||||||
Inventory inventory;
|
Inventory inventory;
|
||||||
Texture *atlas;
|
Texture *atlas;
|
||||||
Texture *cube;
|
|
||||||
MeshBuilder *mesh;
|
MeshBuilder *mesh;
|
||||||
|
|
||||||
Lara *players[2], *player;
|
Lara *players[2], *player;
|
||||||
@@ -375,7 +374,7 @@ struct Level : IGame {
|
|||||||
Core::whiteTex->bind(sNormal);
|
Core::whiteTex->bind(sNormal);
|
||||||
Core::whiteTex->bind(sMask);
|
Core::whiteTex->bind(sMask);
|
||||||
Core::whiteTex->bind(sReflect);
|
Core::whiteTex->bind(sReflect);
|
||||||
cube->bind(sEnvironment);
|
Core::whiteCube->bind(sEnvironment);
|
||||||
Core::basis.identity();
|
Core::basis.identity();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -694,7 +693,6 @@ struct Level : IGame {
|
|||||||
delete zoneCache;
|
delete zoneCache;
|
||||||
|
|
||||||
delete atlas;
|
delete atlas;
|
||||||
delete cube;
|
|
||||||
delete mesh;
|
delete mesh;
|
||||||
|
|
||||||
Sound::stopAll();
|
Sound::stopAll();
|
||||||
@@ -1087,14 +1085,9 @@ struct Level : IGame {
|
|||||||
LOG("atlas: %d x %d\n", atlas->width, atlas->height);
|
LOG("atlas: %d x %d\n", atlas->width, atlas->height);
|
||||||
PROFILE_LABEL(TEXTURE, atlas->ID, "atlas");
|
PROFILE_LABEL(TEXTURE, atlas->ID, "atlas");
|
||||||
|
|
||||||
uint32 whitePix = 0xFFFFFFFF;
|
|
||||||
cube = new Texture(1, 1, Texture::RGBA, true, &whitePix);
|
|
||||||
|
|
||||||
delete[] level.tiles;
|
delete[] level.tiles;
|
||||||
level.tiles = NULL;
|
level.tiles = NULL;
|
||||||
#else
|
#else
|
||||||
cube = NULL;
|
|
||||||
|
|
||||||
#ifdef _PSP
|
#ifdef _PSP
|
||||||
atlas = new Texture(level.tiles4, level.tilesCount, level.cluts, level.clutsCount);
|
atlas = new Texture(level.tiles4, level.tilesCount, level.cluts, level.clutsCount);
|
||||||
#else
|
#else
|
||||||
|
Reference in New Issue
Block a user