hsfload fixes
This commit is contained in:
parent
1e51c0f60d
commit
dfc51f4912
7 changed files with 87 additions and 19 deletions
2
extern/aurora
vendored
2
extern/aurora
vendored
|
|
@ -1 +1 @@
|
||||||
Subproject commit d9de6603c79917a5353abd3a9cc26ec557ceee05
|
Subproject commit 3b56e337c08a1dd4946c226298011364c319c7a2
|
||||||
|
|
@ -350,6 +350,9 @@ typedef struct hsf_track {
|
||||||
float value;
|
float value;
|
||||||
void *data;
|
void *data;
|
||||||
};
|
};
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
void *dataTop;
|
||||||
|
#endif
|
||||||
} HsfTrack;
|
} HsfTrack;
|
||||||
|
|
||||||
typedef struct hsf_motion {
|
typedef struct hsf_motion {
|
||||||
|
|
|
||||||
|
|
@ -215,6 +215,20 @@ typedef struct HsfBitmapKey32b {
|
||||||
u32 data;
|
u32 data;
|
||||||
} HsfBitmapKey32b;
|
} HsfBitmapKey32b;
|
||||||
|
|
||||||
|
typedef struct HsfFace32b {
|
||||||
|
s16 type;
|
||||||
|
s16 mat;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
s16 indices[3][4];
|
||||||
|
u32 count;
|
||||||
|
u32 data;
|
||||||
|
} strip;
|
||||||
|
s16 indices[4][4];
|
||||||
|
};
|
||||||
|
Vec nbt;
|
||||||
|
} HsfFace32b;
|
||||||
|
|
||||||
void byteswap_u16(u16 *src);
|
void byteswap_u16(u16 *src);
|
||||||
void byteswap_s16(s16 *src);
|
void byteswap_s16(s16 *src);
|
||||||
void byteswap_u32(u32 *src);
|
void byteswap_u32(u32 *src);
|
||||||
|
|
@ -248,6 +262,7 @@ void byteswap_hsfobject(HsfObject32b *src, HsfObject *dest);
|
||||||
void byteswap_hsfbitmapkey(HsfBitmapKey32b *src, HsfBitmapKey *dest);
|
void byteswap_hsfbitmapkey(HsfBitmapKey32b *src, HsfBitmapKey *dest);
|
||||||
void byteswap_hsftrack(HsfTrack32b *src, HsfTrack *dest);
|
void byteswap_hsftrack(HsfTrack32b *src, HsfTrack *dest);
|
||||||
void byteswap_hsfmotion(HsfMotion32b *src, HsfMotion *dest);
|
void byteswap_hsfmotion(HsfMotion32b *src, HsfMotion *dest);
|
||||||
|
void byteswap_hsfface(HsfFace32b *src, HsfFace *dest);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -371,8 +371,10 @@ void ObjectSetup(void)
|
||||||
s16 group;
|
s16 group;
|
||||||
s16 sprite;
|
s16 sprite;
|
||||||
AnimData *data;
|
AnimData *data;
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
return;
|
||||||
|
#else
|
||||||
option = 0;
|
option = 0;
|
||||||
#ifdef __MWERKS__
|
|
||||||
if (OSGetResetCode() != OS_RESET_RESTART) {
|
if (OSGetResetCode() != OS_RESET_RESTART) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -425,7 +427,6 @@ void ObjectSetup(void)
|
||||||
HuPrcVSleep();
|
HuPrcVSleep();
|
||||||
}
|
}
|
||||||
#ifdef __MWERKS__
|
#ifdef __MWERKS__
|
||||||
// TODO PC
|
|
||||||
if (!option) {
|
if (!option) {
|
||||||
OSSetProgressiveMode(OS_PROGRESSIVE_MODE_ON);
|
OSSetProgressiveMode(OS_PROGRESSIVE_MODE_ON);
|
||||||
VIConfigure(&GXNtsc480Prog);
|
VIConfigure(&GXNtsc480Prog);
|
||||||
|
|
|
||||||
|
|
@ -272,7 +272,7 @@ static void MaterialLoad(void)
|
||||||
new_mat->refAlpha = curr_mat->refAlpha;
|
new_mat->refAlpha = curr_mat->refAlpha;
|
||||||
new_mat->unk2C = curr_mat->unk2C;
|
new_mat->unk2C = curr_mat->unk2C;
|
||||||
new_mat->numAttrs = curr_mat->numAttrs;
|
new_mat->numAttrs = curr_mat->numAttrs;
|
||||||
new_mat->attrs = (s32 *)(NSymIndex+((uintptr_t)curr_mat->attrs));
|
new_mat->attrs = (s32 *)(NSymIndex+((u32)curr_mat->attrs));
|
||||||
rgba[i].r = new_mat->litColor[0];
|
rgba[i].r = new_mat->litColor[0];
|
||||||
rgba[i].g = new_mat->litColor[1];
|
rgba[i].g = new_mat->litColor[1];
|
||||||
rgba[i].b = new_mat->litColor[2];
|
rgba[i].b = new_mat->litColor[2];
|
||||||
|
|
@ -458,6 +458,14 @@ static void NormalLoad(void)
|
||||||
new_normal->count = file_normal->count;
|
new_normal->count = file_normal->count;
|
||||||
new_normal->name = SetName((u32 *)&file_normal->name);
|
new_normal->name = SetName((u32 *)&file_normal->name);
|
||||||
new_normal->data = (void *)((uintptr_t)data+(uintptr_t)temp_data);
|
new_normal->data = (void *)((uintptr_t)data+(uintptr_t)temp_data);
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
if (cenv_count != 0) {
|
||||||
|
for (i = 0; i < new_normal->count; i++) {
|
||||||
|
HsfVector3f *normalData = &((HsfVector3f *)new_normal->data)[i];
|
||||||
|
byteswap_hsfvec3f(normalData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -530,9 +538,10 @@ static void FaceLoad(void)
|
||||||
if(head.face.count) {
|
if(head.face.count) {
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
HsfBuffer32b *file_face_real = (HsfBuffer32b *)((uintptr_t)fileptr + head.face.ofs);
|
HsfBuffer32b *file_face_real = (HsfBuffer32b *)((uintptr_t)fileptr + head.face.ofs);
|
||||||
|
HsfFace32b *file_facedata_real = (HsfFace32b *)&file_face_real[head.face.count];
|
||||||
temp_face = file_face = FaceTop = HuMemDirectMallocNum(HEAP_DATA, sizeof(HsfBuffer) * head.face.count, MEMORY_DEFAULT_NUM);
|
temp_face = file_face = FaceTop = HuMemDirectMallocNum(HEAP_DATA, sizeof(HsfBuffer) * head.face.count, MEMORY_DEFAULT_NUM);
|
||||||
for (i = 0; i < head.face.count; i++) {
|
for (i = 0; i < head.face.count; i++) {
|
||||||
byteswap_hsfbuffer(&file_face[i], &file_face[i]);
|
byteswap_hsfbuffer(&file_face_real[i], &file_face[i]);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
temp_face = file_face = (HsfBuffer *)((u32)fileptr+head.face.ofs);
|
temp_face = file_face = (HsfBuffer *)((u32)fileptr+head.face.ofs);
|
||||||
|
|
@ -541,9 +550,7 @@ static void FaceLoad(void)
|
||||||
new_face = temp_face;
|
new_face = temp_face;
|
||||||
Model.face = new_face;
|
Model.face = new_face;
|
||||||
Model.faceCnt = head.face.count;
|
Model.faceCnt = head.face.count;
|
||||||
#ifdef TARGET_PC
|
#ifdef __MWERKS__
|
||||||
data = (void *)&file_face_real[head.face.count];
|
|
||||||
#else
|
|
||||||
file_face = (HsfBuffer *)((u32)fileptr+head.face.ofs);
|
file_face = (HsfBuffer *)((u32)fileptr+head.face.ofs);
|
||||||
data = (HsfFace *)&file_face[head.face.count];
|
data = (HsfFace *)&file_face[head.face.count];
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -551,22 +558,30 @@ static void FaceLoad(void)
|
||||||
temp_data = file_face->data;
|
temp_data = file_face->data;
|
||||||
new_face->name = SetName((u32 *)&file_face->name);
|
new_face->name = SetName((u32 *)&file_face->name);
|
||||||
new_face->count = file_face->count;
|
new_face->count = file_face->count;
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
{
|
||||||
|
HsfFace32b *facedata_start = (HsfFace32b *)((uintptr_t)file_facedata_real + (uintptr_t)temp_data);
|
||||||
|
data = HuMemDirectMallocNum(HEAP_DATA, sizeof(HsfFace) * new_face->count, MEMORY_DEFAULT_NUM);
|
||||||
|
for (j = 0; j < new_face->count; j++) {
|
||||||
|
byteswap_hsfface(&facedata_start[j], &data[j]);
|
||||||
|
}
|
||||||
|
new_face->data = data;
|
||||||
|
strip = (u8 *)(&facedata_start[new_face->count]);
|
||||||
|
}
|
||||||
|
#else
|
||||||
new_face->data = (void *)((uintptr_t)data+(uintptr_t)temp_data);
|
new_face->data = (void *)((uintptr_t)data+(uintptr_t)temp_data);
|
||||||
strip = (u8 *)(&((HsfFace *)new_face->data)[new_face->count]);
|
strip = (u8 *)(&((HsfFace *)new_face->data)[new_face->count]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
new_face = temp_face;
|
new_face = temp_face;
|
||||||
for(i=0; i<head.face.count; i++, new_face++) {
|
for(i=0; i<head.face.count; i++, new_face++) {
|
||||||
file_face_strip = new_face_strip = new_face->data;
|
file_face_strip = new_face_strip = new_face->data;
|
||||||
for(j=0; j<new_face->count; j++, new_face_strip++, file_face_strip++) {
|
for(j=0; j<new_face->count; j++, new_face_strip++, file_face_strip++) {
|
||||||
#ifdef TARGET_PC
|
|
||||||
byteswap_s16(&file_face_strip->type);
|
|
||||||
#endif
|
|
||||||
if(AS_U16(file_face_strip->type) == 4) {
|
if(AS_U16(file_face_strip->type) == 4) {
|
||||||
new_face_strip->strip.data = (s16 *)(strip+(uintptr_t)file_face_strip->strip.data*(sizeof(s16)*4));
|
new_face_strip->strip.data = (s16 *)(strip+(uintptr_t)file_face_strip->strip.data*(sizeof(s16)*4));
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
{
|
{
|
||||||
s32 k;
|
s32 k;
|
||||||
byteswap_u32(&new_face_strip->strip.count);
|
|
||||||
for (k = 0; k < new_face_strip->strip.count; k++) {
|
for (k = 0; k < new_face_strip->strip.count; k++) {
|
||||||
byteswap_s16(&new_face_strip->strip.data[k]);
|
byteswap_s16(&new_face_strip->strip.data[k]);
|
||||||
}
|
}
|
||||||
|
|
@ -1554,7 +1569,7 @@ static inline void MotionLoadAttribute(HsfTrack *track, void *data)
|
||||||
{
|
{
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
HsfBitmapKey32b *file_frame_real = (HsfBitmapKey32b *)((uintptr_t)data + (uintptr_t)track->data);
|
HsfBitmapKey32b *file_frame_real = (HsfBitmapKey32b *)((uintptr_t)data + (uintptr_t)track->data);
|
||||||
new_frame = file_frame = HuMemDirectMallocNum(HEAP_DATA, sizeof(HsfBitmapKey) * track->numKeyframes, MEMORY_DEFAULT_NUM);
|
new_frame = file_frame = track->dataTop = HuMemDirectMallocNum(HEAP_DATA, sizeof(HsfBitmapKey) * track->numKeyframes, MEMORY_DEFAULT_NUM);
|
||||||
#else
|
#else
|
||||||
new_frame = file_frame = (HsfBitmapKey *)((uintptr_t)data + (uintptr_t)track->data);
|
new_frame = file_frame = (HsfBitmapKey *)((uintptr_t)data + (uintptr_t)track->data);
|
||||||
out_track->data = file_frame;
|
out_track->data = file_frame;
|
||||||
|
|
@ -1845,6 +1860,9 @@ void KillHSF(HsfData *data)
|
||||||
HuMemDirectFree(data->bitmap);
|
HuMemDirectFree(data->bitmap);
|
||||||
HuMemDirectFree(data->cenv);
|
HuMemDirectFree(data->cenv);
|
||||||
HuMemDirectFree(data->skeleton);
|
HuMemDirectFree(data->skeleton);
|
||||||
|
for (i = 0; i < data->faceCnt; i++) {
|
||||||
|
HuMemDirectFree(data->face[i].data);
|
||||||
|
}
|
||||||
HuMemDirectFree(data->face);
|
HuMemDirectFree(data->face);
|
||||||
HuMemDirectFree(data->material);
|
HuMemDirectFree(data->material);
|
||||||
for (i = 0; i < data->motionCnt; i++) {
|
for (i = 0; i < data->motionCnt; i++) {
|
||||||
|
|
@ -1853,7 +1871,7 @@ void KillHSF(HsfData *data)
|
||||||
HsfTrack *track = data->motion[i].track;
|
HsfTrack *track = data->motion[i].track;
|
||||||
if (track->type == HSF_TRACK_ATTRIBUTE && track->curveType == HSF_CURVE_BITMAP) {
|
if (track->type == HSF_TRACK_ATTRIBUTE && track->curveType == HSF_CURVE_BITMAP) {
|
||||||
// in this case we needed to allocate space for HsfBitmapKey structs
|
// in this case we needed to allocate space for HsfBitmapKey structs
|
||||||
HuMemDirectFree(track->data);
|
HuMemDirectFree(track->dataTop);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
HuMemDirectFree(motion->track);
|
HuMemDirectFree(motion->track);
|
||||||
|
|
|
||||||
|
|
@ -721,6 +721,31 @@ template <typename B> void bswap(B &base, HsfMotion32b &obj, HsfMotion &dest)
|
||||||
dest.len = obj.len;
|
dest.len = obj.len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename B> void bswap(B &base, HsfFace32b &obj, HsfFace &dest)
|
||||||
|
{
|
||||||
|
bswap(base, obj.type);
|
||||||
|
bswap(base, obj.mat);
|
||||||
|
bswap(base, obj.nbt);
|
||||||
|
|
||||||
|
dest.type = obj.type;
|
||||||
|
dest.mat = obj.mat;
|
||||||
|
dest.nbt = obj.nbt;
|
||||||
|
|
||||||
|
if (obj.type == 4) {
|
||||||
|
bswap(base, obj.strip.count);
|
||||||
|
bswap(base, obj.strip.data);
|
||||||
|
bswap_flat(base, obj.strip.indices[0], 3 * 4);
|
||||||
|
|
||||||
|
dest.strip.count = obj.strip.count;
|
||||||
|
dest.strip.data = reinterpret_cast<s16 *>(obj.strip.data);
|
||||||
|
std::copy(&obj.strip.indices[0][0], &obj.strip.indices[0][0] + 3 * 4, &dest.strip.indices[0][0]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bswap_flat(base, obj.indices[0], 4 * 4);
|
||||||
|
std::copy(&obj.indices[0][0], &obj.indices[0][0] + 4 * 4, &dest.indices[0][0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void byteswap_u16(u16 *src)
|
void byteswap_u16(u16 *src)
|
||||||
{
|
{
|
||||||
bswap(*src, *src);
|
bswap(*src, *src);
|
||||||
|
|
@ -909,6 +934,12 @@ void byteswap_hsftrack(HsfTrack32b *src, HsfTrack *dest)
|
||||||
}
|
}
|
||||||
|
|
||||||
void byteswap_hsfmotion(HsfMotion32b *src, HsfMotion *dest)
|
void byteswap_hsfmotion(HsfMotion32b *src, HsfMotion *dest)
|
||||||
|
{
|
||||||
|
bswap(*src, *src, *dest);
|
||||||
|
sVisitedPtrs.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void byteswap_hsfface(HsfFace32b *src, HsfFace *dest)
|
||||||
{
|
{
|
||||||
bswap(*src, *src, *dest);
|
bswap(*src, *src, *dest);
|
||||||
sVisitedPtrs.clear();
|
sVisitedPtrs.clear();
|
||||||
|
|
|
||||||
|
|
@ -198,27 +198,27 @@ s32 CARDWriteAsync(CARDFileInfo *fileInfo, const void *addr, s32 length, s32 off
|
||||||
|
|
||||||
void DCFlushRange(void *addr, u32 nBytes)
|
void DCFlushRange(void *addr, u32 nBytes)
|
||||||
{
|
{
|
||||||
puts("DCFlushRange is a stub");
|
//puts("DCFlushRange is a stub");
|
||||||
}
|
}
|
||||||
|
|
||||||
void DCFlushRangeNoSync(void *addr, u32 nBytes)
|
void DCFlushRangeNoSync(void *addr, u32 nBytes)
|
||||||
{
|
{
|
||||||
puts("DCFlushRangeNoSync is a stub");
|
//puts("DCFlushRangeNoSync is a stub");
|
||||||
}
|
}
|
||||||
|
|
||||||
void DCInvalidateRange(void *addr, u32 nBytes)
|
void DCInvalidateRange(void *addr, u32 nBytes)
|
||||||
{
|
{
|
||||||
puts("DCInvalidateRange is a stub");
|
//puts("DCInvalidateRange is a stub");
|
||||||
}
|
}
|
||||||
|
|
||||||
void DCStoreRange(void *addr, u32 nBytes)
|
void DCStoreRange(void *addr, u32 nBytes)
|
||||||
{
|
{
|
||||||
puts("DCStoreRange is a stub");
|
//puts("DCStoreRange is a stub");
|
||||||
}
|
}
|
||||||
|
|
||||||
void DCStoreRangeNoSync(void *addr, u32 nBytes)
|
void DCStoreRangeNoSync(void *addr, u32 nBytes)
|
||||||
{
|
{
|
||||||
puts("DCStoreRangeNoSync is a stub");
|
//puts("DCStoreRangeNoSync is a stub");
|
||||||
}
|
}
|
||||||
|
|
||||||
void DEMOUpdateStats(unsigned char inc)
|
void DEMOUpdateStats(unsigned char inc)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue