1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-02-24 23:42:49 +01:00
This commit is contained in:
XProger 2018-08-26 20:35:23 +03:00
commit c8c7d58494
3 changed files with 190 additions and 122 deletions

View File

@ -321,11 +321,19 @@ struct AmbientCache {
tasksCount = 0;
}
Cube* getAmbient(int roomIndex, int sector) {
Cube* getAmbient(int roomIndex, int x, int z) {
TR::Room &r = level->rooms[roomIndex];
int sx = clamp(x / 1024, 0, r.xSectors - 1);
int sz = clamp(z / 1024, 0, r.zSectors - 1);
int sector = sx * r.zSectors + sz;
if (level->state.flags.flipped && r.alternateRoom > -1)
sector += r.xSectors * r.zSectors;
if (r.sectors[sector].floor == TR::NO_FLOOR)
return NULL;
Cube *cube = &items[offsets[roomIndex] + sector];
if (cube->status == Cube::BLANK)
addTask(roomIndex, sector);
@ -333,17 +341,70 @@ struct AmbientCache {
return cube->status == Cube::READY ? cube : NULL;
}
void lerpCubes(Cube &result, const Cube *a, const Cube *b, float t) {
ASSERT(a != NULL && b != NULL);
result.colors[0] = a->colors[0].lerp(b->colors[0], t);
result.colors[1] = a->colors[1].lerp(b->colors[1], t);
result.colors[2] = a->colors[2].lerp(b->colors[2], t);
result.colors[3] = a->colors[3].lerp(b->colors[3], t);
result.colors[4] = a->colors[4].lerp(b->colors[4], t);
result.colors[5] = a->colors[5].lerp(b->colors[5], t);
}
void getAmbient(int room, const vec3 &pos, Cube &value) {
TR::Room &r = level->rooms[room];
int sx = clamp((int(pos.x) - r.info.x) / 1024, 0, r.xSectors - 1);
int sz = clamp((int(pos.z) - r.info.z) / 1024, 0, r.zSectors - 1);
int x = int(pos.x) - r.info.x;
int z = int(pos.z) - r.info.z;
int sector = sx * r.zSectors + sz;
Cube *a = getAmbient(room, sector);
if (a)
value = *a;
else
// cc cx
// cz cd
Cube *cc = getAmbient(room, x, z);
if (cc && cc->status == Cube::READY) {
Cube *cx = NULL, *cz = NULL, *cd = NULL;
int sx = (x / 1024) * 1024 + 512;
int sz = (z / 1024) * 1024 + 512;
int ox = sx + sign(x - sx) * 1024;
int oz = sz + sign(z - sz) * 1024;
float tx, tz;
tx = abs(x - sx) / 1024.0f;
tz = abs(z - sz) / 1024.0f;
cx = getAmbient(room, ox, sz);
cz = getAmbient(room, sx, oz);
cd = getAmbient(room, ox, oz);
if (cx != NULL && cx->status != Cube::READY) cx = cc;
if (cz != NULL && cz->status != Cube::READY) cz = cc;
if (cd != NULL && cd->status != Cube::READY) cd = cc;
Cube lx, lz;
if (cd != NULL && cx != NULL && cz != NULL) {
lerpCubes(lx, cc, cx, tx);
lerpCubes(lz, cz, cd, tx);
lerpCubes(value, &lx, &lz, tz);
} else if (cd != NULL && cx != NULL) {
lerpCubes(lx, cc, cx, tx);
lerpCubes(value, &lx, cd, tz);
} else if (cd != NULL && cz != NULL) {
lerpCubes(lz, cc, cz, tz);
lerpCubes(value, &lz, cd, tx);
} else if (cx != NULL && cz != NULL) {
lerpCubes(lx, cc, cx, tx);
lerpCubes(value, &lx, cz, tz);
} else if (cx != NULL) {
lerpCubes(value, cc, cx, tx);
} else if (cz != NULL) {
lerpCubes(value, cc, cz, tz);
} else
value = *cc;
value.status = cc->status;
} else
value.status = Cube::BLANK;
}
};

View File

@ -440,13 +440,19 @@ struct Level : IGame {
Core::Pass tmpPass = Core::pass;
Core::eye = 0.0f;
// TODO: fix for wrong room visibility checks, FIX IT!
int roomsCount = 0;
int roomsList[256];
for (int i = 0; i < level.roomsCount; i++)
roomsList[roomsCount++] = i;
// -----
// render level into cube faces or texture images
for (int i = 0; i < 6; i++) {
setupCubeCamera(pos, i);
Core::pass = pass;
Texture *target = (targets[0]->opt & OPT_CUBEMAP) ? targets[0] : targets[i * stride];
Core::setTarget(target, RT_CLEAR_COLOR | RT_CLEAR_DEPTH | RT_STORE_COLOR, i);
renderView(roomIndex, false, false);
renderView(roomIndex, false, false, roomsCount, roomsList);
}
Core::pass = tmpPass;
@ -2343,7 +2349,7 @@ struct Level : IGame {
Core::validateRenderState();
// Debug::Level::rooms(level, lara->pos, lara->getEntity().room);
// Debug::Level::lights(level, player->getRoomIndex(), player);
// Debug::Level::sectors(this, lara->getRoomIndex(), (int)lara->pos.y);
// Debug::Level::sectors(this, players[0]->getRoomIndex(), (int)players[0]->pos.y);
// Core::setDepthTest(false);
// Debug::Level::portals(level);
// Core::setDepthTest(true);
@ -2399,6 +2405,7 @@ struct Level : IGame {
glBegin(GL_LINES);
float S = 64.0f;
for (int i = 0; i < level.roomsCount; i++) {
if (i != players[0]->getRoomIndex()) continue;
TR::Room &r = level.rooms[i];
for (int j = 0; j < r.xSectors * r.zSectors; j++) {
TR::Room::Sector &s = r.sectors[j];

View File

@ -16,118 +16,118 @@ struct AC_ENTRY {
static const AC_ENTRY STR_AC[] = {
// signBit = (8 + shift) - length
// AC_LUT_1 (shift = 1)
{ 0b11000000 , 1 , 1 , 4 },
{ 0b10000000 , 0 , 2 , 5 },
{ 0b10100000 , 2 , 1 , 5 },
{ 0b01010000 , 0 , 3 , 6 },
{ 0b01100000 , 4 , 1 , 6 },
{ 0b01110000 , 3 , 1 , 6 },
{ 0b00100000 , 7 , 1 , 7 },
{ 0b00101000 , 6 , 1 , 7 },
{ 0b00110000 , 1 , 2 , 7 },
{ 0b00111000 , 5 , 1 , 7 },
{ 0b00010000 , 2 , 2 , 8 },
{ 0b00010100 , 9 , 1 , 8 },
{ 0b00011000 , 0 , 4 , 8 },
{ 0b00011100 , 8 , 1 , 8 },
{ 0b01000000 , 13 , 1 , 9 },
{ 0b01000010 , 0 , 6 , 9 },
{ 0b01000100 , 12 , 1 , 9 },
{ 0b01000110 , 11 , 1 , 9 },
{ 0b01001000 , 3 , 2 , 9 },
{ 0b01001010 , 1 , 3 , 9 },
{ 0b01001100 , 0 , 5 , 9 },
{ 0b01001110 , 10 , 1 , 9 },
{ 0XC0 , 1 , 1 , 4 }, // 11000000
{ 0X80 , 0 , 2 , 5 }, // 10000000
{ 0XA0 , 2 , 1 , 5 }, // 10100000
{ 0X50 , 0 , 3 , 6 }, // 01010000
{ 0X60 , 4 , 1 , 6 }, // 01100000
{ 0X70 , 3 , 1 , 6 }, // 01110000
{ 0X20 , 7 , 1 , 7 }, // 00100000
{ 0X28 , 6 , 1 , 7 }, // 00101000
{ 0X30 , 1 , 2 , 7 }, // 00110000
{ 0X38 , 5 , 1 , 7 }, // 00111000
{ 0X10 , 2 , 2 , 8 }, // 00010000
{ 0X14 , 9 , 1 , 8 }, // 00010100
{ 0X18 , 0 , 4 , 8 }, // 00011000
{ 0X1C , 8 , 1 , 8 }, // 00011100
{ 0X40 , 13 , 1 , 9 }, // 01000000
{ 0X42 , 0 , 6 , 9 }, // 01000010
{ 0X44 , 12 , 1 , 9 }, // 01000100
{ 0X46 , 11 , 1 , 9 }, // 01000110
{ 0X48 , 3 , 2 , 9 }, // 01001000
{ 0X4A , 1 , 3 , 9 }, // 01001010
{ 0X4C , 0 , 5 , 9 }, // 01001100
{ 0X4E , 10 , 1 , 9 }, // 01001110
// AC_LUT_6 (shift = 6)
{ 0b10000000 , 16 , 1 , 11 },
{ 0b10010000 , 5 , 2 , 11 },
{ 0b10100000 , 0 , 7 , 11 },
{ 0b10110000 , 2 , 3 , 11 },
{ 0b11000000 , 1 , 4 , 11 },
{ 0b11010000 , 15 , 1 , 11 },
{ 0b11100000 , 14 , 1 , 11 },
{ 0b11110000 , 4 , 2 , 11 },
{ 0b01000000 , 0 , 11 , 13 },
{ 0b01000100 , 8 , 2 , 13 },
{ 0b01001000 , 4 , 3 , 13 },
{ 0b01001100 , 0 , 10 , 13 },
{ 0b01010000 , 2 , 4 , 13 },
{ 0b01010100 , 7 , 2 , 13 },
{ 0b01011000 , 21 , 1 , 13 },
{ 0b01011100 , 20 , 1 , 13 },
{ 0b01100000 , 0 , 9 , 13 },
{ 0b01100100 , 19 , 1 , 13 },
{ 0b01101000 , 18 , 1 , 13 },
{ 0b01101100 , 1 , 5 , 13 },
{ 0b01110000 , 3 , 3 , 13 },
{ 0b01110100 , 0 , 8 , 13 },
{ 0b01111000 , 6 , 2 , 13 },
{ 0b01111100 , 17 , 1 , 13 },
{ 0b00100000 , 10 , 2 , 14 },
{ 0b00100010 , 9 , 2 , 14 },
{ 0b00100100 , 5 , 3 , 14 },
{ 0b00100110 , 3 , 4 , 14 },
{ 0b00101000 , 2 , 5 , 14 },
{ 0b00101010 , 1 , 7 , 14 },
{ 0b00101100 , 1 , 6 , 14 },
{ 0b00101110 , 0 , 15 , 14 },
{ 0b00110000 , 0 , 14 , 14 },
{ 0b00110010 , 0 , 13 , 14 },
{ 0b00110100 , 0 , 12 , 14 },
{ 0b00110110 , 26 , 1 , 14 },
{ 0b00111000 , 25 , 1 , 14 },
{ 0b00111010 , 24 , 1 , 14 },
{ 0b00111100 , 23 , 1 , 14 },
{ 0b00111110 , 22 , 1 , 14 },
{ 0X80 , 16 , 1 , 11 }, // 10000000
{ 0X90 , 5 , 2 , 11 }, // 10010000
{ 0XA0 , 0 , 7 , 11 }, // 10100000
{ 0XB0 , 2 , 3 , 11 }, // 10110000
{ 0XC0 , 1 , 4 , 11 }, // 11000000
{ 0XD0 , 15 , 1 , 11 }, // 11010000
{ 0XE0 , 14 , 1 , 11 }, // 11100000
{ 0XF0 , 4 , 2 , 11 }, // 11110000
{ 0X40 , 0 , 11 , 13 }, // 01000000
{ 0X44 , 8 , 2 , 13 }, // 01000100
{ 0X48 , 4 , 3 , 13 }, // 01001000
{ 0X4C , 0 , 10 , 13 }, // 01001100
{ 0X50 , 2 , 4 , 13 }, // 01010000
{ 0X54 , 7 , 2 , 13 }, // 01010100
{ 0X58 , 21 , 1 , 13 }, // 01011000
{ 0X5C , 20 , 1 , 13 }, // 01011100
{ 0X60 , 0 , 9 , 13 }, // 01100000
{ 0X64 , 19 , 1 , 13 }, // 01100100
{ 0X68 , 18 , 1 , 13 }, // 01101000
{ 0X6C , 1 , 5 , 13 }, // 01101100
{ 0X70 , 3 , 3 , 13 }, // 01110000
{ 0X74 , 0 , 8 , 13 }, // 01110100
{ 0X78 , 6 , 2 , 13 }, // 01111000
{ 0X7C , 17 , 1 , 13 }, // 01111100
{ 0X20 , 10 , 2 , 14 }, // 00100000
{ 0X22 , 9 , 2 , 14 }, // 00100010
{ 0X24 , 5 , 3 , 14 }, // 00100100
{ 0X26 , 3 , 4 , 14 }, // 00100110
{ 0X28 , 2 , 5 , 14 }, // 00101000
{ 0X2A , 1 , 7 , 14 }, // 00101010
{ 0X2C , 1 , 6 , 14 }, // 00101100
{ 0X2E , 0 , 15 , 14 }, // 00101110
{ 0X30 , 0 , 14 , 14 }, // 00110000
{ 0X32 , 0 , 13 , 14 }, // 00110010
{ 0X34 , 0 , 12 , 14 }, // 00110100
{ 0X36 , 26 , 1 , 14 }, // 00110110
{ 0X38 , 25 , 1 , 14 }, // 00111000
{ 0X3A , 24 , 1 , 14 }, // 00111010
{ 0X3C , 23 , 1 , 14 }, // 00111100
{ 0X3E , 22 , 1 , 14 }, // 00111110
// AC_LUT_9 (shift = 9)
{ 0b10000000 , 0 , 31 , 15 },
{ 0b10001000 , 0 , 30 , 15 },
{ 0b10010000 , 0 , 29 , 15 },
{ 0b10011000 , 0 , 28 , 15 },
{ 0b10100000 , 0 , 27 , 15 },
{ 0b10101000 , 0 , 26 , 15 },
{ 0b10110000 , 0 , 25 , 15 },
{ 0b10111000 , 0 , 24 , 15 },
{ 0b11000000 , 0 , 23 , 15 },
{ 0b11001000 , 0 , 22 , 15 },
{ 0b11010000 , 0 , 21 , 15 },
{ 0b11011000 , 0 , 20 , 15 },
{ 0b11100000 , 0 , 19 , 15 },
{ 0b11101000 , 0 , 18 , 15 },
{ 0b11110000 , 0 , 17 , 15 },
{ 0b11111000 , 0 , 16 , 15 },
{ 0b01000000 , 0 , 40 , 16 },
{ 0b01000100 , 0 , 39 , 16 },
{ 0b01001000 , 0 , 38 , 16 },
{ 0b01001100 , 0 , 37 , 16 },
{ 0b01010000 , 0 , 36 , 16 },
{ 0b01010100 , 0 , 35 , 16 },
{ 0b01011000 , 0 , 34 , 16 },
{ 0b01011100 , 0 , 33 , 16 },
{ 0b01100000 , 0 , 32 , 16 },
{ 0b01100100 , 1 , 14 , 16 },
{ 0b01101000 , 1 , 13 , 16 },
{ 0b01101100 , 1 , 12 , 16 },
{ 0b01110000 , 1 , 11 , 16 },
{ 0b01110100 , 1 , 10 , 16 },
{ 0b01111000 , 1 , 9 , 16 },
{ 0b01111100 , 1 , 8 , 16 },
{ 0b00100000 , 1 , 18 , 17 },
{ 0b00100010 , 1 , 17 , 17 },
{ 0b00100100 , 1 , 16 , 17 },
{ 0b00100110 , 1 , 15 , 17 },
{ 0b00101000 , 6 , 3 , 17 },
{ 0b00101010 , 16 , 2 , 17 },
{ 0b00101100 , 15 , 2 , 17 },
{ 0b00101110 , 14 , 2 , 17 },
{ 0b00110000 , 13 , 2 , 17 },
{ 0b00110010 , 12 , 2 , 17 },
{ 0b00110100 , 11 , 2 , 17 },
{ 0b00110110 , 31 , 1 , 17 },
{ 0b00111000 , 30 , 1 , 17 },
{ 0b00111010 , 29 , 1 , 17 },
{ 0b00111100 , 28 , 1 , 17 },
{ 0b00111110 , 27 , 1 , 17 },
{ 0X80 , 0 , 31 , 15 }, // 10000000
{ 0X88 , 0 , 30 , 15 }, // 10001000
{ 0X90 , 0 , 29 , 15 }, // 10010000
{ 0X98 , 0 , 28 , 15 }, // 10011000
{ 0XA0 , 0 , 27 , 15 }, // 10100000
{ 0XA8 , 0 , 26 , 15 }, // 10101000
{ 0XB0 , 0 , 25 , 15 }, // 10110000
{ 0XB8 , 0 , 24 , 15 }, // 10111000
{ 0XC0 , 0 , 23 , 15 }, // 11000000
{ 0XC8 , 0 , 22 , 15 }, // 11001000
{ 0XD0 , 0 , 21 , 15 }, // 11010000
{ 0XD8 , 0 , 20 , 15 }, // 11011000
{ 0XE0 , 0 , 19 , 15 }, // 11100000
{ 0XE8 , 0 , 18 , 15 }, // 11101000
{ 0XF0 , 0 , 17 , 15 }, // 11110000
{ 0XF8 , 0 , 16 , 15 }, // 11111000
{ 0X40 , 0 , 40 , 16 }, // 01000000
{ 0X44 , 0 , 39 , 16 }, // 01000100
{ 0X48 , 0 , 38 , 16 }, // 01001000
{ 0X4C , 0 , 37 , 16 }, // 01001100
{ 0X50 , 0 , 36 , 16 }, // 01010000
{ 0X54 , 0 , 35 , 16 }, // 01010100
{ 0X58 , 0 , 34 , 16 }, // 01011000
{ 0X5C , 0 , 33 , 16 }, // 01011100
{ 0X60 , 0 , 32 , 16 }, // 01100000
{ 0X64 , 1 , 14 , 16 }, // 01100100
{ 0X68 , 1 , 13 , 16 }, // 01101000
{ 0X6C , 1 , 12 , 16 }, // 01101100
{ 0X70 , 1 , 11 , 16 }, // 01110000
{ 0X74 , 1 , 10 , 16 }, // 01110100
{ 0X78 , 1 , 9 , 16 }, // 01111000
{ 0X7C , 1 , 8 , 16 }, // 01111100
{ 0X20 , 1 , 18 , 17 }, // 00100000
{ 0X22 , 1 , 17 , 17 }, // 00100010
{ 0X24 , 1 , 16 , 17 }, // 00100100
{ 0X26 , 1 , 15 , 17 }, // 00100110
{ 0X28 , 6 , 3 , 17 }, // 00101000
{ 0X2A , 16 , 2 , 17 }, // 00101010
{ 0X2C , 15 , 2 , 17 }, // 00101100
{ 0X2E , 14 , 2 , 17 }, // 00101110
{ 0X30 , 13 , 2 , 17 }, // 00110000
{ 0X32 , 12 , 2 , 17 }, // 00110010
{ 0X34 , 11 , 2 , 17 }, // 00110100
{ 0X36 , 31 , 1 , 17 }, // 00110110
{ 0X38 , 30 , 1 , 17 }, // 00111000
{ 0X3A , 29 , 1 , 17 }, // 00111010
{ 0X3C , 28 , 1 , 17 }, // 00111100
{ 0X3E , 27 , 1 , 17 }, // 00111110
};
static const uint8 STR_ZIG_ZAG[] = {