Clear unknowns in LegoAnimPresenter and related classes (#1565)

* Clear unknowns in `LegoAnimPresenter` and related classes

* Update LEGO1/lego/legoomni/include/legoanimpresenter.h

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
This commit is contained in:
Florian Kaiser 2025-06-21 01:24:32 +02:00 committed by GitHub
parent 4691b0253c
commit 72eb194424
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 127 additions and 112 deletions

View File

@ -103,12 +103,17 @@ protected:
LegoChar* FUN_10069150(const LegoChar* p_und1);
void FUN_100692b0();
void FUN_100695c0();
LegoChar* FUN_100697c0(const LegoChar* p_und1, const LegoChar* p_und2);
LegoChar* GetVariableOrIdentity(const LegoChar* p_varName, const LegoChar* p_prefix);
LegoBool FUN_100698b0(const CompoundObject& p_rois, const LegoChar* p_und2);
LegoROI* FUN_100699e0(const LegoChar* p_und);
LegoROI* FindROI(const LegoChar* p_name);
void FUN_10069b10();
void FUN_1006a3c0(LegoAnimStructMap& p_map, LegoTreeNode* p_node, LegoROI* p_roi);
void FUN_1006a4f0(LegoAnimStructMap& p_map, LegoAnimNodeData* p_data, const LegoChar* p_und, LegoROI* p_roi);
void UpdateStructMapAndROIIndex(LegoAnimStructMap& p_map, LegoTreeNode* p_node, LegoROI* p_roi);
void UpdateStructMapAndROIIndexForNode(
LegoAnimStructMap& p_map,
LegoAnimNodeData* p_data,
const LegoChar* p_und,
LegoROI* p_roi
);
void FUN_1006aa60();
void FUN_1006ab70();
LegoBool FUN_1006aba0();
@ -121,8 +126,8 @@ protected:
LegoAnim* m_anim; // 0x64
LegoROI** m_roiMap; // 0x68
MxU32 m_roiMapSize; // 0x6c
LegoROIList* m_unk0x70; // 0x70
LegoROIList* m_unk0x74; // 0x74
LegoROIList* m_sceneROIs; // 0x70
LegoROIList* m_managedActors; // 0x74
Matrix4* m_unk0x78; // 0x78
MxU32 m_flags; // 0x7c
LegoWorld* m_currentWorld; // 0x80

View File

@ -336,9 +336,9 @@ void LegoCarBuildAnimPresenter::SwapNodesByName(LegoChar* p_name1, LegoChar* p_n
strcpy(node1->GetName(), node2->GetName());
strcpy(node2->GetName(), buffer);
LegoU16 val1 = node1->GetUnknown0x20();
node1->SetUnknown0x20(node2->GetUnknown0x20());
node2->SetUnknown0x20(val1);
LegoU16 val1 = node1->GetROIIndex();
node1->SetROIIndex(node2->GetROIIndex());
node2->SetROIIndex(val1);
}
}
@ -456,7 +456,7 @@ void LegoCarBuildAnimPresenter::FUN_100795d0(LegoChar* p_param)
assert(newHideKey);
newHideKey->SetTime(0);
newHideKey->SetUnknown0x08(FALSE);
newHideKey->SetVisible(FALSE);
data->SetNumMorphKeys(1);
data->SetMorphKeys(newHideKey);

View File

@ -47,8 +47,8 @@ void LegoAnimPresenter::Init()
m_anim = NULL;
m_roiMap = NULL;
m_roiMapSize = 0;
m_unk0x74 = NULL;
m_unk0x70 = NULL;
m_managedActors = NULL;
m_sceneROIs = NULL;
m_unk0x78 = NULL;
m_flags = 0;
m_unk0xa8.Clear();
@ -81,13 +81,13 @@ void LegoAnimPresenter::Destroy(MxBool p_fromDestructor)
delete[] m_roiMap;
}
if (m_unk0x70 != NULL) {
delete m_unk0x70;
if (m_sceneROIs != NULL) {
delete m_sceneROIs;
}
if (m_unk0x74 != NULL) {
if (m_managedActors != NULL) {
FUN_1006aa60();
delete m_unk0x74;
delete m_managedActors;
}
if (m_unk0x78 != NULL) {
@ -214,13 +214,13 @@ LegoChar* LegoAnimPresenter::FUN_10069150(const LegoChar* p_und1)
// FUNCTION: LEGO1 0x100692b0
void LegoAnimPresenter::FUN_100692b0()
{
m_unk0x74 = new LegoROIList();
m_managedActors = new LegoROIList();
if (m_unk0x74) {
if (m_managedActors) {
LegoU32 numActors = m_anim->GetNumActors();
for (LegoU32 i = 0; i < numActors; i++) {
LegoChar* str = FUN_100697c0(m_anim->GetActorName(i), NULL);
LegoChar* str = GetVariableOrIdentity(m_anim->GetActorName(i), NULL);
undefined4 unk0x04 = m_anim->GetActorUnknown0x04(i);
LegoROI* roi = NULL;
@ -280,7 +280,7 @@ void LegoAnimPresenter::FUN_100692b0()
}
if (roi != NULL) {
m_unk0x74->Append(roi);
m_managedActors->Append(roi);
}
delete[] str;
@ -292,9 +292,9 @@ void LegoAnimPresenter::FUN_100692b0()
// FUNCTION: BETA10 0x1004f359
void LegoAnimPresenter::FUN_100695c0()
{
m_unk0x70 = new LegoROIList();
m_sceneROIs = new LegoROIList();
if (m_unk0x70) {
if (m_sceneROIs) {
const CompoundObject& rois = VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->GetROIs();
LegoU32 numActors = m_anim->GetNumActors();
@ -324,23 +324,23 @@ void LegoAnimPresenter::FUN_100695c0()
}
// FUNCTION: LEGO1 0x100697c0
LegoChar* LegoAnimPresenter::FUN_100697c0(const LegoChar* p_und1, const LegoChar* p_und2)
LegoChar* LegoAnimPresenter::GetVariableOrIdentity(const LegoChar* p_varName, const LegoChar* p_prefix)
{
const LegoChar* str = p_und1;
const char* var = VariableTable()->GetVariable(p_und1);
const LegoChar* str = p_varName;
const char* var = VariableTable()->GetVariable(p_varName);
if (*var) {
str = var;
}
LegoU32 len = strlen(str) + (p_und2 ? strlen(p_und2) : 0) + 2;
LegoU32 len = strlen(str) + (p_prefix ? strlen(p_prefix) : 0) + 2;
LegoChar* result = new LegoChar[len];
if (result != NULL) {
*result = '\0';
if (p_und2) {
strcpy(result, p_und2);
if (p_prefix) {
strcpy(result, p_prefix);
strcat(result, ":");
}
@ -356,7 +356,7 @@ LegoBool LegoAnimPresenter::FUN_100698b0(const CompoundObject& p_rois, const Leg
LegoBool result = FALSE;
LegoChar* str;
if (*(str = FUN_100697c0(p_und2, NULL)) == '*') {
if (*(str = GetVariableOrIdentity(p_und2, NULL)) == '*') {
LegoChar* tmp = FUN_10069150(str);
delete[] str;
str = tmp;
@ -369,7 +369,7 @@ LegoBool LegoAnimPresenter::FUN_100698b0(const CompoundObject& p_rois, const Leg
if (name != NULL) {
if (!strcmpi(name, str)) {
m_unk0x70->Append(roi);
m_sceneROIs->Append(roi);
result = TRUE;
break;
}
@ -382,20 +382,20 @@ LegoBool LegoAnimPresenter::FUN_100698b0(const CompoundObject& p_rois, const Leg
}
// FUNCTION: LEGO1 0x100699e0
LegoROI* LegoAnimPresenter::FUN_100699e0(const LegoChar* p_und)
LegoROI* LegoAnimPresenter::FindROI(const LegoChar* p_name)
{
LegoROIListCursor cursor(m_unk0x70);
LegoROIListCursor cursor(m_sceneROIs);
LegoROI* roi;
while (cursor.Next(roi)) {
LegoChar* und = FUN_100697c0(roi->GetName(), NULL);
LegoChar* nameOrVar = GetVariableOrIdentity(roi->GetName(), NULL);
if (und != NULL && !strcmpi(und, p_und)) {
delete[] und;
if (nameOrVar != NULL && !strcmpi(nameOrVar, p_name)) {
delete[] nameOrVar;
return roi;
}
delete[] und;
delete[] nameOrVar;
}
return NULL;
@ -410,7 +410,7 @@ void LegoAnimPresenter::FUN_10069b10()
memset(m_unk0x8c, 0, m_unk0x94 * sizeof(*m_unk0x8c));
}
FUN_1006a3c0(anims, m_anim->GetRoot(), NULL);
UpdateStructMapAndROIIndex(anims, m_anim->GetRoot(), NULL);
if (m_roiMap != NULL) {
delete[] m_roiMap;
@ -443,7 +443,7 @@ void LegoAnimPresenter::FUN_10069b10()
}
// FUNCTION: LEGO1 0x1006a3c0
void LegoAnimPresenter::FUN_1006a3c0(LegoAnimStructMap& p_map, LegoTreeNode* p_node, LegoROI* p_roi)
void LegoAnimPresenter::UpdateStructMapAndROIIndex(LegoAnimStructMap& p_map, LegoTreeNode* p_node, LegoROI* p_roi)
{
LegoROI* roi = p_roi;
LegoChar* und = NULL;
@ -456,27 +456,27 @@ void LegoAnimPresenter::FUN_1006a3c0(LegoAnimStructMap& p_map, LegoTreeNode* p_n
name = und2 = FUN_10069150(name);
}
und = FUN_100697c0(name, p_roi != NULL ? p_roi->GetName() : NULL);
und = GetVariableOrIdentity(name, p_roi != NULL ? p_roi->GetName() : NULL);
if (p_roi == NULL) {
roi = FUN_100699e0(und);
roi = FindROI(und);
if (roi != NULL) {
FUN_1006a4f0(p_map, data, und, roi);
UpdateStructMapAndROIIndexForNode(p_map, data, und, roi);
}
else {
data->SetUnknown0x20(0);
data->SetROIIndex(0);
}
}
else {
LegoROI* child = p_roi->FindChildROI(name, p_roi);
if (child != NULL) {
FUN_1006a4f0(p_map, data, und, child);
UpdateStructMapAndROIIndexForNode(p_map, data, und, child);
}
else {
if (FUN_100699e0(name) != NULL) {
FUN_1006a3c0(p_map, p_node, NULL);
if (FindROI(name) != NULL) {
UpdateStructMapAndROIIndex(p_map, p_node, NULL);
delete[] und;
delete[] und2;
return;
@ -490,12 +490,12 @@ void LegoAnimPresenter::FUN_1006a3c0(LegoAnimStructMap& p_map, LegoTreeNode* p_n
MxS32 count = p_node->GetNumChildren();
for (MxS32 i = 0; i < count; i++) {
FUN_1006a3c0(p_map, p_node->GetChild(i), roi);
UpdateStructMapAndROIIndex(p_map, p_node->GetChild(i), roi);
}
}
// FUNCTION: LEGO1 0x1006a4f0
void LegoAnimPresenter::FUN_1006a4f0(
void LegoAnimPresenter::UpdateStructMapAndROIIndexForNode(
LegoAnimStructMap& p_map,
LegoAnimNodeData* p_data,
const LegoChar* p_und,
@ -510,7 +510,7 @@ void LegoAnimPresenter::FUN_1006a4f0(
animStruct.m_index = p_map.size() + 1;
animStruct.m_roi = p_roi;
p_data->SetUnknown0x20(animStruct.m_index);
p_data->SetROIIndex(animStruct.m_index);
LegoChar* und = new LegoChar[strlen(p_und) + 1];
strcpy(und, p_und);
@ -518,7 +518,7 @@ void LegoAnimPresenter::FUN_1006a4f0(
p_map[und] = animStruct;
}
else {
p_data->SetUnknown0x20((*it).second.m_index);
p_data->SetROIIndex((*it).second.m_index);
}
}
@ -526,7 +526,7 @@ void LegoAnimPresenter::FUN_1006a4f0(
// FUNCTION: BETA10 0x1004feee
void LegoAnimPresenter::FUN_1006aa60()
{
LegoROIListCursor cursor(m_unk0x74);
LegoROIListCursor cursor(m_managedActors);
LegoROI* roi;
while (cursor.Next(roi)) {
@ -542,10 +542,10 @@ void LegoAnimPresenter::FUN_1006aa60()
void LegoAnimPresenter::FUN_1006ab70()
{
if (m_unk0x96) {
AnimationManager()->FUN_10063270(m_unk0x74, this);
AnimationManager()->FUN_10063270(m_managedActors, this);
}
else {
AnimationManager()->FUN_10063780(m_unk0x74);
AnimationManager()->FUN_10063780(m_managedActors);
}
}
@ -565,10 +565,10 @@ MxBool LegoAnimPresenter::FUN_1006abb0(LegoTreeNode* p_node, LegoROI* p_roi)
MxS32 i, count;
if (name != NULL && *name != '-') {
und = FUN_100697c0(name, p_roi != NULL ? p_roi->GetName() : NULL);
und = GetVariableOrIdentity(name, p_roi != NULL ? p_roi->GetName() : NULL);
if (p_roi == NULL) {
roi = FUN_100699e0(und);
roi = FindROI(und);
if (roi == NULL) {
goto done;
@ -578,7 +578,7 @@ MxBool LegoAnimPresenter::FUN_1006abb0(LegoTreeNode* p_node, LegoROI* p_roi)
LegoROI* child = p_roi->FindChildROI(name, p_roi);
if (child == NULL) {
if (FUN_100699e0(name) != NULL) {
if (FindROI(name) != NULL) {
if (FUN_1006abb0(p_node, NULL)) {
result = TRUE;
}
@ -828,9 +828,9 @@ void LegoAnimPresenter::StartingTickle()
VTable0x8c();
done:
if (m_unk0x70 != NULL) {
delete m_unk0x70;
m_unk0x70 = NULL;
if (m_sceneROIs != NULL) {
delete m_sceneROIs;
m_sceneROIs = NULL;
}
}
@ -893,7 +893,7 @@ void LegoAnimPresenter::FUN_1006b900(LegoAnim* p_anim, MxLong p_time, Matrix4* p
mat = *p_matrix;
}
else {
LegoROI* roi = m_roiMap[data->GetUnknown0x20()];
LegoROI* roi = m_roiMap[data->GetROIIndex()];
if (roi != NULL) {
mat = roi->GetLocal2World();
@ -918,7 +918,7 @@ void LegoAnimPresenter::FUN_1006b9a0(LegoAnim* p_anim, MxLong p_time, Matrix4* p
mat = *p_matrix;
}
else {
LegoROI* roi = m_roiMap[data->GetUnknown0x20()];
LegoROI* roi = m_roiMap[data->GetROIIndex()];
if (roi != NULL) {
mat = roi->GetLocal2World();

View File

@ -104,10 +104,10 @@ void LegoHideAnimPresenter::FUN_1006db60(LegoTreeNode* p_node, LegoTime p_time)
MxBool previousB = FALSE;
if (m_roiMap != NULL) {
LegoROI* roi = m_roiMap[data->GetUnknown0x20()];
LegoROI* roi = m_roiMap[data->GetROIIndex()];
if (roi != NULL) {
newB = data->FUN_100a0990(p_time);
newB = data->GetVisibility(p_time);
previousB = roi->GetVisibility();
roi->SetVisibility(newB);
}
@ -117,7 +117,7 @@ void LegoHideAnimPresenter::FUN_1006db60(LegoTreeNode* p_node, LegoTime p_time)
LegoPathBoundary* boundary = m_boundaryMap[data->GetUnknown0x22()];
if (boundary != NULL) {
newB = data->FUN_100a0990(p_time);
newB = data->GetVisibility(p_time);
previousB = boundary->GetFlag0x10();
boundary->SetFlag0x10(newB);
}

View File

@ -157,8 +157,8 @@ void LegoLocomotionAnimPresenter::FUN_1006d680(LegoAnimActor* p_actor, MxFloat p
variableTable->SetVariable(key, "");
if (m_unk0x70 != NULL) {
delete m_unk0x70;
m_unk0x70 = NULL;
if (m_sceneROIs != NULL) {
delete m_sceneROIs;
m_sceneROIs = NULL;
}
}

View File

@ -348,7 +348,7 @@ LegoResult LegoTranslationKey::Read(LegoStorage* p_storage)
}
if (m_x > 1e-05F || m_x < -1e-05F || m_y > 1e-05F || m_y < -1e-05F || m_z > 1e-05F || m_z < -1e-05F) {
m_flags |= c_bit1;
m_flags |= c_active;
}
return SUCCESS;
@ -415,7 +415,7 @@ LegoResult LegoRotationKey::Read(LegoStorage* p_storage)
}
if (m_angle != 1.0F) {
m_flags |= c_bit1;
m_flags |= c_active;
}
return SUCCESS;
@ -480,7 +480,7 @@ LegoResult LegoScaleKey::Read(LegoStorage* p_storage)
}
if (m_x > 1.00001 || m_x < 0.99999 || m_y > 1.00001 || m_y < 0.99999 || m_z > 1.00001 || m_z < 0.99999) {
m_flags |= c_bit1;
m_flags |= c_active;
}
return SUCCESS;
@ -522,7 +522,7 @@ LegoAnimNodeData::LegoAnimNodeData()
m_name = NULL;
m_translationKeys = NULL;
m_unk0x20 = 0;
m_roiIndex = 0;
m_rotationKeys = NULL;
m_unk0x22 = 0;
m_scaleKeys = NULL;
@ -785,7 +785,7 @@ inline void LegoAnimNodeData::GetTranslation(
case 0:
return;
case 1:
if (!p_translationKeys[i].TestBit1()) {
if (!p_translationKeys[i].IsActive()) {
return;
}
@ -794,7 +794,7 @@ inline void LegoAnimNodeData::GetTranslation(
z = p_translationKeys[i].GetZ();
break;
case 2:
if (!p_translationKeys[i].TestBit1() && !p_translationKeys[i + 1].TestBit1()) {
if (!p_translationKeys[i].IsActive() && !p_translationKeys[i + 1].IsActive()) {
return;
}
@ -841,7 +841,7 @@ inline void LegoAnimNodeData::GetTranslation(
case 0:
return;
case 1:
if (p_rotationKeys[i].TestBit1()) {
if (p_rotationKeys[i].IsActive()) {
p_matrix.FromQuaternion(Mx4DPointFloat(
p_rotationKeys[i].GetX(),
p_rotationKeys[i].GetY(),
@ -854,19 +854,19 @@ inline void LegoAnimNodeData::GetTranslation(
Mx4DPointFloat a;
MxQuaternionTransformer b;
if (p_rotationKeys[i].TestBit1() || p_rotationKeys[i + 1].TestBit1()) {
if (p_rotationKeys[i].IsActive() || p_rotationKeys[i + 1].IsActive()) {
a[0] = p_rotationKeys[i].GetX();
a[1] = p_rotationKeys[i].GetY();
a[2] = p_rotationKeys[i].GetZ();
a[3] = p_rotationKeys[i].GetAngle();
if (p_rotationKeys[i + 1].TestBit3()) {
if (p_rotationKeys[i + 1].ShouldSkipInterpolation()) {
p_matrix.FromQuaternion(a);
return;
}
Mx4DPointFloat c;
if (p_rotationKeys[i + 1].TestBit2()) {
if (p_rotationKeys[i + 1].ShouldNegateRotation()) {
c[0] = -p_rotationKeys[i + 1].GetX();
c[1] = -p_rotationKeys[i + 1].GetY();
c[2] = -p_rotationKeys[i + 1].GetZ();
@ -920,7 +920,7 @@ inline void LegoAnimNodeData::GetScale(
}
// FUNCTION: LEGO1 0x100a0990
LegoBool LegoAnimNodeData::FUN_100a0990(LegoFloat p_time)
LegoBool LegoAnimNodeData::GetVisibility(LegoFloat p_time)
{
LegoU32 i, n;
LegoU32 index = GetMorphIndex();
@ -935,7 +935,7 @@ LegoBool LegoAnimNodeData::FUN_100a0990(LegoFloat p_time)
break;
case 1:
case 2:
result = m_morphKeys[i].GetUnknown0x08();
result = m_morphKeys[i].IsVisible();
break;
}
@ -1171,7 +1171,7 @@ undefined4 LegoAnim::GetActorUnknown0x04(LegoU32 p_index)
// FUNCTION: BETA10 0x1018027c
LegoMorphKey::LegoMorphKey()
{
m_unk0x08 = 0;
m_visible = FALSE;
}
// FUNCTION: LEGO1 0x100a0f70
@ -1183,7 +1183,7 @@ LegoResult LegoMorphKey::Read(LegoStorage* p_storage)
return result;
}
if ((result = p_storage->Read(&m_unk0x08, sizeof(LegoU8))) != SUCCESS) {
if ((result = p_storage->Read(&m_visible, sizeof(LegoU8))) != SUCCESS) {
return result;
}
@ -1200,7 +1200,7 @@ LegoResult LegoMorphKey::Write(LegoStorage* p_storage)
return result;
}
if ((result = p_storage->Write(&m_unk0x08, sizeof(LegoU8))) != SUCCESS) {
if ((result = p_storage->Write(&m_visible, sizeof(LegoU8))) != SUCCESS) {
return result;
}

View File

@ -11,9 +11,9 @@ class Matrix4;
class LegoAnimKey {
public:
enum Flags {
c_bit1 = 0x01,
c_bit2 = 0x02,
c_bit3 = 0x04
c_active = 0x01,
c_negateRotation = 0x02,
c_skipInterpolation = 0x04
};
LegoAnimKey();
@ -25,18 +25,18 @@ public:
// FUNCTION: BETA10 0x100738a0
void SetTime(MxS32 p_time) { m_time = p_time; }
LegoU32 TestBit1() { return m_flags & c_bit1; }
LegoU32 TestBit2() { return m_flags & c_bit2; }
LegoU32 TestBit3() { return m_flags & c_bit3; }
LegoU32 IsActive() { return m_flags & c_active; }
LegoU32 ShouldNegateRotation() { return m_flags & c_negateRotation; }
LegoU32 ShouldSkipInterpolation() { return m_flags & c_skipInterpolation; }
// FUNCTION: BETA10 0x100739a0
void FUN_100739a0(MxS32 p_param)
{
if (p_param) {
m_flags |= c_bit1;
m_flags |= c_active;
}
else {
m_flags &= ~c_bit1;
m_flags &= ~c_active;
}
}
@ -127,13 +127,13 @@ public:
LegoMorphKey();
LegoResult Read(LegoStorage* p_storage);
LegoResult Write(LegoStorage* p_storage);
LegoBool GetUnknown0x08() { return m_unk0x08; }
LegoBool IsVisible() { return m_visible; }
// FUNCTION: BETA10 0x100738d0
void SetUnknown0x08(LegoBool p_unk0x08) { m_unk0x08 = p_unk0x08; }
void SetVisible(LegoBool p_visible) { m_visible = p_visible; }
protected:
LegoBool m_unk0x08; // 0x08
LegoBool m_visible; // 0x08
};
// SIZE 0x0c
@ -160,7 +160,7 @@ public:
void SetName(LegoChar* p_name);
LegoResult CreateLocalTransform(LegoFloat p_time, Matrix4& p_matrix);
LegoBool FUN_100a0990(LegoFloat p_time);
LegoBool GetVisibility(LegoFloat p_time);
// FUNCTION: BETA10 0x100595d0
LegoChar* GetName() { return m_name; }
@ -187,7 +187,7 @@ public:
LegoU32 GetMorphIndex() { return m_morphIndex; }
// FUNCTION: BETA10 0x1005abc0
LegoU16 GetUnknown0x20() { return m_unk0x20; }
LegoU16 GetROIIndex() { return m_roiIndex; }
// FUNCTION: BETA10 0x1005d5c0
LegoU16 GetUnknown0x22() { return m_unk0x22; }
@ -214,7 +214,7 @@ public:
void SetNumMorphKeys(LegoU16 p_numMorphKeys) { m_numMorphKeys = p_numMorphKeys; }
// FUNCTION: BETA10 0x10059600
void SetUnknown0x20(LegoU16 p_unk0x20) { m_unk0x20 = p_unk0x20; }
void SetROIIndex(LegoU16 p_roiIndex) { m_roiIndex = p_roiIndex; }
// FUNCTION: BETA10 0x1005f2e0
void SetUnknown0x22(LegoU16 p_unk0x22) { m_unk0x22 = p_unk0x22; }
@ -225,7 +225,7 @@ public:
}
// FUNCTION: BETA10 0x1005d580
LegoBool FUN_100a0990(LegoTime p_time) { return FUN_100a0990((LegoFloat) p_time); }
LegoBool GetVisibility(LegoTime p_time) { return GetVisibility((LegoFloat) p_time); }
inline static void GetTranslation(
LegoU16 p_numTranslationKeys,
@ -279,7 +279,7 @@ protected:
LegoRotationKey* m_rotationKeys; // 0x14
LegoScaleKey* m_scaleKeys; // 0x18
LegoMorphKey* m_morphKeys; // 0x1c
LegoU16 m_unk0x20; // 0x20
LegoU16 m_roiIndex; // 0x20
LegoU16 m_unk0x22; // 0x22
LegoU32 m_translationIndex; // 0x24
LegoU32 m_rotationIndex; // 0x28

View File

@ -337,7 +337,7 @@ done:
}
// FUNCTION: LEGO1 0x100a8cb0
LegoResult LegoROI::FUN_100a8cb0(LegoAnimNodeData* p_data, LegoTime p_time, Matrix4& p_matrix)
LegoResult LegoROI::CreateLocalTransform(LegoAnimNodeData* p_data, LegoTime p_time, Matrix4& p_matrix)
{
p_matrix.SetIdentity();
p_data->CreateLocalTransform(p_time, p_matrix);
@ -379,27 +379,32 @@ LegoROI* LegoROI::FindChildROI(const LegoChar* p_name, LegoROI* p_roi)
}
// FUNCTION: LEGO1 0x100a8da0
LegoResult LegoROI::FUN_100a8da0(LegoTreeNode* p_node, const Matrix4& p_matrix, LegoTime p_time, LegoROI* p_roi)
LegoResult LegoROI::ApplyAnimationTransformation(
LegoTreeNode* p_node,
const Matrix4& p_matrix,
LegoTime p_time,
LegoROI* p_parentROI
)
{
MxMatrix mat;
LegoAnimNodeData* data = (LegoAnimNodeData*) p_node->GetData();
const LegoChar* name = data->GetName();
LegoROI* roi = FindChildROI(name, p_roi);
LegoROI* roi = FindChildROI(name, p_parentROI);
if (roi == NULL) {
roi = FindChildROI(name, this);
}
if (roi != NULL) {
FUN_100a8cb0(data, p_time, mat);
CreateLocalTransform(data, p_time, mat);
roi->m_local2world.Product(mat, p_matrix);
roi->UpdateWorldData();
LegoBool und = data->FUN_100a0990(p_time);
LegoBool und = data->GetVisibility(p_time);
roi->SetVisibility(und);
for (LegoU32 i = 0; i < p_node->GetNumChildren(); i++) {
FUN_100a8da0(p_node->GetChild(i), roi->m_local2world, p_time, roi);
ApplyAnimationTransformation(p_node->GetChild(i), roi->m_local2world, p_time, roi);
}
}
else {
@ -416,14 +421,14 @@ void LegoROI::FUN_100a8e80(LegoTreeNode* p_node, Matrix4& p_matrix, LegoTime p_t
MxMatrix mat;
LegoAnimNodeData* data = (LegoAnimNodeData*) p_node->GetData();
FUN_100a8cb0(data, p_time, mat);
CreateLocalTransform(data, p_time, mat);
LegoROI* roi = p_roiMap[data->GetUnknown0x20()];
LegoROI* roi = p_roiMap[data->GetROIIndex()];
if (roi != NULL) {
roi->m_local2world.Product(mat, p_matrix);
roi->UpdateWorldData();
LegoBool und = data->FUN_100a0990(p_time);
LegoBool und = data->GetVisibility(p_time);
roi->SetVisibility(und);
for (LegoU32 i = 0; i < p_node->GetNumChildren(); i++) {
@ -447,9 +452,9 @@ void LegoROI::FUN_100a8fd0(LegoTreeNode* p_node, Matrix4& p_matrix, LegoTime p_t
MxMatrix mat;
LegoAnimNodeData* data = (LegoAnimNodeData*) p_node->GetData();
FUN_100a8cb0(data, p_time, mat);
CreateLocalTransform(data, p_time, mat);
LegoROI* roi = p_roiMap[data->GetUnknown0x20()];
LegoROI* roi = p_roiMap[data->GetROIIndex()];
if (roi != NULL) {
roi->m_local2world.Product(mat, p_matrix);
@ -474,9 +479,9 @@ LegoResult LegoROI::SetFrame(LegoAnim* p_anim, LegoTime p_time)
MxMatrix mat;
mat = m_local2world;
mat.SetIdentity();
mat.SetIdentity(); // this clears the matrix, assignment above is redundant
return FUN_100a8da0(root, mat, p_time, this);
return ApplyAnimationTransformation(root, mat, p_time, this);
}
// FUNCTION: LEGO1 0x100a9170

View File

@ -32,7 +32,12 @@ public:
LegoStorage* p_storage
);
LegoROI* FindChildROI(const LegoChar* p_name, LegoROI* p_roi);
LegoResult FUN_100a8da0(LegoTreeNode* p_node, const Matrix4& p_matrix, LegoTime p_time, LegoROI* p_roi);
LegoResult ApplyAnimationTransformation(
LegoTreeNode* p_node,
const Matrix4& p_matrix,
LegoTime p_time,
LegoROI* p_roi
);
static void FUN_100a8e80(LegoTreeNode* p_node, Matrix4& p_matrix, LegoTime p_time, LegoROI** p_roiMap);
static void FUN_100a8fd0(LegoTreeNode* p_node, Matrix4& p_matrix, LegoTime p_time, LegoROI** p_roiMap);
LegoResult SetFrame(LegoAnim* p_anim, LegoTime p_time);
@ -51,7 +56,7 @@ public:
void ClearMeshOffset();
void SetDisplayBB(int p_displayBB);
static LegoResult FUN_100a8cb0(LegoAnimNodeData* p_data, LegoTime p_time, Matrix4& p_matrix);
static LegoResult CreateLocalTransform(LegoAnimNodeData* p_data, LegoTime p_time, Matrix4& p_matrix);
static void FUN_100a81b0(const LegoChar* p_error, const LegoChar* p_name);
static void configureLegoROI(int p_roi);
static void SetColorOverride(ColorOverride p_colorOverride);