mirror of
https://github.com/zeldaret/tww.git
synced 2026-07-07 13:23:27 -04:00
J3DCluster work
This commit is contained in:
@@ -17,8 +17,8 @@ public:
|
||||
mKeyNum = other.mKeyNum;
|
||||
mPosNum = other.mPosNum;
|
||||
mNrmNum = other.mNrmNum;
|
||||
field_0x16 = other.field_0x16;
|
||||
field_0x18 = other.field_0x18;
|
||||
mClusterVertexNum = other.mClusterVertexNum;
|
||||
mPosDstIdx = other.mPosDstIdx;
|
||||
mClusterVertex = other.mClusterVertex;
|
||||
mDeformer = other.mDeformer;
|
||||
}
|
||||
@@ -35,8 +35,8 @@ public:
|
||||
/* 0x10 */ u16 mKeyNum;
|
||||
/* 0x12 */ u16 mPosNum;
|
||||
/* 0x14 */ u16 mNrmNum;
|
||||
/* 0x16 */ u16 field_0x16;
|
||||
/* 0x18 */ u16* field_0x18;
|
||||
/* 0x16 */ u16 mClusterVertexNum;
|
||||
/* 0x18 */ u16* mPosDstIdx;
|
||||
/* 0x1C */ J3DClusterVertex* mClusterVertex;
|
||||
/* 0x20 */ J3DDeformer* mDeformer;
|
||||
}; // Size: 0x24
|
||||
@@ -46,32 +46,29 @@ public:
|
||||
void operator=(const J3DClusterKey& other) {
|
||||
mPosNum = other.mPosNum;
|
||||
mNrmNum = other.mNrmNum;
|
||||
field_0x4 = other.field_0x4;
|
||||
field_0x8 = other.field_0x8;
|
||||
mPosFlag = other.mPosFlag;
|
||||
mNrmFlag = other.mNrmFlag;
|
||||
}
|
||||
|
||||
public:
|
||||
/* 0x00 */ u16 mPosNum;
|
||||
/* 0x02 */ u16 mNrmNum;
|
||||
/* 0x04 */ u16* field_0x4;
|
||||
/* 0x08 */ u16* field_0x8;
|
||||
/* 0x04 */ u16* mPosFlag;
|
||||
/* 0x08 */ u16* mNrmFlag;
|
||||
}; // Size: 0x0C
|
||||
|
||||
class J3DClusterVertex {
|
||||
public:
|
||||
void operator=(const J3DClusterVertex& other) {
|
||||
mNum = other.mNum;
|
||||
field_0x4 = other.field_0x4;
|
||||
field_0x8 = other.field_0x8;
|
||||
mSrcIdx = other.mSrcIdx;
|
||||
mDstIdx = other.mDstIdx;
|
||||
}
|
||||
|
||||
private:
|
||||
friend class J3DClusterLoader;
|
||||
friend class J3DClusterLoader_v15;
|
||||
|
||||
public:
|
||||
/* 0x00 */ u16 mNum;
|
||||
/* 0x04 */ u16* field_0x4;
|
||||
/* 0x08 */ u16* field_0x8;
|
||||
/* 0x04 */ u16* mSrcIdx;
|
||||
/* 0x08 */ u16* mDstIdx;
|
||||
}; // Size: 0x0C
|
||||
|
||||
#endif /* J3DCLUSTER_H */
|
||||
|
||||
@@ -86,7 +86,7 @@ void J3DDeformer::deform(J3DVertexBuffer* vtx, u16 idx, f32* weightList) {
|
||||
Vec* vtxPosDeform = (Vec*)mDeformData->getVtxPos();
|
||||
|
||||
for (s32 i = 0; i < posNum; i++) {
|
||||
Vec* vtx = &vtxPosArr[cluster->field_0x18[i]];
|
||||
Vec* vtx = &vtxPosArr[cluster->mPosDstIdx[i]];
|
||||
vtx->x = 0.0f;
|
||||
vtx->y = 0.0f;
|
||||
vtx->z = 0.0f;
|
||||
@@ -95,9 +95,9 @@ void J3DDeformer::deform(J3DVertexBuffer* vtx, u16 idx, f32* weightList) {
|
||||
f32 sign[2] = { 1.0f, -1.0f };
|
||||
for (u16 i = 0; i < posNum; i++) {
|
||||
for (u16 j = 0; j < keyNum; j++) {
|
||||
u16 flag = key[j].field_0x4[i];
|
||||
Vec* dst = &vtxPosDeform[flag & 0x1FFF];
|
||||
Vec* src = &vtxPosArr[cluster->field_0x18[i]];
|
||||
u16 flag = key[j].mPosFlag[i];
|
||||
Vec* src = &vtxPosDeform[flag & 0x1FFF];
|
||||
Vec* dst = &vtxPosArr[cluster->mPosDstIdx[i]];
|
||||
dst->x += src->x * sign[flag >> 15] * weightList[j];
|
||||
dst->y += src->y * sign[flag >> 14] * weightList[j];
|
||||
dst->z += src->z * sign[flag >> 13] * weightList[j];
|
||||
@@ -115,7 +115,7 @@ void J3DDeformer::deform(J3DVertexBuffer* vtx, u16 idx, f32* weightList) {
|
||||
dst[2] = 0.0f;
|
||||
|
||||
for (u16 j = 0; j < cluster->mKeyNum; j++) {
|
||||
u16 flag = key[j].field_0x8[i];
|
||||
u16 flag = key[j].mNrmFlag[i];
|
||||
f32* src = &vtxNrmDeform[(flag & 0x1FFF) * 3];
|
||||
|
||||
f32 srcX = src[0];
|
||||
@@ -137,13 +137,60 @@ void J3DDeformer::deform(J3DVertexBuffer* vtx, u16 idx, f32* weightList) {
|
||||
normalize(dst);
|
||||
}
|
||||
|
||||
for (u16 i = 0; i < cluster->field_0x16; i++) {
|
||||
for (u16 i = 0; i < cluster->mClusterVertexNum; i++) {
|
||||
J3DClusterVertex* vertex = &cluster->mClusterVertex[i];
|
||||
f32 pos[3];
|
||||
pos[0] = 0.0f;
|
||||
pos[1] = 0.0f;
|
||||
pos[2] = 0.0f;
|
||||
|
||||
f32 weight = 1.0f / (float)vertex->mNum;
|
||||
for (u16 j = 0; j < vertex->mNum; j++) {
|
||||
f32* src = &field_0x0c[vertex->mSrcIdx[j] * 3];
|
||||
pos[0] += src[0] * weight;
|
||||
pos[1] += src[1] * weight;
|
||||
pos[2] += src[2] * weight;
|
||||
}
|
||||
normalize(pos);
|
||||
|
||||
for (u16 j = 0; j < vertex->mNum; j++) {
|
||||
u16 dstIdx = vertex->mDstIdx[j];
|
||||
if (dstIdx == 0xFFFF)
|
||||
continue;
|
||||
|
||||
f32* src = &field_0x0c[vertex->mSrcIdx[j] * 3];
|
||||
f32 dot = pos[0]*src[0] + pos[1]*src[1] + pos[2]*src[2];
|
||||
|
||||
f32 angle;
|
||||
if (dot >= 1.0f) {
|
||||
angle = 0.0f;
|
||||
} else if (dot > -1.0f) {
|
||||
angle = acos(dot);
|
||||
angle = (angle * 180.0f) / 3.1415f;
|
||||
} else {
|
||||
angle = 180.0f;
|
||||
}
|
||||
|
||||
if (angle <= cluster->mMinAngle) {
|
||||
vtxNrmArr[dstIdx * 3 + 0] = pos[0];
|
||||
vtxNrmArr[dstIdx * 3 + 1] = pos[1];
|
||||
vtxNrmArr[dstIdx * 3 + 2] = pos[2];
|
||||
} else if (angle > cluster->mMaxAngle) {
|
||||
vtxNrmArr[dstIdx * 3 + 0] = src[0];
|
||||
vtxNrmArr[dstIdx * 3 + 1] = src[1];
|
||||
vtxNrmArr[dstIdx * 3 + 2] = src[2];
|
||||
} else {
|
||||
f32 weight = (angle - cluster->mMinAngle) / (cluster->mMaxAngle - cluster->mMinAngle);
|
||||
f32 inv = 1.0f - weight;
|
||||
|
||||
vtxNrmArr[dstIdx * 3 + 0] = pos[0] * inv + src[0] * weight;
|
||||
vtxNrmArr[dstIdx * 3 + 1] = pos[1] * inv + src[1] * weight;
|
||||
vtxNrmArr[dstIdx * 3 + 2] = pos[2] * inv + src[2] * weight;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: the rest of the owl
|
||||
}
|
||||
|
||||
/* 802F3FA8-802F4064 .text normalize__11J3DDeformerFPf */
|
||||
|
||||
@@ -92,7 +92,7 @@ void J3DClusterLoader_v15::readCluster(const J3DClusterBlock* block) {
|
||||
for (int i = 0; i < mpDeformData->getClusterNum(); i++) {
|
||||
J3DCluster* cluster = &mpDeformData->mClusterPointer[i];
|
||||
cluster->mClusterKey = JSUConvertOffsetToPtr<J3DClusterKey>(block, cluster->mClusterKey);
|
||||
cluster->field_0x18 = JSUConvertOffsetToPtr<u16>(block, cluster->field_0x18);
|
||||
cluster->mPosDstIdx = JSUConvertOffsetToPtr<u16>(block, cluster->mPosDstIdx);
|
||||
J3DClusterVertex* clusterVertex = JSUConvertOffsetToPtr<J3DClusterVertex>(block, cluster->mClusterVertex);
|
||||
u32 vertexIdx = (clusterVertex - blockClusterVertex) / sizeof(J3DClusterVertex);
|
||||
cluster->mClusterVertex = &mpDeformData->mClusterVertex[vertexIdx];
|
||||
@@ -109,13 +109,13 @@ void J3DClusterLoader_v15::readCluster(const J3DClusterBlock* block) {
|
||||
|
||||
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);
|
||||
clusterKey->mPosFlag = JSUConvertOffsetToPtr<u16>(block, clusterKey->mPosFlag);
|
||||
clusterKey->mNrmFlag = JSUConvertOffsetToPtr<u16>(block, clusterKey->mNrmFlag);
|
||||
}
|
||||
|
||||
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);
|
||||
clusterVertex->mSrcIdx = JSUConvertOffsetToPtr<u16>(block, clusterVertex->mSrcIdx);
|
||||
clusterVertex->mDstIdx = JSUConvertOffsetToPtr<u16>(block, clusterVertex->mDstIdx);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user