diff --git a/src/cache.h b/src/cache.h index 80f999b..46c5c32 100644 --- a/src/cache.h +++ b/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++; diff --git a/src/camera.h b/src/camera.h index cf78536..0f15683 100644 --- a/src/camera.h +++ b/src/camera.h @@ -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; } diff --git a/src/core.h b/src/core.h index 8777b96..cbbe6aa 100644 --- a/src/core.h +++ b/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 diff --git a/src/format.h b/src/format.h index 439d1f5..f0ddc73 100644 --- a/src/format.h +++ b/src/format.h @@ -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); } diff --git a/src/gameflow.h b/src/gameflow.h index 95d2de4..f0aecd3 100644 --- a/src/gameflow.h +++ b/src/gameflow.h @@ -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; } } diff --git a/src/lara.h b/src/lara.h index 5ba1d7f..69413d9 100644 --- a/src/lara.h +++ b/src/lara.h @@ -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); diff --git a/src/level.h b/src/level.h index 3a74056..32c3b18 100644 --- a/src/level.h +++ b/src/level.h @@ -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