diff --git a/TR5Main/Specific/level.cpp b/TR5Main/Specific/level.cpp index 165c23b87..2c6e9fd1e 100644 --- a/TR5Main/Specific/level.cpp +++ b/TR5Main/Specific/level.cpp @@ -452,6 +452,30 @@ void LoadTextures() g_Level.StaticsTextures.push_back(texture); } + numTextures = ReadInt32(); + g_Level.AnimatedTextures.reserve(numTextures); + for (int i = 0; i < numTextures; i++) + { + TEXTURE texture; + + texture.width = ReadInt32(); + texture.height = ReadInt32(); + + size = ReadInt32(); + texture.colorMapData.resize(size); + ReadBytes(texture.colorMapData.data(), size); + + bool hasNormalMap = ReadInt8(); + if (hasNormalMap) + { + size = ReadInt32(); + texture.normalMapData.resize(size); + ReadBytes(texture.normalMapData.data(), size); + } + + g_Level.AnimatedTextures.push_back(texture); + } + numTextures = ReadInt32(); g_Level.SpritesTextures.reserve(numTextures); for (int i = 0; i < numTextures; i++) @@ -690,7 +714,9 @@ void FreeLevel() g_Level.RoomTextures.clear(); g_Level.MoveablesTextures.clear(); g_Level.StaticsTextures.clear(); + g_Level.AnimatedTextures.clear(); g_Level.SpritesTextures.clear(); + g_Level.AnimatedTexturesSequences.clear(); g_Level.Rooms.clear(); g_Level.ObjectTextures.clear(); g_Level.Bones.clear(); @@ -740,8 +766,29 @@ void LoadAnimatedTextures() { NumAnimatedTextures = ReadInt32(); - AnimTextureRanges = game_malloc(NumAnimatedTextures); - ReadBytes(AnimTextureRanges, NumAnimatedTextures * sizeof(short)); + /*AnimTextureRanges = game_malloc(NumAnimatedTextures); + ReadBytes(AnimTextureRanges, NumAnimatedTextures * sizeof(short));*/ + + for (int i = 0; i < NumAnimatedTextures; i++) + { + ANIMATED_TEXTURES_SEQUENCE sequence; + sequence.atlas = ReadInt32(); + sequence.numFrames = ReadInt32(); + for (int j = 0; j < sequence.numFrames; j++) + { + ANIMATED_TEXTURES_FRAME frame; + frame.x1 = ReadFloat(); + frame.y1 = ReadFloat(); + frame.x2 = ReadFloat(); + frame.y2 = ReadFloat(); + frame.x3 = ReadFloat(); + frame.y3 = ReadFloat(); + frame.x4 = ReadFloat(); + frame.y4 = ReadFloat(); + sequence.frames.push_back(frame); + } + g_Level.AnimatedTexturesSequences.push_back(sequence); + } nAnimUVRanges = ReadInt8(); } diff --git a/TR5Main/Specific/level.h b/TR5Main/Specific/level.h index f0a80be05..adb5a220d 100644 --- a/TR5Main/Specific/level.h +++ b/TR5Main/Specific/level.h @@ -41,6 +41,25 @@ struct TEXTURE std::vector normalMapData; }; +struct ANIMATED_TEXTURES_FRAME +{ + float x1; + float y1; + float x2; + float y2; + float x3; + float y3; + float x4; + float y4; +}; + +struct ANIMATED_TEXTURES_SEQUENCE +{ + int atlas; + int numFrames; + std::vector frames; +}; + struct AIOBJECT { short objectNumber; @@ -117,6 +136,7 @@ struct LEVEL std::vector RoomTextures; std::vector MoveablesTextures; std::vector StaticsTextures; + std::vector AnimatedTextures; std::vector SpritesTextures; TEXTURE MiscTextures; std::vector Rooms; @@ -137,6 +157,7 @@ struct LEVEL std::vector Zones[MAX_ZONES][2]; std::vector SoundMap; std::vector SoundDetails; + std::vector AnimatedTexturesSequences; int NumItems; int NumSpritesSequences; };