📄 ui_tacref.cpp
字号:
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 + -