summaryrefslogtreecommitdiffstats
path: root/src/core/AnimViewer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/AnimViewer.cpp')
-rw-r--r--src/core/AnimViewer.cpp419
1 files changed, 419 insertions, 0 deletions
diff --git a/src/core/AnimViewer.cpp b/src/core/AnimViewer.cpp
new file mode 100644
index 00000000..1f28d232
--- /dev/null
+++ b/src/core/AnimViewer.cpp
@@ -0,0 +1,419 @@
+#include "common.h"
+#include "patcher.h"
+#include "Font.h"
+#include "Pad.h"
+#include "Text.h"
+#include "main.h"
+#include "Timer.h"
+#include "DMAudio.h"
+#include "FileMgr.h"
+#include "Streaming.h"
+#include "TxdStore.h"
+#include "General.h"
+#include "Camera.h"
+#include "Vehicle.h"
+#include "PlayerSkin.h"
+#include "PlayerInfo.h"
+#include "World.h"
+#include "Renderer.h"
+#include "AnimManager.h"
+#include "AnimViewer.h"
+#include "PlayerPed.h"
+#include "Pools.h"
+#include "References.h"
+#include "PathFind.h"
+#include "HandlingMgr.h"
+#include "TempColModels.h"
+#include "Particle.h"
+#include "CdStream.h"
+#include "Messages.h"
+#include "CarCtrl.h"
+#include "FileLoader.h"
+#include "ModelIndices.h"
+#include "Clock.h"
+#include "Timecycle.h"
+#include "RpAnimBlend.h"
+#include "Shadows.h"
+
+int CAnimViewer::animTxdSlot = 0;
+CEntity *CAnimViewer::pTarget = nil;
+
+void
+CAnimViewer::Render(void) {
+ if (pTarget)
+ {
+// pTarget->GetPosition() = CVector(0.0f, 0.0f, 0.0f);
+ if (pTarget)
+ {
+ pTarget->Render();
+ CRenderer::RenderOneNonRoad(pTarget);
+ }
+ }
+}
+
+void
+CAnimViewer::Initialise(void) {
+ LoadingScreen("Loading the ModelViewer", "", GetRandomSplashScreen());
+ animTxdSlot = CTxdStore::AddTxdSlot("generic");
+ CTxdStore::Create(animTxdSlot);
+ int hudSlot = CTxdStore::AddTxdSlot("hud");
+ CTxdStore::LoadTxd(hudSlot, "MODELS/HUD.TXD");
+ int particleSlot = CTxdStore::AddTxdSlot("particle");
+ CTxdStore::LoadTxd(particleSlot, "MODELS/PARTICLE.TXD");
+ CTxdStore::SetCurrentTxd(animTxdSlot);
+ CPools::Initialise();
+ CReferences::Init();
+ TheCamera.Init();
+ TheCamera.SetRwCamera(Scene.camera);
+
+ // I didn't get which camera og code selects.
+ for (int i = 0; i < 3; i++) {
+ TheCamera.Cams[i].Distance = 5.0f;
+ }
+
+ gbModelViewer = true;
+
+ ThePaths.Init();
+ ThePaths.AllocatePathFindInfoMem(4500);
+ CCollision::Init();
+ CWorld::Initialise();
+ mod_HandlingManager.Initialise();
+ CTempColModels::Initialise();
+ CAnimManager::Initialise();
+ CModelInfo::Initialise();
+ CParticle::Initialise();
+ CCarCtrl::Init();
+ CPedStats::Initialise();
+ CMessages::Init();
+ CdStreamAddImage("MODELS\\GTA3.IMG");
+ CFileLoader::LoadLevel("DATA\\ANIMVIEWER.DAT");
+ CStreaming::Init();
+ CStreaming::LoadInitialPeds();
+ CStreaming::RequestSpecialModel(MI_PLAYER, "player", STREAMFLAGS_DONT_REMOVE);
+ CStreaming::LoadAllRequestedModels(false);
+ CRenderer::Init();
+ CVehicleModelInfo::LoadVehicleColours();
+ CAnimManager::LoadAnimFiles();
+ CWorld::PlayerInFocus = 0;
+ CWeapon::InitialiseWeapons();
+ CShadows::Init();
+ CPed::Initialise();
+ CTimer::Initialise();
+ CClock::Initialise(60000);
+ CTimeCycle::Initialise();
+ CCarCtrl::Init();
+ CPlayerPed *player = new CPlayerPed();
+ player->GetPosition() = CVector(0.0f, 0.0f, 0.0f);
+ CWorld::Players[0].m_pPed = player;
+ CDraw::SetFOV(120.0f);
+ CDraw::ms_fLODDistance = 500.0f;
+
+ int fd = CFileMgr::OpenFile("DATA\\SPECIAL.TXT", "r");
+ char animGroup[32], modelName[32];
+ if (fd)
+ {
+ for (int lineId = 0; lineId < NUM_OF_SPECIAL_CHARS; lineId++) {
+ if (!CFileMgr::ReadLine(fd, gString, 255))
+ break;
+
+ sscanf(gString, "%s %s", &modelName, &animGroup);
+ int groupId;
+ for (groupId = 0; groupId < NUM_ANIM_ASSOC_GROUPS; groupId++)
+ {
+ if (!strcmp(animGroup, CAnimManager::GetAnimGroupName((AssocGroupId)groupId)))
+ break;
+ }
+
+ if (groupId != NUM_ANIM_ASSOC_GROUPS)
+ ((CPedModelInfo*)CModelInfo::GetModelInfo(MI_SPECIAL01 + lineId))->m_animGroup = groupId;
+
+ CStreaming::RequestSpecialChar(lineId, modelName, STREAMFLAGS_DONT_REMOVE);
+ }
+ CFileMgr::CloseFile(fd);
+ } else {
+ // From xbox
+ CStreaming::RequestSpecialChar(0, "luigi", STREAMFLAGS_DONT_REMOVE);
+ CStreaming::RequestSpecialChar(1, "joey", STREAMFLAGS_DONT_REMOVE);
+ CStreaming::RequestSpecialChar(2, "tony", STREAMFLAGS_DONT_REMOVE);
+ CStreaming::RequestSpecialChar(3, "curly", STREAMFLAGS_DONT_REMOVE);
+ }
+}
+
+int
+LastPedModelId(int modelId)
+{
+ CBaseModelInfo *model;
+ for (int i = modelId; i >= 0; i--) {
+ model = CModelInfo::GetModelInfo(i);
+ if (model->m_type == MITYPE_PED)
+ return i;
+ }
+ return modelId;
+}
+
+int
+LastVehicleModelId(int modelId)
+{
+ CBaseModelInfo* model;
+ for (int i = modelId; i >= 0; i--) {
+ model = CModelInfo::GetModelInfo(i);
+ if (model->m_type == MITYPE_VEHICLE)
+ return i;
+ }
+ return modelId;
+}
+
+
+// It's me that named this.
+int
+FindMeAModelID(int modelId, int wantedChange)
+{
+ // Max. 2 trials wasn't here, it's me that added it.
+
+ int tryCount = 2;
+ int ogModelId = modelId;
+
+ while(tryCount != 0)
+ {
+ modelId += wantedChange;
+ if (modelId < 0 || modelId >= MODELINFOSIZE)
+ {
+ tryCount--;
+ wantedChange = -wantedChange;
+ }
+ else if (modelId != 5 && modelId != 6 && modelId != 405)
+ {
+ CBaseModelInfo *model = CModelInfo::GetModelInfo(modelId);
+ if (model)
+ {
+ //int type = model->m_type;
+ return modelId;
+ }
+ }
+ }
+ return ogModelId;
+}
+
+void
+PlayAnimation(RpClump *clump, AssocGroupId animGroup, AnimationId anim)
+{
+ CAnimBlendAssociation *currentAssoc = RpAnimBlendClumpGetAssociation(clump, anim);
+
+ if (currentAssoc && currentAssoc->IsPartial())
+ delete currentAssoc;
+
+ RpAnimBlendClumpSetBlendDeltas(clump, ASSOC_PARTIAL, -8.0f);
+
+ CAnimBlendAssociation *animAssoc = CAnimManager::BlendAnimation(clump, animGroup, anim, 8.0f);
+ animAssoc->flags |= ASSOC_DELETEFADEDOUT;
+ animAssoc->SetCurrentTime(0.0f);
+ animAssoc->SetRun();
+}
+
+void
+CAnimViewer::Update(void)
+{
+ static int modelId = 0;
+ static int animId = 0;
+ // Please don't make this bool, static bool's are problematic on my side.
+ static int reloadIFP = 0;
+
+ AssocGroupId animGroup = ASSOCGRP_STD;
+ int nextModelId = modelId;
+ CBaseModelInfo *modelInfo = CModelInfo::GetModelInfo(modelId);
+ CEntity *entity = nil;
+
+ if (modelInfo->m_type == MITYPE_PED)
+ {
+ int animGroup = ((CPedModelInfo*)modelInfo)->m_animGroup;
+
+ if (animId > ANIM_IDLE_STANCE)
+ animGroup = ASSOCGRP_STD;
+
+ if (reloadIFP)
+ {
+ if (pTarget)
+ {
+ CWorld::Remove(pTarget);
+ if (pTarget)
+ delete pTarget;
+ }
+ pTarget = nil;
+
+ // These calls were inside of LoadIFP function.
+ CAnimManager::Shutdown();
+ CAnimManager::Initialise();
+ CAnimManager::LoadAnimFiles();
+
+ reloadIFP = 0;
+ }
+ }
+ else
+ {
+ animGroup = ASSOCGRP_STD;
+ }
+ CPad::UpdatePads();
+ CPad* pad = CPad::GetPad(0);
+ CStreaming::UpdateForAnimViewer();
+ CStreaming::RequestModel(modelId, 0);
+ if (CStreaming::HasModelLoaded(modelId))
+ {
+ if (!pTarget)
+ {
+ if (modelInfo->m_type == MITYPE_VEHICLE)
+ {
+ CVehicleModelInfo* veh = (CVehicleModelInfo*)modelInfo;
+ if (veh->m_vehicleType != VEHICLE_TYPE_CAR)
+ {
+ // Not ready yet
+/* if (veh->m_vehicleType == VEHICLE_TYPE_BOAT)
+ {
+ v33 = (CBoat*)CVehicle::operator new((CVehicle*)0x488, v6);
+ CBoat::CBoat(v33, modelId, 1u);
+ entity = (int)v33;
+ pTarget = (int)v33;
+ }
+ else
+ {
+*/ entity = pTarget = new CObject(modelId, true);
+ if (!modelInfo->GetColModel())
+ {
+ modelInfo->SetColModel(&CTempColModels::ms_colModelWheel1);
+ }
+// }
+ }
+ else
+ {
+ entity = pTarget = new CAutomobile(modelId, RANDOM_VEHICLE);
+ entity->m_status = STATUS_ABANDONED;
+ }
+ entity->bIsStuck = true;
+ }
+ else if (modelInfo->m_type == MITYPE_PED)
+ {
+ pTarget = entity = new CPed(PEDTYPE_CIVMALE);
+ entity->SetModelIndex(modelId);
+ }
+ else
+ {
+ entity = pTarget = new CObject(modelId, true);
+ if (!modelInfo->GetColModel())
+ {
+ modelInfo->SetColModel(&CTempColModels::ms_colModelWheel1);
+ }
+ entity->bIsStuck = true;
+ }
+ entity->GetPosition() = CVector(0.0f, 0.0f, 0.0f);
+ CWorld::Add(entity);
+ TheCamera.TakeControl(pTarget, 9, 2, 1);
+ }
+ if (entity &&
+ (entity->m_type == ENTITY_TYPE_VEHICLE || entity->m_type == ENTITY_TYPE_PED || entity->m_type == ENTITY_TYPE_OBJECT))
+ {
+ // Maybe m_vecMoveSpeed or something else? Some structs are different on mobile.
+ ((CPhysical*)pTarget)->m_vecTurnSpeed = CVector(0.0f, 0.0f, 0.0f);
+ }
+ pTarget->GetPosition().z = 0.0f;
+
+ if (modelInfo->m_type != MITYPE_PED)
+ {
+ if (modelInfo->m_type == MITYPE_VEHICLE)
+ {
+ if (pad->NewState.LeftShoulder1 && !pad->OldState.LeftShoulder1)
+ {
+ nextModelId = LastPedModelId(modelId);
+ }
+ else
+ {
+ // Start in mobile
+ if (pad->NewState.Square && !pad->OldState.Square)
+ CVehicleModelInfo::LoadVehicleColours();
+ }
+ }
+ }
+ else
+ {
+ ((CPed*)pTarget)->bKindaStayInSamePlace = true;
+
+ // Triangle in mobile
+ if (pad->NewState.Square && !pad->OldState.Square) {
+ reloadIFP = 1;
+ } else if (pad->NewState.Cross && !pad->OldState.Cross)
+ {
+ PlayAnimation(pTarget->GetClump(), animGroup, (AnimationId)animId);
+ }
+ else if (pad->NewState.Circle && !pad->OldState.Circle)
+ {
+ PlayAnimation(pTarget->GetClump(), animGroup, ANIM_IDLE_STANCE);
+ }
+ else if (pad->NewState.DPadUp && pad->OldState.DPadUp == 0)
+ {
+ animId--;
+ if (animId < 0)
+ {
+ animId = NUM_ANIMS - 1;
+ }
+ PlayAnimation(pTarget->GetClump(), animGroup, (AnimationId)animId);
+ }
+ else if (pad->NewState.DPadDown && !pad->OldState.DPadDown)
+ {
+ animId = (animId == (NUM_ANIMS - 1) ? 0 : animId + 1);
+ PlayAnimation(pTarget->GetClump(), animGroup, (AnimationId)animId);
+ }
+ else
+ {
+ if (pad->NewState.Start && !pad->OldState.Start)
+ {
+
+ } else {
+ if (pad->NewState.LeftShoulder1 && !pad->OldState.LeftShoulder1) {
+ nextModelId = LastVehicleModelId(modelId);
+ } else {
+// if (CPad::GetPad(1)->NewState.LeftShoulder2)
+// CPedModelInfo::AnimatePedColModelSkinned(CModelInfo::ms_modelInfoPtrs[(pTarget + 96)], pTarget->GetClump()));
+ }
+ }
+ }
+ }
+ }
+
+ if (pad->NewState.DPadLeft && pad->OldState.DPadLeft == 0)
+ {
+ nextModelId = FindMeAModelID(modelId, -1);
+ } else if (pad->NewState.DPadRight && pad->OldState.DPadRight == 0)
+ {
+ nextModelId = FindMeAModelID(modelId, 1);
+ }
+
+ if (nextModelId != modelId)
+ {
+ modelId = nextModelId;
+ if (pTarget)
+ {
+ CWorld::Remove(pTarget);
+ if (pTarget)
+ delete pTarget;
+ }
+ pTarget = nil;
+ return;
+ }
+
+ CTimeCycle::Update();
+ CWorld::Process();
+ if (pTarget)
+ TheCamera.Process();
+}
+
+void
+CAnimViewer::Shutdown(void)
+{
+ if (CWorld::Players[0].m_pPed)
+ delete CWorld::Players[0].m_pPed;
+
+ CWorld::ShutDown();
+ CModelInfo::ShutDown();
+ CAnimManager::Shutdown();
+ CTimer::Shutdown();
+ CStreaming::Shutdown();
+ CTxdStore::RemoveTxdSlot(animTxdSlot);
+} \ No newline at end of file