Implement/match ViewManager::Update (#647)

* Implement/match ViewManager::Update

* Fix
This commit is contained in:
Christian Semmler 2024-03-09 20:14:53 -05:00 committed by GitHub
parent 86f84e1740
commit 4b0c6d1f5f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 87 additions and 4 deletions

View file

@ -1,5 +1,6 @@
#include "viewmanager.h"
#include "mxdirectx/mxstopwatch.h"
#include "tgl/d3drm/impl.h"
#include "viewlod.h"
@ -8,6 +9,9 @@ DECOMP_SIZE_ASSERT(ViewManager, 0x1bc)
// GLOBAL: LEGO1 0x100dbcd8
int g_unk0x100dbcd8[18] = {0, 1, 5, 6, 2, 3, 3, 0, 4, 1, 2, 6, 0, 3, 2, 4, 5, 6};
// GLOBAL: LEGO1 0x10101060
float g_elapsedSeconds = 0;
inline undefined4 GetD3DRM(IDirect3DRM2*& d3drm, Tgl::Renderer* pRenderer);
inline undefined4 GetFrame(IDirect3DRMFrame2*& frame, Tgl::Group* scene);
@ -111,12 +115,89 @@ void ViewManager::FUN_100a66a0(ViewROI* p_roi)
p_roi->SetUnknown0xe0(-1);
}
// STUB: LEGO1 0x100a6930
void ViewManager::Update(float p_previousRenderTime, float p_und2)
// STUB: LEGO1 0x100a66f0
void ViewManager::FUN_100a66f0(ViewROI* p_roi, undefined4 p_und)
{
// TODO
}
// FUNCTION: LEGO1 0x100a6930
void ViewManager::Update(float p_previousRenderTime, float)
{
MxStopWatch stopWatch;
stopWatch.Start();
unk0x28 = p_previousRenderTime;
flags |= c_bit1;
if (flags & c_bit3) {
Unknown();
}
else if (flags & c_bit2) {
FUN_100a6b90();
}
for (CompoundObject::iterator it = rois.begin(); it != rois.end(); it++) {
FUN_100a66f0((ViewROI*) *it, -1);
}
stopWatch.Stop();
g_elapsedSeconds = stopWatch.ElapsedSeconds();
}
inline int ViewManager::Unknown()
{
flags &= ~c_bit3;
if (height == 0.0F || front == 0.0F) {
return -1;
}
else {
float fVar7 = tan(view_angle / 2.0F);
unk0x2c = view_angle * view_angle * 4.0F;
float fVar1 = front * fVar7;
float fVar2 = (width / height) * fVar1;
float uVar6 = front;
float fVar3 = back + front;
float fVar4 = fVar3 / front;
float fVar5 = fVar4 * fVar1;
fVar4 = fVar4 * fVar2;
float* unk0x90 = (float*) this->unk0x90;
// clang-format off
*unk0x90 = fVar2; unk0x90++;
*unk0x90 = fVar1; unk0x90++;
*unk0x90 = uVar6; unk0x90++;
*unk0x90 = fVar2; unk0x90++;
*unk0x90 = -fVar1; unk0x90++;
*unk0x90 = uVar6; unk0x90++;
*unk0x90 = -fVar2; unk0x90++;
*unk0x90 = -fVar1; unk0x90++;
*unk0x90 = uVar6; unk0x90++;
*unk0x90 = -fVar2; unk0x90++;
*unk0x90 = fVar1; unk0x90++;
*unk0x90 = uVar6; unk0x90++;
*unk0x90 = fVar4; unk0x90++;
*unk0x90 = fVar5; unk0x90++;
*unk0x90 = fVar3; unk0x90++;
*unk0x90 = fVar4; unk0x90++;
*unk0x90 = -fVar5; unk0x90++;
*unk0x90 = fVar3; unk0x90++;
*unk0x90 = -fVar4; unk0x90++;
*unk0x90 = -fVar5; unk0x90++;
*unk0x90 = fVar3; unk0x90++;
*unk0x90 = -fVar4; unk0x90++;
*unk0x90 = fVar5; unk0x90++;
*unk0x90 = fVar3;
// clang-format on
FUN_100a6b90();
return 0;
}
}
// FUNCTION: LEGO1 0x100a6b90
void ViewManager::FUN_100a6b90()
{

View file

@ -28,8 +28,10 @@ class ViewManager {
ViewROI* Pick(Tgl::View* p_view, unsigned long x, unsigned long y);
void SetResolution(int width, int height);
void SetFrustrum(float fov, float front, float back);
void FUN_100a66f0(ViewROI* p_roi, undefined4 p_und);
void Update(float p_previousRenderTime, float);
inline int Unknown();
void FUN_100a6b90();
void Update(float p_previousRenderTime, float p_und2);
// SYNTHETIC: LEGO1 0x100a6000
// ViewManager::`scalar deleting destructor'
@ -44,7 +46,7 @@ class ViewManager {
RealtimeView rt_view; // 0x14
ROIList visible_rois; // 0x18
float unk0x28; // 0x28
undefined4 unk0x2c; // 0x2c
float unk0x2c; // 0x2c
unsigned int flags; // 0x30
float width; // 0x34
float height; // 0x38