Files
expvintl 419f2e4752 init
2025-02-23 17:40:52 +08:00

266 lines
9.7 KiB
C++

//
// qa_physics/qa_boxwall.cpp
//
// Copyright (C) 1999-2006 Rockstar Games. All Rights Reserved.
//
#include "qa/qa.h"
#if __QA
#include "physicsworld.h"
#include "bank/bkmgr.h"
#include "math/random.h"
#include "phbound/bound.h"
#include "phbound/boundbox.h"
#include "physics/archetype.h"
#include "physics/collider.h"
#include "physics/inst.h"
#include "physics/levelnew.h"
#include "physics/simulator.h"
#include "grprofile/drawmanager.h"
#include "system/rageroot.h"
#include "system/timemgr.h"
#include "vectormath/legacyconvert.h"
namespace rage {
EXT_PFD_DECLARE_GROUP(Physics);
EXT_PFD_DECLARE_GROUP(Bounds);
EXT_PFD_DECLARE_ITEM(Solid);
EXT_PFD_DECLARE_ITEM(Wireframe);
}
using namespace rage;
class qaBoxWall : public qaItem
{
public:
void Init(int stackSize, float boxSize, float boxMass);
void Shutdown();
virtual void Update(qaResult& result);
virtual void Draw();
private:
qaPhysicsWorld* s_BoxesWorld;
atArray<phInst*> s_Boxes;
int s_StackSize;
phInst s_Terrain;
};
void qaBoxWall::Init(int stackSize, float boxSize, float boxMass)
{
s_StackSize = stackSize;
#if __BANK && __PFDRAW
if (bkManager::IsEnabled())
{
GetRageProfileDraw().Init(20000000);
GetRageProfileDraw().SetEnabled(true);
}
#endif // __BANK && __PFDRAW
s_BoxesWorld = rage_new qaPhysicsWorld(3000);
ASSET.SetPath(RAGE_ASSET_ROOT);
PFD_GROUP_ENABLE(Physics, true);
PFD_GROUP_ENABLE(Bounds, true);
PFD_ITEM_ENABLE(Solid, true);
PFD_ITEM_ENABLE(Wireframe, false);
phBound::DisableMessages();
phBound::SetBoundFlag(phBound::WARN_BAD_POLYGONS, false);
#if __DEV || __TOOL
phPolygon::DisableMessages();
#endif // __DEV || __TOOL
phBound* terrain = phBound::Load("physics/big_plane/bound.bnd");
Assert(terrain);
phArchetype* terrainArchetype = rage_new phArchetype;
terrainArchetype->SetBound(terrain);
s_Terrain.SetMatrix( Mat34V(V_IDENTITY) );
s_Terrain.SetArchetype(terrainArchetype);
PHSIM->AddFixedObject(&s_Terrain);
phBoundBox* boxBound = rage_new phBoundBox(Vector3(boxSize, boxSize, boxSize));
phArchetype* boxArchetype = rage_new phArchetypePhys;
boxArchetype->SetBound(boxBound);
boxArchetype->SetMass(boxMass);
Matrix34 boxMatrix(M34_IDENTITY);
s_Boxes.Resize(stackSize * (stackSize + 1) / 2);
Vector3 boxMax(VEC3V_TO_VECTOR3(boxBound->GetBoundingBoxMax()));
Vector3 boxMin(VEC3V_TO_VECTOR3(boxBound->GetBoundingBoxMin()));
float size = boxMax.y - boxMin.y;
float halfSize = 0.5f*size;
float width = boxMax.x - boxMin.x;
Vector3 boxPosition;
int box = 0;
for (int i=0; i<stackSize; i++)
{
for (int j=0; j<stackSize-i;j++)
{
float posWide = float(j) * width - (stackSize - i - 1) * width * 0.5f;
float posHigh = halfSize + float(i) * size;
boxMatrix.d.Set(posWide,posHigh,0.0f);
phInst* newInst = rage_new phInst;
s_Boxes[box] = newInst;
s_Boxes[box]->SetArchetype(boxArchetype);
s_Boxes[box]->SetMatrix(RCC_MAT34V(boxMatrix));
PHSIM->AddActiveObject(s_Boxes[box], false);
++box;
}
}
Assert(box == s_Boxes.GetCount());
}
void qaBoxWall::Shutdown()
{
for (int box = 0; box < s_Boxes.GetCount(); ++box)
{
PHSIM->DeleteObject(s_Boxes[box]->GetLevelIndex());
}
delete s_Boxes[0]->GetArchetype()->GetBound();
delete s_Boxes[0]->GetArchetype();
for (int box = 0; box < s_Boxes.GetCount(); ++box)
{
delete s_Boxes[box];
}
s_Boxes.Reset();
PHSIM->DeleteObject(s_Terrain.GetLevelIndex());
delete s_Terrain.GetArchetype()->GetBound();
delete s_Terrain.GetArchetype();
#if __PFDRAW
GetRageProfileDraw().Shutdown();
#endif
delete s_BoxesWorld;
}
void qaBoxWall::Update(qaResult& result)
{
TIME.Update();
s_BoxesWorld->Update();
Vector3 boxMax(VEC3V_TO_VECTOR3(s_Boxes[0]->GetArchetype()->GetBound()->GetBoundingBoxMax()));
Vector3 boxMin(VEC3V_TO_VECTOR3(s_Boxes[0]->GetArchetype()->GetBound()->GetBoundingBoxMin()));
float size = boxMax.y - boxMin.y;
float halfSize = 0.5f*size;
float width = boxMax.x - boxMin.x;
Vector3 boxPosition;
int box = 0;
for (int i=0; i<s_StackSize; i++)
{
for (int j=0; j<s_StackSize-i;j++)
{
float posWide = float(j) * width - (s_StackSize - i - 1) * width * 0.5f;
float posHigh = halfSize + float(i) * size;
if (!RCC_MATRIX34(s_Boxes[box]->GetMatrix()).d.IsClose(Vector3(posWide, posHigh, 0.0f), 0.1f))
{
TST_FAIL;
return;
}
++box;
}
}
if (PHLEVEL->GetFirstActiveIndex() == phInst::INVALID_INDEX)
{
TST_PASS;
}
}
void qaBoxWall::Draw()
{
#if __PFDRAW
PHLEVEL->ProfileDraw();
grcBindTexture(NULL);
grcState::Default();
grcLightState::SetEnabled(true);
//const Matrix34 & cameraMtx = GetCamMgr().GetWorldMtx();
//GetRageProfileDraw().SendDrawCameraForServer(cameraMtx);
GetRageProfileDraw().Render();
#endif
}
QA_ITEM_FAMILY(qaBoxWall, (int stackSize, float boxSize, float boxMass), (stackSize, boxSize, boxMass));
QA_ITEM_DRAW(qaBoxWall, (3, 1.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (4, 1.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (5, 1.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (6, 1.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (7, 1.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (8, 1.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (9, 1.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (10, 1.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (3, 2.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (4, 2.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (5, 2.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (6, 2.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (7, 2.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (8, 2.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (9, 2.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (10, 2.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (3, 4.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (4, 4.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (5, 4.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (6, 4.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (7, 4.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (8, 4.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (9, 4.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (10, 4.0f, 1.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (3, 1.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (4, 1.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (5, 1.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (6, 1.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (7, 1.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (8, 1.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (9, 1.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (10, 1.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (3, 2.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (4, 2.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (5, 2.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (6, 2.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (7, 2.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (8, 2.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (9, 2.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (10, 2.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (3, 4.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (4, 4.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (5, 4.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (6, 4.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (7, 4.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (8, 4.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (9, 4.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
QA_ITEM_DRAW(qaBoxWall, (10, 4.0f, 10.0f), qaResult::FAIL_OR_AVERAGE_TIME | qaResult::FAIL_OR_NUM_UPDATES);
#endif // __QA