mirror of
https://github.com/isledecomp/isle-portable.git
synced 2026-05-01 18:13:57 +00:00
Some checks failed
CI / clang-format (push) Has been cancelled
CI / ${{ matrix.name }} (false, --toolchain /usr/local/vitasdk/share/vita.toolchain.cmake, false, false, Ninja, Vita, ubuntu-latest, true, true) (push) Has been cancelled
CI / ${{ matrix.name }} (false, -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0.26100.0, false, false, Visual Studio 17 2022, true, Xbox One, windows-latest, amd64, false, true) (push) Has been cancelled
CI / ${{ matrix.name }} (false, -DCMAKE_TOOLCHAIN_FILE=/opt/devkitpro/cmake/3DS.cmake, false, devkitpro/devkitarm:latest, false, Ninja, true, Nintendo 3DS, ubuntu-latest, true) (push) Has been cancelled
CI / ${{ matrix.name }} (false, -DCMAKE_TOOLCHAIN_FILE=/opt/devkitpro/cmake/Switch.cmake, false, devkitpro/devkita64:latest, false, Ninja, Nintendo Switch, true, ubuntu-latest, true) (push) Has been cancelled
CI / ${{ matrix.name }} (false, emcmake, false, false, true, Ninja, Emscripten, ubuntu-latest, true) (push) Has been cancelled
CI / ${{ matrix.name }} (false, false, false, Ninja, true, MSVC (arm64), windows-latest, amd64_arm64, false) (push) Has been cancelled
CI / ${{ matrix.name }} (false, false, true, Ninja, true, MSVC (x86), windows-latest, amd64_x86, false) (push) Has been cancelled
CI / ${{ matrix.name }} (false, true, false, Ninja, true, MSVC (x64), windows-latest, amd64, false) (push) Has been cancelled
CI / ${{ matrix.name }} (false, true, true, false, Ninja, true, MSVC (x64 Debug), windows-latest, amd64, false) (push) Has been cancelled
CI / ${{ matrix.name }} (true, false, -DCMAKE_SYSTEM_NAME=iOS, false, false, Xcode, true, iOS, macos-15, true) (push) Has been cancelled
CI / ${{ matrix.name }} (true, false, false, false, Ninja, Android, ubuntu-latest, true) (push) Has been cancelled
CI / ${{ matrix.name }} (true, false, true, false, Ninja, macOS, macos-latest, true) (push) Has been cancelled
CI / ${{ matrix.name }} (true, true, false, Ninja, true, mingw-w64-x86_64, mingw64, msys2 mingw64, windows-latest, msys2 {0}, true) (push) Has been cancelled
CI / ${{ matrix.name }} (true, true, true, false, Ninja, true, Linux (Debug), ubuntu-latest, true) (push) Has been cancelled
CI / ${{ matrix.name }} (true, true, true, false, Ninja, true, Linux, ubuntu-latest, true) (push) Has been cancelled
CI / Flatpak (${{ matrix.arch }}) (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Flatpak (${{ matrix.arch }}) (x86_64, ubuntu-latest) (push) Has been cancelled
CI / C++ (push) Has been cancelled
Docker / Publish web port (push) Has been cancelled
CI / Release (push) Has been cancelled
Introduces a third person camera system with orbit camera, input handling (mouse/keyboard/touch/gamepad), display actor cloning, and camera-relative movement. Includes shared character utilities (animator, cloner, customizer) and an IExtraAnimHandler interface for optional animation extensions. Also includes generic base game fixes and extension system improvements.
177 lines
3.9 KiB
C++
177 lines
3.9 KiB
C++
#include "modeldb.h"
|
|
|
|
DECOMP_SIZE_ASSERT(ModelDbWorld, 0x18)
|
|
DECOMP_SIZE_ASSERT(ModelDbPart, 0x18)
|
|
DECOMP_SIZE_ASSERT(ModelDbModel, 0x38)
|
|
DECOMP_SIZE_ASSERT(ModelDbPartList, 0x1c)
|
|
DECOMP_SIZE_ASSERT(ModelDbPartListCursor, 0x10)
|
|
|
|
// FUNCTION: LEGO1 0x10027690
|
|
// FUNCTION: BETA10 0x100e5620
|
|
void ModelDbModel::Free()
|
|
{
|
|
delete[] m_modelName;
|
|
delete[] m_presenterName;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x100276b0
|
|
MxResult ModelDbModel::Read(SDL_IOStream* p_file)
|
|
{
|
|
MxU32 len;
|
|
|
|
if (SDL_ReadIO(p_file, &len, sizeof(MxU32)) != sizeof(MxU32)) {
|
|
return FAILURE;
|
|
}
|
|
|
|
m_modelName = new char[((len + 3) & ~3u)];
|
|
if (SDL_ReadIO(p_file, m_modelName, len) != len) {
|
|
return FAILURE;
|
|
}
|
|
|
|
if (SDL_ReadIO(p_file, &m_modelDataLength, sizeof(MxU32)) != sizeof(MxU32)) {
|
|
return FAILURE;
|
|
}
|
|
if (SDL_ReadIO(p_file, &m_modelDataOffset, sizeof(MxU32)) != sizeof(MxU32)) {
|
|
return FAILURE;
|
|
}
|
|
if (SDL_ReadIO(p_file, &len, sizeof(len)) != sizeof(len)) {
|
|
return FAILURE;
|
|
}
|
|
|
|
m_presenterName = new char[((len + 3) & ~3u)];
|
|
if (SDL_ReadIO(p_file, m_presenterName, len) != len) {
|
|
return FAILURE;
|
|
}
|
|
|
|
if (SDL_ReadIO(p_file, m_location, 3 * sizeof(float)) != 3 * sizeof(float)) {
|
|
return FAILURE;
|
|
}
|
|
if (SDL_ReadIO(p_file, m_direction, 3 * sizeof(float)) != 3 * sizeof(float)) {
|
|
return FAILURE;
|
|
}
|
|
if (SDL_ReadIO(p_file, m_up, 3 * sizeof(float)) != 3 * sizeof(float)) {
|
|
return FAILURE;
|
|
}
|
|
if (SDL_ReadIO(p_file, &m_visible, sizeof(MxU8)) != sizeof(MxU8)) {
|
|
return FAILURE;
|
|
}
|
|
|
|
return SUCCESS;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10027850
|
|
MxResult ModelDbPart::Read(SDL_IOStream* p_file)
|
|
{
|
|
MxU32 len;
|
|
|
|
if (SDL_ReadIO(p_file, &len, sizeof(MxU32)) != sizeof(MxU32)) {
|
|
return FAILURE;
|
|
}
|
|
|
|
char* buff = new char[len];
|
|
|
|
if (SDL_ReadIO(p_file, buff, len) != len) {
|
|
return FAILURE;
|
|
}
|
|
|
|
m_roiName = buff;
|
|
delete[] buff;
|
|
|
|
if (SDL_ReadIO(p_file, &m_partDataLength, sizeof(undefined4)) != sizeof(undefined4)) {
|
|
return FAILURE;
|
|
}
|
|
if (SDL_ReadIO(p_file, &m_partDataOffset, sizeof(undefined4)) != sizeof(undefined4)) {
|
|
return FAILURE;
|
|
}
|
|
|
|
return SUCCESS;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10027910
|
|
MxResult ReadModelDbWorlds(SDL_IOStream* p_file, ModelDbWorld*& p_worlds, MxS32& p_numWorlds)
|
|
{
|
|
p_worlds = NULL;
|
|
p_numWorlds = 0;
|
|
|
|
MxS32 numWorlds;
|
|
if (SDL_ReadIO(p_file, &numWorlds, sizeof(numWorlds)) != sizeof(numWorlds)) {
|
|
return FAILURE;
|
|
}
|
|
|
|
ModelDbWorld* worlds = new ModelDbWorld[numWorlds];
|
|
MxS32 worldNameLen, numParts, i, j;
|
|
|
|
for (i = 0; i < numWorlds; i++) {
|
|
if (SDL_ReadIO(p_file, &worldNameLen, sizeof(MxS32)) != sizeof(MxS32)) {
|
|
return FAILURE;
|
|
}
|
|
|
|
worlds[i].m_worldName = new char[worldNameLen];
|
|
if (SDL_ReadIO(p_file, worlds[i].m_worldName, worldNameLen) != worldNameLen) {
|
|
return FAILURE;
|
|
}
|
|
|
|
if (SDL_ReadIO(p_file, &numParts, sizeof(MxS32)) != sizeof(MxS32)) {
|
|
return FAILURE;
|
|
}
|
|
|
|
worlds[i].m_partList = new ModelDbPartList();
|
|
|
|
for (j = 0; j < numParts; j++) {
|
|
ModelDbPart* part = new ModelDbPart();
|
|
|
|
if (part->Read(p_file) != SUCCESS) {
|
|
return FAILURE;
|
|
}
|
|
|
|
worlds[i].m_partList->Append(part);
|
|
}
|
|
|
|
if (SDL_ReadIO(p_file, &worlds[i].m_numModels, sizeof(MxS32)) != sizeof(MxS32)) {
|
|
return FAILURE;
|
|
}
|
|
|
|
worlds[i].m_models = new ModelDbModel[worlds[i].m_numModels];
|
|
|
|
for (j = 0; j < worlds[i].m_numModels; j++) {
|
|
if (worlds[i].m_models[j].Read(p_file) != SUCCESS) {
|
|
return FAILURE;
|
|
}
|
|
}
|
|
}
|
|
|
|
p_worlds = worlds;
|
|
p_numWorlds = numWorlds;
|
|
return SUCCESS;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10028080
|
|
// FUNCTION: BETA10 0x100e6431
|
|
void FreeModelDbWorlds(ModelDbWorld*& p_worlds, MxS32 p_numWorlds)
|
|
{
|
|
ModelDbWorld* worlds = p_worlds;
|
|
|
|
for (MxS32 i = 0; i < p_numWorlds; i++) {
|
|
delete[] worlds[i].m_worldName;
|
|
|
|
ModelDbPartListCursor cursor(worlds[i].m_partList);
|
|
ModelDbPart* part;
|
|
|
|
while (cursor.Next(part)) {
|
|
delete part;
|
|
}
|
|
|
|
delete worlds[i].m_partList;
|
|
|
|
ModelDbModel* models = worlds[i].m_models;
|
|
for (MxS32 j = 0; j < worlds[i].m_numModels; j++) {
|
|
models[j].Free();
|
|
}
|
|
|
|
delete[] worlds[i].m_models;
|
|
}
|
|
|
|
delete[] p_worlds;
|
|
p_worlds = NULL;
|
|
}
|