Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
1805 lines
42 KiB
C++
1805 lines
42 KiB
C++
// OverviewWindow.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include <math.h>
|
|
#include "MW4GameEd2.h"
|
|
#include "OverviewWindow.h"
|
|
#include "EdGUIObject.h"
|
|
#include "ObjectManager.h"
|
|
#include "PenProps.h"
|
|
#include "MainFrm.h"
|
|
#include "Refresher.h"
|
|
#include "CameraController.h"
|
|
#include "OverviewProperties.h"
|
|
#include "GridProps.h"
|
|
#include "AlignDlg.h"
|
|
#include "DisperseDlg.h"
|
|
#include "CustomTagDlg.h"
|
|
|
|
#include "GameInterface.h"
|
|
|
|
#include <Windowsx.h>
|
|
|
|
static UINT indicators[] =
|
|
{
|
|
ID_SEPARATOR // status line indicator
|
|
};
|
|
|
|
const int key_scroll_rate = 50;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// OverviewWindow
|
|
|
|
//IMPLEMENT_DYNCREATE(OverviewWindow, CWnd)
|
|
|
|
OverviewWindow::OverviewWindow(ObjectManager *objman,CWnd *parent)
|
|
: m_DistanceLineStartPos(-1,-1,-1)
|
|
, m_DistanceLineEndPos(-1,-1,-1)
|
|
, m_COverviewProperties(0)
|
|
{
|
|
ShowTagsAlways=false;
|
|
BackGroundReady=false;
|
|
GroupSelecting=false;
|
|
ZoomBoxing=false;
|
|
TagFlag=TF_ONSELECT;
|
|
|
|
BOOL result=false;
|
|
|
|
result=GridPen.CreatePen(PS_SOLID,1,0xffff00); Verify(result);
|
|
result=GreenPen.CreatePen(PS_SOLID,1,0x00ff00); Verify(result);
|
|
result=RedPen.CreatePen(PS_SOLID,1,0x0000ff); Verify(result);
|
|
result=YellowPen.CreatePen(PS_SOLID,1,0x00ffff); Verify(result);
|
|
|
|
result=DarkGreenPen.CreatePen(PS_SOLID,1,0x007f00); Verify(result);
|
|
result=DarkRedPen.CreatePen(PS_SOLID,1,0x00007f); Verify(result);
|
|
result=DarkYellowPen.CreatePen(PS_SOLID,1,0x007f7f); Verify(result);
|
|
UserGridSize.x=10.0f;
|
|
UserGridSize.z=10.0f;
|
|
|
|
ShowFlag=0xffffffff;
|
|
|
|
CurrentVMode=VM_TEXTURE;
|
|
|
|
LOGBRUSH lb;
|
|
lb.lbColor=0xffffff;
|
|
lb.lbStyle=BS_SOLID;
|
|
result=BoxPen.CreatePen(PS_DOT,1,&lb); Verify(result);
|
|
|
|
ObjMan=objman;
|
|
DisplayUserGrid=false;
|
|
DisplayZoneGrid=false;
|
|
DisplayTileGrid=false;
|
|
DidMoveCopy=false;
|
|
HandCur=AfxGetApp()->LoadCursor(IDC_UHAND);
|
|
|
|
}
|
|
|
|
OverviewWindow::~OverviewWindow()
|
|
{
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(OverviewWindow, CWnd)
|
|
//{{AFX_MSG_MAP(OverviewWindow)
|
|
ON_WM_PAINT()
|
|
ON_WM_MOUSEMOVE()
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_LBUTTONUP()
|
|
ON_WM_RBUTTONDOWN()
|
|
ON_WM_RBUTTONUP()
|
|
ON_WM_CLOSE()
|
|
ON_WM_SIZE()
|
|
ON_WM_MOUSEWHEEL()
|
|
ON_WM_LBUTTONDBLCLK()
|
|
ON_WM_KEYDOWN()
|
|
ON_WM_KEYUP()
|
|
ON_WM_CHAR()
|
|
ON_COMMAND(ID_BACKGROUND_HEIGHTFIELD, OnBackgroundHeightfield)
|
|
ON_COMMAND(ID_BACKGROUND_SLOPEMAP, OnBackgroundSlopemap)
|
|
ON_COMMAND(ID_BACKGROUND_TEXTURE, OnBackgroundTexture)
|
|
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
|
|
ON_COMMAND(ID_EDIT_CUT, OnEditCut)
|
|
ON_COMMAND(ID_EDIT_DELETE, OnEditDelete)
|
|
ON_COMMAND(ID_EDIT_GROUP, OnEditGroup)
|
|
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
|
|
ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
|
|
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
|
|
ON_COMMAND(ID_EDIT_UNGOUP, OnEditUngoup)
|
|
ON_UPDATE_COMMAND_UI(ID_BACKGROUND_HEIGHTFIELD, OnUpdateBackgroundHeightfield)
|
|
ON_UPDATE_COMMAND_UI(ID_BACKGROUND_SLOPEMAP, OnUpdateBackgroundSlopemap)
|
|
ON_UPDATE_COMMAND_UI(ID_BACKGROUND_TEXTURE, OnUpdateBackgroundTexture)
|
|
ON_COMMAND(ID_VIEW_HELPERS_SHOWBOUNDS, OnViewHelpersShowbounds)
|
|
ON_COMMAND(ID_VIEW_HELPERS_SHOWLATTICE, OnViewHelpersShowlattice)
|
|
ON_COMMAND(ID_VIEW_HELPERS_SHOWPATHS, OnViewHelpersShowpaths)
|
|
ON_COMMAND(ID_VIEW_HELPERS_SHOWTILEBOUNDS, OnViewHelpersShowtilebounds)
|
|
ON_COMMAND(ID_VIEW_HELPERS_SHOWUSERGRID, OnViewHelpersShowusergrid)
|
|
ON_COMMAND(ID_VIEW_HELPERS_SHOWZONEBOUNDS, OnViewHelpersShowzonebounds)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_HELPERS_SHOWBOUNDS, OnUpdateViewHelpersShowbounds)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_HELPERS_SHOWLATTICE, OnUpdateViewHelpersShowlattice)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_HELPERS_SHOWPATHS, OnUpdateViewHelpersShowpaths)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_HELPERS_SHOWTILEBOUNDS, OnUpdateViewHelpersShowtilebounds)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_HELPERS_SHOWUSERGRID, OnUpdateViewHelpersShowusergrid)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_HELPERS_SHOWZONEBOUNDS, OnUpdateViewHelpersShowzonebounds)
|
|
ON_COMMAND(ID_VIEW_SETUSERGRIDPROPERTIES, OnViewSetusergridproperties)
|
|
ON_COMMAND(ID_VIEW_SETPENCOLORS, OnViewSetpencolors)
|
|
ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
|
|
ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
|
|
ON_COMMAND(ID_TOOLS_CREATELATTICE, OnToolsCreatelattice)
|
|
ON_COMMAND(ID_TOOLS_RECALCLATTICELINKS, OnToolsRecalclatticelinks)
|
|
ON_COMMAND(ID_TOOLS_RESETMISSIONBOUNDS, OnToolsResetmissionbounds)
|
|
ON_COMMAND(ID_OPTIONS_SETDEFAULTALIGNMENT, OnOptionsSetdefaultalignment)
|
|
ON_COMMAND(ID_VIEW_TAGS_SHOWCUSTOM, OnViewTagsShowcustom)
|
|
ON_WM_CREATE()
|
|
ON_WM_ERASEBKGND()
|
|
ON_COMMAND(ID_TOOLS_DISPERSEWITHBITMAP, OnToolsDispersewithbitmap)
|
|
ON_COMMAND(ID_TOOLS_SNAPOBJECTTOTERRAIN, OnToolsSnapobjecttoterrain)
|
|
ON_WM_RBUTTONDBLCLK()
|
|
ON_WM_SYSKEYDOWN()
|
|
ON_WM_SYSKEYUP()
|
|
ON_COMMAND(ID_OPTIONS_FILLLATTICE, OnOptionsFilllattice)
|
|
ON_UPDATE_COMMAND_UI(ID_OPTIONS_FILLLATTICE, OnUpdateOptionsFilllattice)
|
|
ON_COMMAND(ID_TOOLS_DUMPOVERVEIWCONTENTSTOFILE, OnToolsDumpoverveiwcontentstofile)
|
|
ON_COMMAND(ID_VIEW_ZOOMIN, OnViewZoomin)
|
|
ON_COMMAND(ID_VIEW_ZOOMOUT, OnViewZoomout)
|
|
ON_COMMAND(ID_VIEW_TAGS_SHOWTAGS, OnViewTagsShowtags)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_TAGS_SHOWTAGS, OnUpdateViewTagsShowtags)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// OverviewWindow message handlers
|
|
|
|
void OverviewWindow::OnPaint()
|
|
{
|
|
CPaintDC dc(this); // device context for painting
|
|
RefreshWindow(&dc);
|
|
// Do not call CWnd::OnPaint() for painting messages
|
|
}
|
|
|
|
void OverviewWindow::BuildBackGround()
|
|
{
|
|
CDC *pDC=GetDC();
|
|
CRect crect;
|
|
GetClientRect(&crect);
|
|
pDC->SetStretchBltMode(COLORONCOLOR);
|
|
|
|
if(!ObjMan->IsLoaded()) return;
|
|
|
|
|
|
Image *bimage;
|
|
|
|
switch(CurrentVMode)
|
|
{
|
|
case VM_TEXTURE:
|
|
bimage=ObjMan->GetTerrainTexture();
|
|
break;
|
|
case VM_HFIELD:
|
|
bimage=ObjMan->GetHeightField();
|
|
break;
|
|
case VM_SLOPEMAP:
|
|
bimage=ObjMan->GetSlopeMap();
|
|
break;
|
|
default: STOP(("Invalid View Mode"));
|
|
}
|
|
|
|
|
|
CSize bmsize(bimage->GetWidth(),bimage->GetHeight());
|
|
BackGround.DeleteObject();
|
|
BOOL result;
|
|
result=BackGround.CreateCompatibleBitmap(pDC,bmsize.cx,bmsize.cy); Verify(result);
|
|
|
|
CDC memDC;
|
|
result=memDC.CreateCompatibleDC(pDC); Verify(result);
|
|
memDC.SelectObject(BackGround);
|
|
|
|
BITMAPINFO binf;
|
|
ZeroMemory(&binf,sizeof(binf));
|
|
binf.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
|
|
binf.bmiHeader.biPlanes=1;
|
|
binf.bmiHeader.biCompression=BI_RGB;
|
|
binf.bmiHeader.biWidth=bmsize.cx;
|
|
binf.bmiHeader.biHeight=-bmsize.cy;
|
|
binf.bmiHeader.biBitCount=(unsigned short)bimage->GetBpp();
|
|
|
|
BYTE *buf=bimage->Lock();
|
|
|
|
int res;
|
|
res=SetDIBitsToDevice(memDC,0,0,bmsize.cx,bmsize.cy,
|
|
0,0,
|
|
0,bmsize.cy,
|
|
buf,&binf,DIB_RGB_COLORS);
|
|
Verify(res!=0);
|
|
|
|
bimage->UnLock();
|
|
|
|
memDC.DeleteDC();
|
|
ReleaseDC(pDC);
|
|
BackGroundReady=true;
|
|
drawInfo.vinf.SetBitmapArea(bmsize);
|
|
}
|
|
|
|
void OverviewWindow::InitWindow()
|
|
{
|
|
BuildBackGround();
|
|
InitBackBuffer();
|
|
ObjMan->UpdateVisibility(ShowFlag);
|
|
}
|
|
|
|
void OverviewWindow::InitBackBuffer()
|
|
{
|
|
BackBuffer.DeleteObject();
|
|
CRect crect;
|
|
GetClientRect(&crect);
|
|
drawInfo.vinf.SetClientArea(crect.Size());
|
|
CDC *pDC=GetDC();
|
|
BOOL result;
|
|
result=BackBuffer.CreateCompatibleBitmap(pDC,crect.Width(),crect.Height()); Verify(result);
|
|
ReleaseDC(pDC);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void OverviewWindow::RefreshWindow(CDC *pDC)
|
|
{
|
|
|
|
CRect destrect,crct;
|
|
GetClientRect(&crct);
|
|
|
|
bool needrelease=false;
|
|
if(pDC==NULL)
|
|
{
|
|
needrelease=true;
|
|
pDC=GetDC();
|
|
}
|
|
CDC bbufDC;
|
|
int res;
|
|
res=bbufDC.CreateCompatibleDC(pDC);
|
|
Verify(res!=0);
|
|
bbufDC.SelectObject(BackBuffer);
|
|
|
|
if(BackGroundReady)
|
|
{
|
|
CDC memDC;
|
|
CRect srcrect;
|
|
memDC.CreateCompatibleDC(pDC);
|
|
memDC.SelectObject(BackGround);
|
|
|
|
|
|
if(!drawInfo.vinf.GetBltRects(&destrect,&srcrect))
|
|
{
|
|
BOOL res=bbufDC.StretchBlt(
|
|
destrect.left,destrect.top,destrect.Width(),destrect.Height(),
|
|
&memDC,
|
|
srcrect.left,srcrect.top,srcrect.Width(),srcrect.Height(),
|
|
SRCCOPY);
|
|
// Verify(res);
|
|
}
|
|
else
|
|
{
|
|
COLORREF col=memDC.GetPixel(srcrect.TopLeft());
|
|
CRect clrct;
|
|
GetClientRect(&clrct);
|
|
bbufDC.FillSolidRect(&clrct,col);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
BOOL res;
|
|
GetClientRect(&destrect);
|
|
res=bbufDC.BitBlt(destrect.left,destrect.top,destrect.Width(),destrect.Height(),NULL,0,0,BLACKNESS); Verify(res);
|
|
}
|
|
|
|
DrawHelpers(&bbufDC);
|
|
BOOL result;
|
|
result=pDC->BitBlt(crct.left,crct.top,crct.Width(),crct.Height(),&bbufDC,0,0,SRCCOPY); Verify(result);
|
|
|
|
if(needrelease)
|
|
ReleaseDC(pDC);
|
|
ValidateRect(NULL);
|
|
|
|
// m_COverviewProperties->Refresh();
|
|
}
|
|
|
|
void OverviewWindow::DragCameraToPoint(const CPoint& point)
|
|
{
|
|
if ((ObjMan->GetCameraController() != 0) &&
|
|
(Refresher::Instance != 0))
|
|
{
|
|
CPoint p(point);
|
|
Point3D point3D(drawInfo.vinf.ScreenToData(p));
|
|
|
|
if (ObjMan->GetCameraController()->StaysInsideBounds(point3D,ObjMan->GetCameraController()->GetYawPitchRange()) == true)
|
|
{
|
|
ObjMan->GetCameraController()->SetLookAt(point3D,true);
|
|
ObjMan->GetCameraController()->Update();
|
|
Refresher::Instance->DrawRefresh();
|
|
}
|
|
}
|
|
}
|
|
|
|
void OverviewWindow::OnMouseMove(UINT nFlags, CPoint point)
|
|
{
|
|
m_LastMousePos = point;
|
|
|
|
CRect crect;
|
|
GetClientRect(&crect);
|
|
short AltKey=GetAsyncKeyState(VK_MENU);
|
|
short SpaceKey=GetAsyncKeyState(VK_SPACE);
|
|
|
|
if(SpaceKey) GroupSelecting=false;
|
|
|
|
if(ObjMan->IsMultiZone())
|
|
{
|
|
ObjMan->SelectMultiZone();
|
|
Point3D vect;
|
|
vect=drawInfo.vinf.ScreenToData(point);
|
|
vect-=drawInfo.vinf.ScreenToData(OldPoint);
|
|
ObjMan->OffsetSelection(vect);
|
|
OldPoint=point;
|
|
Refresher::Instance->DrawRefresh();
|
|
|
|
}
|
|
else
|
|
{
|
|
Point3D data_point=drawInfo.vinf.ScreenToData(point);
|
|
if(nFlags&MK_MBUTTON || (SpaceKey && nFlags&MK_LBUTTON && nFlags&MK_CONTROL) || ZoomBoxing)
|
|
{ // Adjust Zoom
|
|
|
|
if(ZoomBreakBuffer==false)
|
|
{
|
|
if(((point.x-ZoomBufferPoint.x)*(point.x-ZoomBufferPoint.x)+(point.y-ZoomBufferPoint.y)*(point.y-ZoomBufferPoint.y))>25)
|
|
ZoomBreakBuffer=true;
|
|
|
|
}
|
|
else
|
|
{
|
|
ZoomBoxing=true;
|
|
ZoomBox.left=point.x<ZoomBoxAnchor.x?point.x:ZoomBoxAnchor.x;
|
|
ZoomBox.right=point.x>ZoomBoxAnchor.x?point.x:ZoomBoxAnchor.x;
|
|
ZoomBox.top=point.y<ZoomBoxAnchor.y?point.y:ZoomBoxAnchor.y;
|
|
ZoomBox.bottom=point.y>ZoomBoxAnchor.y?point.y:ZoomBoxAnchor.y;
|
|
|
|
Refresher::Instance->OverviewRefresh();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if(nFlags&MK_LBUTTON)
|
|
{
|
|
if(SpaceKey)
|
|
{
|
|
if(nFlags&MK_CONTROL)
|
|
{
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
drawInfo.vinf.OffsetPan(OldPoint-point);
|
|
ZoomBoxing=false;
|
|
GroupSelecting=false;
|
|
Refresher::Instance->OverviewRefresh();
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
if(BreakBuffer)
|
|
{
|
|
|
|
if(InitalSelectCount==0 && InitalUnSelectCount==0)
|
|
{
|
|
GroupSelecting=true;
|
|
}
|
|
else
|
|
{
|
|
if(nFlags&MK_CONTROL && !DidMoveCopy)
|
|
{
|
|
ObjMan->Select(data_point);
|
|
if(!ObjMan->CopySelection())
|
|
MessageBox("Copy Operation Failed","Copy Fail",MB_OK);
|
|
else
|
|
{
|
|
MoveCopyPoint.x=-MoveCopyPoint.x;
|
|
MoveCopyPoint.y=-MoveCopyPoint.y;
|
|
MoveCopyPoint.z=-MoveCopyPoint.z;
|
|
MoveCopyQuat.w=-MoveCopyQuat.w;
|
|
ObjMan->OffsetSelection(MoveCopyPoint);
|
|
ObjMan->RotateSelection(MoveCopyQuat);
|
|
ObjMan->ClearSelection();
|
|
ObjMan->PasteClipBoard(Point3D(0.0f,0.0f,0.0f));
|
|
}
|
|
DidMoveCopy=true;
|
|
Refresher::Instance->ObjManSelRefresh();
|
|
|
|
}
|
|
|
|
if(AltKey)
|
|
{ //Rotate
|
|
YawPitchRoll rot(0.0f,0.0f,0.0f);
|
|
Scalar yd=(float)(OldPoint.y-point.y)/crect.Height();
|
|
Scalar xd=(float)(OldPoint.x-point.x)/crect.Width();
|
|
rot.yaw=Two_Pi*xd;
|
|
UnitQuaternion quatrot;
|
|
UnitQuaternion tquat;
|
|
quatrot=rot;
|
|
tquat.Multiply(quatrot,MoveCopyQuat);
|
|
MoveCopyQuat=tquat;
|
|
ObjMan->RotateSelection(quatrot);
|
|
Refresher::Instance->DrawRefresh();
|
|
|
|
}
|
|
else
|
|
{ //Offset
|
|
Point3D vect;
|
|
vect=data_point;
|
|
vect-=drawInfo.vinf.ScreenToData(OldPoint);
|
|
ObjMan->OffsetSelection(vect);
|
|
Refresher::Instance->DrawRefresh();
|
|
if(!DidMoveCopy) MoveCopyPoint+=vect;
|
|
}
|
|
|
|
}
|
|
|
|
if(GroupSelecting)
|
|
{
|
|
GroupSelBox.left=point.x<GroupSelAnchor.x?point.x:GroupSelAnchor.x;
|
|
GroupSelBox.right=point.x>GroupSelAnchor.x?point.x:GroupSelAnchor.x;
|
|
GroupSelBox.top=point.y<GroupSelAnchor.y?point.y:GroupSelAnchor.y;
|
|
GroupSelBox.bottom=point.y>GroupSelAnchor.y?point.y:GroupSelAnchor.y;
|
|
Refresher::Instance->OverviewRefresh();
|
|
}
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
if(((point.x-BufferPoint.x)*(point.x-BufferPoint.x)+(point.y-BufferPoint.y)*(point.y-BufferPoint.y))>25)
|
|
{
|
|
BreakBuffer=true;
|
|
ObjMan->SavePosForUndo();
|
|
// ObjMan->SaveRotForUndo();
|
|
}
|
|
}
|
|
}
|
|
} //end of Left Button
|
|
|
|
|
|
|
|
if(nFlags&MK_RBUTTON)
|
|
{
|
|
CSize delta;
|
|
delta=OldPoint-point;
|
|
|
|
if(CameraController::GetInstance()->RevMouse)
|
|
delta.cy=-delta.cy;
|
|
|
|
|
|
YawPitchRange ypr=CameraController::GetInstance()->GetYawPitchRange();
|
|
CameraController::GetInstance()->RBMode=true;
|
|
|
|
Scalar yd=(float)(delta.cy)*Two_Pi/crect.Height();
|
|
Scalar xd=(float)(delta.cx)*Two_Pi/crect.Width();
|
|
ypr.yaw+=xd;
|
|
ypr.pitch+=yd;
|
|
CameraController::GetInstance()->SetYawPitchRange(ypr);
|
|
CameraController::GetInstance()->Update();
|
|
Refresher::Instance->DrawRefresh();
|
|
|
|
}
|
|
else
|
|
{
|
|
CameraController::GetInstance()->RBMode=false;
|
|
}
|
|
|
|
|
|
if (m_DistanceLineStartPos != Stuff::Point3D(-1,-1,-1))
|
|
{
|
|
m_DistanceLineEndPos = drawInfo.vinf.ScreenToData(point);
|
|
Refresher::Instance->OverviewRefresh();
|
|
}
|
|
|
|
if(nFlags&(MK_MBUTTON|MK_RBUTTON|MK_LBUTTON)) OldPoint=point;
|
|
} //End multizone
|
|
|
|
CWnd::OnMouseMove(nFlags, point);
|
|
}
|
|
|
|
void OverviewWindow::OnLButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
short SpaceKey=GetAsyncKeyState(VK_SPACE);
|
|
if(nFlags&MK_CONTROL && SpaceKey)
|
|
{
|
|
CPoint ZoomBufferPoint=point;
|
|
ZoomBreakBuffer=false;
|
|
|
|
OldPoint=point;
|
|
ZoomBoxAnchor=point;
|
|
ZoomBox=CRect(point,point);
|
|
ZoomBoxing=false;
|
|
|
|
}
|
|
else
|
|
{
|
|
OldPoint=point;
|
|
Point3D data_point=drawInfo.vinf.ScreenToData(point);
|
|
GroupSelecting=false;
|
|
GroupSelAnchor=point;
|
|
GroupSelBox=CRect(point,point);
|
|
BufferPoint=point;
|
|
BreakBuffer=false;
|
|
DidMoveCopy=false;
|
|
AddedObject=false;
|
|
InitalSelectCount=ObjMan->SelectionDepth(data_point);
|
|
InitalUnSelectCount=ObjMan->ObjectDepth(data_point)-InitalSelectCount;
|
|
MoveCopyPoint=Point3D(0.0f,0.0f,0.0f);
|
|
MoveCopyQuat=UnitQuaternion::Identity;
|
|
|
|
if(InitalUnSelectCount>0 && !(nFlags&MK_SHIFT) && !(nFlags&MK_CONTROL))
|
|
ObjMan->ClearSelection();
|
|
|
|
if(!(nFlags&MK_CONTROL))
|
|
ObjMan->Select( drawInfo.vinf.ScreenToData(point));
|
|
|
|
if((InitalSelectCount==0 && InitalUnSelectCount==0) && (nFlags&MK_SHIFT)) BreakBuffer=true;
|
|
|
|
Refresher::Instance->OverviewRefresh();
|
|
Refresher::Instance->ObjManSelRefresh();
|
|
}
|
|
SetCapture();
|
|
CWnd::OnLButtonDown(nFlags, point);
|
|
}
|
|
|
|
void OverviewWindow::OnLButtonUp(UINT nFlags, CPoint point)
|
|
{
|
|
short SpaceKey=GetAsyncKeyState(VK_SPACE);
|
|
short AltKey=GetAsyncKeyState(VK_MENU);
|
|
|
|
if(ZoomBoxing)
|
|
{
|
|
ZoomBoxing=false;
|
|
if(ZoomBox.Width()!=0 && ZoomBox.Height()!=0)
|
|
{
|
|
Point3D min,max;
|
|
min=drawInfo.vinf.ScreenToData(ZoomBox.TopLeft());
|
|
max=drawInfo.vinf.ScreenToData(ZoomBox.BottomRight());
|
|
drawInfo.vinf.SetViewLimits(min,max);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
if(InitalSelectCount==0 && InitalUnSelectCount==0 && !(nFlags&MK_SHIFT) && !AddedObject && !SpaceKey)
|
|
ObjMan->ClearSelection();
|
|
|
|
Point3D data_point=drawInfo.vinf.ScreenToData(point);
|
|
if(GroupSelecting)
|
|
{
|
|
if(!(nFlags&MK_SHIFT) && !(nFlags&MK_CONTROL) && !AddedObject)
|
|
ObjMan->ClearSelection();
|
|
|
|
|
|
ObjMan->Select(drawInfo.vinf.ScreenToData(GroupSelBox.TopLeft()),
|
|
drawInfo.vinf.ScreenToData(GroupSelBox.BottomRight()));
|
|
}
|
|
else
|
|
{
|
|
if(nFlags&MK_CONTROL && !DidMoveCopy)
|
|
{
|
|
ObjMan->ToggleSelect(data_point);
|
|
}
|
|
}
|
|
|
|
if(DidMoveCopy)
|
|
{
|
|
Refresher::Instance->WorldRefresh();
|
|
}
|
|
|
|
GroupSelecting=false;
|
|
}
|
|
Refresher::Instance->OverviewRefresh();
|
|
Refresher::Instance->ObjManSelRefresh();
|
|
ReleaseCapture();
|
|
CWnd::OnLButtonUp(nFlags, point);
|
|
}
|
|
|
|
void OverviewWindow::OnLButtonDblClk(UINT nFlags, CPoint point)
|
|
{
|
|
short SpaceKey=GetAsyncKeyState(VK_SPACE);
|
|
short AltKey=GetAsyncKeyState(VK_MENU);
|
|
Point3D data_point=drawInfo.vinf.ScreenToData(point);
|
|
if(ObjMan->SelectionDepth(data_point)==0)
|
|
{
|
|
if(!ObjMan->AddAt(data_point,&ShowFlag,AltKey?true:false))
|
|
MessageBox("Object Creation Failed","Creation Failure",MB_OK);
|
|
|
|
ObjMan->UpdateVisibility(ShowFlag);
|
|
ObjMan->Select(data_point);
|
|
AddedObject=true;
|
|
}
|
|
else
|
|
{
|
|
ObjMan->SetProperties(data_point,this);
|
|
}
|
|
Refresher::Instance->WorldRefresh();
|
|
CWnd::OnLButtonDblClk(nFlags, point);
|
|
}
|
|
|
|
void OverviewWindow::OnRButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
CameraController::GetInstance()->SetLookAt(drawInfo.vinf.ScreenToData(point),true);
|
|
CameraController::GetInstance()->SetLookAtMode(false);
|
|
CameraController::GetInstance()->Update();
|
|
Refresher::Instance->DrawRefresh();
|
|
|
|
CWnd::OnRButtonDown(nFlags, point);
|
|
}
|
|
|
|
void OverviewWindow::OnRButtonUp(UINT nFlags, CPoint point)
|
|
{
|
|
|
|
CWnd::OnRButtonUp(nFlags, point);
|
|
}
|
|
|
|
|
|
void OverviewWindow::OnRButtonDblClk(UINT nFlags, CPoint point)
|
|
{
|
|
EdGUIObject *obj;
|
|
Point3D data_point=drawInfo.vinf.ScreenToData(point);
|
|
obj=ObjMan->GetObjAtPoint(data_point);
|
|
|
|
if(obj)
|
|
{
|
|
ObjMan->ClearSelection();
|
|
ObjMan->Select(data_point);
|
|
|
|
if (CameraController::GetInstance()->StaysInsideBounds(obj->GetPos(),
|
|
CameraController::GetInstance()->GetYawPitchRange()) == true)
|
|
{
|
|
CameraController::GetInstance()->SetLookAt(obj->GetPos(),false);
|
|
CameraController::GetInstance()->Update();
|
|
CameraController::GetInstance()->SetLookAtMode(true);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CameraController::GetInstance()->SetLookAt(data_point,false);
|
|
CameraController::GetInstance()->Update();
|
|
}
|
|
Refresher::Instance->DrawRefresh();
|
|
|
|
// TODO: Add your message handler code here and/or call default
|
|
|
|
CWnd::OnRButtonDblClk(nFlags, point);
|
|
}
|
|
|
|
|
|
|
|
|
|
void OverviewWindow::DrawHelpers(CDC *pDC)
|
|
{
|
|
pDC->SelectObject(GetStockObject(NULL_BRUSH));
|
|
pDC->SetBkMode(TRANSPARENT);
|
|
pDC->SetTextColor(0x0000ff);
|
|
|
|
|
|
drawInfo.SetDC(pDC);
|
|
|
|
//Draw Grid
|
|
if(DisplayUserGrid)
|
|
{
|
|
pDC->SelectObject(GridPen);
|
|
DrawGrid(UserGridSize.x,UserGridSize.z,pDC);
|
|
}
|
|
|
|
//Draw Tile Grid
|
|
if(DisplayTileGrid)
|
|
{
|
|
pDC->SelectObject(DarkGreenPen);
|
|
DrawGrid(drawInfo.vinf.GetTileSize(),drawInfo.vinf.GetTileSize(),pDC);
|
|
DrawTileEntityCounts(pDC);
|
|
ObjMan->DrawTileViolation(drawInfo);
|
|
}
|
|
|
|
//Draw Zone Grid
|
|
if(ObjMan->IsMultiZone())
|
|
{
|
|
pDC->SelectObject(RedPen);
|
|
DrawGrid(drawInfo.vinf.GetZoneSize(),drawInfo.vinf.GetZoneSize(),pDC);
|
|
}
|
|
else
|
|
if(DisplayZoneGrid)
|
|
{
|
|
pDC->SelectObject(GreenPen);
|
|
DrawGrid(drawInfo.vinf.GetZoneSize(),drawInfo.vinf.GetZoneSize(),pDC);
|
|
}
|
|
|
|
|
|
|
|
// Draw Objects
|
|
switch(TagFlag)
|
|
{
|
|
case TF_NEVER:
|
|
ObjMan->DrawUnSelectedObjects(drawInfo,false);
|
|
ObjMan->DrawSelectedObjects(drawInfo,false);
|
|
break;
|
|
|
|
case TF_ALWAYS:
|
|
ObjMan->DrawUnSelectedObjects(drawInfo,true);
|
|
ObjMan->DrawSelectedObjects(drawInfo,true);
|
|
break;
|
|
|
|
case TF_ONSELECT:
|
|
ObjMan->DrawUnSelectedObjects(drawInfo,false);
|
|
ObjMan->DrawSelectedObjects(drawInfo,true);
|
|
break;
|
|
}
|
|
|
|
|
|
if (ObjMan->GetCameraController())
|
|
ObjMan->GetCameraController()->Draw(drawInfo);
|
|
|
|
//Draw Selection Box
|
|
pDC->SelectObject(GetStockObject(NULL_BRUSH));
|
|
|
|
if(GroupSelecting)
|
|
{
|
|
pDC->SelectObject(BoxPen);
|
|
pDC->Rectangle(GroupSelBox);
|
|
}
|
|
|
|
if(ZoomBoxing)
|
|
{
|
|
pDC->SelectObject(BoxPen);
|
|
pDC->Rectangle(ZoomBox);
|
|
}
|
|
|
|
if (m_DistanceLineStartPos != Stuff::Point3D(-1,-1,-1))
|
|
{
|
|
pDC->MoveTo(drawInfo.vinf.DataToScreen(m_DistanceLineStartPos));
|
|
pDC->LineTo(drawInfo.vinf.DataToScreen(m_DistanceLineEndPos));
|
|
|
|
Stuff::Point3D center(m_DistanceLineStartPos);
|
|
center += m_DistanceLineEndPos;
|
|
center *= 0.5f;
|
|
CPoint center2D(drawInfo.vinf.DataToScreen(center));
|
|
|
|
Stuff::Vector3D delta;
|
|
delta.Subtract(m_DistanceLineStartPos,m_DistanceLineEndPos);
|
|
|
|
CString s;
|
|
s.Format("%.2f",delta.GetApproximateLength());
|
|
|
|
pDC->TextOut(center2D.x + 5,center2D.y + 5,s.GetBuffer(0));
|
|
}
|
|
}
|
|
|
|
|
|
void OverviewWindow::OnClose()
|
|
{
|
|
ShowWindow(SW_HIDE);
|
|
// CWnd::OnClose();
|
|
}
|
|
|
|
bool OverviewWindow::SetCorrectSize(int cx,int cy)
|
|
{
|
|
if(drawInfo.vinf.GetMapRatio()!=(float)cx/cy)
|
|
{
|
|
if(cx<cy)
|
|
{
|
|
// Fix X
|
|
cy=(int)(cx*drawInfo.vinf.GetMapRatio());
|
|
}
|
|
else
|
|
{
|
|
//Fix Y
|
|
cx=(int)(cy/drawInfo.vinf.GetMapRatio());
|
|
}
|
|
|
|
SetWindowPos(NULL,0,0,cx,cy,SWP_NOMOVE|SWP_NOZORDER);
|
|
return false;
|
|
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void OverviewWindow::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
CWnd::OnSize(nType, cx, cy);
|
|
InitBackBuffer();
|
|
}
|
|
|
|
|
|
void OverviewWindow::OnMouseHover(UINT nFlags, CPoint point)
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
LRESULT OverviewWindow::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
// TODO: Add your specialized code here and/or call the base class
|
|
MsgHan.Lock();
|
|
|
|
switch(message)
|
|
{
|
|
case WM_RBUTTONDOWN:
|
|
CameraController::GetInstance()->RBMode=true;
|
|
case WM_LBUTTONDOWN:
|
|
SetCapture();
|
|
break;
|
|
case WM_RBUTTONUP:
|
|
CameraController::GetInstance()->RBMode=false;
|
|
case WM_LBUTTONUP:
|
|
ReleaseCapture();
|
|
break;
|
|
case WM_MOUSELEAVE:
|
|
CameraController::GetInstance()->RBMode=false;
|
|
|
|
break;
|
|
|
|
case WM_MBUTTONDBLCLK:
|
|
{
|
|
drawInfo.vinf.SetZoom(1.0f); // Zoom Extents
|
|
Refresher::Instance->OverviewRefresh();
|
|
}
|
|
break;
|
|
case WM_MBUTTONDOWN:
|
|
{
|
|
CPoint point=CPoint(GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam));
|
|
CPoint ZoomBufferPoint=point;
|
|
ZoomBreakBuffer=false;
|
|
|
|
OldPoint=point;
|
|
ZoomBoxAnchor=point;
|
|
ZoomBox=CRect(point,point);
|
|
ZoomBoxing=false;
|
|
SetCapture();
|
|
}
|
|
break;
|
|
|
|
case WM_MBUTTONUP:
|
|
{
|
|
CPoint point=CPoint(GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam));
|
|
if(ZoomBoxing)
|
|
{
|
|
ZoomBoxing=false;
|
|
if(ZoomBox.Width()!=0 && ZoomBox.Height()!=0)
|
|
{
|
|
Point3D min,max;
|
|
min=drawInfo.vinf.ScreenToData(ZoomBox.TopLeft());
|
|
max=drawInfo.vinf.ScreenToData(ZoomBox.BottomRight());
|
|
drawInfo.vinf.SetViewLimits(min,max);
|
|
Refresher::Instance->OverviewRefresh();
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
drawInfo.vinf.SetPan(point);
|
|
Refresher::Instance->OverviewRefresh();
|
|
}
|
|
ReleaseCapture();
|
|
}
|
|
break;
|
|
|
|
case WM_MOUSEHOVER:
|
|
{
|
|
OnMouseHover((UINT)wParam,CPoint(GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam)));
|
|
|
|
TRACKMOUSEEVENT tme;
|
|
tme.cbSize=sizeof(TRACKMOUSEEVENT);
|
|
tme.dwFlags=TME_HOVER;
|
|
tme.hwndTrack=m_hWnd;
|
|
tme.dwHoverTime=HOVER_DEFAULT;
|
|
_TrackMouseEvent(&tme);
|
|
}
|
|
break;
|
|
|
|
}
|
|
|
|
LRESULT res=CWnd::WindowProc(message, wParam, lParam);
|
|
|
|
MsgHan.Unlock();
|
|
return res;
|
|
}
|
|
|
|
void OverviewWindow::DrawTileEntityCounts( CDC *pDC)
|
|
{
|
|
float xspace=drawInfo.vinf.GetTileSize();
|
|
float yspace=drawInfo.vinf.GetTileSize();
|
|
if(xspace<=0 || yspace<=0) return;
|
|
|
|
Point3D goff,wpnt,min,max;
|
|
drawInfo.vinf.GetViewLimits(&min,&max);
|
|
|
|
goff=drawInfo.vinf.GetMapOrg();
|
|
goff.x=xspace*((goff.x/xspace)-(float)floor(goff.x/xspace));
|
|
goff.z=yspace*((goff.z/yspace)-(float)floor(goff.z/yspace));
|
|
|
|
|
|
CPoint sp,ep;
|
|
float xinc,yinc,xstop,ystop;
|
|
wpnt.y=0.0f;
|
|
|
|
yinc=yspace*(float)floor(min.z/yspace)-goff.z;
|
|
ystop=max.z;
|
|
while(yinc<=ystop)
|
|
{
|
|
xinc=xspace*(float)floor(min.x/xspace)-goff.x;
|
|
xstop=max.x;
|
|
while(xinc<=xstop)
|
|
{
|
|
int tx=(int)((xinc+drawInfo.vinf.GetMapSize().x*0.5f)/xspace),ty=(int)((yinc+drawInfo.vinf.GetMapSize().z*0.5f)/yspace);
|
|
int etcount=EntitiesInTile(tx,ty);
|
|
|
|
if(etcount>0)
|
|
{
|
|
if(etcount<=5) pDC->SetTextColor(0x00ff00);
|
|
else if(etcount>5 && etcount<10 ) pDC->SetTextColor(0x00ffff);
|
|
else if(etcount>=10) pDC->SetTextColor(0x0000ff);
|
|
wpnt.x=xinc;
|
|
wpnt.z=yinc;
|
|
|
|
ep=drawInfo.vinf.DataToScreen(wpnt);
|
|
|
|
wpnt.x=xinc+xspace;
|
|
wpnt.z=yinc+yspace;
|
|
sp=drawInfo.vinf.DataToScreen(wpnt);
|
|
|
|
CRect rct(sp,ep);
|
|
CString txt;
|
|
txt.Format("%i",etcount);
|
|
|
|
pDC->DrawText(txt,&rct,DT_VCENTER|DT_CENTER );
|
|
|
|
}
|
|
|
|
xinc+=xspace;
|
|
}
|
|
yinc+=yspace;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void OverviewWindow::DrawGrid(float xspace, float yspace, CDC *pDC)
|
|
{
|
|
if(xspace<=0 || yspace<=0) return;
|
|
|
|
Point3D goff,wpnt,min,max;
|
|
drawInfo.vinf.GetViewLimits(&min,&max);
|
|
float stop;
|
|
|
|
goff=drawInfo.vinf.GetMapOrg();
|
|
goff.x=xspace*((goff.x/xspace)-(float)floor(goff.x/xspace));
|
|
goff.z=yspace*((goff.z/yspace)-(float)floor(goff.z/yspace));
|
|
|
|
|
|
CPoint sp,ep;
|
|
float inc;
|
|
wpnt.y=0.0f;
|
|
|
|
inc=yspace*(float)floor(min.z/yspace)-goff.z;
|
|
stop=max.z;
|
|
while(inc<=stop)
|
|
{
|
|
wpnt.z=inc;
|
|
|
|
wpnt.x=min.x;
|
|
sp=drawInfo.vinf.DataToScreen(wpnt);
|
|
|
|
wpnt.x=max.x;
|
|
ep=drawInfo.vinf.DataToScreen(wpnt);
|
|
|
|
pDC->MoveTo(sp);
|
|
pDC->LineTo(ep);
|
|
inc+=yspace;
|
|
}
|
|
|
|
inc=xspace*(float)floor(min.x/xspace)-goff.x;
|
|
stop=max.x;
|
|
while(inc<=stop)
|
|
{
|
|
wpnt.x=inc;
|
|
|
|
wpnt.z=min.z;
|
|
sp=drawInfo.vinf.DataToScreen(wpnt);
|
|
|
|
wpnt.z=max.z;
|
|
ep=drawInfo.vinf.DataToScreen(wpnt);
|
|
|
|
pDC->MoveTo(sp);
|
|
pDC->LineTo(ep);
|
|
|
|
inc+=xspace;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL OverviewWindow::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
|
|
{
|
|
|
|
CPoint point=pt;
|
|
|
|
CRect crct;
|
|
ScreenToClient(&point);
|
|
GetWindowRect(&crct);
|
|
Point3D newpan=drawInfo.vinf.ScreenToData(point);
|
|
|
|
if(zDelta>0)
|
|
drawInfo.vinf.MultiplyZoom(1.5f);
|
|
else
|
|
drawInfo.vinf.MultiplyZoom(1/1.5f);
|
|
|
|
if(crct.PtInRect(pt))
|
|
{
|
|
drawInfo.vinf.SetPan( newpan);
|
|
}
|
|
|
|
Refresher::Instance->OverviewRefresh();
|
|
return CWnd::OnMouseWheel(nFlags, zDelta, pt);
|
|
}
|
|
|
|
|
|
void OverviewWindow::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
Point3D porg=drawInfo.vinf.ScreenToData(CPoint(0,0));
|
|
Point3D mpoint;
|
|
bool pmmz=ObjMan->IsMultiZone();
|
|
|
|
switch(nChar)
|
|
{
|
|
|
|
case VK_UP:
|
|
{
|
|
mpoint=drawInfo.vinf.ScreenToData(CPoint(0,-1*nRepCnt));
|
|
mpoint-=porg;
|
|
ObjMan->OffsetSelection(mpoint);
|
|
|
|
if(!pmmz && ObjMan->IsMultiZone() )
|
|
{
|
|
mpoint.x=-mpoint.x;
|
|
mpoint.y=-mpoint.y;
|
|
mpoint.z=-mpoint.z;
|
|
ObjMan->OffsetSelection(mpoint);
|
|
}
|
|
|
|
Refresher::Instance->DrawRefresh();
|
|
break;
|
|
}
|
|
|
|
case VK_DOWN:
|
|
{
|
|
mpoint=drawInfo.vinf.ScreenToData(CPoint(0,1*nRepCnt));
|
|
mpoint-=porg;
|
|
ObjMan->OffsetSelection(mpoint);
|
|
|
|
if(!pmmz && ObjMan->IsMultiZone() )
|
|
{
|
|
mpoint.x=-mpoint.x;
|
|
mpoint.y=-mpoint.y;
|
|
mpoint.z=-mpoint.z;
|
|
ObjMan->OffsetSelection(mpoint);
|
|
}
|
|
|
|
Refresher::Instance->DrawRefresh();
|
|
break;
|
|
}
|
|
|
|
case VK_LEFT:
|
|
{
|
|
mpoint=drawInfo.vinf.ScreenToData(CPoint(-1*nRepCnt,0));
|
|
mpoint-=porg;
|
|
ObjMan->OffsetSelection(mpoint);
|
|
|
|
if(!pmmz && ObjMan->IsMultiZone() )
|
|
{
|
|
mpoint.x=-mpoint.x;
|
|
mpoint.y=-mpoint.y;
|
|
mpoint.z=-mpoint.z;
|
|
ObjMan->OffsetSelection(mpoint);
|
|
}
|
|
|
|
Refresher::Instance->DrawRefresh();
|
|
break;
|
|
}
|
|
|
|
case VK_RIGHT:
|
|
{
|
|
mpoint=drawInfo.vinf.ScreenToData(CPoint(1*nRepCnt,0));
|
|
mpoint-=porg;
|
|
ObjMan->OffsetSelection(mpoint);
|
|
|
|
if(!pmmz && ObjMan->IsMultiZone() )
|
|
{
|
|
mpoint.x=-mpoint.x;
|
|
mpoint.y=-mpoint.y;
|
|
mpoint.z=-mpoint.z;
|
|
ObjMan->OffsetSelection(mpoint);
|
|
}
|
|
|
|
Refresher::Instance->DrawRefresh();
|
|
break;
|
|
}
|
|
|
|
case VK_SPACE:
|
|
{
|
|
OldCur=SetCursor(HandCur);
|
|
}
|
|
break;
|
|
case VK_RETURN:
|
|
{
|
|
ObjMan->SetPropertiesOfSelected(this);
|
|
Refresher::Instance->WorldRefresh();
|
|
|
|
// Refresher::Instance->DrawRefresh();
|
|
// Refresher::Instance->ObjManListRefresh();
|
|
break;
|
|
}
|
|
|
|
case VK_DELETE:
|
|
{
|
|
ObjMan->DeleteSelection();
|
|
Refresher::Instance->WorldRefresh();
|
|
break;
|
|
}
|
|
|
|
case 'M':
|
|
{
|
|
if (m_DistanceLineStartPos == Stuff::Point3D(-1,-1,-1))
|
|
{
|
|
m_DistanceLineStartPos = drawInfo.vinf.ScreenToData(m_LastMousePos);
|
|
m_DistanceLineEndPos = m_DistanceLineStartPos;
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
|
|
}
|
|
|
|
void OverviewWindow::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
switch(nChar)
|
|
{
|
|
case VK_UP:
|
|
case VK_DOWN:
|
|
case VK_LEFT:
|
|
case VK_RIGHT:
|
|
ObjMan->SavePosForUndo();
|
|
break;
|
|
|
|
case VK_SPACE:
|
|
{
|
|
SetCursor(OldCur);
|
|
}
|
|
break;
|
|
|
|
case 'M':
|
|
{
|
|
m_DistanceLineStartPos = Stuff::Point3D(-1,-1,-1);
|
|
m_DistanceLineEndPos = m_DistanceLineStartPos;
|
|
break;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
void OverviewWindow::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
|
|
CWnd::OnChar(nChar, nRepCnt, nFlags);
|
|
}
|
|
|
|
void OverviewWindow::SetViewMode(ViewMode vm)
|
|
{
|
|
CurrentVMode=vm;
|
|
BuildBackGround();
|
|
Refresher::Instance->OverviewRefresh();
|
|
}
|
|
|
|
void OverviewWindow::SaveToReg()
|
|
{
|
|
m_COverviewProperties->SaveToReg();
|
|
gos_SaveDataToRegistry("Show Flags",&ShowFlag,sizeof(ShowFlag));
|
|
|
|
CRect rct;
|
|
CString wintitle;
|
|
GetWindowText(wintitle);
|
|
|
|
|
|
gos_SaveDataToRegistry((char *)(LPCSTR)(wintitle+"DisplayUserGrid"),&DisplayUserGrid,sizeof(DisplayUserGrid));
|
|
gos_SaveDataToRegistry((char *)(LPCSTR)(wintitle+"ZoneGrid"),&DisplayZoneGrid,sizeof(DisplayZoneGrid));
|
|
gos_SaveDataToRegistry((char *)(LPCSTR)(wintitle+"TileGrid"),&DisplayTileGrid,sizeof(DisplayTileGrid));
|
|
gos_SaveDataToRegistry((char *)(LPCSTR)(wintitle+"UserGridSize"),&UserGridSize,sizeof(UserGridSize));
|
|
gos_SaveDataToRegistry((char *)(LPCSTR)(wintitle+"TagFlag"),&TagFlag,sizeof(TagFlag));
|
|
gos_SaveDataToRegistry((char *)(LPCSTR)(wintitle+"ViewMode"),&CurrentVMode,sizeof(CurrentVMode));
|
|
|
|
drawInfo.SaveToReg();
|
|
}
|
|
|
|
void OverviewWindow::LoadFromReg()
|
|
{
|
|
unsigned long size;
|
|
CRect rct;
|
|
CString wintitle;
|
|
GetWindowText(wintitle);
|
|
|
|
drawInfo.LoadFromReg();
|
|
m_COverviewProperties->LoadFromReg();
|
|
|
|
gos_LoadDataFromRegistry("Show Flags",&ShowFlag,&size);
|
|
m_COverviewProperties->Refresh();
|
|
ObjMan->UpdateVisibility(ShowFlag);
|
|
|
|
size=sizeof(DisplayUserGrid);
|
|
gos_LoadDataFromRegistry((char *)(LPCSTR)(wintitle+"DisplayUserGrid"),&DisplayUserGrid,&size);
|
|
size=sizeof(DisplayZoneGrid);
|
|
gos_LoadDataFromRegistry((char *)(LPCSTR)(wintitle+"ZoneGrid"),&DisplayZoneGrid,&size);
|
|
size=sizeof(DisplayTileGrid);
|
|
gos_LoadDataFromRegistry((char *)(LPCSTR)(wintitle+"TileGrid"),&DisplayTileGrid,&size);
|
|
size=sizeof(UserGridSize);
|
|
gos_LoadDataFromRegistry((char *)(LPCSTR)(wintitle+"UserGridSize"),&UserGridSize,&size);
|
|
|
|
|
|
|
|
|
|
size=sizeof(TagFlag);
|
|
gos_LoadDataFromRegistry((char *)(LPCSTR)(wintitle+"TagFlag"),&TagFlag,&size);
|
|
|
|
size=sizeof(CurrentVMode);
|
|
gos_LoadDataFromRegistry((char *)(LPCSTR)(wintitle+"ViewMode"),&CurrentVMode,&size);
|
|
}
|
|
|
|
void OverviewWindow::OnBackgroundHeightfield()
|
|
{
|
|
SetViewMode(OverviewWindow::VM_HFIELD);
|
|
}
|
|
|
|
void OverviewWindow::OnBackgroundSlopemap()
|
|
{
|
|
SetViewMode(OverviewWindow::VM_SLOPEMAP);
|
|
}
|
|
|
|
void OverviewWindow::OnBackgroundTexture()
|
|
{
|
|
SetViewMode(OverviewWindow::VM_TEXTURE);
|
|
}
|
|
|
|
void OverviewWindow::OnEditCopy()
|
|
{
|
|
if(!ObjMan->CopySelection())
|
|
MessageBox("Copy Operation Failed","Copy Fail",MB_OK);
|
|
|
|
Refresher::Instance->WorldRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnEditCut()
|
|
{
|
|
if(!ObjMan->CutSelection())
|
|
MessageBox("Cut Operation Failed","Cut Fail",MB_OK);
|
|
|
|
Refresher::Instance->WorldRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnEditDelete()
|
|
{
|
|
ObjMan->DeleteSelection();
|
|
Refresher::Instance->WorldRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnEditGroup()
|
|
{
|
|
ObjMan->GroupSelected();
|
|
Refresher::Instance->WorldRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnEditPaste()
|
|
{
|
|
ObjMan->PasteClipBoard();
|
|
Refresher::Instance->WorldRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnEditRedo()
|
|
{
|
|
ObjMan->Redo();
|
|
Refresher::Instance->WorldRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnEditUndo()
|
|
{
|
|
ObjMan->Undo();
|
|
Refresher::Instance->WorldRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnEditUngoup()
|
|
{
|
|
ObjMan->UnGroupSelected();
|
|
Refresher::Instance->WorldRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnUpdateBackgroundHeightfield(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck(GetViewMode()==OverviewWindow::VM_HFIELD?1:0);
|
|
}
|
|
|
|
void OverviewWindow::OnUpdateBackgroundSlopemap(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck(GetViewMode()==OverviewWindow::VM_SLOPEMAP?1:0);
|
|
}
|
|
|
|
void OverviewWindow::OnUpdateBackgroundTexture(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck(GetViewMode()==OverviewWindow::VM_TEXTURE?1:0);
|
|
}
|
|
|
|
void OverviewWindow::OnViewHelpersShowbounds()
|
|
{
|
|
if(ShowFlag&SHOW_BOUNDS)
|
|
ShowFlag&=~SHOW_BOUNDS;
|
|
else
|
|
ShowFlag|=SHOW_BOUNDS;
|
|
|
|
ObjMan->UpdateVisibility(ShowFlag);
|
|
Refresher::Instance->WorldRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnViewHelpersShowlattice()
|
|
{
|
|
if(ShowFlag&SHOW_LATTICE)
|
|
ShowFlag&=~SHOW_LATTICE;
|
|
else
|
|
ShowFlag|=SHOW_LATTICE;
|
|
|
|
ObjMan->UpdateVisibility(ShowFlag);
|
|
Refresher::Instance->WorldRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnViewHelpersShowpaths()
|
|
{
|
|
if(ShowFlag&SHOW_PATHS)
|
|
ShowFlag&=~SHOW_PATHS;
|
|
else
|
|
ShowFlag|=SHOW_PATHS;
|
|
|
|
ObjMan->UpdateVisibility(ShowFlag);
|
|
Refresher::Instance->WorldRefresh();
|
|
|
|
}
|
|
|
|
void OverviewWindow::OnViewHelpersShowtilebounds()
|
|
{
|
|
DisplayTileGrid=!DisplayTileGrid;
|
|
Refresher::Instance->OverviewRefresh();
|
|
|
|
}
|
|
|
|
void OverviewWindow::OnViewHelpersShowusergrid()
|
|
{
|
|
DisplayUserGrid=!DisplayUserGrid;
|
|
Refresher::Instance->OverviewRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnViewHelpersShowzonebounds()
|
|
{
|
|
DisplayZoneGrid=!DisplayZoneGrid;
|
|
Refresher::Instance->OverviewRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnUpdateViewHelpersShowbounds(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck((ShowFlag&SHOW_BOUNDS)?1:0);
|
|
}
|
|
|
|
void OverviewWindow::OnUpdateViewHelpersShowlattice(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck((ShowFlag&SHOW_LATTICE)?1:0);
|
|
}
|
|
|
|
void OverviewWindow::OnUpdateViewHelpersShowpaths(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck((ShowFlag&SHOW_PATHS)?1:0);
|
|
}
|
|
|
|
void OverviewWindow::OnUpdateViewHelpersShowtilebounds(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck(DisplayTileGrid?1:0);
|
|
}
|
|
|
|
void OverviewWindow::OnUpdateViewHelpersShowusergrid(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck(DisplayUserGrid?1:0);
|
|
}
|
|
|
|
void OverviewWindow::OnUpdateViewHelpersShowzonebounds(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck(DisplayZoneGrid?1:0);
|
|
}
|
|
|
|
void OverviewWindow::OnViewSetusergridproperties()
|
|
{
|
|
CGridProps dlg;
|
|
dlg.m_XDist=UserGridSize.x;
|
|
dlg.m_YDist=UserGridSize.z;
|
|
|
|
if(dlg.DoModal()==IDOK)
|
|
{
|
|
UserGridSize.x=dlg.m_XDist;
|
|
UserGridSize.z=dlg.m_YDist;
|
|
DisplayUserGrid=true;
|
|
Refresher::Instance->OverviewRefresh();
|
|
}
|
|
}
|
|
|
|
void OverviewWindow::OnViewSetpencolors()
|
|
{
|
|
CPenProps dlg(&drawInfo,this);
|
|
dlg.DoModal();
|
|
Refresher::Instance->OverviewRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnUpdateEditRedo(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->Enable(ObjMan->CanRedo());
|
|
}
|
|
|
|
void OverviewWindow::OnUpdateEditUndo(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->Enable(ObjMan->CanUndo());
|
|
}
|
|
|
|
void OverviewWindow::OnToolsCreatelattice()
|
|
{
|
|
CString lattice_warn,warn;
|
|
lattice_warn.LoadString(IDS_LATTICEWARNING);
|
|
warn.LoadString(IDS_WARNING);
|
|
if (MessageBox(lattice_warn,warn,MB_ICONQUESTION | MB_YESNO) == IDNO)
|
|
return;
|
|
ObjMan->CreateLattice();
|
|
ShowFlag|=SHOW_LATTICE;
|
|
ObjMan->UpdateVisibility(ShowFlag);
|
|
Refresher::Instance->WorldRefresh();
|
|
|
|
}
|
|
|
|
void OverviewWindow::OnToolsRecalclatticelinks()
|
|
{
|
|
ObjMan->RecalcLatticeLinks();
|
|
ShowFlag|=SHOW_LATTICE;
|
|
ObjMan->UpdateVisibility(ShowFlag);
|
|
Refresher::Instance->WorldRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnToolsResetmissionbounds()
|
|
{
|
|
ObjMan->ResetBounds();
|
|
ShowFlag|=SHOW_BOUNDS;
|
|
ObjMan->UpdateVisibility(ShowFlag);
|
|
Refresher::Instance->OverviewRefresh();
|
|
|
|
}
|
|
|
|
void OverviewWindow::OnOptionsSetdefaultalignment()
|
|
{
|
|
CAlignDlg dlg;
|
|
|
|
dlg.m_alignment=ObjMan->GetDefaultAlignment();
|
|
if(dlg.DoModal()==IDOK)
|
|
{
|
|
ObjMan->SetDefaultAlignment(dlg.m_alignment);
|
|
}
|
|
|
|
}
|
|
|
|
void OverviewWindow::OnViewTagsShowcustom()
|
|
{
|
|
CCustomTagDlg dlg;
|
|
|
|
|
|
Refresher::Instance->OverviewRefresh();
|
|
|
|
dlg.m_ShowTags=ShowTagsAlways;
|
|
dlg.TagFlag=ObjMan->GetTagFlags();
|
|
|
|
if(dlg.DoModal()==IDOK)
|
|
{
|
|
ObjMan->SetTagFlags(dlg.TagFlag);
|
|
Refresher::Instance->OverviewRefresh();
|
|
Refresher::Instance->ObjManListRefresh();
|
|
|
|
ShowTagsAlways=dlg.m_ShowTags?true:false;
|
|
|
|
if(ShowTagsAlways)
|
|
TagFlag=TF_ALWAYS;
|
|
else
|
|
TagFlag=TF_ONSELECT;
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
int OverviewWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CWnd::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
m_COverviewProperties = new COverviewProperties(ObjMan,&ShowFlag,GetParent()->GetParent());
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
BOOL OverviewWindow::OnEraseBkgnd(CDC* pDC)
|
|
{
|
|
|
|
return CWnd::OnEraseBkgnd(pDC);
|
|
}
|
|
|
|
void OverviewWindow::OnToolsDispersewithbitmap()
|
|
{
|
|
CDisperseDlg dlg(ObjMan);
|
|
|
|
if(dlg.DoModal()==IDOK)
|
|
{
|
|
|
|
ObjMan->UpdateVisibility(ShowFlag);
|
|
Refresher::Instance->WorldRefresh();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void OverviewWindow::OnToolsSnapobjecttoterrain()
|
|
{
|
|
ObjMan->SnapObjectToGround(true);
|
|
Refresher::Instance->DrawRefresh();
|
|
|
|
}
|
|
|
|
|
|
void OverviewWindow::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
YawPitchRoll rot(0,0,0);
|
|
UnitQuaternion quatrot;
|
|
|
|
if(nFlags&0x2000) //Alt Key is Down
|
|
if(GetAsyncKeyState(VK_SHIFT))
|
|
{
|
|
switch(nChar)
|
|
{
|
|
|
|
case VK_UP:
|
|
{
|
|
rot.pitch=-5*Radians_Per_Degree*nRepCnt;
|
|
quatrot=rot;
|
|
ObjMan->RotateSelection(quatrot);
|
|
Refresher::Instance->DrawRefresh();
|
|
break;
|
|
}
|
|
|
|
case VK_DOWN:
|
|
{
|
|
rot.pitch=+5*Radians_Per_Degree*nRepCnt;
|
|
quatrot=rot;
|
|
ObjMan->RotateSelection(quatrot);
|
|
Refresher::Instance->DrawRefresh();
|
|
break;
|
|
}
|
|
|
|
case VK_LEFT:
|
|
{
|
|
rot.roll=-5*Radians_Per_Degree*nRepCnt;
|
|
quatrot=rot;
|
|
ObjMan->RotateSelection(quatrot);
|
|
Refresher::Instance->DrawRefresh();
|
|
break;
|
|
}
|
|
|
|
case VK_RIGHT:
|
|
{
|
|
rot.roll=5*Radians_Per_Degree*nRepCnt;
|
|
quatrot=rot;
|
|
ObjMan->RotateSelection(quatrot);
|
|
Refresher::Instance->DrawRefresh();
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
switch(nChar)
|
|
{
|
|
|
|
case VK_UP:
|
|
{
|
|
ObjMan->OffsetSelection(Point3D(0,1.0f,0));
|
|
Refresher::Instance->DrawRefresh();
|
|
break;
|
|
}
|
|
|
|
case VK_DOWN:
|
|
{
|
|
ObjMan->OffsetSelection(Point3D(0,-1.0f,0));
|
|
Refresher::Instance->DrawRefresh();
|
|
break;
|
|
}
|
|
|
|
case VK_LEFT:
|
|
{
|
|
rot.yaw=5*Radians_Per_Degree*nRepCnt;
|
|
quatrot=rot;
|
|
ObjMan->RotateSelection(quatrot);
|
|
Refresher::Instance->DrawRefresh();
|
|
break;
|
|
}
|
|
|
|
case VK_RIGHT:
|
|
{
|
|
rot.yaw=-5*Radians_Per_Degree*nRepCnt;
|
|
quatrot=rot;
|
|
ObjMan->RotateSelection(quatrot);
|
|
Refresher::Instance->DrawRefresh();
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
CWnd::OnSysKeyDown(nChar, nRepCnt, nFlags);
|
|
}
|
|
|
|
void OverviewWindow::OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
if(nFlags&0x2000) //Alt Key is Down
|
|
switch(nChar)
|
|
{
|
|
case VK_UP:
|
|
case VK_DOWN:
|
|
case VK_LEFT:
|
|
case VK_RIGHT:
|
|
ObjMan->SavePosForUndo();
|
|
break;
|
|
}
|
|
|
|
CWnd::OnSysKeyUp(nChar, nRepCnt, nFlags);
|
|
}
|
|
|
|
void OverviewWindow::OnOptionsFilllattice()
|
|
{
|
|
drawInfo.UseBrushes=!drawInfo.UseBrushes;
|
|
Refresher::Instance->OverviewRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnUpdateOptionsFilllattice(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck(drawInfo.UseBrushes);
|
|
}
|
|
|
|
void OverviewWindow::OnToolsDumpoverveiwcontentstofile()
|
|
{
|
|
CFileDialog dlg1(FALSE,"Tiffs","Output.tif",OFN_NOCHANGEDIR,"Tiffs (*.tif)|*.tif||",this);
|
|
|
|
if(dlg1.DoModal()==IDOK)
|
|
{
|
|
Image finalimage;
|
|
|
|
finalimage.CreateBlank((int)(ObjMan->GetMapSize().x/5),(int)(ObjMan->GetMapSize().z/5),
|
|
ITYPE_RGB,24,RGBMask(0xff0000,0x00ff00,0x0000ff));
|
|
|
|
switch(CurrentVMode)
|
|
{
|
|
case VM_TEXTURE:
|
|
ObjMan->LoadTerrainTexture(&finalimage);
|
|
break;
|
|
case VM_HFIELD:
|
|
ObjMan->BuildHFFromMap(&finalimage);
|
|
break;
|
|
case VM_SLOPEMAP:
|
|
{
|
|
Point3D pnt=ObjMan->BuildHFFromMap(&finalimage);
|
|
ObjMan->MakeSlopeMap(&finalimage,pnt);
|
|
}
|
|
break;
|
|
default: STOP(("Invalid View Mode"));
|
|
}
|
|
|
|
CBitmap bmp;
|
|
|
|
BOOL res;
|
|
void *gres;
|
|
|
|
CDC *pDC=GetDC(),memDC;
|
|
res=bmp.CreateCompatibleBitmap(pDC,finalimage.GetWidth(),finalimage.GetHeight());
|
|
Verify(res);
|
|
res=memDC.CreateCompatibleDC(pDC);
|
|
Verify(res);
|
|
gres=memDC.SelectObject(bmp);
|
|
Verify(gres);
|
|
|
|
|
|
BITMAPINFO binf;
|
|
ZeroMemory(&binf,sizeof(binf));
|
|
binf.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
|
|
binf.bmiHeader.biWidth=finalimage.GetWidth();
|
|
binf.bmiHeader.biHeight=-finalimage.GetHeight();
|
|
binf.bmiHeader.biPlanes=1;
|
|
binf.bmiHeader.biBitCount=finalimage.GetBpp();
|
|
binf.bmiHeader.biCompression=BI_RGB;
|
|
|
|
res=SetDIBitsToDevice(memDC,0,0,finalimage.GetWidth(),
|
|
finalimage.GetHeight(),0,0,0,finalimage.GetHeight(),finalimage.Lock(),
|
|
&binf,DIB_RGB_COLORS);
|
|
Verify(res);
|
|
|
|
finalimage.UnLock();
|
|
|
|
|
|
ViewWindowInfo oldinfo=drawInfo.vinf;
|
|
drawInfo.vinf.SetClientArea(CSize(finalimage.GetWidth(),finalimage.GetHeight()));
|
|
drawInfo.vinf.SetZoom(1.0f); // Zoom Extents
|
|
drawInfo.vinf.SetPan(Point3D(0.0f,0.0f,0.0f));
|
|
|
|
DrawHelpers(&memDC);
|
|
drawInfo.vinf=oldinfo;
|
|
|
|
res=GetDIBits(memDC,bmp,0,finalimage.GetHeight(),finalimage.Lock(),&binf,DIB_RGB_COLORS);
|
|
Verify(res);
|
|
finalimage.UnLock();
|
|
|
|
finalimage.SaveTiff((char *)(LPCSTR)dlg1.GetPathName());
|
|
|
|
memDC.DeleteDC();
|
|
bmp.DeleteObject();
|
|
ReleaseDC(pDC);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void OverviewWindow::OnViewZoomin()
|
|
{
|
|
drawInfo.vinf.MultiplyZoom(1.5f);
|
|
Refresher::Instance->OverviewRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnViewZoomout()
|
|
{
|
|
drawInfo.vinf.MultiplyZoom(1/1.5f);
|
|
Refresher::Instance->OverviewRefresh();
|
|
}
|
|
|
|
void OverviewWindow::OnViewTagsShowtags()
|
|
{
|
|
if(TagFlag==TF_NEVER)
|
|
{
|
|
TagFlag=ShowTagsAlways?TF_ALWAYS:TF_ONSELECT;
|
|
}
|
|
else
|
|
TagFlag=TF_NEVER;
|
|
|
|
|
|
}
|
|
|
|
void OverviewWindow::OnUpdateViewTagsShowtags(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck(TagFlag!=TF_NEVER?1:0);
|
|
}
|