1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-02-24 23:42:49 +01:00

#138 Sega Saturn levels loader (WIP)

This commit is contained in:
XProger 2018-11-04 19:49:09 +03:00
parent c8657cc55d
commit ce3c0ac654
8 changed files with 630 additions and 258 deletions

View File

@ -117,10 +117,11 @@ struct Animation {
// framePrev = frameIndex;
frameIndex = int(time * 30.0f);
int rate = max((int)anim->frameRate, 1);
// get count of real frames
int fCount = (anim->frameEnd - anim->frameStart) / anim->frameRate + 1;
int fCount = (anim->frameEnd - anim->frameStart) / rate + 1;
// real frame index & lerp delta
int fIndex = int(time * 30.0f) / anim->frameRate;
int fIndex = int(time * 30.0f) / rate;
int k = fIndex * anim->frameRate;
delta = (time * 30.0f - k) / max(1, min((int)anim->frameRate, framesCount - k)); // min is because in some cases framesCount > realFramesCount / frameRate * frameRate
@ -135,7 +136,7 @@ struct Animation {
frameNext = anim->nextFrame;
anim = &level->anims[anim->nextAnimation];
frameNext -= anim->frameStart;
fIndexB = frameNext / anim->frameRate;
fIndexB = frameNext / max((int)anim->frameRate, 1);
}
getCommand(anim, frameNext, NULL, NULL, &rot);

View File

@ -393,7 +393,7 @@ struct Controller {
switch (cmd.func) {
case TR::FloorData::PORTAL :
info.roomNext = (*fd++).data;
info.roomNext = (*fd++).value;
break;
case TR::FloorData::FLOOR : // floor & ceiling

View File

@ -696,11 +696,13 @@ namespace Debug {
c = c->next;
}
vec3 viewPos = ((Lara*)controller)->camera->frustum->pos;
char buf[255];
sprintf(buf, "DIP = %d, TRI = %d, SND = %d, active = %d", Core::stats.dips, Core::stats.tris, Sound::channelsCount, activeCount);
Debug::Draw::text(vec2(16, y += 16), vec4(1.0f), buf);
vec3 angle = controller->angle * RAD2DEG;
sprintf(buf, "pos = (%d, %d, %d), angle = (%d, %d), room = %d (camera: %d)", int(controller->pos.x), int(controller->pos.y), int(controller->pos.z), (int)angle.x, (int)angle.y, controller->getRoomIndex(), game->getCamera()->getRoomIndex());
sprintf(buf, "pos = (%d, %d, %d), angle = (%d, %d), room = %d (camera: %d [%d, %d, %d])", int(controller->pos.x), int(controller->pos.y), int(controller->pos.z), (int)angle.x, (int)angle.y, controller->getRoomIndex(), game->getCamera()->getRoomIndex(), int(viewPos.x), int(viewPos.y), int(viewPos.z));
Debug::Draw::text(vec2(16, y += 16), vec4(1.0f), buf);
int rate = anim.anims[anim.index].frameRate;
sprintf(buf, "state = %d, anim = %d, next = %d, rate = %d, frame = %.2f / %d (%f)", anim.state, anim.index, anim.next, rate, anim.time * 30.0f, anim.framesCount, anim.delta);

File diff suppressed because it is too large Load Diff

View File

@ -18,7 +18,7 @@ namespace TR {
VER_PC = 256,
VER_PSX = 512,
VER_SEGA = 1024,
VER_SAT = 1024,
VER_TR1 = 1,
VER_TR2 = 2,
@ -27,11 +27,11 @@ namespace TR {
VER_TR5 = 16,
VER_VERSION = VER_TR1 | VER_TR2 | VER_TR3 | VER_TR4 | VER_TR5,
VER_PLATFORM = VER_PC | VER_PSX | VER_SEGA,
VER_PLATFORM = VER_PC | VER_PSX | VER_SAT,
VER_TR1_PC = VER_TR1 | VER_PC,
VER_TR1_PSX = VER_TR1 | VER_PSX,
VER_TR1_SEGA = VER_TR1 | VER_SEGA,
VER_TR1_SAT = VER_TR1 | VER_SAT,
VER_TR2_PC = VER_TR2 | VER_PC,
VER_TR2_PSX = VER_TR2 | VER_PSX,
@ -291,18 +291,21 @@ namespace TR {
case 585648 : // PSX JAP
case 508614 : version = VER_TR1_PSX;
//case 320412 : // PC JAP
case 5148 : // SAT
case 334874 :
case 316138 :
case 316460 : return LVL_TR1_TITLE;
// GYM
case 1234800 : // PSX JAP
case 1074234 : version = VER_TR1_PSX;
case 343854 : // SAT
case 3377974 : // PC JAP
case 3236806 :
case 3237128 : return LVL_TR1_GYM;
// LEVEL1
case 1667568 : // PSX JAP
case 1448896 : version = VER_TR1_PSX;
case 497656 :
case 2540906 : // PC JAP
case 2533312 :
case 2533634 : return LVL_TR1_1;
@ -735,7 +738,7 @@ namespace TR {
if (Stream::existsContent("PSXDATA/GYM.PSX"))
return VER_TR1_PSX;
if (Stream::existsContent("DATA/GYM.SAT"))
return VER_TR1_SEGA;
return VER_TR1_SAT;
if (Stream::existsContent("data/ASSAULT.TR2") || Stream::existsContent("assault.TR2"))
return VER_TR2_PC;
@ -765,14 +768,14 @@ namespace TR {
void getGameLevelFile(char *dst, Version version, LevelID id) {
if (useEasyStart) {
switch (version) {
case VER_TR1_PC :
case VER_TR1_PC :
sprintf(dst, "DATA/%s.PHD", LEVEL_INFO[id].name);
if (Stream::existsContent(dst)) break;
sprintf(dst, "%s.PHD", LEVEL_INFO[id].name);
break;
case VER_TR1_PSX : sprintf(dst, "PSXDATA/%s.PSX", LEVEL_INFO[id].name); break;
case VER_TR1_SEGA : sprintf(dst, "DATA/%s.SAT", LEVEL_INFO[id].name); break;
case VER_TR2_PC : { // oh FFFFUUUUUUCKing CaTaComB.Tr2!
case VER_TR1_PSX : sprintf(dst, "PSXDATA/%s.PSX", LEVEL_INFO[id].name); break;
case VER_TR1_SAT : sprintf(dst, "DATA/%s.SAT", LEVEL_INFO[id].name); break;
case VER_TR2_PC : { // oh FFFFUUUUUUCKing CaTaComB.Tr2!
if (id == LVL_TR2_VENICE || id == LVL_TR2_CUT_2 || id == LVL_TR2_PLATFORM || id == LVL_TR2_CUT_3 || id == LVL_TR2_UNWATER ||
id == LVL_TR2_KEEL || id == LVL_TR2_LIVING || id == LVL_TR2_DECK || id == LVL_TR2_CATACOMB || id == LVL_TR2_ICECAVE ||
id == LVL_TR2_CUT_4 || id == LVL_TR2_XIAN || id == LVL_TR2_HOUSE) {
@ -904,6 +907,7 @@ namespace TR {
char title[32];
if (useEasyStart) {
switch (version) {
case VER_TR1_SAT :
case VER_TR1_PC :
case VER_TR1_PSX :
sprintf(title, "track_%02d", track);

View File

@ -1145,7 +1145,7 @@ struct Level : IGame {
src = owner->tileData->color;
uv = t.texCoordAtlas;
uvCount = 4;
level->fillObjectTexture(owner->tileData, tile.uv, tile.tile, tile.clut);
level->fillObjectTexture(owner->tileData, tile.uv, tile.tile, tile.clut, t.type);
} else {
id -= level->objectTexturesCount;
@ -1155,7 +1155,7 @@ struct Level : IGame {
src = owner->tileData->color;
uv = t.texCoordAtlas;
uvCount = 2;
level->fillObjectTexture(owner->tileData, tile.uv, tile.tile, tile.clut);
level->fillObjectTexture(owner->tileData, tile.uv, tile.tile, tile.clut, TR::TextureType::TEX_TYPE_SPRITE);
} else { // common (generated) textures
id -= level->spriteTexturesCount;
@ -1280,8 +1280,6 @@ struct Level : IGame {
}
*/
void initTextures() {
ASSERT(level.tilesCount);
#ifndef SPLIT_BY_TILE
#ifdef _OS_PSP
@ -1338,6 +1336,8 @@ struct Level : IGame {
PROFILE_LABEL(TEXTURE, atlas->ID, "atlas");
#else
ASSERT(level.tilesCount);
#ifdef _OS_PSP
atlas = new Texture(level.tiles4, level.tilesCount, level.cluts, level.clutsCount);
#else

View File

@ -908,7 +908,9 @@ struct MeshBuilder {
dyn.faces = NULL;
for (int j = 0; j < d.fCount; j++) {
TR::Face &f = d.faces[j];
TR::Face &f = d.faces[j];
ASSERT(!f.colored);
ASSERT(f.flags.texture < level.objectTexturesCount);
TR::ObjectTexture &t = level.objectTextures[f.flags.texture];
if (f.water) continue;
@ -962,6 +964,7 @@ struct MeshBuilder {
for (int j = 0; j < mesh.fCount; j++) {
TR::Face &f = mesh.faces[j];
ASSERT(f.colored || f.flags.texture < level.objectTexturesCount);
TR::ObjectTexture &t = f.colored ? whiteTile : level.objectTextures[f.flags.texture];
if (t.attribute != 0)

View File

@ -13,14 +13,17 @@
#endif
#define ASSERT(expr) if (expr) {} else { LOG("ASSERT:\n %s:%d\n %s => %s\n", __FILE__, __LINE__, __FUNCTION__, #expr); debugBreak(); }
#define ASSERTV(expr) ASSERT(expr)
#ifndef _OS_ANDROID
#define LOG(...) printf(__VA_ARGS__)
#endif
#else
#define ASSERT(expr)
//#define ASSERT(expr) if (expr) {} else { LOG("ASSERT:\n %s:%d\n %s => %s\n", __FILE__, __LINE__, __FUNCTION__, #expr); }
#define ASSERT(expr)
#define ASSERTV(expr) (expr) ? 0 : 1
#ifdef _OS_LINUX
#define LOG(...) printf(__VA_ARGS__); fflush(stdout)
#else