1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-17 18:36:43 +02:00

#23 remove water surfaces (for water effect) for alternative rooms (flipmaps); apply main light for water surfaces

This commit is contained in:
XProger
2017-08-27 00:01:38 +03:00
parent de78325909
commit 345e1c97ff
2 changed files with 12 additions and 17 deletions

View File

@@ -321,7 +321,7 @@ struct AmbientCache {
}; };
struct WaterCache { struct WaterCache {
#define MAX_SURFACES 8 #define MAX_SURFACES 16
#define MAX_INVISIBLE_TIME 5.0f #define MAX_INVISIBLE_TIME 5.0f
#define SIMULATE_TIMESTEP (1.0f / 40.0f) #define SIMULATE_TIMESTEP (1.0f / 40.0f)
#define DETAIL (64.0f / 1024.0f) #define DETAIL (64.0f / 1024.0f)
@@ -711,13 +711,6 @@ struct WaterCache {
if (!item.visible) continue; if (!item.visible) continue;
// render water plane // 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); game->setShader(Core::passWater, Shader::WATER_COMPOSE);
Core::active.shader->setParam(uLightPos, Core::lightPos[0], 1); Core::active.shader->setParam(uLightPos, Core::lightPos[0], 1);
Core::active.shader->setParam(uLightColor, Core::lightColor[0], 1); Core::active.shader->setParam(uLightColor, Core::lightColor[0], 1);

View File

@@ -535,16 +535,18 @@ struct MeshBuilder {
return res; return res;
} }
bool roomCheckWaterPortal(TR::Room room) { bool isWaterSurface(int delta, int roomIndex, bool fromWater) {
for (int i = 0; i < room.portalsCount; i++) if (roomIndex != TR::NO_ROOM && delta == 0) {
if (room.flags.water ^ level->rooms[room.portals[i].roomIndex].flags.water) TR::Room &r = level->rooms[roomIndex];
if (r.flags.water ^ fromWater)
return true; return true;
if (r.alternateRoom > -1 && level->rooms[r.alternateRoom].flags.water ^ fromWater)
return true;
}
return false; return false;
} }
void roomRemoveWaterSurfaces(TR::Room &room, int &iCount, int &vCount) { void roomRemoveWaterSurfaces(TR::Room &room, int &iCount, int &vCount) {
if (!roomCheckWaterPortal(room)) return;
// remove animated water polygons from room geometry // remove animated water polygons from room geometry
for (int i = 0; i < room.data.rCount; i++) { for (int i = 0; i < room.data.rCount; i++) {
TR::Rectangle &f = room.data.rectangles[i]; TR::Rectangle &f = room.data.rectangles[i];
@@ -568,8 +570,8 @@ struct MeshBuilder {
if (yt > 0 && yb > 0) continue; if (yt > 0 && yb > 0) continue;
if ((yt == 0 && s.roomAbove != TR::NO_ROOM && (level->rooms[s.roomAbove].flags.water ^ room.flags.water)) || if (isWaterSurface(yt, s.roomAbove, room.flags.water) ||
(yb == 0 && s.roomBelow != TR::NO_ROOM && (level->rooms[s.roomBelow].flags.water ^ room.flags.water))) { isWaterSurface(yb, s.roomBelow, room.flags.water)) {
f.vertices[0] = 0xFFFF; // mark as unused f.vertices[0] = 0xFFFF; // mark as unused
iCount -= 6; iCount -= 6;
vCount -= 4; vCount -= 4;
@@ -597,8 +599,8 @@ struct MeshBuilder {
if (yt > 0 && yb > 0) continue; if (yt > 0 && yb > 0) continue;
if ((yt <= 1 && s.roomAbove != TR::NO_ROOM && (level->rooms[s.roomAbove].flags.water ^ room.flags.water)) || if (isWaterSurface(yt, s.roomAbove, room.flags.water) ||
(yb <= 1 && s.roomBelow != TR::NO_ROOM && (level->rooms[s.roomBelow].flags.water ^ room.flags.water))) { isWaterSurface(yb, s.roomBelow, room.flags.water)) {
f.vertices[0] = 0xFFFF; // mark as unused f.vertices[0] = 0xFFFF; // mark as unused
iCount -= 3; iCount -= 3;
vCount -= 3; vCount -= 3;