Reorganize library code into libs/ (#3119)

* Reorganize files into libs/{dolphin,JSystem,PowerPC_EABI_Support,revolution,TRK_MINNOW_DOLPHIN}

* Update configure.py and project.py for new libs structure

* Refactor `#include <dolphin/x.h>` -> `<x.h>`

* Remove `__REVOLUTION_SDK__` forwards from dolphin

* Fix dolphin/ references in revolution

* Wrap `#include <dolphin.h>` in `!__REVOLUTION_SDK__`

* Always build TRK against dolphin headers

* Resolve revolution SDK header resolution issues
This commit is contained in:
Luke Street
2026-03-01 15:35:36 -07:00
committed by GitHub
parent c9a46bd65b
commit 4df8ccc871
1740 changed files with 583 additions and 825 deletions
@@ -0,0 +1,677 @@
//
// J3DAnmLoader
//
#include "JSystem/JSystem.h" // IWYU pragma: keep
#include "JSystem/J3DGraphLoader/J3DAnmLoader.h"
#include "JSystem/J3DGraphAnimator/J3DAnimation.h"
#include "JSystem/JSupport/JSupport.h"
#include <os.h>
J3DAnmBase* J3DAnmLoaderDataBase::load(const void* i_data, J3DAnmLoaderDataBaseFlag flag) {
const JUTDataFileHeader* header = (const JUTDataFileHeader*)i_data;
J3D_ASSERT_NULLPTR(48, i_data);
if (!i_data) {
return NULL;
}
if (header->mMagic == 'J3D1') {
switch (header->mType) {
case 'bck1': {
J3DAnmKeyLoader_v15 loader;
loader.mAnm = new J3DAnmTransformKey();
return loader.load(i_data);
}
case 'bpk1': {
J3DAnmKeyLoader_v15 loader;
loader.mAnm = new J3DAnmColorKey();
return loader.load(i_data);
}
case 'blk1': {
J3DAnmKeyLoader_v15 loader;
loader.mAnm = new J3DAnmClusterKey();
return loader.load(i_data);
}
case 'btk1': {
J3DAnmKeyLoader_v15 loader;
loader.mAnm = new J3DAnmTextureSRTKey();
return loader.load(i_data);
}
case 'brk1': {
J3DAnmKeyLoader_v15 loader;
loader.mAnm = new J3DAnmTevRegKey();
return loader.load(i_data);
}
case 'bxk1': {
J3DAnmKeyLoader_v15 loader;
loader.mAnm = new J3DAnmVtxColorKey();
return loader.load(i_data);
}
case 'bca1': {
J3DAnmFullLoader_v15 loader;
if (flag & J3DLOADER_UNK_FLAG1) {
loader.mAnm = new J3DAnmTransformFullWithLerp();
} else {
loader.mAnm = new J3DAnmTransformFull();
}
return loader.load(i_data);
}
case 'bpa1': {
J3DAnmFullLoader_v15 loader;
loader.mAnm = new J3DAnmColorFull();
return loader.load(i_data);
}
case 'btp1': {
J3DAnmFullLoader_v15 loader;
loader.mAnm = new J3DAnmTexPattern();
return loader.load(i_data);
}
case 'bva1': {
J3DAnmFullLoader_v15 loader;
loader.mAnm = new J3DAnmVisibilityFull();
return loader.load(i_data);
}
case 'bla1': {
J3DAnmFullLoader_v15 loader;
loader.mAnm = new J3DAnmClusterFull();
return loader.load(i_data);
}
case 'bxa1': {
J3DAnmFullLoader_v15 loader;
loader.mAnm = new J3DAnmVtxColorFull();
return loader.load(i_data);
}
default:
OSReport("J3DAnmLoader: this is not a J3D Binary.\n");
return NULL;
}
}
return NULL;
}
void J3DAnmLoaderDataBase::setResource(J3DAnmBase* param_1, const void* i_data) {
const JUTDataFileHeader* header = (const JUTDataFileHeader*)i_data;
J3D_ASSERT_NULLPTR(188, i_data);
if (!i_data) {
return;
}
if (header->mMagic != 'J3D1') {
return;
}
switch (header->mType) {
case 'bck1': {
J3DAnmKeyLoader_v15 loader;
loader.setResource(param_1, i_data);
break;
}
case 'bpk1': {
J3DAnmKeyLoader_v15 loader;
loader.setResource(param_1, i_data);
break;
}
case 'blk1': {
J3DAnmKeyLoader_v15 loader;
loader.setResource(param_1, i_data);
break;
}
case 'btk1': {
J3DAnmKeyLoader_v15 loader;
loader.setResource(param_1, i_data);
break;
}
case 'brk1': {
J3DAnmKeyLoader_v15 loader;
if (param_1->getKind() == 5) {
loader.setResource(param_1, i_data);
}
break;
}
case 'bxk1': {
J3DAnmKeyLoader_v15 loader;
loader.setResource(param_1, i_data);
break;
}
case 'bca1': {
J3DAnmFullLoader_v15 loader;
loader.setResource(param_1, i_data);
break;
}
case 'bpa1': {
J3DAnmFullLoader_v15 loader;
loader.setResource(param_1, i_data);
break;
}
case 'btp1': {
J3DAnmFullLoader_v15 loader;
loader.setResource(param_1, i_data);
break;
}
case 'bla1': {
J3DAnmFullLoader_v15 loader;
loader.setResource(param_1, i_data);
break;
}
case 'bxa1': {
J3DAnmFullLoader_v15 loader;
loader.setResource(param_1, i_data);
break;
}
case 'bva1': {
J3DAnmFullLoader_v15 loader;
loader.setResource(param_1, i_data);
break;
}
default: {
OSReport("J3DAnmLoader: this is not a J3D Binary.\n");
break;
}
}
}
J3DAnmFullLoader_v15::J3DAnmFullLoader_v15() {}
J3DAnmFullLoader_v15::~J3DAnmFullLoader_v15() {}
J3DAnmKeyLoader_v15::J3DAnmKeyLoader_v15() {}
J3DAnmKeyLoader_v15::~J3DAnmKeyLoader_v15() {}
J3DAnmBase* J3DAnmFullLoader_v15::load(const void* i_data) {
J3D_ASSERT_NULLPTR(357, i_data);
const JUTDataFileHeader* header = (const JUTDataFileHeader*)i_data;
const JUTDataBlockHeader* block = &header->mFirstBlock;
for (int i = 0; i < header->mBlockNum; i++) {
switch (block->mType) {
case 'ANF1':
readAnmTransform((J3DAnmTransformFullData*)block);
break;
case 'PAF1':
readAnmColor((J3DAnmColorFullData*)block);
break;
case 'TPT1':
readAnmTexPattern((J3DAnmTexPatternFullData*)block);
break;
case 'CLF1':
readAnmCluster((J3DAnmClusterFullData*)block);
break;
case 'VAF1':
readAnmVisibility((J3DAnmVisibilityFullData*)block);
break;
case 'VCF1':
readAnmVtxColor((J3DAnmVtxColorFullData*)block);
break;
default:
OSReport("Unknown data block\n");
break;
}
block = (JUTDataBlockHeader*)((u8*)block + block->mSize);
}
return mAnm;
}
void J3DAnmFullLoader_v15::setResource(J3DAnmBase* param_1, const void* i_data) {
J3D_ASSERT_NULLPTR(416, i_data);
const JUTDataFileHeader* header = (const JUTDataFileHeader*)i_data;
const JUTDataBlockHeader* block = &header->mFirstBlock;
for (int i = 0; i < header->mBlockNum; i++) {
switch (block->mType) {
case 'ANF1':
JUT_ASSERT_MSG(428, param_1->getKind() == 9, "Error: Resource type inconsistency");
setAnmTransform((J3DAnmTransformFull*)param_1, (const J3DAnmTransformFullData*)block);
break;
case 'PAF1':
JUT_ASSERT_MSG(435, param_1->getKind() == 10, "Error: Resource type inconsistency");
setAnmColor((J3DAnmColorFull*)param_1, (const J3DAnmColorFullData*)block);
break;
case 'TPT1':
JUT_ASSERT_MSG(441, param_1->getKind() == 2, "Error: Resource type inconsistency");
setAnmTexPattern((J3DAnmTexPattern*)param_1, (const J3DAnmTexPatternFullData*)block);
break;
case 'CLF1':
JUT_ASSERT_MSG(448, param_1->getKind() == 12, "Error: Resource type inconsistency");
setAnmCluster((J3DAnmClusterFull*)param_1, (const J3DAnmClusterFullData*)block);
break;
case 'VAF1':
JUT_ASSERT_MSG(454, param_1->getKind() == 6, "Error: Resource type inconsistency");
setAnmVisibility((J3DAnmVisibilityFull*)param_1,
(const J3DAnmVisibilityFullData*)block);
break;
case 'VCF1':
JUT_ASSERT_MSG(461, param_1->getKind() == 14, "Error: Resource type inconsistency");
setAnmVtxColor((J3DAnmVtxColorFull*)param_1, (const J3DAnmVtxColorFullData*)block);
break;
default:
OSReport("Unknown data block\n");
break;
}
block = (JUTDataBlockHeader*)((u8*)block + block->mSize);
}
}
void J3DAnmFullLoader_v15::readAnmTransform(const J3DAnmTransformFullData* param_1) {
J3DAnmTransformFull* anm = (J3DAnmTransformFull*)mAnm;
setAnmTransform(anm, param_1);
}
void J3DAnmFullLoader_v15::setAnmTransform(J3DAnmTransformFull* param_1,
const J3DAnmTransformFullData* param_2) {
J3D_ASSERT_NULLPTR(504, param_1);
J3D_ASSERT_NULLPTR(505, param_2);
param_1->field_0x1e = param_2->field_0xc;
param_1->mFrameMax = param_2->mFrameMax;
param_1->mAttribute = param_2->field_0x8;
param_1->mFrame = 0.0f;
param_1->mAnmTable =
JSUConvertOffsetToPtr<J3DAnmTransformFullTable>(param_2, param_2->mTableOffset);
param_1->mScaleData = JSUConvertOffsetToPtr<f32>(param_2, param_2->mScaleValOffset);
param_1->mRotData = JSUConvertOffsetToPtr<s16>(param_2, param_2->mRotValOffset);
param_1->mTransData = JSUConvertOffsetToPtr<f32>(param_2, param_2->mTransValOffset);
}
void J3DAnmFullLoader_v15::readAnmColor(const J3DAnmColorFullData* param_1) {
J3DAnmColorFull* anm = (J3DAnmColorFull*)mAnm;
setAnmColor(anm, param_1);
}
void J3DAnmFullLoader_v15::setAnmColor(J3DAnmColorFull* param_1,
const J3DAnmColorFullData* param_2) {
J3D_ASSERT_NULLPTR(550, param_1);
J3D_ASSERT_NULLPTR(551, param_2);
param_1->mFrameMax = param_2->mFrameMax;
param_1->mAttribute = param_2->field_0x8;
param_1->mFrame = 0.0f;
param_1->mUpdateMaterialNum = param_2->mUpdateMaterialNum;
param_1->mAnmTable =
JSUConvertOffsetToPtr<J3DAnmColorFullTable>(param_2, param_2->mTableOffset);
param_1->mColorR = JSUConvertOffsetToPtr<u8>(param_2, param_2->mRValuesOffset);
param_1->mColorG = JSUConvertOffsetToPtr<u8>(param_2, param_2->mGValuesOffset);
param_1->mColorB = JSUConvertOffsetToPtr<u8>(param_2, param_2->mBValuesOffset);
param_1->mColorA = JSUConvertOffsetToPtr<u8>(param_2, param_2->mAValuesOffset);
param_1->mUpdateMaterialID =
JSUConvertOffsetToPtr<u16>(param_2, param_2->mUpdateMaterialIDOffset);
param_1->mUpdateMaterialName.setResource(
JSUConvertOffsetToPtr<ResNTAB>(param_2, param_2->mNameTabOffset));
}
void J3DAnmFullLoader_v15::readAnmTexPattern(const J3DAnmTexPatternFullData* param_1) {
J3DAnmTexPattern* anm = (J3DAnmTexPattern*)mAnm;
setAnmTexPattern(anm, param_1);
}
void J3DAnmFullLoader_v15::setAnmTexPattern(J3DAnmTexPattern* param_1,
const J3DAnmTexPatternFullData* param_2) {
J3D_ASSERT_NULLPTR(603, param_1);
J3D_ASSERT_NULLPTR(604, param_2);
param_1->mFrameMax = param_2->mFrameMax;
param_1->mAttribute = param_2->field_0x8;
param_1->mFrame = 0.0f;
param_1->mUpdateMaterialNum = param_2->field_0xc;
param_1->field_0x14 = param_2->field_0xe;
param_1->mAnmTable =
JSUConvertOffsetToPtr<J3DAnmTexPatternFullTable>(param_2, param_2->mTableOffset);
param_1->mTextureIndex = JSUConvertOffsetToPtr<u16>(param_2, param_2->mValuesOffset);
param_1->mUpdateMaterialID =
JSUConvertOffsetToPtr<u16>(param_2, param_2->mUpdateMaterialIDOffset);
param_1->mUpdateMaterialName.setResource(
JSUConvertOffsetToPtr<ResNTAB>(param_2, param_2->mNameTabOffset));
}
void J3DAnmFullLoader_v15::readAnmVisibility(const J3DAnmVisibilityFullData* param_1) {
J3DAnmVisibilityFull* anm = (J3DAnmVisibilityFull*)mAnm;
setAnmVisibility(anm, param_1);
}
void J3DAnmFullLoader_v15::setAnmVisibility(J3DAnmVisibilityFull* param_1,
const J3DAnmVisibilityFullData* param_2) {
J3D_ASSERT_NULLPTR(654, param_1);
J3D_ASSERT_NULLPTR(655, param_2);
param_1->mFrameMax = param_2->mFrameMax;
param_1->mAttribute = param_2->field_0x8;
param_1->mFrame = 0.0f;
param_1->mUpdateMaterialNum = param_2->field_0xc;
param_1->field_0xe = param_2->field_0xe;
param_1->mAnmTable =
JSUConvertOffsetToPtr<J3DAnmVisibilityFullTable>(param_2, param_2->mTableOffset);
param_1->mVisibility = JSUConvertOffsetToPtr<u8>(param_2, param_2->mValuesOffset);
}
void J3DAnmFullLoader_v15::readAnmCluster(const J3DAnmClusterFullData* param_1) {
J3DAnmClusterFull* anm = (J3DAnmClusterFull*)mAnm;
setAnmCluster(anm, param_1);
}
void J3DAnmFullLoader_v15::setAnmCluster(J3DAnmClusterFull* param_1,
const J3DAnmClusterFullData* param_2) {
J3D_ASSERT_NULLPTR(697, param_1);
J3D_ASSERT_NULLPTR(698, param_2);
param_1->mFrameMax = param_2->mFrameMax;
param_1->mAttribute = param_2->field_0x8;
param_1->mFrame = 0.0f;
param_1->mAnmTable =
JSUConvertOffsetToPtr<J3DAnmClusterFullTable>(param_2, param_2->mTableOffset);
param_1->mWeight = JSUConvertOffsetToPtr<f32>(param_2, param_2->mWeightOffset);
}
void J3DAnmFullLoader_v15::readAnmVtxColor(const J3DAnmVtxColorFullData* param_1) {
J3DAnmVtxColorFull* anm = (J3DAnmVtxColorFull*)mAnm;
setAnmVtxColor(anm, param_1);
}
void J3DAnmFullLoader_v15::setAnmVtxColor(J3DAnmVtxColorFull* dst,
const J3DAnmVtxColorFullData* data) {
J3D_ASSERT_NULLPTR(738, dst);
J3D_ASSERT_NULLPTR(739, data);
dst->mFrameMax = data->mFrameMax;
dst->mAttribute = data->field_0x8;
dst->mFrame = 0.0f;
dst->mAnmTableNum[0] = data->mAnmTableNum[0];
dst->mAnmTableNum[1] = data->mAnmTableNum[1];
dst->mpTable[0] =
JSUConvertOffsetToPtr<J3DAnmColorFullTable>(data, data->mTableOffsets[0]);
dst->mpTable[1] =
JSUConvertOffsetToPtr<J3DAnmColorFullTable>(data, data->mTableOffsets[1]);
dst->mAnmVtxColorIndexData[0] = JSUConvertOffsetToPtr<J3DAnmVtxColorIndexData>(
data, data->mVtxColorIndexDataOffsets[0]);
dst->mAnmVtxColorIndexData[1] = JSUConvertOffsetToPtr<J3DAnmVtxColorIndexData>(
data, data->mVtxColorIndexDataOffsets[1]);
void* indexPtr0 =
JSUConvertOffsetToPtr<u16>(data, data->mVtxColorIndexPointerOffsets[0]);
void* indexPtr1 =
JSUConvertOffsetToPtr<u16>(data, data->mVtxColorIndexPointerOffsets[1]);
for (s32 i = 0; i < dst->mAnmTableNum[0]; i++)
dst->mAnmVtxColorIndexData[0][i].mpData =
(void*)((s32)indexPtr0 + (s32)dst->mAnmVtxColorIndexData[0][i].mpData * 2);
for (s32 i = 0; i < dst->mAnmTableNum[1]; i++)
dst->mAnmVtxColorIndexData[1][i].mpData =
(void*)((s32)indexPtr1 + (s32)dst->mAnmVtxColorIndexData[1][i].mpData * 2);
dst->mColorR = JSUConvertOffsetToPtr<u8>(data, data->mRValuesOffset);
dst->mColorG = JSUConvertOffsetToPtr<u8>(data, data->mGValuesOffset);
dst->mColorB = JSUConvertOffsetToPtr<u8>(data, data->mBValuesOffset);
dst->mColorA = JSUConvertOffsetToPtr<u8>(data, data->mAValuesOffset);
}
J3DAnmBase* J3DAnmKeyLoader_v15::load(const void* param_1) {
J3D_ASSERT_NULLPTR(801, param_1);
const JUTDataFileHeader* header = (const JUTDataFileHeader*)param_1;
const JUTDataBlockHeader* block = &header->mFirstBlock;
for (int i = 0; i < header->mBlockNum; i++) {
switch (block->mType) {
case 'ANK1':
readAnmTransform((J3DAnmTransformKeyData*)block);
break;
case 'PAK1':
readAnmColor((J3DAnmColorKeyData*)block);
break;
case 'CLK1':
readAnmCluster((J3DAnmClusterKeyData*)block);
break;
case 'TTK1':
readAnmTextureSRT((J3DAnmTextureSRTKeyData*)block);
break;
case 'TRK1':
readAnmTevReg((J3DAnmTevRegKeyData*)block);
break;
case 'VCK1':
readAnmVtxColor((J3DAnmVtxColorKeyData*)block);
break;
default:
OSReport("Unknown data block\n");
break;
}
block = (JUTDataBlockHeader*)((u8*)block + block->mSize);
}
return mAnm;
}
void J3DAnmKeyLoader_v15::setResource(J3DAnmBase* param_1, const void* param_2) {
J3D_ASSERT_NULLPTR(858, param_2);
const JUTDataFileHeader* header = (const JUTDataFileHeader*)param_2;
const JUTDataBlockHeader* block = &header->mFirstBlock;
for (int i = 0; i < header->mBlockNum; i++) {
switch (block->mType) {
case 'ANK1':
JUT_ASSERT_MSG(870, param_1->getKind() == 8, "Error: Resource type inconsistency");
setAnmTransform((J3DAnmTransformKey*)param_1, (const J3DAnmTransformKeyData*)block);
break;
case 'PAK1':
JUT_ASSERT_MSG(876, param_1->getKind() == 11, "Error: Resource type inconsistency");
setAnmColor((J3DAnmColorKey*)param_1, (const J3DAnmColorKeyData*)block);
break;
case 'CLK1':
JUT_ASSERT_MSG(883, param_1->getKind() == 13, "Error: Resource type inconsistency");
setAnmCluster((J3DAnmClusterKey*)param_1, (const J3DAnmClusterKeyData*)block);
break;
case 'TTK1':
JUT_ASSERT_MSG(888, param_1->getKind() == 4, "Error: Resource type inconsistency");
setAnmTextureSRT((J3DAnmTextureSRTKey*)param_1, (const J3DAnmTextureSRTKeyData*)block);
break;
case 'TRK1':
JUT_ASSERT_MSG(894, param_1->getKind() == 5, "Error: Resource type inconsistency");
setAnmTevReg((J3DAnmTevRegKey*)param_1, (const J3DAnmTevRegKeyData*)block);
break;
case 'VCK1':
JUT_ASSERT_MSG(901, param_1->getKind() == 15, "Error: Resource type inconsistency");
setAnmVtxColor((J3DAnmVtxColorKey*)param_1, (const J3DAnmVtxColorKeyData*)block);
break;
default:
OSReport("Unknown data block\n");
break;
}
block = (JUTDataBlockHeader*)((u8*)block + block->mSize);
}
}
void J3DAnmKeyLoader_v15::readAnmTransform(const J3DAnmTransformKeyData* param_1) {
J3DAnmTransformKey* anm = (J3DAnmTransformKey*)mAnm;
setAnmTransform(anm, param_1);
}
void J3DAnmKeyLoader_v15::setAnmTransform(J3DAnmTransformKey* param_1,
const J3DAnmTransformKeyData* param_2) {
J3D_ASSERT_NULLPTR(944, param_1);
J3D_ASSERT_NULLPTR(945, param_2);
param_1->field_0x1e = param_2->field_0xc;
param_1->mFrameMax = param_2->mFrameMax;
param_1->mAttribute = param_2->field_0x8;
param_1->mDecShift = param_2->field_0x9;
param_1->mFrame = 0.0f;
param_1->mAnmTable =
JSUConvertOffsetToPtr<J3DAnmTransformKeyTable>(param_2, param_2->mTableOffset);
param_1->mScaleData = JSUConvertOffsetToPtr<f32>(param_2, param_2->field_0x18);
param_1->mRotData = JSUConvertOffsetToPtr<s16>(param_2, param_2->field_0x1c);
param_1->mTransData = JSUConvertOffsetToPtr<f32>(param_2, param_2->field_0x20);
}
void J3DAnmKeyLoader_v15::readAnmTextureSRT(const J3DAnmTextureSRTKeyData* param_1) {
J3DAnmTextureSRTKey* anm = (J3DAnmTextureSRTKey*)mAnm;
setAnmTextureSRT(anm, param_1);
}
void J3DAnmKeyLoader_v15::setAnmTextureSRT(J3DAnmTextureSRTKey* param_1,
const J3DAnmTextureSRTKeyData* param_2) {
J3D_ASSERT_NULLPTR(987, param_1);
J3D_ASSERT_NULLPTR(988, param_2);
param_1->mTrackNum = param_2->field_0xc;
param_1->mFrameMax = param_2->field_0xa;
param_1->mAttribute = param_2->field_0x8;
param_1->mDecShift = param_2->field_0x9;
param_1->mFrame = 0.0f;
param_1->mTrackNum = param_2->field_0xc;
param_1->mScaleNum = param_2->field_0xe;
param_1->mRotNum = param_2->field_0x10;
param_1->mTransNum = param_2->field_0x12;
param_1->mAnmTable =
JSUConvertOffsetToPtr<J3DAnmTransformKeyTable>(param_2, param_2->mTableOffset);
param_1->mUpdateMaterialID =
JSUConvertOffsetToPtr<u16>(param_2, param_2->mUpdateMatIDOffset);
param_1->mUpdateMaterialName.setResource(
JSUConvertOffsetToPtr<ResNTAB>(param_2, param_2->mNameTab1Offset));
param_1->mUpdateTexMtxID =
JSUConvertOffsetToPtr<u8>(param_2, param_2->mUpdateTexMtxIDOffset);
param_1->mSRTCenter = JSUConvertOffsetToPtr<Vec>(param_2, param_2->unkOffset);
param_1->mScaleData = JSUConvertOffsetToPtr<f32>(param_2, param_2->mScaleValOffset);
param_1->mRotData = JSUConvertOffsetToPtr<s16>(param_2, param_2->mRotValOffset);
param_1->mTransData = JSUConvertOffsetToPtr<f32>(param_2, param_2->mTransValOffset);
if (param_2->mNameTab2Offset) {
param_1->mPostUpdateMaterialName.setResource(
JSUConvertOffsetToPtr<ResNTAB>(param_2, param_2->mNameTab2Offset));
}
param_1->field_0x4a = param_2->field_0x34;
param_1->field_0x44 = param_2->field_0x36;
param_1->field_0x46 = param_2->field_0x38;
param_1->field_0x48 = param_2->field_0x3a;
param_1->field_0x58 =
JSUConvertOffsetToPtr<J3DAnmTransformKeyTable>(param_2, param_2->mInfoTable2Offset);
param_1->mPostUpdateMaterialID = JSUConvertOffsetToPtr<u16>(param_2, param_2->field_0x40);
param_1->mPostUpdateTexMtxID = JSUConvertOffsetToPtr<u8>(param_2, param_2->field_0x48);
param_1->mPostSRTCenter = JSUConvertOffsetToPtr<Vec>(param_2, param_2->field_0x4c);
param_1->field_0x4c = JSUConvertOffsetToPtr<f32>(param_2, param_2->field_0x50);
param_1->field_0x50 = JSUConvertOffsetToPtr<s16>(param_2, param_2->field_0x54);
param_1->field_0x54 = JSUConvertOffsetToPtr<f32>(param_2, param_2->field_0x58);
switch (param_2->field_0x5c) {
case 0:
case 1:
param_1->mTexMtxCalcType = param_2->field_0x5c;
break;
default:
param_1->mTexMtxCalcType = 0;
break;
}
}
void J3DAnmKeyLoader_v15::readAnmColor(const J3DAnmColorKeyData* param_1) {
J3DAnmColorKey* anm = (J3DAnmColorKey*)mAnm;
setAnmColor(anm, param_1);
}
void J3DAnmKeyLoader_v15::setAnmColor(J3DAnmColorKey* param_1, const J3DAnmColorKeyData* param_2) {
J3D_ASSERT_NULLPTR(1097, param_1);
J3D_ASSERT_NULLPTR(1098, param_2);
param_1->mFrameMax = param_2->mFrameMax;
param_1->mAttribute = param_2->field_0x8;
param_1->mFrame = 0.0f;
param_1->mUpdateMaterialNum = param_2->mUpdateMaterialNum;
param_1->field_0xc = param_2->field_0x10;
param_1->field_0xe = param_2->field_0x12;
param_1->field_0x10 = param_2->field_0x14;
param_1->field_0x12 = param_2->field_0x16;
param_1->mAnmTable =
JSUConvertOffsetToPtr<J3DAnmColorKeyTable>(param_2, param_2->mTableOffset);
param_1->mColorR = JSUConvertOffsetToPtr<s16>(param_2, param_2->mRValOffset);
param_1->mColorG = JSUConvertOffsetToPtr<s16>(param_2, param_2->mGValOffset);
param_1->mColorB = JSUConvertOffsetToPtr<s16>(param_2, param_2->mBValOffset);
param_1->mColorA = JSUConvertOffsetToPtr<s16>(param_2, param_2->mAValOffset);
param_1->mUpdateMaterialID =
JSUConvertOffsetToPtr<u16>(param_2, param_2->mUpdateMaterialIDOffset);
param_1->mUpdateMaterialName.setResource(
JSUConvertOffsetToPtr<ResNTAB>(param_2, param_2->mNameTabOffset));
}
void J3DAnmKeyLoader_v15::readAnmCluster(const J3DAnmClusterKeyData* param_1) {
J3DAnmClusterKey* anm = (J3DAnmClusterKey*)mAnm;
setAnmCluster(anm, param_1);
}
void J3DAnmKeyLoader_v15::setAnmCluster(J3DAnmClusterKey* param_1,
const J3DAnmClusterKeyData* param_2) {
J3D_ASSERT_NULLPTR(1156, param_1);
J3D_ASSERT_NULLPTR(1157, param_2);
param_1->mFrameMax = param_2->mFrameMax;
param_1->mAttribute = param_2->field_0x8;
param_1->mFrame = 0.0f;
param_1->mAnmTable =
JSUConvertOffsetToPtr<J3DAnmClusterKeyTable>(param_2, param_2->mTableOffset);
param_1->mWeight = JSUConvertOffsetToPtr<f32>(param_2, param_2->mWeightOffset);
}
void J3DAnmKeyLoader_v15::readAnmTevReg(const J3DAnmTevRegKeyData* param_1) {
J3DAnmTevRegKey* anm = (J3DAnmTevRegKey*)mAnm;
setAnmTevReg(anm, param_1);
}
void J3DAnmKeyLoader_v15::setAnmTevReg(J3DAnmTevRegKey* param_1,
const J3DAnmTevRegKeyData* param_2) {
J3D_ASSERT_NULLPTR(1195, param_1);
J3D_ASSERT_NULLPTR(1196, param_2);
param_1->mFrameMax = param_2->mFrameMax;
param_1->mAttribute = param_2->field_0x8;
param_1->mFrame = 0.0f;
param_1->mCRegUpdateMaterialNum = param_2->mCRegUpdateMaterialNum;
param_1->mAnmCRegKeyTable =
JSUConvertOffsetToPtr<J3DAnmCRegKeyTable>(param_2, param_2->mCRegTableOffset);
param_1->mCRegUpdateMaterialID =
JSUConvertOffsetToPtr<u16>(param_2, param_2->mCRegUpdateMaterialIDOffset);
param_1->mCRegUpdateMaterialName.setResource(
JSUConvertOffsetToPtr<ResNTAB>(param_2, param_2->mCRegNameTabOffset));
param_1->mKRegUpdateMaterialNum = param_2->mKRegUpdateMaterialNum;
param_1->mAnmKRegKeyTable =
JSUConvertOffsetToPtr<J3DAnmKRegKeyTable>(param_2, param_2->mKRegTableOffset);
param_1->mKRegUpdateMaterialID =
JSUConvertOffsetToPtr<u16>(param_2, param_2->mKRegUpdateMaterialIDOffset);
param_1->mKRegUpdateMaterialName.setResource(
JSUConvertOffsetToPtr<ResNTAB>(param_2, param_2->mKRegNameTabOffset));
param_1->mCRegDataCountR = param_2->field_0x10;
param_1->mCRegDataCountG = param_2->field_0x12;
param_1->mCRegDataCountB = param_2->field_0x14;
param_1->mCRegDataCountA = param_2->field_0x16;
param_1->mAnmCRegDataR = JSUConvertOffsetToPtr<s16>(param_2, param_2->mCRValuesOffset);
param_1->mAnmCRegDataG = JSUConvertOffsetToPtr<s16>(param_2, param_2->mCGValuesOffset);
param_1->mAnmCRegDataB = JSUConvertOffsetToPtr<s16>(param_2, param_2->mCBValuesOffset);
param_1->mAnmCRegDataA = JSUConvertOffsetToPtr<s16>(param_2, param_2->mCAValuesOffset);
param_1->mKRegDataCountR = param_2->field_0x18;
param_1->mKRegDataCountG = param_2->field_0x1a;
param_1->mKRegDataCountB = param_2->field_0x1c;
param_1->mKRegDataCountA = param_2->field_0x1e;
param_1->mAnmKRegDataR = JSUConvertOffsetToPtr<s16>(param_2, param_2->mKRValuesOffset);
param_1->mAnmKRegDataG = JSUConvertOffsetToPtr<s16>(param_2, param_2->mKGValuesOffset);
param_1->mAnmKRegDataB = JSUConvertOffsetToPtr<s16>(param_2, param_2->mKBValuesOffset);
param_1->mAnmKRegDataA = JSUConvertOffsetToPtr<s16>(param_2, param_2->mKAValuesOffset);
}
void J3DAnmKeyLoader_v15::readAnmVtxColor(const J3DAnmVtxColorKeyData* param_1) {
J3DAnmVtxColorKey* anm = (J3DAnmVtxColorKey*)mAnm;
setAnmVtxColor(anm, param_1);
}
void J3DAnmKeyLoader_v15::setAnmVtxColor(J3DAnmVtxColorKey* dst,
const J3DAnmVtxColorKeyData* data) {
J3D_ASSERT_NULLPTR(1275, dst);
J3D_ASSERT_NULLPTR(1276, data);
dst->mFrameMax = data->mFrameMax;
dst->mAttribute = data->field_0x8;
dst->mFrame = 0.0f;
dst->mAnmTableNum[0] = data->mAnmTableNum[0];
dst->mAnmTableNum[1] = data->mAnmTableNum[1];
dst->mpTable[0] =
JSUConvertOffsetToPtr<J3DAnmColorKeyTable>(data, data->mTableOffsets[0]);
dst->mpTable[1] =
JSUConvertOffsetToPtr<J3DAnmColorKeyTable>(data, data->mTableOffsets[1]);
dst->mAnmVtxColorIndexData[0] = JSUConvertOffsetToPtr<J3DAnmVtxColorIndexData>(
data, data->mVtxColoIndexDataOffset[0]);
dst->mAnmVtxColorIndexData[1] = JSUConvertOffsetToPtr<J3DAnmVtxColorIndexData>(
data, data->mVtxColoIndexDataOffset[1]);
void* indexPtr0 = JSUConvertOffsetToPtr<u16>(data, data->mVtxColoIndexPointerOffset[0]);
void* indexPtr1 = JSUConvertOffsetToPtr<u16>(data, data->mVtxColoIndexPointerOffset[1]);
for (s32 i = 0; i < dst->mAnmTableNum[0]; i++)
dst->mAnmVtxColorIndexData[0][i].mpData =
(void*)((s32)indexPtr0 + (s32)dst->mAnmVtxColorIndexData[0][i].mpData * 2);
for (s32 i = 0; i < dst->mAnmTableNum[1]; i++)
dst->mAnmVtxColorIndexData[1][i].mpData =
(void*)((s32)indexPtr1 + (s32)dst->mAnmVtxColorIndexData[1][i].mpData * 2);
dst->mColorR = JSUConvertOffsetToPtr<s16>(data, data->mRValOffset);
dst->mColorG = JSUConvertOffsetToPtr<s16>(data, data->mGValOffset);
dst->mColorB = JSUConvertOffsetToPtr<s16>(data, data->mBValOffset);
dst->mColorA = JSUConvertOffsetToPtr<s16>(data, data->mAValOffset);
}
@@ -0,0 +1,115 @@
//
// J3DClusterLoader
//
#include "JSystem/JSystem.h" // IWYU pragma: keep
#include "JSystem/J3DGraphLoader/J3DClusterLoader.h"
#include "JSystem/J3DGraphAnimator/J3DSkinDeform.h"
#include "JSystem/JSupport/JSupport.h"
#include "JSystem/JKernel/JKRHeap.h"
#include <os.h>
#include <cstring>
void* J3DClusterLoaderDataBase::load(const void* i_data) {
J3D_ASSERT_NULLPTR(41, i_data);
const JUTDataFileHeader* fileHeader = (JUTDataFileHeader*)i_data;
if (fileHeader->mMagic == 'J3D1' && fileHeader->mType == 'bls1') {
J3DClusterLoader_v15 loader;
return loader.load(i_data);
} else if (fileHeader->mMagic == 'J3D2' && fileHeader->mType == 'bls2') {
return NULL;
}
return NULL;
}
J3DClusterLoader_v15::J3DClusterLoader_v15() {}
J3DClusterLoader_v15::~J3DClusterLoader_v15() {}
void* J3DClusterLoader_v15::load(const void* i_data) {
J3D_ASSERT_NULLPTR(98, i_data);
mpDeformData = new J3DDeformData();
const JUTDataFileHeader* fileHeader = (JUTDataFileHeader*)i_data;
const JUTDataBlockHeader* block = &fileHeader->mFirstBlock;
for (int i = 0; i < fileHeader->mBlockNum; i++) {
switch (block->mType) {
case 'CLS1':
readCluster((J3DClusterBlock*)block);
break;
default:
OSReport("Unknown data block\n");
break;
}
block = (JUTDataBlockHeader*)((u8*)block + block->mSize);
}
return mpDeformData;
}
void J3DClusterLoader_v15::readCluster(const J3DClusterBlock* block) {
J3D_ASSERT_NULLPTR(147, block);
mpDeformData->mClusterNum = block->mClusterNum;
mpDeformData->mClusterKeyNum = block->mClusterKeyNum;
mpDeformData->mVtxPosNum = block->mVtxPosNum;
mpDeformData->mVtxNrmNum = block->mVtxNrmNum;
mpDeformData->mClusterVertexNum = block->mClusterVertexNum;
if (block->mClusterName != NULL) {
mpDeformData->mClusterName =
new JUTNameTab(JSUConvertOffsetToPtr<ResNTAB>(block, block->mClusterName));
} else {
mpDeformData->mClusterName = NULL;
}
if (block->mClusterKeyName != NULL) {
mpDeformData->mClusterKeyName =
new JUTNameTab(JSUConvertOffsetToPtr<ResNTAB>(block, block->mClusterKeyName));
} else {
mpDeformData->mClusterKeyName = NULL;
}
mpDeformData->mVtxPos = JSUConvertOffsetToPtr<f32>(block, block->mVtxPos);
mpDeformData->mVtxNrm = JSUConvertOffsetToPtr<f32>(block, block->mVtxNrm);
void* clusterPointer = block->mClusterPointer;
int clusterKeyPointerSize = (intptr_t)block->mClusterKeyPointer - (intptr_t)block->mClusterPointer;
int clusterVertexPointerSize = (intptr_t)block->mClusterVertex - (intptr_t)block->mClusterPointer;
int vtxPosSize = (intptr_t)block->mVtxPos - (intptr_t)block->mClusterPointer;
u8* arr = new (0x20) u8[vtxPosSize];
memcpy(arr, JSUConvertOffsetToPtr<J3DCluster>(block, block->mClusterPointer), vtxPosSize);
mpDeformData->mClusterPointer = (J3DCluster*)arr;
mpDeformData->mClusterKeyPointer = (J3DClusterKey*)&arr[clusterKeyPointerSize];
mpDeformData->mClusterVertex = (J3DClusterVertex*)&arr[clusterVertexPointerSize];
for (int i = 0; i < mpDeformData->getClusterNum(); i++) {
J3DCluster* cluster = &mpDeformData->mClusterPointer[i];
cluster->mClusterKey = JSUConvertOffsetToPtr<J3DClusterKey>(arr - (intptr_t)clusterPointer, cluster->mClusterKey);
cluster->field_0x18 = JSUConvertOffsetToPtr<u16>(block, cluster->field_0x18);
cluster->mClusterVertex =
JSUConvertOffsetToPtr<J3DClusterVertex>(arr - (intptr_t)clusterPointer, cluster->mClusterVertex);
J3DDeformer* deformer = new J3DDeformer(mpDeformData);
if (cluster->field_0x14 != 0) {
deformer->field_0xc = new f32[cluster->field_0x14 * 3];
} else {
deformer->field_0xc = NULL;
}
deformer->mFlags = cluster->mFlags;
deformer->field_0x8 = new f32[cluster->mKeyNum];
cluster->setDeformer(deformer);
}
for (int i = 0; i < mpDeformData->getClusterKeyNum(); i++) {
J3DClusterKey* clusterKey = &mpDeformData->mClusterKeyPointer[i];
clusterKey->field_0x4 = JSUConvertOffsetToPtr<u16>(block, clusterKey->field_0x4);
clusterKey->field_0x8 = JSUConvertOffsetToPtr<u16>(block, clusterKey->field_0x8);
}
for (int i = 0; i < mpDeformData->mClusterVertexNum; i++) {
J3DClusterVertex* clusterVertex = &mpDeformData->mClusterVertex[i];
clusterVertex->field_0x4 = JSUConvertOffsetToPtr<u16>(block, clusterVertex->field_0x4);
clusterVertex->field_0x8 = JSUConvertOffsetToPtr<u16>(block, clusterVertex->field_0x8);
}
DCStoreRange(arr, vtxPosSize);
}
@@ -0,0 +1,29 @@
#include "JSystem/JSystem.h" // IWYU pragma: keep
#include "JSystem/J3DGraphLoader/J3DJointFactory.h"
#include "JSystem/J3DGraphLoader/J3DModelLoader.h"
#include "JSystem/J3DGraphAnimator/J3DJoint.h"
#include "JSystem/JSupport/JSupport.h"
J3DJointFactory::J3DJointFactory(J3DJointBlock const& block) {
mJointInitData = JSUConvertOffsetToPtr<J3DJointInitData>(&block, (uintptr_t)block.mpJointInitData);
mIndexTable = JSUConvertOffsetToPtr<u16>(&block, (uintptr_t)block.mpIndexTable);
}
J3DJoint* J3DJointFactory::create(int no) {
J3DJoint* joint = new J3DJoint();
J3D_ASSERT_ALLOCMEM(50, joint);
joint->mJntNo = no;
joint->mKind = getKind(no);
joint->mScaleCompensate = getScaleCompensate(no);
joint->mTransformInfo = getTransformInfo(no);
joint->mBoundingSphereRadius = getRadius(no);
joint->mMin = getMin(no);
joint->mMax = getMax(no);
joint->mMtxCalc = NULL;
if (joint->mScaleCompensate == 0xFF)
joint->mScaleCompensate = 0;
return joint;
}
@@ -0,0 +1,717 @@
#include "JSystem/JSystem.h" // IWYU pragma: keep
#include "JSystem/J3DGraphLoader/J3DMaterialFactory.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "JSystem/JMath/JMath.h"
#include "JSystem/JSupport/JSupport.h"
#include "JSystem/JUtility/JUTAssert.h"
J3DMaterialFactory::J3DMaterialFactory(J3DMaterialBlock const& i_block) {
mMaterialNum = i_block.mMaterialNum;
mpMaterialInitData = JSUConvertOffsetToPtr<J3DMaterialInitData>(&i_block, i_block.mpMaterialInitData);
mpMaterialID = JSUConvertOffsetToPtr<u16>(&i_block, i_block.mpMaterialID);
if (i_block.mpIndInitData != NULL && (uintptr_t)i_block.mpIndInitData - (uintptr_t)i_block.mpNameTable > 4) {
mpIndInitData = JSUConvertOffsetToPtr<J3DIndInitData>(&i_block, i_block.mpIndInitData);
} else {
mpIndInitData = NULL;
}
mpCullMode = JSUConvertOffsetToPtr<GXCullMode>(&i_block, i_block.mpCullMode);
mpMatColor = JSUConvertOffsetToPtr<GXColor>(&i_block, i_block.mpMatColor);
mpColorChanNum = JSUConvertOffsetToPtr<u8>(&i_block, i_block.mpColorChanNum);
mpColorChanInfo = JSUConvertOffsetToPtr<J3DColorChanInfo>(&i_block, i_block.mpColorChanInfo);
mpAmbColor = JSUConvertOffsetToPtr<GXColor>(&i_block, i_block.mpAmbColor);
mpLightInfo = JSUConvertOffsetToPtr<J3DLightInfo>(&i_block, i_block.mpLightInfo);
mpTexGenNum = JSUConvertOffsetToPtr<u8>(&i_block, i_block.mpTexGenNum);
mpTexCoordInfo = JSUConvertOffsetToPtr<J3DTexCoordInfo>(&i_block, i_block.mpTexCoordInfo);
mpTexCoord2Info = JSUConvertOffsetToPtr<J3DTexCoord2Info>(&i_block, i_block.mpTexCoord2Info);
mpTexMtxInfo = JSUConvertOffsetToPtr<J3DTexMtxInfo>(&i_block, i_block.mpTexMtxInfo);
field_0x34 = JSUConvertOffsetToPtr<J3DTexMtxInfo>(&i_block, i_block.field_0x44);
mpTexNo = JSUConvertOffsetToPtr<u16>(&i_block, i_block.mpTexNo);
mpTevOrderInfo = JSUConvertOffsetToPtr<J3DTevOrderInfo>(&i_block, i_block.mpTevOrderInfo);
mpTevColor = JSUConvertOffsetToPtr<GXColorS10>(&i_block, i_block.mpTevColor);
mpTevKColor = JSUConvertOffsetToPtr<GXColor>(&i_block, i_block.mpTevKColor);
mpTevStageNum = JSUConvertOffsetToPtr<u8>(&i_block, i_block.mpTevStageNum);
mpTevStageInfo = JSUConvertOffsetToPtr<J3DTevStageInfo>(&i_block, i_block.mpTevStageInfo);
mpTevSwapModeInfo = JSUConvertOffsetToPtr<J3DTevSwapModeInfo>(&i_block, i_block.mpTevSwapModeInfo);
mpTevSwapModeTableInfo = JSUConvertOffsetToPtr<J3DTevSwapModeTableInfo>(&i_block, i_block.mpTevSwapModeTableInfo);
mpFogInfo = JSUConvertOffsetToPtr<J3DFogInfo>(&i_block, i_block.mpFogInfo);
mpAlphaCompInfo = JSUConvertOffsetToPtr<J3DAlphaCompInfo>(&i_block, i_block.mpAlphaCompInfo);
mpBlendInfo = JSUConvertOffsetToPtr<J3DBlendInfo>(&i_block, i_block.mpBlendInfo);
mpZModeInfo = JSUConvertOffsetToPtr<J3DZModeInfo>(&i_block, i_block.mpZModeInfo);
mpZCompLoc = JSUConvertOffsetToPtr<u8>(&i_block, i_block.mpZCompLoc);
mpDither = JSUConvertOffsetToPtr<u8>(&i_block, i_block.mpDither);
mpNBTScaleInfo = JSUConvertOffsetToPtr<J3DNBTScaleInfo>(&i_block, i_block.mpNBTScaleInfo);
mpDisplayListInit = NULL;
mpPatchingInfo = NULL;
mpCurrentMtxInfo = NULL;
mpMaterialMode = NULL;
}
J3DMaterialFactory::J3DMaterialFactory(J3DMaterialDLBlock const& i_block) {
mMaterialNum = i_block.mMaterialNum;
mpMaterialInitData = NULL;
mpDisplayListInit = JSUConvertOffsetToPtr<J3DDisplayListInit>(&i_block, i_block.mpDisplayListInit);
mpPatchingInfo = JSUConvertOffsetToPtr<J3DPatchingInfo>(&i_block, i_block.mpPatchingInfo);
mpCurrentMtxInfo = JSUConvertOffsetToPtr<J3DCurrentMtxInfo>(&i_block, i_block.mpCurrentMtxInfo);
mpMaterialMode = JSUConvertOffsetToPtr<u8>(&i_block, i_block.mpMaterialMode);
}
u16 J3DMaterialFactory::countUniqueMaterials() {
u16 count = 0;
s32 id = -1;
for (u16 i = 0; i < mMaterialNum; i++) {
if (id < mpMaterialID[i]) {
id = mpMaterialID[i];
count++;
}
}
return count;
}
u32 J3DMaterialFactory::countTexGens(int i_idx) const {
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTexGenNumIdx != 0xff) {
return mpTexGenNum[mtl_init_data->mTexGenNumIdx];
}
return 0;
}
u32 J3DMaterialFactory::countStages(int i_idx) const {
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
u32 count1 = 0;
u32 count2 = 0;
if (mtl_init_data->mTevStageNumIdx != 0xff) {
count2 = mpTevStageNum[mtl_init_data->mTevStageNumIdx];
}
for (int i = 0; i < 8; i++) {
if (mtl_init_data->mTexNoIdx[i] != 0xffff) {
count1++;
}
}
if (count2 != count1 && count1 != 0) {
u32 count3;
if (count2 > count1) {
count3 = count2;
} else {
count3 = count1;
}
return count3;
}
return count2;
}
J3DMaterial* J3DMaterialFactory::create(J3DMaterial* i_material, MaterialType i_type,
int i_idx, u32 i_flags) const {
switch (i_type) {
case MATERIAL_TYPE_NORMAL:
i_material = createNormalMaterial(i_material, i_idx, i_flags);
break;
case MATERIAL_TYPE_LOCKED:
i_material = createLockedMaterial(i_material, i_idx, i_flags);
break;
case MATERIAL_TYPE_PATCHED:
i_material = createPatchedMaterial(i_material, i_idx, i_flags);
break;
}
return i_material;
}
J3DMaterial* J3DMaterialFactory::createNormalMaterial(J3DMaterial* i_material, int i_idx,
u32 i_flags) const {
if (mpDisplayListInit != NULL) {
return createLockedMaterial(i_material, i_idx, i_flags);
}
const u32 stages = countStages(i_idx);
u32 tev_stage_num = getMdlDataFlag_TevStageNum(i_flags);
u32 tev_stage_num_max = JMAMax(stages, tev_stage_num);
u32 tex_num = tev_stage_num_max > 8 ? 8 : tev_stage_num_max;
u32 texgens = countTexGens(i_idx);
u32 texgen_flag = texgens > 4 ? getMdlDataFlag_TexGenFlag(0) : getMdlDataFlag_TexGenFlag(i_flags);
u32 color_flag = getMdlDataFlag_ColorFlag(i_flags);
u32 pe_flag = getMdlDataFlag_PEFlag(i_flags);
BOOL ind_flag = (i_flags & 0x1000000) ? TRUE : FALSE;
if (i_material == NULL) {
i_material = new J3DMaterial();
J3D_ASSERT_ALLOCMEM(269, i_material);
}
i_material->mColorBlock = J3DMaterial::createColorBlock(color_flag);
i_material->mTexGenBlock = J3DMaterial::createTexGenBlock(texgen_flag);
i_material->mTevBlock = J3DMaterial::createTevBlock((u16)tev_stage_num_max);
i_material->mIndBlock = J3DMaterial::createIndBlock(ind_flag);
i_material->mPEBlock = J3DMaterial::createPEBlock(pe_flag, getMaterialMode(i_idx));
i_material->mIndex = i_idx;
i_material->mMaterialMode = getMaterialMode(i_idx);
i_material->mColorBlock->setColorChanNum(newColorChanNum(i_idx));
i_material->mColorBlock->setCullMode(newCullMode(i_idx));
i_material->mTexGenBlock->setTexGenNum(newTexGenNum(i_idx));
i_material->mTexGenBlock->setNBTScale(newNBTScale(i_idx));
i_material->mPEBlock->setFog(newFog(i_idx));
i_material->mPEBlock->setAlphaComp(newAlphaComp(i_idx));
i_material->mPEBlock->setBlend(newBlend(i_idx));
i_material->mPEBlock->setZMode(newZMode(i_idx));
i_material->mPEBlock->setZCompLoc(newZCompLoc(i_idx));
i_material->mPEBlock->setDither(newDither(i_idx));
i_material->mTevBlock->setTevStageNum(newTevStageNum(i_idx));
for (u8 i = 0; i < tex_num; i++) {
i_material->mTevBlock->setTexNo(i, newTexNo(i_idx, i));
}
for (u8 i = 0; i < tev_stage_num_max; i++) {
i_material->mTevBlock->setTevOrder(i, newTevOrder(i_idx, i));
}
for (u8 i = 0; i < tev_stage_num_max; i++) {
J3DMaterialInitData* material_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
i_material->mTevBlock->setTevStage(i, newTevStage(i_idx, i));
if (material_init_data->mTevSwapModeIdx[i] != 0xffff) {
i_material->mTevBlock->getTevStage(i)->setTexSel(
mpTevSwapModeInfo[material_init_data->mTevSwapModeIdx[i]].mTexSel);
i_material->mTevBlock->getTevStage(i)->setRasSel(
mpTevSwapModeInfo[material_init_data->mTevSwapModeIdx[i]].mRasSel);
}
}
for (u8 i = 0; i < 4; i++) {
i_material->mTevBlock->setTevKColor(i, newTevKColor(i_idx, i));
}
for (u8 i = 0; i < 4; i++) {
i_material->mTevBlock->setTevColor(i, newTevColor(i_idx, i));
}
for (u8 i = 0; i < 4; i++) {
i_material->mTevBlock->setTevSwapModeTable(i, newTevSwapModeTable(i_idx, i));
}
for (u8 i = 0; i < 2; i++) {
i_material->mColorBlock->setAmbColor(i, newAmbColor(i_idx, i));
}
for (u8 i = 0; i < 2; i++) {
i_material->mColorBlock->setMatColor(i, newMatColor(i_idx, i));
}
for (u8 i = 0; i < 4; i++) {
J3DColorChan color_chan = newColorChan(i_idx, i);
i_material->mColorBlock->setColorChan(i, color_chan);
}
for (u8 i = 0; i < texgens; i++) {
J3DTexCoord tex_coord = newTexCoord(i_idx, i);
i_material->mTexGenBlock->setTexCoord(i, &tex_coord);
}
for (u8 i = 0; i < 8; i++) {
i_material->mTexGenBlock->setTexMtx(i, newTexMtx(i_idx, i));
}
J3DMaterialInitData* material_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
for (u8 i = 0; i < tev_stage_num_max; i++) {
if (material_init_data->mTevKColorSel[i] != 0xff) {
i_material->mTevBlock->setTevKColorSel(i, material_init_data->mTevKColorSel[i]);
} else {
i_material->mTevBlock->setTevKColorSel(i, 0xc);
}
}
for (u8 i = 0; i < tev_stage_num_max; i++) {
if (material_init_data->mTevKAlphaSel[i] != 0xff) {
i_material->mTevBlock->setTevKAlphaSel(i, material_init_data->mTevKAlphaSel[i]);
} else {
i_material->mTevBlock->setTevKAlphaSel(i, 0x1c);
}
}
if (mpIndInitData != NULL) {
u8 ind_tex_stage_num = newIndTexStageNum(i_idx);
i_material->mIndBlock->setIndTexStageNum(newIndTexStageNum(i_idx));
for (u8 i = 0; i < ind_tex_stage_num; i++) {
i_material->mIndBlock->setIndTexMtx(i, newIndTexMtx(i_idx, i));
}
for (u8 i = 0; i < ind_tex_stage_num; i++) {
i_material->mIndBlock->setIndTexOrder(i, newIndTexOrder(i_idx, i));
}
for (u8 i = 0; i < ind_tex_stage_num; i++) {
i_material->mIndBlock->setIndTexCoordScale(i, newIndTexCoordScale(i_idx, i));
}
for (u8 i = 0; i < tev_stage_num_max; i++) {
i_material->mTevBlock->setIndTevStage(i, newIndTevStage(i_idx, i));
}
}
return i_material;
}
J3DMaterial* J3DMaterialFactory::createPatchedMaterial(J3DMaterial* i_material, int i_idx,
u32 i_flags) const {
if (i_material == NULL) {
i_material = new J3DPatchedMaterial();
J3D_ASSERT_ALLOCMEM(430, i_material);
}
bool bVar1 = i_flags & 0x3000000 ? true : false;
i_material->mColorBlock = J3DMaterial::createColorBlock(0x40000000);
i_material->mTexGenBlock = new J3DTexGenBlockPatched();
J3D_ASSERT_ALLOCMEM(440, i_material->mTexGenBlock);
i_material->mTevBlock = new J3DTevBlockPatched();
J3D_ASSERT_ALLOCMEM(442, i_material->mTevBlock);
i_material->mIndBlock = J3DMaterial::createIndBlock(bVar1);
i_material->mPEBlock = J3DMaterial::createPEBlock(0x10000000, getMaterialMode(i_idx));
i_material->mIndex = i_idx;
i_material->mMaterialMode = getMaterialMode(i_idx);
i_material->mTevBlock->setTevStageNum(newTevStageNum(i_idx));
i_material->mColorBlock->setColorChanNum(newColorChanNum(i_idx));
i_material->mColorBlock->setCullMode(newCullMode(i_idx));
i_material->mPEBlock->setFog(newFog(i_idx));
i_material->mPEBlock->setAlphaComp(newAlphaComp(i_idx));
i_material->mPEBlock->setBlend(newBlend(i_idx));
i_material->mPEBlock->setZMode(newZMode(i_idx));
i_material->mPEBlock->setZCompLoc(newZCompLoc(i_idx));
i_material->mPEBlock->setDither(newDither(i_idx));
u8 tev_stage_num = i_material->mTevBlock->getTevStageNum();
for (u8 i = 0; i < 8; i++) {
i_material->mTevBlock->setTexNo(i, newTexNo(i_idx, i));
}
for (u8 i = 0; i < tev_stage_num; i++) {
i_material->mTevBlock->setTevOrder(i, newTevOrder(i_idx, i));
}
for (u8 i = 0; i < 4; i++) {
i_material->mTevBlock->setTevKColor(i, newTevKColor(i_idx, i));
}
for (u8 i = 0; i < 4; i++) {
i_material->mTevBlock->setTevColor(i, newTevColor(i_idx, i));
}
for (u8 i = 0; i < tev_stage_num; i++) {
J3DMaterialInitData* material_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
i_material->mTevBlock->setTevStage(i, newTevStage(i_idx, i));
if (material_init_data->mTevSwapModeIdx[i] != 0xffff) {
i_material->mTevBlock->getTevStage(i)->setTexSel(
mpTevSwapModeInfo[material_init_data->mTevSwapModeIdx[i]].mTexSel);
i_material->mTevBlock->getTevStage(i)->setRasSel(
mpTevSwapModeInfo[material_init_data->mTevSwapModeIdx[i]].mRasSel);
}
}
J3DMaterialInitData* init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
for (u8 i = 0; i < tev_stage_num; i++) {
if (init_data->mTevKColorSel[i] != 0xff) {
i_material->mTevBlock->setTevKColorSel(i, init_data->mTevKColorSel[i]);
} else {
i_material->mTevBlock->setTevKColorSel(i, 0xC);
}
}
for (u8 i = 0; i < 2; i++) {
i_material->mColorBlock->setMatColor(i, newMatColor(i_idx, i));
}
for (u8 i = 0; i < 4; i++) {
J3DColorChan color_chan = newColorChan(i_idx, i);
i_material->mColorBlock->setColorChan(i, color_chan);
}
u32 texgens = countTexGens(i_idx);
i_material->mTexGenBlock->setTexGenNum(newTexGenNum(i_idx));
for (u8 i = 0; i < 8; i++) {
i_material->mTexGenBlock->setTexMtx(i, newTexMtx(i_idx, i));
}
for (u8 i = 0; i < texgens; i++) {
J3DTexCoord tex_coord = newTexCoord(i_idx, i);
i_material->mTexGenBlock->setTexCoord(i, &tex_coord);
}
if (bVar1 && mpIndInitData != NULL) {
u8 ind_tex_stage_num = newIndTexStageNum(i_idx);
i_material->mIndBlock->setIndTexStageNum(newIndTexStageNum(i_idx));
for (u8 i = 0; i < ind_tex_stage_num; i++) {
i_material->mIndBlock->setIndTexMtx(i, newIndTexMtx(i_idx, i));
}
for (u8 i = 0; i < ind_tex_stage_num; i++) {
i_material->mIndBlock->setIndTexOrder(i, newIndTexOrder(i_idx, i));
}
for (u8 i = 0; i < ind_tex_stage_num; i++) {
i_material->mIndBlock->setIndTexCoordScale(i, newIndTexCoordScale(i_idx, i));
}
for (u8 i = 0; i < tev_stage_num; i++) {
i_material->mTevBlock->setIndTevStage(i, newIndTevStage(i_idx, i));
}
}
return i_material;
}
void J3DMaterialFactory::modifyPatchedCurrentMtx(J3DMaterial* i_material, int i_idx) const {
J3DTexCoord coord[8];
u32 tex_gens = countTexGens(i_idx);
for (u8 i = 0; i < tex_gens; i++) {
coord[i] = newTexCoord(i_idx, i);
}
J3DCurrentMtx currentMtx;
currentMtx.setCurrentTexMtx(
coord[0].getTexGenMtx(),
coord[1].getTexGenMtx(),
coord[2].getTexGenMtx(),
coord[3].getTexGenMtx(),
coord[4].getTexGenMtx(),
coord[5].getTexGenMtx(),
coord[6].getTexGenMtx(),
coord[7].getTexGenMtx()
);
i_material->mCurrentMtx = currentMtx;
}
J3DMaterial* J3DMaterialFactory::createLockedMaterial(J3DMaterial* i_material, int i_idx,
u32 i_flags) const {
if (i_material == NULL) {
i_material = new J3DLockedMaterial();
J3D_ASSERT_ALLOCMEM(629, i_material);
i_material->mColorBlock = new J3DColorBlockNull();
J3D_ASSERT_ALLOCMEM(634, i_material->mColorBlock);
i_material->mTexGenBlock = new J3DTexGenBlockNull();
J3D_ASSERT_ALLOCMEM(636, i_material->mTexGenBlock);
i_material->mTevBlock = new J3DTevBlockNull();
J3D_ASSERT_ALLOCMEM(638, i_material->mTevBlock);
i_material->mIndBlock = new J3DIndBlockNull();
J3D_ASSERT_ALLOCMEM(640, i_material->mIndBlock);
i_material->mPEBlock = new J3DPEBlockNull();
J3D_ASSERT_ALLOCMEM(642, i_material->mPEBlock);
i_material->mIndex = i_idx;
i_material->mMaterialMode = mpMaterialMode[i_idx];
}
i_material->mCurrentMtx = mpCurrentMtxInfo[i_idx];
i_material->getColorBlock()->setMatColorOffset(mpPatchingInfo[i_idx].mMatColorOffset);
i_material->getColorBlock()->setColorChanOffset(mpPatchingInfo[i_idx].mColorChanOffset);
i_material->getTexGenBlock()->setTexMtxOffset(mpPatchingInfo[i_idx].mTexMtxOffset);
i_material->getTevBlock()->setTexNoOffset(mpPatchingInfo[i_idx].mTexNoOffset);
i_material->getTevBlock()->setTevRegOffset(mpPatchingInfo[i_idx].mTevRegOffset);
i_material->getPEBlock()->setFogOffset(mpPatchingInfo[i_idx].mFogOffset);
if (i_material->mSharedDLObj == NULL) {
i_material->mSharedDLObj = new J3DDisplayListObj();
J3D_ASSERT_ALLOCMEM(673, i_material->mSharedDLObj);
i_material->mSharedDLObj->setSingleDisplayList((void*)(
mpDisplayListInit[i_idx].mOffset + (uintptr_t)&mpDisplayListInit[i_idx]),
mpDisplayListInit[i_idx].field_0x4
);
}
return i_material;
}
u32 J3DMaterialFactory::calcSize(J3DMaterial* i_material, J3DMaterialFactory::MaterialType i_type,
int i_idx, u32 i_flags) const {
u32 size = 0;
switch (i_type) {
case MATERIAL_TYPE_NORMAL:
size += calcSizeNormalMaterial(i_material, i_idx, i_flags);
break;
case MATERIAL_TYPE_LOCKED:
size += calcSizeLockedMaterial(i_material, i_idx, i_flags);
break;
case MATERIAL_TYPE_PATCHED:
size += calcSizePatchedMaterial(i_material, i_idx, i_flags);
break;
}
return size;
}
u32 J3DMaterialFactory::calcSizeNormalMaterial(J3DMaterial* i_material, int i_idx,
u32 i_flags) const {
u32 size = 0;
if (mpDisplayListInit != NULL) {
return calcSizeLockedMaterial(i_material, i_idx, i_flags);
}
const u32 stages = countStages(i_idx);
u32 tev_stage_num = getMdlDataFlag_TevStageNum(i_flags);
u32 tev_stage_num_max = JMAMax(stages, tev_stage_num);
u32 tex_num = tev_stage_num_max > 8 ? 8 : tev_stage_num_max;
u32 tex_gens = countTexGens(i_idx);
u32 tex_gen_flag = tex_gens > 4 ? getMdlDataFlag_TexGenFlag(0) : getMdlDataFlag_TexGenFlag(i_flags);
u32 color_block_flag = getMdlDataFlag_ColorFlag(i_flags);
u32 pe_flag = getMdlDataFlag_PEFlag(i_flags);
BOOL ind_flag = (i_flags & 0x1000000) ? TRUE : FALSE;
if (i_material == NULL) {
size += sizeof(J3DMaterial);
}
size += J3DMaterial::calcSizeColorBlock(color_block_flag);
size += J3DMaterial::calcSizeTexGenBlock(tex_gen_flag);
size += J3DMaterial::calcSizeTevBlock((u16)tev_stage_num_max);
size += J3DMaterial::calcSizeIndBlock(ind_flag);
size += J3DMaterial::calcSizePEBlock(pe_flag, getMaterialMode(i_idx));
J3DMaterialInitData* init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
for (u32 i = 0; i < 8; i++) {
if (init_data->mTexMtxIdx[i] != 0xffff) {
size += sizeof(J3DTexMtx);
}
}
return size;
}
u32 J3DMaterialFactory::calcSizePatchedMaterial(J3DMaterial* i_material, int i_idx,
u32 i_flags) const {
u32 size = 0;
if (i_material == NULL) {
size += sizeof(J3DPatchedMaterial);
}
u8 ind_flag = (i_flags & 0x3000000) != 0 ? (u8)1 : (u8)0;
size += J3DMaterial::calcSizeColorBlock(0x40000000);
size += sizeof(J3DTexGenBlockPatched);
size += sizeof(J3DTevBlockPatched);
size += J3DMaterial::calcSizeIndBlock(ind_flag);
size += J3DMaterial::calcSizePEBlock(0x10000000, getMaterialMode(i_idx));
J3DMaterialInitData* init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
for (u32 i = 0; i < 8; i++) {
if (init_data->mTexMtxIdx[i] != 0xffff) {
size += sizeof(J3DTexMtx);
}
}
return size;
}
u32 J3DMaterialFactory::calcSizeLockedMaterial(J3DMaterial* i_material, int i_idx,
u32 i_flags) const {
u32 size = 0;
if (i_material == NULL) {
size += sizeof(J3DLockedMaterial);
size += sizeof(J3DColorBlockNull);
size += sizeof(J3DTexGenBlockNull);
size += sizeof(J3DTevBlockNull);
size += sizeof(J3DIndBlockNull);
size += sizeof(J3DPEBlockNull);
}
size += sizeof(J3DDisplayListObj);
return size;
}
J3DGXColor J3DMaterialFactory::newMatColor(int i_idx, int i_no) const {
J3DGXColor dflt = (GXColor){0xff, 0xff, 0xff, 0xff};
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mMatColorIdx[i_no] != 0xffff) {
return mpMatColor[mtl_init_data->mMatColorIdx[i_no]];
} else {
return dflt;
}
}
const u8 J3DMaterialFactory::newColorChanNum(int i_idx) const {
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mColorChanNumIdx != 0xff) {
return mpColorChanNum[mtl_init_data->mColorChanNumIdx];
} else {
return 0;
}
}
J3DColorChan J3DMaterialFactory::newColorChan(int i_idx, int i_no) const {
u32 r29 = 0;
J3DMaterialInitData* init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (init_data->mColorChanIdx[i_no] != 0xffff) {
return J3DColorChan(mpColorChanInfo[init_data->mColorChanIdx[i_no]]);
} else {
return J3DColorChan();
}
}
J3DGXColor J3DMaterialFactory::newAmbColor(int i_idx, int i_no) const {
J3DGXColor dflt = (GXColor){0x32, 0x32, 0x32, 0x32};
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mAmbColorIdx[i_no] != 0xffff) {
return mpAmbColor[mtl_init_data->mAmbColorIdx[i_no]];
} else {
return dflt;
}
}
u32 J3DMaterialFactory::newTexGenNum(int i_idx) const {
u32 r30 = 0;
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTexGenNumIdx != 0xff) {
return mpTexGenNum[mtl_init_data->mTexGenNumIdx];
} else {
return 0;
}
}
J3DTexCoord J3DMaterialFactory::newTexCoord(int i_idx, int i_no) const {
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTexCoordIdx[i_no] != 0xffff) {
return J3DTexCoord(mpTexCoordInfo[mtl_init_data->mTexCoordIdx[i_no]]);
} else {
return J3DTexCoord();
}
}
J3DTexMtx* J3DMaterialFactory::newTexMtx(int i_idx, int i_no) const {
J3DTexMtx* tex_mtx = NULL;
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTexMtxIdx[i_no] != 0xffff) {
tex_mtx = new J3DTexMtx(mpTexMtxInfo[mtl_init_data->mTexMtxIdx[i_no]]);
}
return tex_mtx;
}
u8 J3DMaterialFactory::newCullMode(int i_idx) const {
u32 r30 = 0;
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mCullModeIdx != 0xff) {
return mpCullMode[mtl_init_data->mCullModeIdx];
} else {
return 0xff;
}
}
u16 J3DMaterialFactory::newTexNo(int i_idx, int i_no) const {
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTexNoIdx[i_no] != 0xffff) {
return mpTexNo[mtl_init_data->mTexNoIdx[i_no]];
} else {
return 0xffff;
}
}
J3DTevOrder J3DMaterialFactory::newTevOrder(int i_idx, int i_no) const {
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTevOrderIdx[i_no] != 0xffff) {
return J3DTevOrder(mpTevOrderInfo[mtl_init_data->mTevOrderIdx[i_no]]);
} else {
return J3DTevOrder();
}
}
J3DGXColorS10 J3DMaterialFactory::newTevColor(int i_idx, int i_no) const {
GXColorS10 _dflt = {0, 0, 0, 0};
J3DGXColorS10 dflt = _dflt;
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTevColorIdx[i_no] != 0xffff) {
return mpTevColor[mtl_init_data->mTevColorIdx[i_no]];
} else {
return dflt;
}
}
J3DGXColor J3DMaterialFactory::newTevKColor(int i_idx, int i_no) const {
J3DGXColor dflt = (GXColor){0xff, 0xff, 0xff, 0xff};
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTevKColorIdx[i_no] != 0xffff) {
return mpTevKColor[mtl_init_data->mTevKColorIdx[i_no]];
} else {
return dflt;
}
}
const u8 J3DMaterialFactory::newTevStageNum(int i_idx) const {
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTevStageNumIdx != 0xff) {
return mpTevStageNum[mtl_init_data->mTevStageNumIdx];
} else {
return 0xff;
}
}
J3DTevStage J3DMaterialFactory::newTevStage(int i_idx, int i_no) const {
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTevStageIdx[i_no] != 0xffff) {
return J3DTevStage(mpTevStageInfo[mtl_init_data->mTevStageIdx[i_no]]);
} else {
return J3DTevStage();
}
}
J3DTevSwapModeTable J3DMaterialFactory::newTevSwapModeTable(int i_idx, int i_no) const {
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTevSwapModeTableIdx[i_no] != 0xffff) {
return J3DTevSwapModeTable(mpTevSwapModeTableInfo[mtl_init_data->mTevSwapModeTableIdx[i_no]]);
} else {
return J3DTevSwapModeTable(j3dDefaultTevSwapModeTable);
}
}
u8 J3DMaterialFactory::newIndTexStageNum(int i_idx) const {
u8 dflt = 0;
if (mpIndInitData[i_idx].mEnabled == true) {
return mpIndInitData[i_idx].mIndTexStageNum;
} else {
return dflt;
}
}
J3DIndTexOrder J3DMaterialFactory::newIndTexOrder(int i_idx, int i_no) const {
J3DIndTexOrder dflt;
if (mpIndInitData[i_idx].mEnabled == true) {
return J3DIndTexOrder(mpIndInitData[i_idx].mIndTexOrderInfo[i_no]);
} else {
return dflt;
}
}
J3DIndTexMtx J3DMaterialFactory::newIndTexMtx(int i_idx, int i_no) const {
J3DIndTexMtx dflt;
if (mpIndInitData[i_idx].mEnabled == true) {
return J3DIndTexMtx(mpIndInitData[i_idx].mIndTexMtxInfo[i_no]);
} else {
return dflt;
}
}
J3DIndTevStage J3DMaterialFactory::newIndTevStage(int i_idx, int i_no) const {
J3DIndTevStage dflt;
if (mpIndInitData[i_idx].mEnabled == true) {
return J3DIndTevStage(mpIndInitData[i_idx].mIndTevStageInfo[i_no]);
} else {
return dflt;
}
}
J3DIndTexCoordScale J3DMaterialFactory::newIndTexCoordScale(int i_idx, int i_no) const {
J3DIndTexCoordScale dflt;
if (mpIndInitData[i_idx].mEnabled == true) {
return J3DIndTexCoordScale(mpIndInitData[i_idx].mIndTexCoordScaleInfo[i_no]);
} else {
return dflt;
}
}
J3DFog J3DMaterialFactory::newFog(int i_idx) const {
J3DFog fog;
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mFogIdx != 0xffff) {
fog.setFogInfo(mpFogInfo[mtl_init_data->mFogIdx]);
}
return fog;
}
J3DAlphaComp J3DMaterialFactory::newAlphaComp(int i_idx) const {
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mAlphaCompIdx != 0xffff) {
return J3DAlphaComp(mpAlphaCompInfo[mtl_init_data->mAlphaCompIdx]);
} else {
return J3DAlphaComp(0xffff);
}
}
J3DBlend J3DMaterialFactory::newBlend(int i_idx) const {
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mBlendIdx != 0xffff) {
return J3DBlend(mpBlendInfo[mtl_init_data->mBlendIdx]);
} else {
return J3DBlend(j3dDefaultBlendInfo);
}
}
J3DZMode J3DMaterialFactory::newZMode(int i_idx) const {
u32 r29 = 0;
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mZModeIdx != 0xff) {
return J3DZMode(mpZModeInfo[mtl_init_data->mZModeIdx]);
} else {
return J3DZMode();
}
}
const u8 J3DMaterialFactory::newZCompLoc(int i_idx) const {
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mZCompLocIdx != 0xff){
return mpZCompLoc[mtl_init_data->mZCompLocIdx];
} else {
return 0;
}
}
const u8 J3DMaterialFactory::newDither(int i_idx) const {
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mDitherIdx != 0xff){
return mpDither[mtl_init_data->mDitherIdx];
} else {
return 1;
}
}
J3DNBTScale J3DMaterialFactory::newNBTScale(int i_idx) const {
J3DNBTScale dflt(j3dDefaultNBTScaleInfo);
J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mNBTScaleIdx != 0xffff) {
return J3DNBTScale(mpNBTScaleInfo[mtl_init_data->mNBTScaleIdx]);
} else {
return dflt;
}
}
@@ -0,0 +1,361 @@
#include "JSystem/JSystem.h" // IWYU pragma: keep
#include "JSystem/J3DGraphLoader/J3DMaterialFactory_v21.h"
#include "JSystem/J3DGraphLoader/J3DMaterialFactory.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "JSystem/JMath/JMath.h"
#include "JSystem/JSupport/JSupport.h"
J3DMaterialFactory_v21::J3DMaterialFactory_v21(J3DMaterialBlock_v21 const& i_block) {
mMaterialNum = i_block.mMaterialNum;
mpMaterialInitData = JSUConvertOffsetToPtr<J3DMaterialInitData_v21>(&i_block, i_block.mpMaterialInitData);
mpMaterialID = JSUConvertOffsetToPtr<u16>(&i_block, i_block.mpMaterialID);
mpCullMode = JSUConvertOffsetToPtr<GXCullMode>(&i_block, i_block.mpCullMode);
mpMatColor = JSUConvertOffsetToPtr<GXColor>(&i_block, i_block.mpMatColor);
mpColorChanNum = JSUConvertOffsetToPtr<u8>(&i_block, i_block.mpColorChanNum);
mpColorChanInfo = JSUConvertOffsetToPtr<J3DColorChanInfo>(&i_block, i_block.mpColorChanInfo);
mpTexGenNum = JSUConvertOffsetToPtr<u8>(&i_block, i_block.mpTexGenNum);
mpTexCoordInfo = JSUConvertOffsetToPtr<J3DTexCoordInfo>(&i_block, i_block.mpTexCoordInfo);
mpTexCoord2Info = JSUConvertOffsetToPtr<J3DTexCoord2Info>(&i_block, i_block.mpTexCoord2Info);
mpTexMtxInfo = JSUConvertOffsetToPtr<J3DTexMtxInfo>(&i_block, i_block.mpTexMtxInfo);
field_0x28 = JSUConvertOffsetToPtr<J3DTexMtxInfo>(&i_block, i_block.field_0x38);
mpTexNo = JSUConvertOffsetToPtr<u16>(&i_block, i_block.mpTexNo);
mpTevOrderInfo = JSUConvertOffsetToPtr<J3DTevOrderInfo>(&i_block, i_block.mpTevOrderInfo);
mpTevColor = JSUConvertOffsetToPtr<GXColorS10>(&i_block, i_block.mpTevColor);
mpTevKColor = JSUConvertOffsetToPtr<GXColor>(&i_block, i_block.mpTevKColor);
mpTevStageNum = JSUConvertOffsetToPtr<u8>(&i_block, i_block.mpTevStageNum);
mpTevStageInfo = JSUConvertOffsetToPtr<J3DTevStageInfo>(&i_block, i_block.mpTevStageInfo);
mpTevSwapModeInfo = JSUConvertOffsetToPtr<J3DTevSwapModeInfo>(&i_block, i_block.mpTevSwapModeInfo);
mpTevSwapModeTableInfo = JSUConvertOffsetToPtr<J3DTevSwapModeTableInfo>(&i_block, i_block.mpTevSwapModeTableInfo);
mpFogInfo = JSUConvertOffsetToPtr<J3DFogInfo>(&i_block, i_block.mpFogInfo);
mpAlphaCompInfo = JSUConvertOffsetToPtr<J3DAlphaCompInfo>(&i_block, i_block.mpAlphaCompInfo);
mpBlendInfo = JSUConvertOffsetToPtr<J3DBlendInfo>(&i_block, i_block.mpBlendInfo);
mpZModeInfo = JSUConvertOffsetToPtr<J3DZModeInfo>(&i_block, i_block.mpZModeInfo);
mpZCompLoc = JSUConvertOffsetToPtr<u8>(&i_block, i_block.mpZCompLoc);
mpDither = JSUConvertOffsetToPtr<u8>(&i_block, i_block.mpDither);
mpNBTScaleInfo = JSUConvertOffsetToPtr<J3DNBTScaleInfo>(&i_block, i_block.mpNBTScaleInfo);
}
u16 J3DMaterialFactory_v21::countUniqueMaterials() {
u16 i;
for (i = 0; i < mMaterialNum; i++) {
if (mpMaterialID[i] - i == 0) {
// No code, maybe commented out.
}
}
return i;
}
u32 J3DMaterialFactory_v21::countTexGens(int i_idx) const {
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTexGenNumIdx != 0xff) {
return mpTexGenNum[mtl_init_data->mTexGenNumIdx];
}
return 0;
}
u32 J3DMaterialFactory_v21::countStages(int i_idx) const {
J3DMaterialInitData_v21* init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
u32 count1 = 0;
u32 count2 = 0;
if (init_data->mTevStageNumIdx != 0xff) {
count2 = mpTevStageNum[init_data->mTevStageNumIdx];
}
for (int i = 0; i < 8; i++) {
if (init_data->mTexNoIdx[i] != 0xffff) {
count1++;
}
}
if (count2 != count1 && count1 != 0) {
u32 count3;
if (count2 > count1) {
count3 = count2;
} else {
count3 = count1;
}
return count3;
}
return count2;
}
J3DMaterial* J3DMaterialFactory_v21::create(J3DMaterial* i_material, int i_idx, u32 i_flags) const {
const u32 stages = countStages(i_idx);
u32 tev_stage_num = getMdlDataFlag_TevStageNum(i_flags);
u32 tev_stage_num_max = JMAMax(stages, tev_stage_num);
u32 tex_num = tev_stage_num_max > 8 ? 8 : tev_stage_num_max;
u32 texgens = countTexGens(i_idx);
u32 texgen_flag = texgens > 4 ? getMdlDataFlag_TexGenFlag(0) : getMdlDataFlag_TexGenFlag(i_flags);
u32 color_flag = getMdlDataFlag_ColorFlag(i_flags);
u32 pe_flag = getMdlDataFlag_PEFlag(i_flags);
BOOL ind_flag = (i_flags & 0x1000000) ? TRUE : FALSE;
if (i_material == NULL) {
i_material = new J3DMaterial();
}
i_material->mColorBlock = J3DMaterial::createColorBlock(color_flag);
i_material->mTexGenBlock = J3DMaterial::createTexGenBlock(texgen_flag);
i_material->mTevBlock = J3DMaterial::createTevBlock((u16)tev_stage_num_max);
i_material->mIndBlock = J3DMaterial::createIndBlock(ind_flag);
i_material->mPEBlock = J3DMaterial::createPEBlock(pe_flag, getMaterialMode(i_idx));
i_material->mIndex = i_idx;
i_material->mMaterialMode = getMaterialMode(i_idx);
i_material->mColorBlock->setColorChanNum(newColorChanNum(i_idx));
i_material->mColorBlock->setCullMode(newCullMode(i_idx));
i_material->mTexGenBlock->setTexGenNum(newTexGenNum(i_idx));
i_material->mTexGenBlock->setNBTScale(newNBTScale(i_idx));
i_material->mPEBlock->setFog(newFog(i_idx));
i_material->mPEBlock->setAlphaComp(newAlphaComp(i_idx));
i_material->mPEBlock->setBlend(newBlend(i_idx));
i_material->mPEBlock->setZMode(newZMode(i_idx));
i_material->mPEBlock->setZCompLoc(newZCompLoc(i_idx));
i_material->mPEBlock->setDither(newDither(i_idx));
i_material->mTevBlock->setTevStageNum(newTevStageNum(i_idx));
for (u8 i = 0; i < tex_num; i++) {
i_material->mTevBlock->setTexNo(i, newTexNo(i_idx, i));
}
for (u8 i = 0; i < tev_stage_num_max; i++) {
i_material->mTevBlock->setTevOrder(i, newTevOrder(i_idx, i));
}
for (u8 i = 0; i < tev_stage_num_max; i++) {
J3DMaterialInitData_v21* material_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
i_material->mTevBlock->setTevStage(i, newTevStage(i_idx, i));
if (material_init_data->mTevSwapModeIdx[i] != 0xffff) {
i_material->mTevBlock->getTevStage(i)->setTexSel(
mpTevSwapModeInfo[material_init_data->mTevSwapModeIdx[i]].mTexSel);
i_material->mTevBlock->getTevStage(i)->setRasSel(
mpTevSwapModeInfo[material_init_data->mTevSwapModeIdx[i]].mRasSel);
}
}
for (u8 i = 0; i < 4; i++) {
i_material->mTevBlock->setTevKColor(i, newTevKColor(i_idx, i));
}
for (u8 i = 0; i < 4; i++) {
i_material->mTevBlock->setTevColor(i, newTevColor(i_idx, i));
}
for (u8 i = 0; i < 4; i++) {
i_material->mTevBlock->setTevSwapModeTable(i, newTevSwapModeTable(i_idx, i));
}
for (u8 i = 0; i < 2; i++) {
i_material->mColorBlock->setMatColor(i, newMatColor(i_idx, i));
}
for (u8 i = 0; i < 4; i++) {
J3DColorChan color_chan = newColorChan(i_idx, i);
i_material->mColorBlock->setColorChan(i, color_chan);
}
for (u8 i = 0; i < texgens; i++) {
J3DTexCoord tex_coord = newTexCoord(i_idx, i);
i_material->mTexGenBlock->setTexCoord(i, &tex_coord);
}
for (u8 i = 0; i < 8; i++) {
i_material->mTexGenBlock->setTexMtx(i, newTexMtx(i_idx, i));
}
J3DMaterialInitData_v21* material_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
for (u8 i = 0; i < tev_stage_num_max; i++) {
if (material_init_data->mTevKColorSel[i] != 0xff) {
i_material->mTevBlock->setTevKColorSel(i, material_init_data->mTevKColorSel[i]);
} else {
i_material->mTevBlock->setTevKColorSel(i, 0xc);
}
}
for (u8 i = 0; i < tev_stage_num_max; i++) {
if (material_init_data->mTevKAlphaSel[i] != 0xff) {
i_material->mTevBlock->setTevKAlphaSel(i, material_init_data->mTevKAlphaSel[i]);
} else {
i_material->mTevBlock->setTevKAlphaSel(i, 0x1c);
}
}
return i_material;
}
J3DGXColor J3DMaterialFactory_v21::newMatColor(int i_idx, int i_no) const {
J3DGXColor defaultColor = (GXColor){0xff, 0xff, 0xff, 0xff};
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mMatColorIdx[i_no] != 0xffff) {
return J3DGXColor(mpMatColor[mtl_init_data->mMatColorIdx[i_no]]);
}
return J3DGXColor(defaultColor);
}
const u8 J3DMaterialFactory_v21::newColorChanNum(int i_idx) const {
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mColorChanNumIdx != 0xff) {
return mpColorChanNum[mtl_init_data->mColorChanNumIdx];
} else {
return 0;
}
}
J3DColorChan J3DMaterialFactory_v21::newColorChan(int i_idx, int i_no) const {
u8 r29 = 0;
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mColorChanIdx[i_no] != 0xffff) {
return J3DColorChan(mpColorChanInfo[mtl_init_data->mColorChanIdx[i_no]]);
} else {
return J3DColorChan();
}
}
u32 J3DMaterialFactory_v21::newTexGenNum(int i_idx) const {
u8 r30 = 0;
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTexGenNumIdx != 0xff) {
return mpTexGenNum[mtl_init_data->mTexGenNumIdx];
} else {
return 0;
}
}
J3DTexCoord J3DMaterialFactory_v21::newTexCoord(int i_idx, int i_no) const {
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTexCoordIdx[i_no] != 0xffff) {
return J3DTexCoord(mpTexCoordInfo[mtl_init_data->mTexCoordIdx[i_no]]);
} else {
return J3DTexCoord();
}
}
J3DTexMtx* J3DMaterialFactory_v21::newTexMtx(int i_idx, int i_no) const {
J3DTexMtx* tex_mtx = NULL;
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTexMtxIdx[i_no] != 0xffff) {
tex_mtx = new J3DTexMtx(mpTexMtxInfo[mtl_init_data->mTexMtxIdx[i_no]]);
}
return tex_mtx;
}
u8 J3DMaterialFactory_v21::newCullMode(int i_idx) const {
u8 r30 = 0;
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mCullModeIdx != 0xff) {
return mpCullMode[mtl_init_data->mCullModeIdx];
} else {
return 0xff;
}
}
u16 J3DMaterialFactory_v21::newTexNo(int i_idx, int i_no) const {
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTexNoIdx[i_no] != 0xffff) {
return mpTexNo[mtl_init_data->mTexNoIdx[i_no]];
} else {
return 0xffff;
}
}
J3DTevOrder J3DMaterialFactory_v21::newTevOrder(int i_idx, int i_no) const {
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTevOrderIdx[i_no] != 0xffff) {
return J3DTevOrder(mpTevOrderInfo[mtl_init_data->mTevOrderIdx[i_no]]);
} else {
return J3DTevOrder();
}
}
J3DGXColorS10 J3DMaterialFactory_v21::newTevColor(int i_idx, int i_no) const {
GXColorS10 defaultTevColor = {0,0,0,0};
J3DGXColorS10 dflt = defaultTevColor;
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTevColorIdx[i_no] != 0xffff) {
return mpTevColor[mtl_init_data->mTevColorIdx[i_no]];
} else {
return dflt;
}
}
J3DGXColor J3DMaterialFactory_v21::newTevKColor(int i_idx, int param_1) const {
J3DGXColor defaultColor = (GXColor){0xff, 0xff, 0xff, 0xff};
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTevKColorIdx[param_1] != 0xffff) {
return J3DGXColor(mpTevKColor[mtl_init_data->mTevKColorIdx[param_1]]);
}
return J3DGXColor(defaultColor);
}
const u8 J3DMaterialFactory_v21::newTevStageNum(int i_idx) const {
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTevStageNumIdx != 0xff) {
return mpTevStageNum[mtl_init_data->mTevStageNumIdx];
} else {
return 0xff;
}
}
J3DTevStage J3DMaterialFactory_v21::newTevStage(int i_idx, int i_no) const {
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTevStageIdx[i_no] != 0xffff) {
return J3DTevStage(mpTevStageInfo[mtl_init_data->mTevStageIdx[i_no]]);
} else {
return J3DTevStage();
}
}
J3DTevSwapModeTable J3DMaterialFactory_v21::newTevSwapModeTable(int i_idx, int param_1) const {
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mTevSwapModeTableIdx[param_1] != 0xffff) {
return J3DTevSwapModeTable(mpTevSwapModeTableInfo[mtl_init_data->mTevSwapModeTableIdx[param_1]]);
}
return J3DTevSwapModeTable(j3dDefaultTevSwapModeTable);
}
J3DFog J3DMaterialFactory_v21::newFog(int i_idx) const {
J3DFog fog;
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mFogIdx != 0xffff) {
fog.setFogInfo(mpFogInfo[mtl_init_data->mFogIdx]);
}
return fog;
}
J3DAlphaComp J3DMaterialFactory_v21::newAlphaComp(int i_idx) const {
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mAlphaCompIdx != 0xffff) {
return J3DAlphaComp(mpAlphaCompInfo[mtl_init_data->mAlphaCompIdx]);
}
return J3DAlphaComp(0xffff);
}
J3DBlend J3DMaterialFactory_v21::newBlend(int i_idx) const {
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mBlendIdx != 0xffff) {
return J3DBlend(mpBlendInfo[mtl_init_data->mBlendIdx]);
} else {
return J3DBlend(j3dDefaultBlendInfo);
}
}
const J3DZMode J3DMaterialFactory_v21::newZMode(int i_idx) const {
u8 r29 = 0;
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mZModeIdx != 0xff) {
return J3DZMode(mpZModeInfo[mtl_init_data->mZModeIdx]);
} else {
return J3DZMode();
}
}
const u8 J3DMaterialFactory_v21::newZCompLoc(int i_idx) const {
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mZCompLocIdx != 0xff){
return mpZCompLoc[mtl_init_data->mZCompLocIdx];
} else {
return 0;
}
}
const u8 J3DMaterialFactory_v21::newDither(int i_idx) const {
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mDitherIdx != 0xff){
return mpDither[mtl_init_data->mDitherIdx];
} else {
return 1;
}
}
J3DNBTScale J3DMaterialFactory_v21::newNBTScale(int i_idx) const {
J3DNBTScale dflt(j3dDefaultNBTScaleInfo);
J3DMaterialInitData_v21* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]];
if (mtl_init_data->mNBTScaleIdx != 0xffff) {
return J3DNBTScale(mpNBTScaleInfo[mtl_init_data->mNBTScaleIdx]);
} else {
return dflt;
}
}
@@ -0,0 +1,672 @@
#include "JSystem/JSystem.h" // IWYU pragma: keep
#include "JSystem/J3DGraphLoader/J3DModelLoader.h"
#include "JSystem/J3DGraphAnimator/J3DAnimation.h"
#include "JSystem/J3DGraphAnimator/J3DShapeTable.h"
#include "JSystem/J3DGraphAnimator/J3DJointTree.h"
#include "JSystem/J3DGraphAnimator/J3DJoint.h"
#include "JSystem/J3DGraphLoader/J3DJointFactory.h"
#include "JSystem/J3DGraphLoader/J3DMaterialFactory.h"
#include "JSystem/J3DGraphLoader/J3DMaterialFactory_v21.h"
#include "JSystem/J3DGraphLoader/J3DShapeFactory.h"
#include "JSystem/J3DGraphAnimator/J3DModelData.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "JSystem/JUtility/JUTNameTab.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JSupport/JSupport.h"
J3DModelLoader::J3DModelLoader() :
mpModelData(NULL),
mpMaterialTable(NULL),
mpShapeBlock(NULL),
mpMaterialBlock(NULL),
mpModelHierarchy(NULL),
field_0x18(0),
mEnvelopeSize(0) {
/* empty function */
}
J3DModelData* J3DModelLoaderDataBase::load(void const* i_data, u32 i_flags) {
J3D_ASSERT_NULLPTR(52, i_data);
const J3DModelFileData* header = (const J3DModelFileData*)i_data;
if (i_data == NULL) {
return NULL;
}
if (header->mMagic1 == 'J3D1' && header->mMagic2 == 'bmd1') {
JUT_PANIC(64, "Error : version error.");
return NULL;
}
if (header->mMagic1 == 'J3D2' && header->mMagic2 == 'bmd2') {
J3DModelLoader_v21 loader;
return loader.load(i_data, i_flags);
}
if (header->mMagic1 == 'J3D2' && header->mMagic2 == 'bmd3') {
J3DModelLoader_v26 loader;
return loader.load(i_data, i_flags);
}
JUT_PANIC(89, "Error : version error.");
return NULL;
}
J3DModelData* J3DModelLoaderDataBase::loadBinaryDisplayList(const void* i_data, u32 flags) {
J3D_ASSERT_NULLPTR(138, i_data);
const J3DModelFileData* header = (const J3DModelFileData*)i_data;
if (!i_data) {
return NULL;
}
if (header->mMagic1 == 'J3D2' && (header->mMagic2 == 'bdl3' || header->mMagic2 == 'bdl4')) {
J3DModelLoader_v26 loader;
return loader.loadBinaryDisplayList(i_data, flags);
}
JUT_PANIC(157, "Error : version error.");
return NULL;
}
J3DModelData* J3DModelLoader::load(void const* i_data, u32 i_flags) {
s32 freeSize = JKRGetCurrentHeap()->getTotalFreeSize();
mpModelData = new J3DModelData();
J3D_ASSERT_ALLOCMEM(177, mpModelData);
mpModelData->clear();
mpModelData->mpRawData = i_data;
mpModelData->setModelDataType(0);
mpMaterialTable = &mpModelData->mMaterialTable;
J3DModelFileData const* data = (J3DModelFileData*)i_data;
J3DModelBlock const* block = data->mBlocks;
for (u32 block_no = 0; block_no < data->mBlockNum; block_no++) {
switch (block->mBlockType) {
case 'INF1':
readInformation((J3DModelInfoBlock*)block, (s32)i_flags);
break;
case 'VTX1':
readVertex((J3DVertexBlock*)block);
break;
case 'EVP1':
readEnvelop((J3DEnvelopeBlock*)block);
break;
case 'DRW1':
readDraw((J3DDrawBlock*)block);
break;
case 'JNT1':
readJoint((J3DJointBlock*)block);
break;
case 'MAT3':
readMaterial((J3DMaterialBlock*)block, (s32)i_flags);
break;
case 'MAT2':
readMaterial_v21((J3DMaterialBlock_v21*)block, (s32)i_flags);
break;
case 'SHP1':
readShape((J3DShapeBlock*)block, (s32)i_flags);
break;
case 'TEX1':
readTexture((J3DTextureBlock*)block);
break;
default:
OSReport("Unknown data block\n");
break;
}
block = (J3DModelBlock*)((uintptr_t)block + block->mBlockSize);
}
J3DModelHierarchy const* hierarchy = mpModelData->getHierarchy();
mpModelData->makeHierarchy(NULL, &hierarchy);
mpModelData->getShapeTable()->sortVcdVatCmd();
mpModelData->getJointTree().findImportantMtxIndex();
setupBBoardInfo();
if (mpModelData->getFlag() & 0x100) {
for (u16 shape_no = 0; shape_no < mpModelData->getShapeNum(); shape_no++) {
mpModelData->getShapeNodePointer(shape_no)->onFlag(0x200);
}
}
return mpModelData;
}
J3DMaterialTable* J3DModelLoader::loadMaterialTable(void const* i_data) {
int flags = 0x51100000;
mpMaterialTable = new J3DMaterialTable();
J3D_ASSERT_ALLOCMEM(279, mpMaterialTable);
mpMaterialTable->clear();
J3DModelFileData const* data = (J3DModelFileData*)i_data;
J3DModelBlock const* block = data->mBlocks;
for (u32 block_no = 0; block_no < data->mBlockNum; block_no++) {
switch (block->mBlockType) {
case 'MAT3':
readMaterialTable((J3DMaterialBlock*)block, flags);
break;
case 'MAT2':
readMaterialTable_v21((J3DMaterialBlock_v21*)block, flags);
break;
case 'TEX1':
readTextureTable((J3DTextureBlock*)block);
break;
default:
OSReport("Unknown data block\n");
break;
}
block = (J3DModelBlock*)((uintptr_t)block + block->mBlockSize);
}
if (mpMaterialTable->mTexture == NULL) {
mpMaterialTable->mTexture = new J3DTexture(0, NULL);
J3D_ASSERT_ALLOCMEM(319, mpMaterialTable->mTexture);
}
return mpMaterialTable;
}
inline u32 getBdlFlag_MaterialType(u32 flags) {
return flags & (J3DMLF_13 | J3DMLF_DoBdlMaterialCalc);
}
J3DModelData* J3DModelLoader::loadBinaryDisplayList(void const* i_data, u32 i_flags) {
mpModelData = new J3DModelData();
J3D_ASSERT_ALLOCMEM(338, mpModelData);
mpModelData->clear();
mpModelData->mpRawData = i_data;
mpModelData->setModelDataType(1);
mpMaterialTable = &mpModelData->mMaterialTable;
J3DModelFileData const* data = (J3DModelFileData*)i_data;
J3DModelBlock const* block = data->mBlocks;
for (u32 block_no = 0; block_no < data->mBlockNum; block_no++) {
s32 flags;
u32 materialType;
switch (block->mBlockType) {
case 'INF1':
flags = i_flags;
readInformation((J3DModelInfoBlock*)block, flags);
break;
case 'VTX1':
readVertex((J3DVertexBlock*)block);
break;
case 'EVP1':
readEnvelop((J3DEnvelopeBlock*)block);
break;
case 'DRW1':
readDraw((J3DDrawBlock*)block);
break;
case 'JNT1':
readJoint((J3DJointBlock*)block);
break;
case 'SHP1':
readShape((J3DShapeBlock*)block, i_flags);
break;
case 'TEX1':
readTexture((J3DTextureBlock*)block);
break;
case 'MDL3':
readMaterialDL((J3DMaterialDLBlock*)block, i_flags);
modifyMaterial(i_flags);
break;
case 'MAT3':
flags = 0x50100000;
flags |= (i_flags & 0x3000000);
mpMaterialBlock = (J3DMaterialBlock*)block;
materialType = getBdlFlag_MaterialType(i_flags);
if (materialType == 0) {
readMaterial((J3DMaterialBlock*)block, flags);
} else if (materialType == 0x2000) {
readPatchedMaterial((J3DMaterialBlock*)block, flags);
}
break;
default:
OSReport("Unknown data block\n");
break;
}
block = (J3DModelBlock*)((uintptr_t)block + block->mBlockSize);
}
J3DModelHierarchy const* hierarchy = mpModelData->getHierarchy();
mpModelData->makeHierarchy(NULL, &hierarchy);
mpModelData->getShapeTable()->sortVcdVatCmd();
mpModelData->getJointTree().findImportantMtxIndex();
setupBBoardInfo();
mpModelData->indexToPtr();
return mpModelData;
}
void J3DModelLoader::setupBBoardInfo() {
for (u16 i = 0; i < mpModelData->getJointNum(); i++) {
J3DMaterial* mesh = mpModelData->getJointNodePointer(i)->getMesh();
if (mesh != NULL) {
u32 shape_index = mesh->getShape()->getIndex();
u16* index_table = JSUConvertOffsetToPtr<u16>(mpShapeBlock,
(uintptr_t)mpShapeBlock->mpIndexTable);
J3DShapeInitData* shape_init_data =
JSUConvertOffsetToPtr<J3DShapeInitData>(mpShapeBlock,
(uintptr_t)mpShapeBlock->mpShapeInitData);
J3DShapeInitData* r26 = &shape_init_data[index_table[shape_index]];
switch (r26->mShapeMtxType) {
case 0:
mpModelData->getJointNodePointer(i)->setMtxType(0);
break;
case 1:
mpModelData->getJointNodePointer(i)->setMtxType(1);
mpModelData->mbHasBillboard = true;
break;
case 2:
mpModelData->getJointNodePointer(i)->setMtxType(2);
mpModelData->mbHasBillboard = true;
break;
case 3:
mpModelData->getJointNodePointer(i)->setMtxType(0);
break;
default:
OSReport("WRONG SHAPE MATRIX TYPE (__FILE__)\n");
break;
}
}
}
}
void J3DModelLoader::readInformation(J3DModelInfoBlock const* i_block, u32 i_flags) {
J3D_ASSERT_NULLPTR(506, i_block);
mpModelData->mFlags = i_flags | i_block->mFlags;
mpModelData->getJointTree().setFlag(mpModelData->mFlags);
J3DMtxCalc* mtx_calc = NULL;
switch (mpModelData->mFlags & 0xf) {
case 0:
mtx_calc = new J3DMtxCalcNoAnm<J3DMtxCalcCalcTransformBasic,J3DMtxCalcJ3DSysInitBasic>();
break;
case 1:
mtx_calc = new J3DMtxCalcNoAnm<J3DMtxCalcCalcTransformSoftimage,J3DMtxCalcJ3DSysInitSoftimage>();
break;
case 2:
mtx_calc = new J3DMtxCalcNoAnm<J3DMtxCalcCalcTransformMaya,J3DMtxCalcJ3DSysInitMaya>();
break;
default:
JUT_PANIC(529, "Error : Invalid MtxCalcType.");
break;
}
J3D_ASSERT_ALLOCMEM(532, mtx_calc);
mpModelData->setBasicMtxCalc(mtx_calc);
mpModelData->getVertexData().mPacketNum = i_block->mPacketNum;
mpModelData->getVertexData().mVtxNum = i_block->mVtxNum;
mpModelData->setHierarchy(JSUConvertOffsetToPtr<J3DModelHierarchy>(i_block, i_block->mpHierarchy));
}
static _GXCompType getFmtType(_GXVtxAttrFmtList* i_fmtList, _GXAttr i_attr) {
for (; i_fmtList->attr != GX_VA_NULL; i_fmtList++) {
if (i_fmtList->attr == i_attr) {
return i_fmtList->type;
}
}
return GX_F32;
}
void J3DModelLoader::readVertex(J3DVertexBlock const* i_block) {
J3D_ASSERT_NULLPTR(577, i_block);
J3DVertexData& vertex_data = mpModelData->getVertexData();
vertex_data.mVtxAttrFmtList =
JSUConvertOffsetToPtr<GXVtxAttrFmtList>(i_block, i_block->mpVtxAttrFmtList);
vertex_data.mVtxPosArray = JSUConvertOffsetToPtr<void>(i_block, i_block->mpVtxPosArray);
vertex_data.mVtxNrmArray = JSUConvertOffsetToPtr<void>(i_block, i_block->mpVtxNrmArray);
vertex_data.mVtxNBTArray = JSUConvertOffsetToPtr<void>(i_block, i_block->mpVtxNBTArray);
for (int i = 0; i < 2; i++) {
vertex_data.mVtxColorArray[i] =
(GXColor*)JSUConvertOffsetToPtr<void>(i_block, i_block->mpVtxColorArray[i]);
}
for (int i = 0; i < 8; i++) {
vertex_data.mVtxTexCoordArray[i] =
JSUConvertOffsetToPtr<void>(i_block, i_block->mpVtxTexCoordArray[i]);
}
u32 nrm_size = 12;
if (getFmtType(vertex_data.mVtxAttrFmtList, GX_VA_NRM) == GX_F32) {
nrm_size = 12;
} else {
nrm_size = 6;
}
void* nrm_end = NULL;
if (vertex_data.mVtxNBTArray != NULL) {
nrm_end = vertex_data.mVtxNBTArray;
} else if (vertex_data.mVtxColorArray[0] != NULL) {
nrm_end = vertex_data.mVtxColorArray[0];
} else if (vertex_data.mVtxTexCoordArray[0] != NULL) {
nrm_end = vertex_data.mVtxTexCoordArray[0];
}
if (vertex_data.mVtxNrmArray == NULL) {
vertex_data.mNrmNum = 0;
} else if (nrm_end != NULL) {
vertex_data.mNrmNum = ((uintptr_t)nrm_end - (uintptr_t)vertex_data.mVtxNrmArray) / nrm_size + 1;
} else {
vertex_data.mNrmNum = (i_block->mBlockSize - (uintptr_t)i_block->mpVtxNrmArray) / nrm_size + 1;
}
void* color0_end = NULL;
if (vertex_data.mVtxColorArray[1] != NULL) {
color0_end = vertex_data.mVtxColorArray[1];
} else if (vertex_data.mVtxTexCoordArray[0] != NULL) {
color0_end = vertex_data.mVtxTexCoordArray[0];
}
if (vertex_data.mVtxColorArray[0] == NULL) {
vertex_data.mColNum = 0;
} else if (color0_end != NULL) {
vertex_data.mColNum = ((uintptr_t)color0_end - (uintptr_t)vertex_data.mVtxColorArray[0]) / 4 + 1;
} else {
vertex_data.mColNum = (i_block->mBlockSize - (uintptr_t)i_block->mpVtxColorArray[0]) / 4 + 1;
}
int local_28 = 0;
if (vertex_data.mVtxTexCoordArray[1]) {
color0_end = vertex_data.mVtxTexCoordArray[1];
}
if (vertex_data.mVtxTexCoordArray[0] == NULL) {
vertex_data.mTexCoordNum = 0;
return;
}
if (local_28) {
vertex_data.mTexCoordNum = (local_28 - (uintptr_t)vertex_data.mVtxTexCoordArray[0]) / 8 + 1;
} else {
vertex_data.mTexCoordNum = (i_block->mBlockSize - (uintptr_t)i_block->mpVtxTexCoordArray[0]) / 8 + 1;
}
}
void J3DModelLoader::readEnvelop(J3DEnvelopeBlock const* i_block) {
J3D_ASSERT_NULLPTR(724, i_block);
mpModelData->getJointTree().mWEvlpMtxNum = i_block->mWEvlpMtxNum;
mpModelData->getJointTree().mWEvlpMixMtxNum =
JSUConvertOffsetToPtr<u8>(i_block, i_block->mpWEvlpMixMtxNum);
mpModelData->getJointTree().mWEvlpMixMtxIndex =
JSUConvertOffsetToPtr<u16>(i_block, i_block->mpWEvlpMixIndex);
mpModelData->getJointTree().mWEvlpMixWeight =
JSUConvertOffsetToPtr<f32>(i_block, i_block->mpWEvlpMixWeight);
mpModelData->getJointTree().mInvJointMtx =
JSUConvertOffsetToPtr<Mtx>(i_block, i_block->mpInvJointMtx);
}
void J3DModelLoader::readDraw(J3DDrawBlock const* i_block) {
J3D_ASSERT_NULLPTR(747, i_block);
J3DDrawMtxData* drawMtxData = mpModelData->getDrawMtxData();
drawMtxData->mEntryNum = i_block->mMtxNum - mpModelData->getWEvlpMtxNum();
drawMtxData->mDrawMtxFlag = JSUConvertOffsetToPtr<u8>(i_block, i_block->mpDrawMtxFlag);
drawMtxData->mDrawMtxIndex = JSUConvertOffsetToPtr<u16>(i_block, i_block->mpDrawMtxIndex);
u16 i;
for (i = 0; i < drawMtxData->mEntryNum; i++) {
if (drawMtxData->mDrawMtxFlag[i] == 1) {
break;
}
}
drawMtxData->mDrawFullWgtMtxNum = i;
mpModelData->getJointTree().mWEvlpImportantMtxIdx = new u16[drawMtxData->mEntryNum];
J3D_ASSERT_ALLOCMEM(767, mpModelData->getJointTree().mWEvlpImportantMtxIdx);
}
void J3DModelLoader::readJoint(J3DJointBlock const* i_block) {
J3D_ASSERT_NULLPTR(781, i_block);
J3DJointFactory factory(*i_block);
mpModelData->getJointTree().mJointNum = i_block->mJointNum;
if (i_block->mpNameTable != NULL) {
mpModelData->getJointTree().mJointName =
new JUTNameTab(JSUConvertOffsetToPtr<ResNTAB>(i_block, i_block->mpNameTable));
J3D_ASSERT_ALLOCMEM(791, mpModelData->getJointTree().mJointName);
} else {
mpModelData->getJointTree().mJointName = NULL;
}
mpModelData->getJointTree().mJointNodePointer =
new J3DJoint*[mpModelData->getJointTree().mJointNum];
J3D_ASSERT_ALLOCMEM(797, mpModelData->getJointTree().mJointNodePointer);
for (u16 i = 0; i < mpModelData->getJointNum(); i++) {
mpModelData->getJointTree().mJointNodePointer[i] = factory.create(i);
}
}
void J3DModelLoader_v26::readMaterial(J3DMaterialBlock const* i_block, u32 i_flags) {
J3D_ASSERT_NULLPTR(817, i_block);
J3DMaterialFactory factory(*i_block);
mpMaterialTable->mMaterialNum = i_block->mMaterialNum;
mpMaterialTable->mUniqueMatNum = factory.countUniqueMaterials();
if (i_block->mpNameTable != NULL) {
mpMaterialTable->mMaterialName =
new JUTNameTab(JSUConvertOffsetToPtr<ResNTAB>(i_block, i_block->mpNameTable));
J3D_ASSERT_ALLOCMEM(832, mpMaterialTable->mMaterialName);
} else {
mpMaterialTable->mMaterialName = NULL;
}
mpMaterialTable->mMaterialNodePointer = new J3DMaterial*[mpMaterialTable->mMaterialNum];
J3D_ASSERT_ALLOCMEM(841, mpMaterialTable->mMaterialNodePointer);
if (i_flags & 0x200000) {
mpMaterialTable->field_0x10 = new (0x20) J3DMaterial[mpMaterialTable->mUniqueMatNum];
J3D_ASSERT_ALLOCMEM(846, mpMaterialTable->field_0x10);
} else {
mpMaterialTable->field_0x10 = NULL;
}
if (i_flags & 0x200000) {
for (u16 i = 0; i < mpMaterialTable->mUniqueMatNum; i++) {
factory.create(&mpMaterialTable->field_0x10[i],
J3DMaterialFactory::MATERIAL_TYPE_NORMAL, i, i_flags);
mpMaterialTable->field_0x10[i].mDiffFlag = (uintptr_t)&mpMaterialTable->field_0x10[i] >> 4;
}
}
for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) {
mpMaterialTable->mMaterialNodePointer[i] =
factory.create(NULL, J3DMaterialFactory::MATERIAL_TYPE_NORMAL, i, i_flags);
}
if (i_flags & 0x200000) {
for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) {
mpMaterialTable->mMaterialNodePointer[i]->mDiffFlag =
(uintptr_t)&mpMaterialTable->field_0x10[factory.getMaterialID(i)] >> 4;
mpMaterialTable->mMaterialNodePointer[i]->mpOrigMaterial =
&mpMaterialTable->field_0x10[factory.getMaterialID(i)];
}
} else {
for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) {
mpMaterialTable->mMaterialNodePointer[i]->mDiffFlag =
((uintptr_t)mpMaterialTable->mMaterialNodePointer >> 4) + factory.getMaterialID(i);
}
}
}
void J3DModelLoader_v21::readMaterial_v21(J3DMaterialBlock_v21 const* i_block, u32 i_flags) {
J3D_ASSERT_NULLPTR(913, i_block);
J3DMaterialFactory_v21 factory(*i_block);
mpMaterialTable->mMaterialNum = i_block->mMaterialNum;
mpMaterialTable->mUniqueMatNum = factory.countUniqueMaterials();
if (i_block->mpNameTable != NULL) {
mpMaterialTable->mMaterialName =
new JUTNameTab(JSUConvertOffsetToPtr<ResNTAB>(i_block, i_block->mpNameTable));
J3D_ASSERT_ALLOCMEM(930, mpMaterialTable->mMaterialName);
} else {
mpMaterialTable->mMaterialName = NULL;
}
mpMaterialTable->mMaterialNodePointer = new J3DMaterial*[mpMaterialTable->mMaterialNum];
J3D_ASSERT_ALLOCMEM(940, mpMaterialTable->mMaterialNodePointer);
if (i_flags & 0x200000) {
mpMaterialTable->field_0x10 = new (0x20) J3DMaterial[mpMaterialTable->mUniqueMatNum];
J3D_ASSERT_ALLOCMEM(945, mpMaterialTable->field_0x10);
} else {
mpMaterialTable->field_0x10 = NULL;
}
if (i_flags & 0x200000) {
for (u16 i = 0; i < mpMaterialTable->mUniqueMatNum; i++) {
factory.create(&mpMaterialTable->field_0x10[i], i, i_flags);
mpMaterialTable->field_0x10[i].mDiffFlag = (uintptr_t)&mpMaterialTable->field_0x10[i] >> 4;
}
}
for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) {
mpMaterialTable->mMaterialNodePointer[i] = factory.create(NULL, i, i_flags);
}
if (i_flags & 0x200000) {
for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) {
mpMaterialTable->mMaterialNodePointer[i]->mDiffFlag =
(uintptr_t)&mpMaterialTable->field_0x10[factory.getMaterialID(i)] >> 4;
mpMaterialTable->mMaterialNodePointer[i]->mpOrigMaterial =
&mpMaterialTable->field_0x10[factory.getMaterialID(i)];
}
} else {
for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) {
mpMaterialTable->mMaterialNodePointer[i]->mDiffFlag = 0xc0000000;
}
}
}
void J3DModelLoader::readShape(J3DShapeBlock const* i_block, u32 i_flags) {
J3D_ASSERT_NULLPTR(1009, i_block);
mpShapeBlock = i_block;
J3DShapeTable* shape_table = mpModelData->getShapeTable();
J3DShapeFactory factory(*i_block);
shape_table->mShapeNum = i_block->mShapeNum;
if (i_block->mpNameTable != NULL) {
shape_table->mShapeName =
new JUTNameTab(JSUConvertOffsetToPtr<ResNTAB>(i_block, i_block->mpNameTable));
J3D_ASSERT_ALLOCMEM(1026, shape_table->mShapeName);
} else {
shape_table->mShapeName = NULL;
}
shape_table->mShapeNodePointer = new J3DShape*[shape_table->mShapeNum];
J3D_ASSERT_ALLOCMEM(1034, shape_table->mShapeNodePointer);
factory.allocVcdVatCmdBuffer(shape_table->mShapeNum);
J3DModelHierarchy const* hierarchy_entry = mpModelData->getHierarchy();
GXVtxDescList* vtx_desc_list = NULL;
for (; hierarchy_entry->mType != 0; hierarchy_entry++) {
if (hierarchy_entry->mType == 0x12) {
shape_table->mShapeNodePointer[hierarchy_entry->mValue] =
factory.create(hierarchy_entry->mValue, i_flags, vtx_desc_list);
vtx_desc_list = factory.getVtxDescList(hierarchy_entry->mValue);
}
}
}
void J3DModelLoader::readTexture(J3DTextureBlock const* i_block) {
J3D_ASSERT_NULLPTR(1067, i_block);
u16 texture_num = i_block->mTextureNum;
ResTIMG* texture_res = JSUConvertOffsetToPtr<ResTIMG>(i_block, i_block->mpTextureRes);
if (i_block->mpNameTable != NULL) {
mpMaterialTable->mTextureName =
new JUTNameTab(JSUConvertOffsetToPtr<ResNTAB>(i_block, i_block->mpNameTable));
J3D_ASSERT_ALLOCMEM(1077, mpMaterialTable->mTextureName);
} else {
mpMaterialTable->mTextureName = NULL;
}
mpMaterialTable->mTexture = new J3DTexture(texture_num, texture_res);
J3D_ASSERT_ALLOCMEM(1084, mpMaterialTable->mTexture);
}
void J3DModelLoader_v26::readMaterialTable(J3DMaterialBlock const* i_block, u32 i_flags) {
J3D_ASSERT_NULLPTR(1101, i_block);
J3DMaterialFactory factory(*i_block);
mpMaterialTable->mMaterialNum = i_block->mMaterialNum;
if (i_block->mpNameTable != NULL) {
mpMaterialTable->mMaterialName =
new JUTNameTab(JSUConvertOffsetToPtr<ResNTAB>(i_block, i_block->mpNameTable));
J3D_ASSERT_ALLOCMEM(1114, mpMaterialTable->mMaterialName);
} else {
mpMaterialTable->mMaterialName = NULL;
}
mpMaterialTable->mMaterialNodePointer = new J3DMaterial*[mpMaterialTable->mMaterialNum];
J3D_ASSERT_ALLOCMEM(1121, mpMaterialTable->mMaterialNodePointer);
for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) {
mpMaterialTable->mMaterialNodePointer[i] =
factory.create(NULL, J3DMaterialFactory::MATERIAL_TYPE_NORMAL, i, i_flags);
}
for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) {
mpMaterialTable->mMaterialNodePointer[i]->mDiffFlag =
(uintptr_t)mpMaterialTable->mMaterialNodePointer + factory.getMaterialID(i);
}
}
void J3DModelLoader_v21::readMaterialTable_v21(J3DMaterialBlock_v21 const* i_block, u32 i_flags) {
J3D_ASSERT_NULLPTR(1152, i_block);
J3DMaterialFactory_v21 factory(*i_block);
mpMaterialTable->mMaterialNum = i_block->mMaterialNum;
if (i_block->mpNameTable != NULL) {
mpMaterialTable->mMaterialName =
new JUTNameTab(JSUConvertOffsetToPtr<ResNTAB>(i_block, i_block->mpNameTable));
J3D_ASSERT_ALLOCMEM(1165, mpMaterialTable->mMaterialName);
} else {
mpMaterialTable->mMaterialName = NULL;
}
mpMaterialTable->mMaterialNodePointer = new J3DMaterial*[mpMaterialTable->mMaterialNum];
J3D_ASSERT_ALLOCMEM(1172, mpMaterialTable->mMaterialNodePointer);
for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) {
mpMaterialTable->mMaterialNodePointer[i] =
factory.create(NULL, i, i_flags);
}
for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) {
mpMaterialTable->mMaterialNodePointer[i]->mDiffFlag =
((uintptr_t)mpMaterialTable->mMaterialNodePointer >> 4) + factory.getMaterialID(i);
}
}
void J3DModelLoader::readTextureTable(J3DTextureBlock const* i_block) {
J3D_ASSERT_NULLPTR(1200, i_block);
u16 texture_num = i_block->mTextureNum;
ResTIMG* texture_res = JSUConvertOffsetToPtr<ResTIMG>(i_block, i_block->mpTextureRes);
if (i_block->mpNameTable != NULL) {
mpMaterialTable->mTextureName =
new JUTNameTab(JSUConvertOffsetToPtr<ResNTAB>(i_block, i_block->mpNameTable));
J3D_ASSERT_ALLOCMEM(1211, mpMaterialTable->mTextureName);
} else {
mpMaterialTable->mTextureName = NULL;
}
mpMaterialTable->mTexture = new J3DTexture(texture_num, texture_res);
J3D_ASSERT_ALLOCMEM(1218, mpMaterialTable->mTexture);
}
void J3DModelLoader::readPatchedMaterial(J3DMaterialBlock const* i_block, u32 i_flags) {
J3D_ASSERT_NULLPTR(1234, i_block);
J3DMaterialFactory factory(*i_block);
mpMaterialTable->mMaterialNum = i_block->mMaterialNum;
mpMaterialTable->mUniqueMatNum = factory.countUniqueMaterials();
if (i_block->mpNameTable != NULL) {
mpMaterialTable->mMaterialName =
new JUTNameTab(JSUConvertOffsetToPtr<ResNTAB>(i_block, i_block->mpNameTable));
J3D_ASSERT_ALLOCMEM(1251, mpMaterialTable->mMaterialName);
} else {
mpMaterialTable->mMaterialName = NULL;
}
mpMaterialTable->mMaterialNodePointer = new J3DMaterial*[mpMaterialTable->mMaterialNum];
J3D_ASSERT_ALLOCMEM(1260, mpMaterialTable->mMaterialNodePointer);
mpMaterialTable->field_0x10 = NULL;
for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) {
mpMaterialTable->mMaterialNodePointer[i] =
factory.create(NULL, J3DMaterialFactory::MATERIAL_TYPE_PATCHED, i, i_flags);
mpMaterialTable->mMaterialNodePointer[i]->mDiffFlag =
((uintptr_t)mpMaterialTable->mMaterialNodePointer >> 4) + factory.getMaterialID(i);
}
}
void J3DModelLoader::readMaterialDL(J3DMaterialDLBlock const* i_block, u32 i_flags) {
J3D_ASSERT_NULLPTR(1290, i_block);
J3DMaterialFactory factory(*i_block);
s32 flags;
if (mpMaterialTable->mMaterialNum == 0) {
mpMaterialTable->field_0x1c = 1;
mpMaterialTable->mMaterialNum = i_block->mMaterialNum;
mpMaterialTable->mUniqueMatNum = i_block->mMaterialNum;
if (i_block->mpNameTable != NULL) {
mpMaterialTable->mMaterialName =
new JUTNameTab(JSUConvertOffsetToPtr<ResNTAB>(i_block, i_block->mpNameTable));
J3D_ASSERT_ALLOCMEM(1312, mpMaterialTable->mMaterialName);
} else {
mpMaterialTable->mMaterialName = NULL;
}
mpMaterialTable->mMaterialNodePointer = new J3DMaterial*[mpMaterialTable->mMaterialNum];
J3D_ASSERT_ALLOCMEM(1320, mpMaterialTable->mMaterialNodePointer);
mpMaterialTable->field_0x10 = NULL;
for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) {
flags = i_flags;
mpMaterialTable->mMaterialNodePointer[i] =
factory.create(NULL, J3DMaterialFactory::MATERIAL_TYPE_LOCKED, i, flags);
}
for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) {
mpMaterialTable->mMaterialNodePointer[i]->mDiffFlag = 0xc0000000;
}
} else {
for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) {
flags = i_flags;
mpMaterialTable->mMaterialNodePointer[i] =
factory.create(mpMaterialTable->mMaterialNodePointer[i],
J3DMaterialFactory::MATERIAL_TYPE_LOCKED, i, flags);
}
}
}
void J3DModelLoader::modifyMaterial(u32 i_flags) {
if (i_flags & 0x2000) {
J3DMaterialFactory factory(*mpMaterialBlock);
for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) {
factory.modifyPatchedCurrentMtx(mpMaterialTable->mMaterialNodePointer[i], i);
}
}
}
@@ -0,0 +1,328 @@
#include "JSystem/JSystem.h" // IWYU pragma: keep
#include "JSystem/J3DGraphLoader/J3DModelLoaderCalcSize.h"
#include "JSystem/J3DGraphLoader/J3DModelLoader.h"
#include "JSystem/J3DGraphLoader/J3DShapeFactory.h"
#include "JSystem/J3DGraphLoader/J3DMaterialFactory.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "JSystem/J3DGraphAnimator/J3DJoint.h"
#include "JSystem/J3DGraphAnimator/J3DModelData.h"
#include "JSystem/JSupport/JSupport.h"
#include <os.h>
#include "global.h"
u16 J3DModelLoader::countMaterialNum(const void* stream) {
const J3DModelFileData* header = (const J3DModelFileData*)stream;
const J3DModelBlock* block = header->mBlocks;
for (int i = 0; i < header->mBlockNum; i++)
{
if (block->mBlockType == 'MAT3') {
const J3DMaterialBlock* materialBlock = (const J3DMaterialBlock*)block;
return materialBlock->mMaterialNum;
}
block = (const J3DModelBlock*)((u8*)block + block->mBlockSize);
}
return 0;
}
static void dummy() {
JUT_PANIC(0, "Error : null pointer.");
}
u32 J3DModelLoader::calcLoadSize(void const* stream, u32 flags_) {
int flags = flags_;
size_t size = 0;
// TODO: What sizeof will get us a size of 0xE4?
size += 0xE4;
const J3DModelFileData* header = static_cast<const J3DModelFileData*>(stream);
const J3DModelBlock* nextBlock = header->mBlocks;
for (u32 i = 0; i < header->mBlockNum; i++) {
switch (nextBlock->mBlockType) {
case 'INF1':
size += calcSizeInformation((const J3DModelInfoBlock*)nextBlock, flags);
break;
case 'JNT1':
size += calcSizeJoint((const J3DJointBlock*)nextBlock);
break;
case 'MAT3':
size += calcSizeMaterial((const J3DMaterialBlock*)nextBlock, flags);
break;
case 'SHP1':
size += calcSizeShape((const J3DShapeBlock*)nextBlock, flags);
break;
case 'TEX1':
size += calcSizeTexture((const J3DTextureBlock*)nextBlock);
break;
case 'EVP1':
size += calcSizeEnvelope((const J3DEnvelopeBlock*)nextBlock);
break;
case 'DRW1':
size += calcSizeDraw((const J3DDrawBlock*)nextBlock);
break;
case 'VTX1':
break;
case 'MAT2':
JUT_PANIC(282, "Error : version error.");
break;
default:
OSReport("Unknown data block\n");
break;
}
nextBlock = (const J3DModelBlock*)((u8*)nextBlock + nextBlock->mBlockSize);
}
return size;
}
u32 J3DModelLoader::calcLoadMaterialTableSize(const void* stream) {
u32 flags = J3DMLF_21 | J3DMLF_Material_UseIndirect | J3DMLF_Material_PE_Full | J3DMLF_Material_Color_LightOn;
size_t size = 0;
// TODO: What sizeof will get us a size of 0x20? Is this just the file header???
size += 0x20;
const J3DModelBlock* nextBlock;
bool hasTextureTable;
const J3DModelFileData* header = reinterpret_cast<const J3DModelFileData*>(stream);
nextBlock = header->mBlocks;
hasTextureTable = false;
for (u32 i = 0; i < header->mBlockNum; i++) {
switch (nextBlock->mBlockType) {
case 'MAT3':
size += calcSizeMaterialTable((const J3DMaterialBlock*)nextBlock, flags);
break;
case 'TEX1':
size += calcSizeTextureTable((const J3DTextureBlock*)nextBlock);
hasTextureTable = true;
break;
case 'MAT2':
JUT_PANIC(334, "Error : version error.");
break;
default:
OSReport("Unknown data block\n");
break;
}
nextBlock = (const J3DModelBlock*)((u8*)nextBlock + nextBlock->mBlockSize);
}
if (!hasTextureTable) {
size += 12;
}
return size;
}
inline u32 getBdlFlag_MaterialType(u32 flags) {
return flags & (J3DMLF_13 | J3DMLF_DoBdlMaterialCalc);
}
// NONMATCHING flags issue
u32 J3DModelLoader::calcLoadBinaryDisplayListSize(const void* stream, u32 flags) {
u32 size = 0;
size += sizeof(J3DModelData);
const J3DModelFileData* header = (const J3DModelFileData*)stream;
const J3DModelBlock* nextBlock = header->mBlocks;
for (u32 i = 0; i < header->mBlockNum; i++) {
switch (nextBlock->mBlockType) {
case 'INF1':
size += calcSizeInformation((const J3DModelInfoBlock*)nextBlock, (u32)flags);
break;
case 'JNT1':
size += calcSizeJoint((const J3DJointBlock*)nextBlock);
break;
case 'SHP1':
size += calcSizeShape((const J3DShapeBlock*)nextBlock, (u32)flags);
break;
case 'TEX1':
size += calcSizeTexture((const J3DTextureBlock*)nextBlock);
break;
case 'MDL3':
size += calcSizeMaterialDL((const J3DMaterialDLBlock*)nextBlock, flags);
break;
case 'MAT3': {
u32 flags2 = (J3DMLF_21 | J3DMLF_Material_PE_Full | J3DMLF_Material_Color_LightOn);
flags2 |= (u32)flags & (J3DMLF_Material_UseIndirect | J3DMLF_26);
mpMaterialBlock = (const J3DMaterialBlock*)nextBlock;
u32 flag_mtl_type = getBdlFlag_MaterialType(flags);
if (flag_mtl_type == 0) {
field_0x18 = 1;
size += calcSizeMaterial((const J3DMaterialBlock*)nextBlock, flags2);
} else if (flag_mtl_type == J3DMLF_DoBdlMaterialCalc) {
field_0x18 = 1;
size += calcSizePatchedMaterial((const J3DMaterialBlock*)nextBlock, flags2);
}
break;
}
case 'EVP1':
size += calcSizeEnvelope((const J3DEnvelopeBlock*)nextBlock);
break;
case 'DRW1':
size += calcSizeDraw((const J3DDrawBlock*)nextBlock);
break;
case 'VTX1':
break;
case 'MAT2':
JUT_PANIC(436, "Error : version error.");
break;
default:
OSReport("Unknown data block\n");
break;
}
nextBlock = (const J3DModelBlock*)((u8*)nextBlock + nextBlock->mBlockSize);
}
return size;
}
u32 J3DModelLoader::calcSizeInformation(const J3DModelInfoBlock* block, u32 flags) {
J3D_ASSERT_NULLPTR(462, block);
int size = 0;
u32 flags2 = flags | block->mFlags;
int r27 = 0;
switch (flags2 & J3DMLF_MtxTypeMask) {
case J3DMLF_None: // Basic
size += 4;
break;
case J3DMLF_MtxSoftImageCalc:
size += 4;
break;
case J3DMLF_MtxMayaCalc:
size += 4;
break;
default:
JUT_PANIC(481, "Error : Invalid MtxCalcType.");
break;
}
mpModelHierarchy = JSUConvertOffsetToPtr<J3DModelHierarchy>(block, block->mpHierarchy);
return size;
}
u32 J3DModelLoader::calcSizeJoint(const J3DJointBlock* block) {
J3D_ASSERT_NULLPTR(499, block);
int size = 0;
if (block->mpNameTable) {
size += 0x10;
}
size += (block->mJointNum * sizeof(J3DJoint*));
size += (block->mJointNum * sizeof(J3DJoint));
return size;
}
u32 J3DModelLoader::calcSizeEnvelope(const J3DEnvelopeBlock* block) {
J3D_ASSERT_NULLPTR(522, block);
mEnvelopeSize = block->mWEvlpMtxNum;
return 0;
}
u32 J3DModelLoader::calcSizeDraw(const J3DDrawBlock* block) {
J3D_ASSERT_NULLPTR(538, block);
u32 size = 0;
size += (block->mMtxNum - mEnvelopeSize) * 2;
return size;
}
u32 J3DModelLoader_v26::calcSizeMaterial(const J3DMaterialBlock* block, u32 flags) {
J3D_ASSERT_NULLPTR(558, block);
size_t size = 0;
J3DMaterialFactory factory(*block);
u32 count = block->mMaterialNum;
int uniqueCount = factory.countUniqueMaterials();
if (block->mpNameTable != NULL) {
size += 0x10;
}
size += (count * sizeof(J3DMaterial*));
if ((flags & J3DMLF_UseUniqueMaterials) != 0) {
// calc for allocated materials as well
size += ALIGN_NEXT((u16)uniqueCount * sizeof(J3DMaterial), 0x20);
}
if ((flags & J3DMLF_UseUniqueMaterials) != 0) {
for (u32 i = 0; i < uniqueCount; i++) {
size += factory.calcSize(NULL, J3DMaterialFactory::MATERIAL_TYPE_NORMAL, i, flags);
}
}
for (u32 i = 0; i < count; i++) {
size += factory.calcSize(NULL, J3DMaterialFactory::MATERIAL_TYPE_NORMAL, i, flags);
}
return size;
}
u32 J3DModelLoader::calcSizeShape(const J3DShapeBlock* block, u32 flags) {
J3D_ASSERT_NULLPTR(616, block);
int size = 0;
J3DShapeFactory factory(*block);
int count = block->mShapeNum;
if (block->mpNameTable) {
size += 0x10;
}
size += count * sizeof(J3DShape*);
size += factory.calcSizeVcdVatCmdBuffer(count);
J3DModelHierarchy* hierarchy;
for (hierarchy = mpModelHierarchy; hierarchy->mType != 0; hierarchy++) {
if (hierarchy->mType == 0x12) {
size += factory.calcSize(hierarchy->mValue, flags);
}
}
return size;
}
u32 J3DModelLoader::calcSizeTexture(const J3DTextureBlock* block) {
J3D_ASSERT_NULLPTR(663, block);
// TODO: use sizeofs here.
int size = 0;
if (block->mpNameTable) {
size += 0x10;
}
size += 0xC;
return size;
}
u32 J3DModelLoader_v26::calcSizeMaterialTable(const J3DMaterialBlock* block, u32 flags) {
int size = 0;
u32 count = block->mMaterialNum;
J3DMaterialFactory factory(*block);
if (block->mpNameTable) {
size += 0x10;
}
size += (count * sizeof(J3DMaterial*));
for (u16 i = 0; i < count; i++) {
size += factory.calcSize(NULL, J3DMaterialFactory::MATERIAL_TYPE_NORMAL, i, flags);
}
return size;
}
u32 J3DModelLoader::calcSizeTextureTable(const J3DTextureBlock* block) {
return calcSizeTexture(block);
}
u32 J3DModelLoader::calcSizePatchedMaterial(const J3DMaterialBlock* block, u32 flags) {
int size = 0;
u32 count = block->mMaterialNum;
J3DMaterialFactory factory(*block);
if (block->mpNameTable) {
size += 0x10;
}
size += (count * sizeof(J3DMaterial*));
for (u16 i = 0; i < count; i++) {
size += factory.calcSize(NULL, J3DMaterialFactory::MATERIAL_TYPE_PATCHED, i, flags);
}
return size;
}
u32 J3DModelLoader::calcSizeMaterialDL(const J3DMaterialDLBlock* block, u32 flags_) {
J3D_ASSERT_NULLPTR(758, block);
int flags = flags_;
size_t size = 0;
J3DMaterialFactory factory(*block);
if (!field_0x18) {
u32 count = block->mMaterialNum;
if (block->mpNameTable) {
size += 0x10;
}
size += count * sizeof(J3DLockedMaterial*);
for (u16 i = 0; i < count; i++) {
size += factory.calcSize(NULL, J3DMaterialFactory::MATERIAL_TYPE_LOCKED, i, flags);
}
} else {
u32 count = block->mMaterialNum;
for (u16 i = 0; i < count; i++) {
size += factory.calcSize((J3DMaterial*)this, J3DMaterialFactory::MATERIAL_TYPE_LOCKED, i, flags);
}
}
return size;
}
@@ -0,0 +1,191 @@
#include "JSystem/JSystem.h" // IWYU pragma: keep
#include "JSystem/J3DGraphLoader/J3DShapeFactory.h"
#include "JSystem/J3DGraphBase/J3DShape.h"
#include "JSystem/J3DGraphBase/J3DShapeMtx.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JSupport/JSupport.h"
#include <os.h>
#include "global.h"
J3DShapeFactory::J3DShapeFactory(J3DShapeBlock const& block) {
mShapeInitData = JSUConvertOffsetToPtr<J3DShapeInitData>(&block, (uintptr_t)block.mpShapeInitData);
mIndexTable = JSUConvertOffsetToPtr<u16>(&block, (uintptr_t)block.mpIndexTable);
mVtxDescList = JSUConvertOffsetToPtr<GXVtxDescList>(&block, (uintptr_t)block.mpVtxDescList);
mMtxTable = JSUConvertOffsetToPtr<u16>(&block, (uintptr_t)block.mpMtxTable);
mDisplayListData = JSUConvertOffsetToPtr<u8>(&block, (uintptr_t)block.mpDisplayListData);
mMtxInitData = JSUConvertOffsetToPtr<J3DShapeMtxInitData>(&block, (uintptr_t)block.mpMtxInitData);
mDrawInitData = JSUConvertOffsetToPtr<J3DShapeDrawInitData>(&block, (uintptr_t)block.mpDrawInitData);
mVcdVatCmdBuffer = NULL;
}
J3DShape* J3DShapeFactory::create(int no, u32 flag, GXVtxDescList* vtxDesc) {
J3DShape* shape = new J3DShape;
J3D_ASSERT_ALLOCMEM(67, shape);
shape->mMtxGroupNum = getMtxGroupNum(no);
shape->mRadius = getRadius(no);
shape->mVtxDesc = getVtxDescList(no);
shape->mShapeMtx = new J3DShapeMtx*[shape->mMtxGroupNum];
J3D_ASSERT_ALLOCMEM(74, shape->mShapeMtx);
shape->mShapeDraw = new J3DShapeDraw*[shape->mMtxGroupNum];
J3D_ASSERT_ALLOCMEM(76, shape->mShapeDraw);
shape->mMin = getMin(no);
shape->mMax = getMax(no);
shape->mVcdVatCmd = mVcdVatCmdBuffer + no * J3DShape::kVcdVatDLSize;
for (s32 i = 0; i < shape->mMtxGroupNum; i++) {
shape->mShapeMtx[i] = newShapeMtx(flag, no, i);
shape->mShapeDraw[i] = newShapeDraw(no, i);
}
shape->mIndex = no;
return shape;
}
enum {
J3DMdlDataFlag_ConcatView = 0x10,
};
enum {
J3DShapeMtxType_Mtx = 0x00,
J3DShapeMtxType_BBoard = 0x01,
J3DShapeMtxType_YBBoard = 0x02,
J3DShapeMtxType_Multi = 0x03,
};
J3DShapeMtx* J3DShapeFactory::newShapeMtx(u32 flag, int shapeNo, int mtxGroupNo) const {
J3DShapeMtx* ret = NULL;
const J3DShapeInitData& shapeInitData = mShapeInitData[mIndexTable[shapeNo]];
const J3DShapeMtxInitData& mtxInitData =
(&mMtxInitData[shapeInitData.mMtxInitDataIndex])[mtxGroupNo];
u32 mtxLoadType = getMdlDataFlag_MtxLoadType(flag);
switch (mtxLoadType) {
case J3DMdlDataFlag_ConcatView:
switch (shapeInitData.mShapeMtxType) {
case J3DShapeMtxType_Mtx:
ret = new J3DShapeMtxConcatView(mtxInitData.mUseMtxIndex);
break;
case J3DShapeMtxType_BBoard:
ret = new J3DShapeMtxBBoardConcatView(mtxInitData.mUseMtxIndex);
break;
case J3DShapeMtxType_YBBoard:
ret = new J3DShapeMtxYBBoardConcatView(mtxInitData.mUseMtxIndex);
break;
case J3DShapeMtxType_Multi:
ret = new J3DShapeMtxMultiConcatView(mtxInitData.mUseMtxIndex, mtxInitData.mUseMtxCount,
&mMtxTable[mtxInitData.mFirstUseMtxIndex]);
break;
default:
OSReport("WRONG SHAPE MATRIX TYPE (J3DModelInit.cpp)\n");
break;
}
break;
case 0:
default:
switch (shapeInitData.mShapeMtxType) {
case J3DShapeMtxType_Mtx:
case J3DShapeMtxType_BBoard:
case J3DShapeMtxType_YBBoard:
ret = new J3DShapeMtx(mtxInitData.mUseMtxIndex);
break;
case J3DShapeMtxType_Multi:
ret = new J3DShapeMtxMulti(mtxInitData.mUseMtxIndex, mtxInitData.mUseMtxCount,
&mMtxTable[mtxInitData.mFirstUseMtxIndex]);
break;
default:
OSReport("WRONG SHAPE MATRIX TYPE (J3DModelInit.cpp)\n");
break;
}
break;
}
J3D_ASSERT_ALLOCMEM(167, ret);
return ret;
}
J3DShapeDraw* J3DShapeFactory::newShapeDraw(int shapeNo, int mtxGroupNo) const {
J3DShapeDraw* shapeDraw = NULL;
const J3DShapeInitData& shapeInitData = mShapeInitData[mIndexTable[shapeNo]];
const J3DShapeDrawInitData& drawInitData =
(&mDrawInitData[shapeInitData.mDrawInitDataIndex])[mtxGroupNo];
shapeDraw = new J3DShapeDraw(&mDisplayListData[drawInitData.mDisplayListIndex], drawInitData.mDisplayListSize);
J3D_ASSERT_ALLOCMEM(193, shapeDraw);
return shapeDraw;
}
void J3DShapeFactory::allocVcdVatCmdBuffer(u32 count) {
mVcdVatCmdBuffer = new (0x20) u8[J3DShape::kVcdVatDLSize * count];
J3D_ASSERT_ALLOCMEM(211, mVcdVatCmdBuffer);
for (u32 i = 0; i < (J3DShape::kVcdVatDLSize * count) / 4; i++)
((u32*)mVcdVatCmdBuffer)[i] = 0;
}
s32 J3DShapeFactory::calcSize(int shapeNo, u32 flag) {
s32 size = 0;
s32 mtxGroupNo = getMtxGroupNum(shapeNo);
size += sizeof(J3DShape);
size += mtxGroupNo * 4;
size += mtxGroupNo * 4;
for (u32 i = 0; i < mtxGroupNo; i++) {
size += calcSizeShapeMtx(flag, shapeNo, i);
size += 0x0C;
}
return size;
}
s32 J3DShapeFactory::calcSizeVcdVatCmdBuffer(u32 count) {
return ALIGN_NEXT(count * J3DShape::kVcdVatDLSize, 0x20);
}
s32 J3DShapeFactory::calcSizeShapeMtx(u32 flag, int shapeNo, int mtxGroupNo) const {
int local_18 = 0;
const J3DShapeInitData& shapeInitData = mShapeInitData[mIndexTable[shapeNo]];
J3DShapeMtxInitData& mtxInitData = (&mMtxInitData[shapeInitData.mMtxInitDataIndex])[mtxGroupNo];
u32 ret = 0;
u32 mtxLoadType = getMdlDataFlag_MtxLoadType(flag);
switch (mtxLoadType) {
case J3DMdlDataFlag_ConcatView:
switch (shapeInitData.mShapeMtxType) {
case J3DShapeMtxType_Mtx:
ret += sizeof(J3DShapeMtxConcatView);
break;
case J3DShapeMtxType_BBoard:
ret += sizeof(J3DShapeMtxBBoardConcatView);
break;
case J3DShapeMtxType_YBBoard:
ret += sizeof(J3DShapeMtxYBBoardConcatView);
break;
case J3DShapeMtxType_Multi:
ret += sizeof(J3DShapeMtxMultiConcatView);
break;
default:
OSReport("WRONG SHAPE MATRIX TYPE (J3DModelInit.cpp)\n");
}
break;
case 0:
default:
switch (shapeInitData.mShapeMtxType) {
case J3DShapeMtxType_Mtx:
case J3DShapeMtxType_BBoard:
case J3DShapeMtxType_YBBoard:
ret += 0x08;
break;
case J3DShapeMtxType_Multi:
ret += sizeof(J3DShapeMtxMultiConcatView);
break;
default:
OSReport("WRONG SHAPE MATRIX TYPE (J3DModelInit.cpp)\n");
}
break;
}
return ret;
}