diff --git a/LEGO1/lego/legoomni/src/common/legocharactermanager.cpp b/LEGO1/lego/legoomni/src/common/legocharactermanager.cpp index ff5241bb..485d3511 100644 --- a/LEGO1/lego/legoomni/src/common/legocharactermanager.cpp +++ b/LEGO1/lego/legoomni/src/common/legocharactermanager.cpp @@ -643,7 +643,7 @@ MxBool LegoCharacterManager::SetHeadTexture(LegoROI* p_roi, LegoTextureInfo* p_t lodList->Release(); lodList = dupLodList; - if (head->GetUnknown0xe0() >= 0) { + if (head->GetLodLevel() >= 0) { VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(head); } @@ -844,7 +844,7 @@ MxBool LegoCharacterManager::SwitchVariant(LegoROI* p_roi) lodList->Release(); lodList = dupLodList; - if (childROI->GetUnknown0xe0() >= 0) { + if (childROI->GetLodLevel() >= 0) { VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(childROI); } diff --git a/LEGO1/lego/legoomni/src/common/legoplantmanager.cpp b/LEGO1/lego/legoomni/src/common/legoplantmanager.cpp index ca587de2..734806fc 100644 --- a/LEGO1/lego/legoomni/src/common/legoplantmanager.cpp +++ b/LEGO1/lego/legoomni/src/common/legoplantmanager.cpp @@ -394,7 +394,7 @@ MxBool LegoPlantManager::SwitchColor(LegoEntity* p_entity) ViewLODList* lodList = GetViewLODListManager()->Lookup(g_plantLodNames[info->m_variant][info->m_color]); - if (roi->GetUnknown0xe0() >= 0) { + if (roi->GetLodLevel() >= 0) { VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(roi); } @@ -423,7 +423,7 @@ MxBool LegoPlantManager::SwitchVariant(LegoEntity* p_entity) ViewLODList* lodList = GetViewLODListManager()->Lookup(g_plantLodNames[info->m_variant][info->m_color]); - if (roi->GetUnknown0xe0() >= 0) { + if (roi->GetLodLevel() >= 0) { VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(roi); } diff --git a/LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp b/LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp index 1cc1f852..1c306c1b 100644 --- a/LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp +++ b/LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp @@ -701,7 +701,7 @@ MxLong LegoNavController::Notify(MxParam& p_param) Mx3DPointFloat roiPosition(roi->GetWorldPosition()); roiPosition -= viewPosition; - if (roiPosition.LenSquared() < 2000.0 || roi->GetUnknown0xe0() > 0) { + if (roiPosition.LenSquared() < 2000.0 || roi->GetLodLevel() > 0) { entity->ClickAnimation(); } } diff --git a/LEGO1/viewmanager/viewmanager.cpp b/LEGO1/viewmanager/viewmanager.cpp index caca5868..44635ffd 100644 --- a/LEGO1/viewmanager/viewmanager.cpp +++ b/LEGO1/viewmanager/viewmanager.cpp @@ -25,7 +25,7 @@ float g_minLODThreshold = 0.00097656297; int g_maxLODLevels = 6; // GLOBAL: LEGO1 0x1010105c -float g_unk0x1010105c = 0.000125F; +float g_viewDistance = 0.000125F; // GLOBAL: LEGO1 0x10101060 float g_elapsedSeconds = 0; @@ -65,19 +65,19 @@ unsigned int ViewManager::IsBoundingBoxInFrustum(const BoundingBox& p_bounding_b { const Vector3* box[] = {&p_bounding_box.Min(), &p_bounding_box.Max()}; - float und[8][3]; + float box_corners[8][3]; int i, j, k; for (i = 0; i < 8; i++) { for (j = 0; j < 3; j++) { - und[i][j] = box[g_boundingBoxCornerMap[i][j]]->operator[](j); + box_corners[i][j] = box[g_boundingBoxCornerMap[i][j]]->operator[](j); } } for (i = 0; i < 6; i++) { for (k = 0; k < 8; k++) { - if (frustum_planes[i][0] * und[k][0] + frustum_planes[i][2] * und[k][2] + frustum_planes[i][1] * und[k][1] + - frustum_planes[i][3] >= + if (frustum_planes[i][0] * box_corners[k][0] + frustum_planes[i][2] * box_corners[k][2] + + frustum_planes[i][1] * box_corners[k][1] + frustum_planes[i][3] >= 0.0f) { break; } @@ -98,7 +98,7 @@ void ViewManager::Remove(ViewROI* p_roi) if (*it == p_roi) { rois.erase(it); - if (p_roi->GetUnknown0xe0() >= 0) { + if (p_roi->GetLodLevel() >= 0) { RemoveROIDetailFromScene(p_roi); } @@ -106,7 +106,7 @@ void ViewManager::Remove(ViewROI* p_roi) if (comp != NULL) { for (CompoundObject::const_iterator it = comp->begin(); !(it == comp->end()); it++) { - if (((ViewROI*) *it)->GetUnknown0xe0() >= 0) { + if (((ViewROI*) *it)->GetLodLevel() >= 0) { RemoveROIDetailFromScene((ViewROI*) *it); } } @@ -128,11 +128,11 @@ void ViewManager::RemoveAll(ViewROI* p_roi) rois.erase(rois.begin(), rois.end()); } else { - if (p_roi->GetUnknown0xe0() >= 0) { + if (p_roi->GetLodLevel() >= 0) { RemoveROIDetailFromScene(p_roi); } - p_roi->SetUnknown0xe0(-1); + p_roi->SetLodLevel(ViewROI::c_lodLevelUnset); const CompoundObject* comp = p_roi->GetComp(); if (comp != NULL) { @@ -146,15 +146,15 @@ void ViewManager::RemoveAll(ViewROI* p_roi) } // FUNCTION: LEGO1 0x100a65b0 -void ViewManager::UpdateROIDetailBasedOnLOD(ViewROI* p_roi, int p_und) +void ViewManager::UpdateROIDetailBasedOnLOD(ViewROI* p_roi, int p_lodLevel) { - if (p_roi->GetLODCount() <= p_und) { - p_und = p_roi->GetLODCount() - 1; + if (p_roi->GetLODCount() <= p_lodLevel) { + p_lodLevel = p_roi->GetLODCount() - 1; } - int unk0xe0 = p_roi->GetUnknown0xe0(); + int lodLevel = p_roi->GetLodLevel(); - if (unk0xe0 == p_und) { + if (lodLevel == p_lodLevel) { return; } @@ -162,8 +162,8 @@ void ViewManager::UpdateROIDetailBasedOnLOD(ViewROI* p_roi, int p_und) Tgl::MeshBuilder* meshBuilder; ViewLOD* lod; - if (unk0xe0 < 0) { - lod = (ViewLOD*) p_roi->GetLOD(p_und); + if (lodLevel < 0) { + lod = (ViewLOD*) p_roi->GetLOD(p_lodLevel); if (lod->GetUnknown0x08() & ViewLOD::c_bit4) { scene->Add((Tgl::MeshBuilder*) group); @@ -171,7 +171,7 @@ void ViewManager::UpdateROIDetailBasedOnLOD(ViewROI* p_roi, int p_und) } } else { - lod = (ViewLOD*) p_roi->GetLOD(unk0xe0); + lod = (ViewLOD*) p_roi->GetLOD(lodLevel); if (lod != NULL) { meshBuilder = lod->GetMeshBuilder(); @@ -181,7 +181,7 @@ void ViewManager::UpdateROIDetailBasedOnLOD(ViewROI* p_roi, int p_und) } } - lod = (ViewLOD*) p_roi->GetLOD(p_und); + lod = (ViewLOD*) p_roi->GetLOD(p_lodLevel); } if (lod->GetUnknown0x08() & ViewLOD::c_bit4) { @@ -190,18 +190,18 @@ void ViewManager::UpdateROIDetailBasedOnLOD(ViewROI* p_roi, int p_und) if (meshBuilder != NULL) { group->Add(meshBuilder); SetAppData(p_roi, reinterpret_cast(p_roi)); - p_roi->SetUnknown0xe0(p_und); + p_roi->SetLodLevel(p_lodLevel); return; } } - p_roi->SetUnknown0xe0(-1); + p_roi->SetLodLevel(ViewROI::c_lodLevelUnset); } // FUNCTION: LEGO1 0x100a66a0 void ViewManager::RemoveROIDetailFromScene(ViewROI* p_roi) { - const ViewLOD* lod = (const ViewLOD*) p_roi->GetLOD(p_roi->GetUnknown0xe0()); + const ViewLOD* lod = (const ViewLOD*) p_roi->GetLOD(p_roi->GetLodLevel()); if (lod != NULL) { const Tgl::MeshBuilder* meshBuilder = NULL; @@ -216,60 +216,61 @@ void ViewManager::RemoveROIDetailFromScene(ViewROI* p_roi) scene->Remove(roiGeometry); } - p_roi->SetUnknown0xe0(-1); + p_roi->SetLodLevel(ViewROI::c_lodLevelUnset); } // FUNCTION: LEGO1 0x100a66f0 // FUNCTION: BETA10 0x1017297f -inline void ViewManager::ManageVisibilityAndDetailRecursively(ViewROI* p_from, int p_und) +inline void ViewManager::ManageVisibilityAndDetailRecursively(ViewROI* p_from, int p_lodLevel) { assert(p_from); - if (!p_from->GetVisibility() && p_und != -2) { - ManageVisibilityAndDetailRecursively(p_from, -2); + if (!p_from->GetVisibility() && p_lodLevel != ViewROI::c_lodLevelInvisible) { + ManageVisibilityAndDetailRecursively(p_from, ViewROI::c_lodLevelInvisible); } else { const CompoundObject* comp = p_from->GetComp(); - if (p_und == -1) { + if (p_lodLevel == ViewROI::c_lodLevelUnset) { if (p_from->GetWorldBoundingSphere().Radius() > 0.001F) { - float und = ProjectedSize(p_from->GetWorldBoundingSphere()); + float projectedSize = ProjectedSize(p_from->GetWorldBoundingSphere()); - if (und < seconds_allowed * g_unk0x1010105c) { - if (p_from->GetUnknown0xe0() != -2) { - ManageVisibilityAndDetailRecursively(p_from, -2); + if (projectedSize < seconds_allowed * g_viewDistance) { + if (p_from->GetLodLevel() != ViewROI::c_lodLevelInvisible) { + ManageVisibilityAndDetailRecursively(p_from, ViewROI::c_lodLevelInvisible); } return; } else { - p_und = CalculateLODLevel(und, RealtimeView::GetUserMaxLodPower() * seconds_allowed, p_from); + p_lodLevel = + CalculateLODLevel(projectedSize, RealtimeView::GetUserMaxLodPower() * seconds_allowed, p_from); } } } - if (p_und == -2) { - if (p_from->GetUnknown0xe0() >= 0) { + if (p_lodLevel == ViewROI::c_lodLevelInvisible) { + if (p_from->GetLodLevel() >= 0) { RemoveROIDetailFromScene(p_from); - p_from->SetUnknown0xe0(-2); + p_from->SetLodLevel(ViewROI::c_lodLevelInvisible); } if (comp != NULL) { for (CompoundObject::const_iterator it = comp->begin(); it != comp->end(); it++) { - ManageVisibilityAndDetailRecursively((ViewROI*) *it, p_und); + ManageVisibilityAndDetailRecursively((ViewROI*) *it, p_lodLevel); } } } else if (comp == NULL) { if (p_from->GetLODs() != NULL && p_from->GetLODCount() > 0) { - UpdateROIDetailBasedOnLOD(p_from, p_und); + UpdateROIDetailBasedOnLOD(p_from, p_lodLevel); } } else { - p_from->SetUnknown0xe0(-1); + p_from->SetLodLevel(ViewROI::c_lodLevelUnset); for (CompoundObject::const_iterator it = comp->begin(); it != comp->end(); it++) { - ManageVisibilityAndDetailRecursively((ViewROI*) *it, p_und); + ManageVisibilityAndDetailRecursively((ViewROI*) *it, p_lodLevel); } } } @@ -292,7 +293,7 @@ void ViewManager::Update(float p_previousRenderTime, float) } for (CompoundObject::iterator it = rois.begin(); it != rois.end(); it++) { - ManageVisibilityAndDetailRecursively((ViewROI*) *it, -1); + ManageVisibilityAndDetailRecursively((ViewROI*) *it, ViewROI::c_lodLevelUnset); } stopWatch.Stop(); @@ -353,37 +354,37 @@ inline int ViewManager::CalculateFrustumTransformations() } // FUNCTION: BETA10 0x10172be5 -inline int ViewManager::CalculateLODLevel(float p_und1, float p_und2, ViewROI* from) +inline int ViewManager::CalculateLODLevel(float p_maximumScale, float p_initialScale, ViewROI* from) { - int result; + int lodLevel; assert(from); - if (IsROIVisibleAtLOD(from) != 0) { - if (p_und1 < g_minLODThreshold) { + if (GetFirstLODIndex(from) != 0) { + if (p_maximumScale < g_minLODThreshold) { return 0; } else { - result = 1; + lodLevel = 1; } } else { - result = 0; + lodLevel = 0; } - for (float i = p_und2; result < g_maxLODLevels; result++) { - if (i >= p_und1) { + for (float i = p_initialScale; lodLevel < g_maxLODLevels; lodLevel++) { + if (i >= p_maximumScale) { break; } i *= g_LODScaleFactor; } - return result; + return lodLevel; } // FUNCTION: BETA10 0x10172cb0 -inline int ViewManager::IsROIVisibleAtLOD(ViewROI* p_roi) +inline int ViewManager::GetFirstLODIndex(ViewROI* p_roi) { const LODListBase* lods = p_roi->GetLODs(); diff --git a/LEGO1/viewmanager/viewmanager.h b/LEGO1/viewmanager/viewmanager.h index 550dd667..1f12cb28 100644 --- a/LEGO1/viewmanager/viewmanager.h +++ b/LEGO1/viewmanager/viewmanager.h @@ -24,20 +24,20 @@ public: void Remove(ViewROI* p_roi); void RemoveAll(ViewROI* p_roi); unsigned int IsBoundingBoxInFrustum(const BoundingBox& p_bounding_box); - void UpdateROIDetailBasedOnLOD(ViewROI* p_roi, int p_und); + void UpdateROIDetailBasedOnLOD(ViewROI* p_roi, int p_lodLevel); void RemoveROIDetailFromScene(ViewROI* p_roi); void SetPOVSource(const OrientableROI* point_of_view); float ProjectedSize(const BoundingSphere& p_bounding_sphere); 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); - inline void ManageVisibilityAndDetailRecursively(ViewROI* p_from, int p_und); + inline void ManageVisibilityAndDetailRecursively(ViewROI* p_from, int p_lodLevel); void Update(float p_previousRenderTime, float); inline int CalculateFrustumTransformations(); void UpdateViewTransformations(); - inline static int CalculateLODLevel(float p_und1, float p_und2, ViewROI* from); - inline static int IsROIVisibleAtLOD(ViewROI* p_roi); + inline static int CalculateLODLevel(float p_maximumScale, float p_initalScale, ViewROI* from); + inline static int GetFirstLODIndex(ViewROI* p_roi); // FUNCTION: BETA10 0x100576b0 const CompoundObject& GetROIs() { return rois; } diff --git a/LEGO1/viewmanager/viewroi.h b/LEGO1/viewmanager/viewroi.h index 5cd8d1af..63e82154 100644 --- a/LEGO1/viewmanager/viewroi.h +++ b/LEGO1/viewmanager/viewroi.h @@ -16,11 +16,16 @@ // SIZE 0xe4 class ViewROI : public OrientableROI { public: + enum { + c_lodLevelUnset = -1, + c_lodLevelInvisible = -2, + }; + ViewROI(Tgl::Renderer* pRenderer, ViewLODList* lodList) { SetLODList(lodList); geometry = pRenderer->CreateGroup(); - m_unk0xe0 = -1; + m_lodLevel = c_lodLevelUnset; } // FUNCTION: LEGO1 0x100a9e20 @@ -56,8 +61,8 @@ public: virtual Tgl::Group* GetGeometry(); // vtable+0x30 virtual const Tgl::Group* GetGeometry() const; // vtable+0x34 - int GetUnknown0xe0() { return m_unk0xe0; } - void SetUnknown0xe0(int p_unk0xe0) { m_unk0xe0 = p_unk0xe0; } + int GetLodLevel() { return m_lodLevel; } + void SetLodLevel(int p_lodLevel) { m_lodLevel = p_lodLevel; } static unsigned char SetLightSupport(unsigned char p_lightSupport); @@ -65,7 +70,7 @@ protected: void UpdateWorldDataWithTransformAndChildren(const Matrix4& parent2world) override; // vtable+0x28 Tgl::Group* geometry; // 0xdc - int m_unk0xe0; // 0xe0 + int m_lodLevel; // 0xe0 }; // SYNTHETIC: LEGO1 0x100aa250