From 5bea16c7ccc617828d0aee2da23c8aa3f87375df Mon Sep 17 00:00:00 2001
From: eray orçunus <erayorcunus@gmail.com>
Date: Thu, 15 Aug 2019 17:51:39 +0300
Subject: AnimViewer!

---
 src/core/AnimViewer.cpp | 419 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 419 insertions(+)
 create mode 100644 src/core/AnimViewer.cpp

(limited to 'src/core/AnimViewer.cpp')

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
-- 
cgit v1.2.3-70-g09d2