mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-16 18:14:05 +02:00
#23 remove water surfaces (for water effect) for alternative rooms (flipmaps); apply main light for water surfaces
This commit is contained in:
@@ -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);
|
||||
|
20
src/mesh.h
20
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;
|
||||
|
Reference in New Issue
Block a user