diff --git a/src/cache.h b/src/cache.h index 72d1d86..f1c6e83 100644 --- a/src/cache.h +++ b/src/cache.h @@ -321,7 +321,7 @@ struct AmbientCache { }; struct WaterCache { - #define MAX_SURFACES 8 + #define MAX_SURFACES 16 #define MAX_INVISIBLE_TIME 5.0f #define SIMULATE_TIMESTEP (1.0f / 40.0f) #define DETAIL (64.0f / 1024.0f) @@ -711,13 +711,6 @@ struct WaterCache { if (!item.visible) continue; // render water plane - if (level->rooms[item.from].lightsCount) { - TR::Room::Light &light = level->rooms[item.from].lights[0]; - Core::lightPos[0] = vec3(float(light.x), float(light.y), float(light.z)); - float lum = intensityf(light.intensity); - Core::lightColor[0] = vec4(lum, lum, lum, float(light.radius) * float(light.radius)); - } - game->setShader(Core::passWater, Shader::WATER_COMPOSE); Core::active.shader->setParam(uLightPos, Core::lightPos[0], 1); Core::active.shader->setParam(uLightColor, Core::lightColor[0], 1); diff --git a/src/mesh.h b/src/mesh.h index 74cc9ce..6aaa87f 100644 --- a/src/mesh.h +++ b/src/mesh.h @@ -535,16 +535,18 @@ struct MeshBuilder { return res; } - bool roomCheckWaterPortal(TR::Room room) { - for (int i = 0; i < room.portalsCount; i++) - if (room.flags.water ^ level->rooms[room.portals[i].roomIndex].flags.water) + bool isWaterSurface(int delta, int roomIndex, bool fromWater) { + if (roomIndex != TR::NO_ROOM && delta == 0) { + TR::Room &r = level->rooms[roomIndex]; + if (r.flags.water ^ fromWater) return true; + if (r.alternateRoom > -1 && level->rooms[r.alternateRoom].flags.water ^ fromWater) + return true; + } return false; } void roomRemoveWaterSurfaces(TR::Room &room, int &iCount, int &vCount) { - if (!roomCheckWaterPortal(room)) return; - // remove animated water polygons from room geometry for (int i = 0; i < room.data.rCount; i++) { TR::Rectangle &f = room.data.rectangles[i]; @@ -568,8 +570,8 @@ struct MeshBuilder { if (yt > 0 && yb > 0) continue; - if ((yt == 0 && s.roomAbove != TR::NO_ROOM && (level->rooms[s.roomAbove].flags.water ^ room.flags.water)) || - (yb == 0 && s.roomBelow != TR::NO_ROOM && (level->rooms[s.roomBelow].flags.water ^ room.flags.water))) { + if (isWaterSurface(yt, s.roomAbove, room.flags.water) || + isWaterSurface(yb, s.roomBelow, room.flags.water)) { f.vertices[0] = 0xFFFF; // mark as unused iCount -= 6; vCount -= 4; @@ -597,8 +599,8 @@ struct MeshBuilder { if (yt > 0 && yb > 0) continue; - if ((yt <= 1 && s.roomAbove != TR::NO_ROOM && (level->rooms[s.roomAbove].flags.water ^ room.flags.water)) || - (yb <= 1 && s.roomBelow != TR::NO_ROOM && (level->rooms[s.roomBelow].flags.water ^ room.flags.water))) { + if (isWaterSurface(yt, s.roomAbove, room.flags.water) || + isWaterSurface(yb, s.roomBelow, room.flags.water)) { f.vertices[0] = 0xFFFF; // mark as unused iCount -= 3; vCount -= 3;