isle-portable/LEGO1/modeldb/modeldb.cpp
foxtacles 7e4a86fb39
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
Add third person camera extension (#786)
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.
2026-03-31 01:00:07 +02:00

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;
}