⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ui_tacref.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:

static void Unload3dModel()
{
	VehicleClassDataType* vc;
	long i,visFlag;
	BSPLIST *obj,*Weapon;

	if (CurrentWeapon && CurrentModel)
	{
		obj=TAC_Viewer->Find(CurrentModel);
		Weapon=TAC_Viewer->Find(CurrentWeapon);

		vc = GetVehicleClassData(CurrentEntity);
		visFlag = vc->VisibleFlags;

		for (i=0; i<HARDPOINT_MAX; i++)
		{
			if (visFlag & (1 << i))
			{
				// This is a visible weapon, so detach
				((DrawableBSP*)obj->object)->DetachChild(((DrawableBSP*)Weapon->object),i);
			}
		}
		TAC_Viewer->Remove(CurrentWeapon);
		CurrentWeapon=0;
	}
	if(CurrentModel)
	{
		TAC_Viewer->Remove(CurrentModel);
		CurrentModel=0;
	}
}

static void CustomPosStuff(long GroupID,long SubGroupID,long ModelID,BSPLIST *Vehicle)
{
	TACREF_Object.Heading=-200.0f;
	TACREF_Object.Pitch=10.0f;
	switch(GroupID)
	{
		case CAT_AIRCRAFT:
			switch(SubGroupID)
			{
				case SUB_CAT_AIRCRAFT_FIGHTERS: // Fighters
				case SUB_CAT_AIRCRAFT_ATTACK: // Attack
				case SUB_CAT_AIRCRAFT_HELICOPTERS: // Helicopters
					if(ModelID == VIS_AC130)
						TACREF_Object.Distance=350.0f;
					else
						TACREF_Object.Distance=150.0f;
					break;
				case SUB_CAT_AIRCRAFT_BOMBERS: // Bombers
					TACREF_Object.Distance=440.0f;
					break;
				case SUB_CAT_AIRCRAFT_EW: // EW
				case SUB_CAT_AIRCRAFT_SUPPORT: // Support
					TACREF_Object.Distance=350.0f;
					break;
				default:
					TACREF_Object.Distance=((DrawableBSP*)Vehicle->object)->Radius()*4;
					break;
			}
			TACREF_Object.Direction=0.0f;

			TACREF_Object.MinPitch=0;
			TACREF_Object.MaxPitch=0;
			TACREF_Object.CheckPitch=FALSE;

			TACREF_Object.PosX=0;
			TACREF_Object.PosY=0;
			TACREF_Object.PosZ=0;
			TACREF_Object.MinDistance=((DrawableBSP*)Vehicle->object)->Radius()+30;
			TACREF_Object.MaxDistance=TACREF_Object.Distance + 200;
			break;
		case CAT_VEHICLES:
			switch(SubGroupID)
			{
				case SUB_CAT_VEHICLES_SHIPS:
					TACREF_Object.Distance=static_cast<float>(max(150,(long)((float)((DrawableBSP*)Vehicle->object)->Radius()*2.7)));
					TACREF_Object.Direction=0.0f;

					TACREF_Object.MinDistance=((DrawableBSP*)Vehicle->object)->Radius()+40;
					TACREF_Object.MaxDistance=((DrawableBSP*)Vehicle->object)->Radius()*20;
					TACREF_Object.MinPitch=5;
					TACREF_Object.MaxPitch=90;
					TACREF_Object.CheckPitch=TRUE;

					TACREF_Object.PosX=0;
					TACREF_Object.PosY=0;
					TACREF_Object.PosZ=((DrawableBSP*)Vehicle->object)->Radius()/20+5;
					break;
				default:
					switch ( ModelID ) {
						case VIS_SA2R:	// Fan Song
						case VIS_SA3R:	// Low Blow
							TACREF_Object.Distance=130.0f;
							TACREF_Object.MinDistance=max(90.0f,((DrawableBSP*)Vehicle->object)->Radius()+10);
							TACREF_Object.PosZ=14;
							break;
						case VIS_SA5R:	// Barlock
						case VIS_SA4R:	// Long Track
							TACREF_Object.Distance=110.0f;
							TACREF_Object.MinDistance=max(80.0f,((DrawableBSP*)Vehicle->object)->Radius()+10);
							TACREF_Object.PosZ=10;
							break;
						case VIS_PATRIOTRAD:
						case VIS_SA8L:
						case VIS_SA13L:
							TACREF_Object.Distance=85.0f;
							TACREF_Object.MinDistance=max(50.0f,((DrawableBSP*)Vehicle->object)->Radius()+20);
							TACREF_Object.PosZ=6;
							break;
						case VIS_SA3L:
							TACREF_Object.Distance=80.0f;
							TACREF_Object.MinDistance=max(50.0f,((DrawableBSP*)Vehicle->object)->Radius()+10);
							TACREF_Object.PosZ=3;
							break;
						case VIS_SA14:
						case VIS_STINGER:
							TACREF_Object.Distance=40.0f;
							TACREF_Object.MinDistance=max(20.0f,((DrawableBSP*)Vehicle->object)->Radius()+10);
							TACREF_Object.PosZ=1;
							break;
						case VIS_SA2L:	// sorting problem, need fixing in 3D models
						case VIS_SA5L:
							TACREF_Object.Distance=110.0f;
							TACREF_Object.MinDistance=max(100.0f,((DrawableBSP*)Vehicle->object)->Radius()+10);
							TACREF_Object.PosZ=5;
							break;
						case VIS_M88:	// M-88/A2 IRV, sorting problem need fixing
							TACREF_Object.Distance=135.0f;
							TACREF_Object.MinDistance=max(50.0f,((DrawableBSP*)Vehicle->object)->Radius()+10);
							TACREF_Object.PosZ=14;
							break;
						case VIS_NIKEL:
							TACREF_Object.Distance=140.0f;
							TACREF_Object.MinDistance=max(80.0f,((DrawableBSP*)Vehicle->object)->Radius()+5);
							TACREF_Object.PosZ=14;
							((DrawableBSP*)Vehicle->object)->SetDOFangle(1,30.0f *PI/180);
							break;
						case VIS_ZSU57_2:
							TACREF_Object.Distance=90.0f;
							TACREF_Object.MinDistance=max(20.0f,((DrawableBSP*)Vehicle->object)->Radius());
							TACREF_Object.PosZ=5;
							break;
						default:
							TACREF_Object.Distance=80.0f;
							TACREF_Object.MinDistance=max(40.0f,((DrawableBSP*)Vehicle->object)->Radius()+5);
							TACREF_Object.PosZ=5;
							break;
					}
					TACREF_Object.Direction=0.0f;

					TACREF_Object.MaxDistance=250.0f;
					TACREF_Object.MinPitch=5;
					TACREF_Object.MaxPitch=90;
					TACREF_Object.CheckPitch=TRUE;

					TACREF_Object.PosX=0;
					TACREF_Object.PosY=0;
					break;
			}
			break;
		case CAT_MUNITIONS:
			TACREF_Object.Direction=0.0f;

			TACREF_Object.MinPitch=0;
			TACREF_Object.MaxPitch=0;
			TACREF_Object.CheckPitch=FALSE;

			TACREF_Object.PosX=0;
			TACREF_Object.PosY=0;
			TACREF_Object.PosZ=0;
#if 0
			TACREF_Object.Distance=((DrawableBSP*)Vehicle->object)->Radius()*3;
			TACREF_Object.MinDistance=((DrawableBSP*)Vehicle->object)->Radius()+5;
			TACREF_Object.MaxDistance=((DrawableBSP*)Vehicle->object)->Radius()*10;
#endif
			TACREF_Object.Distance=30.0f;
			TACREF_Object.MinDistance=20.0f;
			TACREF_Object.MaxDistance=50.f;
			break;
	}
}

// This should handle ANY special case stuff for objects
static void Load3dModel(Entity *ent)
{
	BSPLIST *obj,*Weapon;
	Tpoint objPos;
	Trotation objRot;
	C_Window *win;
	VehicleClassDataType* vc;
	long i,visFlag;

	if(ent->ModelID)
	{
		Helicopter=FALSE;
		// Load Current Model
		if(ent->GroupID == CAT_AIRCRAFT) // Aircraft
		{
			obj=TAC_Viewer->LoadBSP(ent->ModelID,ent->ModelID,TRUE);
			if (ent->ModelID == VIS_F16C)
				((DrawableBSP*)obj->object)->SetSwitchMask(10, 1); // Afterburner
			if(ent->SubGroupID == SUB_CAT_AIRCRAFT_HELICOPTERS)
			{
				Helicopter=TRUE;
				((DrawableBSP*)obj->object)->SetSwitchMask(0, 1); // Turn on rotors
				//((DrawableBSP*)obj->object)->SetDofAngle(2, 0);
				//((DrawableBSP*)obj->object)->SetDofAngle(5, 0);
			}

		}
		else
			obj=TAC_Viewer->LoadBSP(ent->ModelID,ent->ModelID,FALSE);

		if(obj)
		{

			if(ent->MissileFlag > 0)
			{
				vc = GetVehicleClassData(ent->EntityID);
				if(vc)
				{
					visFlag = vc->VisibleFlags;
					Weapon = TAC_Viewer->LoadBSP(ent->ModelID+1,ent->MissileFlag);
					CurrentWeapon=ent->ModelID+1;

					for (i=0; i<HARDPOINT_MAX; i++)
					{
						if (visFlag & (1 << i))
						{
							// This is a visible weapon, so attach
							((DrawableBSP*)obj->object)->AttachChild(((DrawableBSP*)Weapon->object),i);
						}
					}
				}
			}

			CustomPosStuff(ent->GroupID,ent->SubGroupID,ent->ModelID,obj);
			CurrentModel=ent->ModelID;

			PositandOrientSetData (TACREF_Object.PosX, TACREF_Object.PosY, TACREF_Object.PosZ, 0.0f, 0.0f, 0.0f, &objPos,&objRot);

			((DrawableBSP*)obj->object)->Update(&objPos,&objRot);

			win=gMainHandler->FindWindow(TAC_REF_WIN);
			if(win)
			{
				TACREF_PositionCamera(&TACREF_Object,win,0);
			}
		}
	}
}

static void LoadBitmap(C_Button *btn,char filename[])
{
	char file[MAX_PATH];

	gImageMgr->RemoveImage(TACREF_BITMAP_ID);
	strcpy(file,filename);
	strcat(file,".tga");
	gImageMgr->LoadImage(TACREF_BITMAP_ID,file,0,0);
	btn->Refresh();
	btn->SetImage(0,TACREF_BITMAP_ID);
	btn->Refresh();
}

// Moves individual entity to Window (info,model,RWR etc)
static void EntityToWindow(Entity* ent)
{
	C_Window *win;
	C_Button *btn;
	C_ListBox *lbox;
	C_TreeList *tree;

	win=gMainHandler->FindWindow(TAC_REF_WIN);
	if(win)
	{
		Unload3dModel();

		CurrentEntity=ent->EntityID;

		// Kill any sounds
		StopRWRSounds();

		// Make Stats Tree
		tree=(C_TreeList*)win->FindControl(STAT_TREE);
		if(tree)
		{
			tree->DeleteBranch(tree->GetRoot());
			BuildStatsTree(ent->GetStats(),tree);
		}

		// Make Description Tree
		tree=(C_TreeList*)win->FindControl(DESC_TREE);
		if(tree)
		{
			tree->DeleteBranch(tree->GetRoot());
			BuildDescTree(ent->GetDescription(),tree);
		}

		// Make RWR Listbox;
		lbox=(C_ListBox*)win->FindControl(RWR_LIST);
		if(lbox)
		{
			lbox->RemoveAllItems();
			BuildRWRList(ent->GetRWR(),lbox);

			SelectRWR(lbox->GetTextID());
		}

		Load3dModel(ent);

		btn=(C_Button*)win->FindControl(ENTITY_PIC);
		if(btn)
		{
			LoadBitmap(btn,ent->PhotoFile);
		}
		win->RefreshWindow();
	}
}

// Makes the Listbox full of Entities
static long InfoToWindow(long SubGroupID)
{
	C_Window *win;
	C_ListBox *lbox;
	Entity *ent;
	long entval=0;

	win=gMainHandler->FindWindow(TAC_REF_WIN);
	if(win)
	{
		lbox=(C_ListBox*)win->FindControl(ENTITY_LIST);
		if(lbox)
		{
			lbox->RemoveAllItems();

			ent=Reference->GetFirst(&entval);
			while(ent)
			{
				if(ent->SubGroupID == SubGroupID)
					lbox->AddItem(ent->EntityID,C_TYPE_ITEM,ent->Name);
				ent=Reference->GetNext(&entval);
			}

			if(!lbox->GetRoot())
			{
				lbox->AddItem(1,C_TYPE_ITEM,TXT_NONE);
				lbox->SetValue(1);
			}
			return(lbox->GetTextID());
		}
	}
	return(0);
}

static void SetGroupButton(long GroupID)
{
	C_Window *win;
	C_Button *btn;
	short i;

	win=gMainHandler->FindWindow(TAC_REF_WIN);
	if(win)
	{
		for(i=0;i<GROUP_COUNT;i++)
		{
			btn=(C_Button*)win->FindControl(GroupButtonID[i]);
			if(btn)
			{
				if(GroupButtonID[i] == GroupID)
				{
					btn->SetState(1);
					win->HideCluster(btn->GetUserNumber(1));
					win->HideCluster(btn->GetUserNumber(2));
					win->UnHideCluster(btn->GetUserNumber(0));
				}
				else
					btn->SetState(0);
				btn->Refresh();
			}
		}
	}
}

static void SetSubGroupButton(long SubGroupID)
{
	C_Window *win;
	C_Button *btn;
	short i;

	win=gMainHandler->FindWindow(TAC_REF_WIN);
	if(win)
	{
		for(i=0;i<SUBGROUP_COUNT;i++)
		{
			btn=(C_Button*)win->FindControl(SubGroupButtonID[i]);
			if(btn)
			{
				if(SubGroupButtonID[i] == SubGroupID)
					btn->SetState(1);
				else
					btn->SetState(0);
				btn->Refresh();
			}
		}
	}
}

// Worker function to get the Entity into the window
static void LoadEntity(long EntityID)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -