📄 ui_tacref.cpp
字号:
#include <windows.h>
#include "Graphics\Include\TimeMgr.h"
#include "Graphics\Include\imagebuf.h"
#include "dxutil\ddutil.h"
#include "dispcfg.h"
#include "Graphics\Include\renderow.h"
#include "Graphics\Include\RViewPnt.h"
#include "Graphics\Include\drawbsp.h"
#include "unit.h"
#include "classtbl.h"
#include "cmpclass.h"
#include "chandler.h"
#include "cbsplist.h"
#include "Graphics\Include\loader.h"
#include "c3dview.h"
#include "soundfx.h"
#include "fsound.h"
#include "tacref.h"
#include "userids.h"
#include "textids.h"
enum
{
TACREF_BITMAP_ID=999888777,
};
extern C_Handler *gMainHandler;
extern C_Parser *gMainParser;
extern int TACREFLoaded;
TacticalReference *Reference=NULL;
C_3dViewer *TAC_Viewer=NULL;
long CurrentModel=0;
long CurrentWeapon=0;
long CurrentEntity=0;
BOOL Helicopter=FALSE;
float BladeAngle=0.0f;
int LastRWRTone=-1;
int LastLockTone=-1;
OBJECTINFO TACREF_Object;
void UI_Help_Guide_CB(long ID,short hittype,C_Base *control);
void CloseWindowCB(long ID,short hittype,C_Base *control);
void FindCameraDeltas(OBJECTINFO *Info);
void UnloadObject();
void TacRef_Cleanup();
void PositandOrientSetData (float x, float y, float z, float pitch, float roll, float yaw,
Tpoint* simView, Trotation* viewRotation);
enum
{
GROUP_COUNT=3,
SUBGROUP_COUNT=18,
};
static long GroupButtonID[GROUP_COUNT]=
{
CAT_AIRCRAFT,
CAT_VEHICLES,
CAT_MUNITIONS,
};
static long SubGroupButtonID[SUBGROUP_COUNT]=
{
SUB_CAT_AIRCRAFT_FIGHTERS,
SUB_CAT_AIRCRAFT_ATTACK,
SUB_CAT_AIRCRAFT_BOMBERS,
SUB_CAT_AIRCRAFT_HELICOPTERS,
SUB_CAT_AIRCRAFT_SUPPORT,
SUB_CAT_AIRCRAFT_EW,
SUB_CAT_VEHICLES_TANKS,
SUB_CAT_VEHICLES_IFVS,
SUB_CAT_VEHICLES_ARTILLERY,
SUB_CAT_VEHICLES_AIRDEFENSE,
SUB_CAT_VEHICLES_SUPPORT,
SUB_CAT_VEHICLES_SHIPS,
SUB_CAT_MUNITIONS_AAM,
SUB_CAT_MUNITIONS_AGM,
SUB_CAT_MUNITIONS_ARM,
SUB_CAT_MUNITIONS_BOMBS,
SUB_CAT_MUNITIONS_STORES,
SUB_CAT_MUNITIONS_GROUND,
};
void TACMoveRendererCB(C_Window *win)
{
if(TAC_Viewer)
TAC_Viewer->Viewport(win,0);
}
void TACREF_ViewBSPObjectCB(long,short,C_Base *control)
{
F4CSECTIONHANDLE *Leave;
if (TAC_Viewer)
{
Leave=UI_Enter(control->Parent_);
TheLoader.WaitForLoader();
TAC_Viewer->View3d(CurrentModel);
UI_Leave(Leave);
}
}
void StopRWRSounds()
{
C_Window *win;
C_Button *btn;
if(LastLockTone != -1)
{
F4StopSound (SFX_DEF[LastLockTone].handle);
LastLockTone=-1;
}
if(LastRWRTone != -1)
{
F4StopSound (SFX_DEF[LastRWRTone].handle);
LastLockTone=-1;
}
win=gMainHandler->FindWindow(TAC_REF_WIN);
if(win)
{
btn=(C_Button *)win->FindControl(PLAY_SEARCH_TONE);
if(btn)
{
btn->SetState(0);
btn->Refresh();
}
btn=(C_Button *)win->FindControl(PLAY_LOCK_TONE);
if(btn)
{
btn->SetState(0);
btn->Refresh();
}
}
}
void TACREFCloseWindowCB(long ID,short hittype,C_Base *control)
{
if(hittype != C_TYPE_LMOUSEUP)
return;
StopRWRSounds();
CloseWindowCB(ID,hittype,control);
TacRef_Cleanup();
}
void TACREF_PositionCamera(OBJECTINFO *Info,C_Window *win,long client)
{
if(!TAC_Viewer || !Info || !win)
return;
FindCameraDeltas(Info);
TAC_Viewer->SetCamera(Info->DeltaX,Info->DeltaY,Info->DeltaZ,Info->Heading,-Info->Pitch,0.0f);
win->RefreshClient(client);
}
static void TACREF_PannerCB(long,short hittype,C_Base *control)
{
float dx,dy;
C_Panner *pnr;
if(hittype != C_TYPE_LMOUSEUP && hittype != C_TYPE_REPEAT)
return;
pnr = static_cast<C_Panner *>(control);
dx = static_cast<float>(pnr->GetHRange());
dy = static_cast<float>(pnr->GetVRange());
TACREF_Object.Heading+=dx;
TACREF_Object.Pitch+=dy;
if(TACREF_Object.Heading < 0) TACREF_Object.Heading+=360;
if(TACREF_Object.Heading > 360) TACREF_Object.Heading-=360;
if(TACREF_Object.CheckPitch)
{
if(TACREF_Object.Pitch < TACREF_Object.MinPitch) TACREF_Object.Pitch=TACREF_Object.MinPitch;
if(TACREF_Object.Pitch > TACREF_Object.MaxPitch) TACREF_Object.Pitch=TACREF_Object.MaxPitch;
}
else
{
if(TACREF_Object.Pitch < 0) TACREF_Object.Pitch+=360;
if(TACREF_Object.Pitch > 360) TACREF_Object.Pitch-=360;
}
TACREF_PositionCamera(&TACREF_Object,control->Parent_,control->GetClient());
}
static void TACREF_ZoomCB(long,short hittype,C_Base *control)
{
float dy;
C_Panner *pnr;
if(hittype != C_TYPE_LMOUSEUP && hittype != C_TYPE_REPEAT)
return;
pnr=(C_Panner*)control;
dy=static_cast<float>(pnr->GetVRange());
TACREF_Object.Distance+=dy;
if(TACREF_Object.Distance < TACREF_Object.MinDistance) TACREF_Object.Distance=TACREF_Object.MinDistance;
if(TACREF_Object.Distance > TACREF_Object.MaxDistance) TACREF_Object.Distance=TACREF_Object.MaxDistance;
TACREF_PositionCamera(&TACREF_Object,control->Parent_,control->GetClient());
}
void TACREF_ViewTimerAnimCB(long,short,C_Base *control)
{
BSPLIST *obj;
if(control->GetUserNumber(_UI95_TIMER_COUNTER_) < 1)
{
if(Helicopter)
{
obj=TAC_Viewer->Find(CurrentModel);
if(obj)
{
BladeAngle += PI * 0.2f;
if(BladeAngle > (PI*2.0f))
BladeAngle -= PI*2.0f;
((DrawableBSP*)obj->object)->SetDOFangle(2,BladeAngle);
((DrawableBSP*)obj->object)->SetDOFangle(4,BladeAngle);
}
}
if(control->GetFlags() & C_BIT_ABSOLUTE)
{
control->Parent_->RefreshWindow();
}
else
control->Parent_->RefreshClient(control->GetClient());
control->SetUserNumber(_UI95_TIMER_COUNTER_,control->GetUserNumber(_UI95_TIMER_DELAY_));
}
control->SetUserNumber(_UI95_TIMER_COUNTER_,control->GetUserNumber(_UI95_TIMER_COUNTER_)-1);
}
void TACREF_ViewTimerCB(long,short,C_Base *control)
{
control->Parent_->RefreshClient(0);
}
static void BuildCatTree(Category *cat,C_TreeList *tree,TREELIST *parent)
{
C_Text *txt;
TREELIST *item;
CatText *cattext;
long textval=0;
cattext=cat->GetFirst(&textval);
while(cattext)
{
txt=new C_Text;
txt->Setup(C_DONT_CARE,0);
txt->SetFixedWidth(cattext->length);
txt->SetText(cattext->String);
txt->SetFont(tree->GetFont());
item=tree->CreateItem(C_DONT_CARE,C_TYPE_ITEM,txt);
if(item)
tree->AddChildItem(parent,item);
cattext=cat->GetNext(&textval);
}
}
static void BuildStatsTree(Statistics *stats,C_TreeList *tree)
{
C_Text *txt;
Category *cat;
TREELIST *par;
long catval=0; // internal... don't use for anything
long UniqueID=1;
if(!stats || !tree)
return;
tree->Parent_->ScanClientArea(tree->GetClient());
cat=stats->GetFirst(&catval);
while(cat)
{
txt=new C_Text;
txt->Setup(C_DONT_CARE,0);
txt->SetFixedWidth(40);
txt->SetFont(tree->GetFont());
txt->SetText(cat->Name);
par=tree->CreateItem(UniqueID++,C_TYPE_MENU,txt);
if(par)
{
tree->AddItem(tree->GetRoot(),par);
BuildCatTree(cat,tree,par);
}
cat=stats->GetNext(&catval);
}
tree->RecalcSize();
tree->Parent_->ScanClientArea(tree->GetClient());
tree->Parent_->RefreshClient(tree->GetClient());
}
static void BuildDescTree(Description *desc,C_TreeList *tree)
{
C_Text *txt;
TREELIST *item;
TextString *desctext;
long textval=0;
long UniqueID=1;
if(!desc || !tree)
return;
tree->Parent_->ScanClientArea(tree->GetClient());
desctext=desc->GetFirst(&textval);
while(desctext)
{
txt=new C_Text;
txt->Setup(UniqueID,0);
txt->SetW(tree->Parent_->ClientArea_[tree->GetClient()].right-tree->Parent_->ClientArea_[tree->GetClient()].left-10 - tree->GetX());
txt->SetFlagBitOn(C_BIT_WORDWRAP);
txt->SetFont(tree->GetFont());
txt->SetFixedWidth(desctext->length);
txt->SetText(desctext->String);
item=tree->CreateItem(UniqueID++,C_TYPE_ITEM,txt);
if(item)
tree->AddItem(tree->GetRoot(),item);
desctext=desc->GetNext(&textval);
}
tree->RecalcSize();
tree->Parent_->ScanClientArea(tree->GetClient());
tree->Parent_->RefreshClient(tree->GetClient());
}
void SelectRWR(long ID)
{
C_Window *win;
C_ListBox *lbox;
C_Button *btn;
LISTBOX *item;
win=gMainHandler->FindWindow(TAC_REF_WIN);
if(win)
{
lbox=(C_ListBox*)win->FindControl(RWR_LIST);
if(lbox)
{
item=lbox->FindID(ID);
if(item)
{
btn=(C_Button*)win->FindControl(PLAY_LOCK_TONE);
if(btn)
btn->SetUserNumber(0,item->Label_->GetUserNumber(3));
btn=(C_Button*)win->FindControl(LOCK_ICON);
if(btn)
{
btn->Refresh();
btn->SetState(static_cast<short>(item->Label_->GetUserNumber(1)));
btn->Refresh();
}
}
else
{
btn=(C_Button*)win->FindControl(PLAY_LOCK_TONE);
if(btn)
btn->SetUserNumber(0,-1);
btn=(C_Button*)win->FindControl(LOCK_ICON);
if(btn)
{
btn->Refresh();
btn->SetState(0);
btn->Refresh();
}
}
}
}
}
static void BuildRWRList(RWR *rwr,C_ListBox *listbox)
{
Radar *radar;
long rwrval=0;
long UniqueID=1;
if(!rwr || !listbox)
return;
radar=rwr->GetFirst(&rwrval);
if(radar)
{
while(radar)
{
listbox->AddItem(UniqueID,C_TYPE_ITEM,radar->Name);
listbox->SetItemUserData(UniqueID,0,radar->SearchState);
listbox->SetItemUserData(UniqueID,1,radar->LockState);
listbox->SetItemUserData(UniqueID,2,radar->SearchTone);
listbox->SetItemUserData(UniqueID,3,radar->LockTone);
UniqueID++;
radar=rwr->GetNext(&rwrval);
}
}
else
{
listbox->AddItem(1,C_TYPE_ITEM,TXT_NO_RADAR);
listbox->SetItemUserData(1,0,0);
listbox->SetItemUserData(1,1,0);
listbox->SetItemUserData(1,2,-1);
listbox->SetItemUserData(1,3,-1);
}
listbox->SetValue(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -