From ea1272bf41b1e0cbbd0d52dbb7ef9238f6636ddb Mon Sep 17 00:00:00 2001 From: XProger Date: Sat, 25 Aug 2018 09:20:51 +0300 Subject: [PATCH] #23 ambient cubes interpolation; fix fmv code for VS2013 --- src/cache.h | 81 ++++++++++++++++--- src/level.h | 11 ++- src/video.h | 220 ++++++++++++++++++++++++++-------------------------- 3 files changed, 190 insertions(+), 122 deletions(-) diff --git a/src/cache.h b/src/cache.h index 443bd29..6c27075 100644 --- a/src/cache.h +++ b/src/cache.h @@ -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 sector = sx * r.zSectors + sz; - Cube *a = getAmbient(room, sector); - if (a) - value = *a; - else + + int x = int(pos.x) - r.info.x; + int z = int(pos.z) - r.info.z; + + // 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 = fabsf(x - sx) / 1024.0f; + tz = fabsf(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; } }; diff --git a/src/level.h b/src/level.h index 96d2bf8..54bc128 100644 --- a/src/level.h +++ b/src/level.h @@ -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; @@ -2334,7 +2340,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); @@ -2390,6 +2396,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]; diff --git a/src/video.h b/src/video.h index 23dfc6d..02d5a7b 100644 --- a/src/video.h +++ b/src/video.h @@ -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[] = {