reman3/Rayman_X/cpa/tempgrp/ITF/devdevic.cpp

1292 lines
36 KiB
C++

/*=========================================================================
* DEVDevic.cpp : Implementation of device.
* This is a part of the CPA project.
*
* Version 1.0
* Creation date 26/06/96
* Revision date
*
*
* (c) Ubi Studios 1996
*=======================================================================*/
#include "stdafx.h"
#include "acp_base.h"
#include "geo.h"
#include "gli.h"
#include "col.h"
#define HieFriend
#include "spo.h"
#include "main.h"
#include "lst.hpp"
#include "IncTUT.h"
#include "itf/CPARes.h"
#include "itf/DEVDevic.hpp"
#include "itf/DEVVp3D.hpp"
//#include "itf/DEVVp2D.hpp"
#include "itf/DEVMulti.hpp"
#include "itf/DEVMul3D.hpp"
#include "itf/CPAProj.hpp"
#include "itf/cpamworl.hpp"
#include "itf/StdDLLId.h"
#include "itf/camdllb.hpp"
#include "itf/CPAConst.hpp"
#include "acp_driver.h"
#ifdef USE_DIRECTX
extern "C"
{
#include "gliglou\multidrv\inc\dllinter.h"
}
#endif
/*
#define M_GetParent ((DEV_MultiDevice*)GetWindowParent())
#define M_GetParentFrame() ((FRMBaseMenu *) (GetParent()->GetParent()->GetParent()))
#define M_GetParentDialogBar() (&(M_GetParentFrame()->m_oGeneralDialogBar))
*/
// type of Device.
#define DEV_NORMAL 0
#define DEV_BACKGROUND 1
BEGIN_MESSAGE_MAP(DEV_Device, CWnd)
//{{AFX_MSG_MAP(DEV_Device)
ON_WM_DESTROY()
ON_WM_SIZE()
ON_WM_MOUSEACTIVATE()
ON_WM_CREATE()
ON_WM_WINDOWPOSCHANGING()
ON_WM_WINDOWPOSCHANGED()
ON_WM_PAINT()
ON_WM_SYSCOMMAND()
ON_WM_NCACTIVATE()
ON_WM_NCHITTEST()
ON_WM_SIZING()
ON_WM_NCLBUTTONDBLCLK()
ON_WM_NCCALCSIZE()
ON_WM_NCHITTEST()
ON_WM_NCPAINT()
ON_WM_NCRBUTTONDOWN()
ON_WM_NCLBUTTONDOWN()
ON_WM_NCLBUTTONUP()
ON_WM_NCMOUSEMOVE()
ON_COMMAND(CPA_ID_DEVICEMENU_VIEWINGAME, OnCxtMenu1)
ON_COMMAND(CPA_IDB_DEVICE_TILE_VERT, OnCxtMenu2)
ON_COMMAND(CPA_IDB_DEVICE_TILE_HORZ, OnCxtMenu3)
ON_COMMAND(CPA_IDB_DEVICE_CASCADE, OnCxtMenu4)
ON_COMMAND(CPA_IDB_DEVICE_MAXIMIZE, OnCxtMenu5)
ON_COMMAND(CPA_IDB_DEVICE_RESTORE, OnCxtMenu6)
ON_COMMAND(CPA_IDM_DEVICE_CLOSE, OnCxtMenu7)
ON_COMMAND(CPA_IDM_DEVICE_CLOSEALL, OnCxtMenu8)
ON_COMMAND(CPA_IDM_DEVICE_NEWDEVICE, OnCxtMenu9)
ON_COMMAND(CPA_ID_DEVICEMENU_SPLITVERTICAL, OnCxtMenu10)
ON_COMMAND(CPA_ID_DEVICEMENU_SPLITHORIZONTAL, OnCxtMenu11)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//================================================================================
//================================================================================
DEV_Device::DEV_Device()
{
m_bIsMaximize = 0;
mbGameRefresh = TRUE;
m_oSizingRect.SetRectEmpty();
m_dfProp = 0;
}
DEV_Device::~DEV_Device()
{
}
//================================================================================
//================================================================================
FRMBaseMenu *DEV_Device::GetParentFrame()
{
return GetParentMultiDevice()->GetParentFrame();
}
//================================================================================
//================================================================================
CPA_DialogBar * DEV_Device::GetParentDialogBar()
{
return &GetParentFrame()->m_oGeneralDialogBar;
}
//================================================================================
//================================================================================
// return the number of Device
int DEV_Device::GetNumber()
{
return mNumber;
}
//================================================================================
//================================================================================
// Return the Camera if this is a device 3D else return NULL.
GLI_tdxHandleToCamera DEV_Device::GetCamera()
{
if (mViewType == C_DEVICE3D)
return ((DEV_ViewPort3D *)mpViewPort)->GetEngineCamera();
else return NULL;
}
//================================================================================
//================================================================================
// stocks the number of Device
void DEV_Device::SetNumber(int number)
{
mNumber = number;
}
void DEV_Device::CreateDevice(void *device,int x, int y,int w, int h, UINT ViewType)
{
CPA_CameraDLLBase *p_oCamDLL = NULL;
CPA_Object *p_oCamera = NULL;
m_p_oWndParent = (CWnd*) device;
mType = DEV_NORMAL;
mViewType = ViewType;
Create(NULL, NULL,
WS_THICKFRAME | WS_OVERLAPPED | WS_CLIPSIBLINGS | WS_VISIBLE | WS_CHILD | WS_CAPTION | WS_MAXIMIZEBOX,
CRect(x,y,x+w,y+h), m_p_oWndParent, 1);
// positioning the Device in top plan
SetWindowPos(&wndTop,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE );
// if the dialogbar exists, ok. else, it camera creation will be done in the framebase
/* if (GetParentDialogBar() != NULL)
{
// create the default camera for the device
p_oCamDLL = (CPA_CameraDLLBase*) M_GetMainApp()->m_p_oMainWorld->GetObjectDLLWithName(C_szDLLCameraName);
ASSERT(p_oCamDLL != NULL);
p_oCamera = p_oCamDLL->CreateDefaultCamera();
ASSERT(p_oCamera != NULL);
((DEV_ViewPort3D*)GetViewPort())->ChangeCamera(p_oCamera);
}
*/
// stake has day of the list of the existing Devices
GetParentMultiDevice()->SetActivDevice(GetNumber(),TRUE);
// stake has days of active Device
//GetParentMultiDevice()->SetFocusDevice(GetNumber());
mbFullScreen = FALSE;
}
//================================================================================
//================================================================================
BOOL DEV_Device::IsMaximize()
{
return (m_bIsMaximize || (mType == DEV_BACKGROUND));
}
//================================================================================
//================================================================================
// creation of a background Device
// first Device created
void DEV_Device::CreateDeviceBackground(void * device, UINT ViewType)
{
CRect stRect;
m_p_oWndParent = (CWnd*)device;
mType = DEV_BACKGROUND; // definition of type
mViewType = ViewType;
GetParentMultiDevice()->GetClientRect(&stRect);
//GetParentFrame()->GetClientRect(&stRect);
//GetClientRect(&stRect);
Create(NULL, (LPCTSTR) "",
WS_OVERLAPPED | WS_CLIPSIBLINGS | WS_VISIBLE | WS_CHILD | WS_MAXIMIZE,
stRect, m_p_oWndParent, 1);
// positioning of Device in rear plan
SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
// SetWindowPos(&wndTop, 250, 250, 0, 0, SWP_NOSIZE);//chbani
/* if (M_GetMainWnd())
{
if (M_GetMainDevice()->GetDevice(0) != this)
{
CPA_CameraDLLBase *p_oCamDLL = NULL;
CPA_Object *p_oCamera = NULL;
// we are not in the game device
// so, create a camera for this device
p_oCamDLL = (CPA_CameraDLLBase*) M_GetMainApp()->m_p_oMainWorld->GetObjectDLLWithName(C_szDLLCameraName);
ASSERT(p_oCamDLL != NULL);
p_oCamera = p_oCamDLL->CreateDefaultCamera();
ASSERT(p_oCamera != NULL);
((DEV_ViewPort3D*)GetViewPort())->ChangeCamera(p_oCamera);
}
}
*/ GetParentMultiDevice()->SetActivDevice(GetNumber(),TRUE); // stake has day of the list of the existing Device
//GetParentMultiDevice()->SetFocusDevice(GetNumber()); // stake has days of active Device
mbFullScreen = FALSE;
}
//================================================================================
//================================================================================
void DEV_Device::OnDestroy()
{
WaitForSingleObject(M_GetMainApp()->m_hDrawSem, INFINITE);
CWnd::OnDestroy();
// Destroy the DisplayViewport.
// fn_bDeleteViewport3D(mDisplayDevice3D, mViewPort.GetDisplayViewport3D());
GLD_bReleaseViewportAndDevice(m_hDisplayDevice,mpViewPort->m_hDisplayViewport);
mpViewPort->SendMessage(WM_DESTROY);
delete(mpViewPort);
GetParentMultiDevice()->SetActivDevice(GetNumber(),FALSE);
CWnd *topWnd=this;
Freeze();
while(1)
{
if((mType != DEV_BACKGROUND) && ((topWnd=topWnd->GetNextWindow()) != NULL))
{
if (GetParentMultiDevice()->IsDevice((DEV_Device *)topWnd))
{
GetParentMultiDevice()->SetFocusDevice( ((DEV_Device*)topWnd)->GetNumber() );
break;
}
}
else
{
GetParentMultiDevice()->SetFocusDevice( -1 );
break;
}
}
ReleaseSemaphore(M_GetMainApp()->m_hDrawSem, 1, NULL);
// Destroy bitmap
m_oBmClose.DeleteObject();
m_oBmGameRefresh1.DeleteObject();
m_oBmGameRefresh2.DeleteObject();
}
//================================================================================
//================================================================================
void DEV_Device::OnSizing(UINT nSide, LPRECT lpRect)
{
char cFlags;
char cKey = M_GetMainApp()->mp_oDevKeyboard->mfn_cActionToKey(KA_PropSizing, &cFlags);
int iLW, iLH, iNW, iNH, iDW, iDH;
if(GetAsyncKeyState(cKey) >= 0)
{
m_dfProp = ((double) (lpRect->right - lpRect->left + 1)) / ((double) (lpRect->bottom - lpRect->top + 1));
m_oSizingRect.SetRect(lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
}
else
{
iLW = m_oSizingRect.right - m_oSizingRect.left + 1;
iLH = m_oSizingRect.bottom - m_oSizingRect.top + 1;
iNW = lpRect->right - lpRect->left + 1;
iNH = lpRect->bottom - lpRect->top + 1;
iDW = iNW - iLW;
iDH = iNH - iLH;
if((abs(iDW) >= abs(iDH)) || (nSide == WMSZ_BOTTOMRIGHT))
{
iNH = (int) ((double) iNW / m_dfProp);
lpRect->bottom = lpRect->top + iNH;
}
else
{
iNW = (int) ((double) iNH * m_dfProp);
lpRect->right = lpRect->left + iNW;
}
m_oSizingRect.SetRect(lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
}
}
//================================================================================
//================================================================================
void DEV_Device::OnSize(UINT type, int cx, int cy)
{
RECT r;
if(mNumber)
WaitForSingleObject(M_GetMainApp()->m_hDrawSem, INFINITE);
if (!IsFreezed())
{
CWnd::OnSize(type, cx, cy);
GetWindowRect(&m_oSizingRect);
m_dfProp = ((double) (m_oSizingRect.right - m_oSizingRect.left + 1)) / ((double) (m_oSizingRect.bottom - m_oSizingRect.top + 1));
if(!M_bEditorsActive())
{
if(M_GetMainWnd())
M_GetMainWnd()->GetWindowRect(&M_GetMainWnd()->m_oMainPos);
}
if (!IsFullScreen())
{
if (!GLD_bAdjustDeviceToWindow(m_hDisplayDevice))
{
ASSERT(0);
}
}
else
{
//save the new pos for when we come back from fullscreen
if(M_GetMainWnd())
{
M_GetMainWnd()->GetWindowRect(m_stRectWhileFullscreen);
g_oBaseFrame.ScreenToClient(&m_stRectWhileFullscreen);
}
}
// Adjust the camera to the new size of the viewport (device)
if((mViewType == C_DEVICE3D) && (((DEV_ViewPort3D *) mpViewPort)->GetEngineCamera()))
GLI_xAdjustCameraToViewport
(
m_hDisplayDevice, mpViewPort->m_hDisplayViewport,
((DEV_ViewPort3D *) mpViewPort)->GetEngineCamera()
);
GAMITF_fn_vResizeGameViewport();
GetParentMultiDevice()->mbForceDrawing = TRUE;
CWnd::GetClientRect(&r);
mpViewPort->SetWindowPos(&wndTopMost,r.left,r.top,r.right,r.bottom, SWP_NOZORDER | SWP_SHOWWINDOW);
}
if(mNumber)
ReleaseSemaphore(M_GetMainApp()->m_hDrawSem, 1, NULL);
}
//================================================================================
// When device gains the focus, it must say it to the contact (and so to one or
// more editor) to update viewport modes.
//================================================================================
BOOL DEV_Device::OnNcActivate(BOOL)
{
OnNcPaint();
return FALSE;
}
//================================================================================
//================================================================================
int DEV_Device::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
if(!M_bEditorsActive())
return MA_NOACTIVATEANDEAT;
int iRes = CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);
GetParentMultiDevice()->SetFocusDevice(GetNumber());
return iRes;
}
//================================================================================
//================================================================================
void DEV_Device::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
{
if((nHitTest == HTCAPTION) && (mType != DEV_BACKGROUND))
{
if(m_bIsMaximize)
SendMessage(WM_SYSCOMMAND, SC_RESTORE, 0);
else
{
if(GetParentFrame()->mbWantTile)
SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, 0);
}
}
}
//================================================================================
//================================================================================
void DEV_Device::OnNcMouseMove(UINT nHitTest, CPoint point)
{
}
//================================================================================
//================================================================================
int DEV_Device::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
GLD_tdstDeviceAttributes stDeviceAttr;
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// Create the DisplayDevice.
stDeviceAttr.bFullScreen = FALSE;
stDeviceAttr.dwFullScreenModeX = MAIN_fn_ulGetDeviceWidth();
stDeviceAttr.dwFullScreenModeY = MAIN_fn_ulGetDeviceHeight();
stDeviceAttr.dwFullScreenModeBpp = 16;
stDeviceAttr.hFullScreenModeWnd = M_GetMainWnd()->GetSafeHwnd();
stDeviceAttr.hNormalModeWnd = CWnd::GetSafeHwnd();
stDeviceAttr.uiTypeDriver = C_DRIVER_HARD | C_DRIVER_RGB; // marc : moteur D3D
if (!GLD_bCreateDevice(&stDeviceAttr, &m_hDisplayDevice))
{
ASSERT(0);
// M_GetMainApp()->fn_vDynaFatalError(GLD_szGetLastErrorString());
}
// Create the Viewport.
/*if (mViewType == C_DEVICE3D)
{*/
mpViewPort = new(DEV_ViewPort3D);
((DEV_ViewPort3D *)mpViewPort)->CreateViewPort(this, m_hDisplayDevice);
/*}
else
{
mpViewPort = new(DEV_ViewPort2D);
((DEV_ViewPort2D *)mpViewPort)->CreateViewPort(this, m_hDisplayDevice);
}*/
Unfreeze();
SetBackgroundColor(0, 0, 0);
// Load bitmap for closing frame
m_oBmClose.LoadBitmap(CPA_IDB_DEVICE_CLOSE);
m_oBmGameRefresh1.LoadBitmap(CPA_IDB_DEVICE_GAMEREFRESH1);
m_oBmGameRefresh2.LoadBitmap(CPA_IDB_DEVICE_GAMEREFRESH2);
return 0;
}
//================================================================================
//================================================================================
void DEV_Device::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
CWnd::OnWindowPosChanging(lpwndpos);
if(mType == DEV_BACKGROUND)
{
lpwndpos->flags |= SWP_NOZORDER | SWP_NOMOVE;
}
}
//================================================================================
//================================================================================
void DEV_Device::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
{
RECT r;
CWnd::OnWindowPosChanged(lpwndpos);
GetParentMultiDevice()->mbForceDrawing = TRUE;
GetClientRect(&r);
if(IsWindow(mpViewPort->m_hWnd))
mpViewPort->SetWindowPos(&wndTopMost,r.left,r.top,r.right-r.left,r.bottom-r.top,0);
//CWnd::UpdateWindow();
}
//================================================================================
//================================================================================
void DEV_Device::SetBackgroundColor(COLORREF Color)
{
mRed = GetRValue(Color);
mGreen = GetGValue(Color);
mBlue = GetBValue(Color);
GLD_bSetBackgroundColorForDevice(m_hDisplayDevice, Color);
CWnd::SendMessage(WM_PAINT);
}
//================================================================================
//================================================================================
void DEV_Device::SetBackgroundColor(char Red, char Green, char Blue)
{
mRed = Red;
mGreen = Green;
mBlue = Blue;
SetBackgroundColor(RGB(Red, Green, Blue));
}
//================================================================================
//================================================================================
void DEV_Device::GetBackgroundColor(char *Red, char *Green, char *Blue)
{
*Red = mRed;
*Green = mGreen;
*Blue = mBlue;
}
//================================================================================
//================================================================================
void DEV_Device::OnPaint()
{
#ifdef USE_DIRECTX
static COLORREF clrBand=0x00de967b;
static COLORREF clrBgr=0x00deebef;
static dwBand = 7;
DWORD dwRealWidth;
DWORD dwRealHeight;
CClientDC *p_DC;
CRect stRect;
p_DC = new CClientDC(this);
GetClientRect(&stRect);
if (GLI_xIsGliInit())
{
GLI_fn_vRecomputeViewportToMaximizeDisplay(0);
dwRealWidth = (DWORD)( (float)stRect.right / GLI_gst_DllInfo.f_WidthRatio);
dwRealHeight = (DWORD)( (float)stRect.bottom / GLI_gst_DllInfo.f_HeightRatio);
p_DC->FillSolidRect(dwRealWidth, 0, stRect.right - dwRealWidth , stRect.bottom ,clrBgr);
p_DC->FillSolidRect(dwRealWidth, 0, dwBand , dwRealHeight+dwBand ,clrBand);
p_DC->FillSolidRect(0, dwRealHeight , stRect.right , stRect.bottom - dwRealHeight ,clrBgr);
p_DC->FillSolidRect(0 , dwRealHeight , dwRealWidth+dwBand , dwBand ,clrBand);
}
else
{
p_DC->FillSolidRect(&stRect,0x00);
}
if ( !M_bFullScreenEditor())
GetParentMultiDevice()->DrawObject();
#else
GetParentMultiDevice()->DrawObject();
if (M_bFullScreenEditor())
{
CClientDC *p_DC;
CRect stRect;
p_DC = new CClientDC(this);
GetClientRect(&stRect);
p_DC->FillSolidRect(&stRect,0x00);
}
#endif
CWnd::OnPaint();
}
//================================================================================
//================================================================================
void DEV_Device::OnSysCommand(UINT nID, LPARAM lParam)
{
RECT parentRect;
CSize sf(GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME));
switch(nID)
{
case SC_RESTORE:
MoveWindow(&m_oRestoreRect);
m_bIsMaximize = FALSE;
break;
case SC_MAXIMIZE:
GetParent()->GetClientRect(&parentRect);
RECT myRect;
if(m_bIsMaximize == FALSE)
{
GetWindowRect(&myRect);
GetParent()->ScreenToClient(&myRect);
m_oRestoreRect.CopyRect(&myRect);
m_bIsMaximize = TRUE;
}
if(mType == DEV_BACKGROUND)
{
sf.cx = 0; sf.cy = 0;
}
MoveWindow(-sf.cx, 0, parentRect.right + 2*sf.cx, parentRect.bottom + sf.cy);
break;
default:
CWnd::OnSysCommand(nID, lParam);
}
}
//================================================================================
//================================================================================
//
// DrawObject 3D
//
void DEV_Device::DrawObject(GLI_tdxHandleToLight hLight, HIE_tdxHandleToSuperObject hObject)
{
if (!IsFreezed())
{
WaitForSingleObject(M_GetMainApp()->m_hDrawSem, INFINITE);
if (!IsFreezed())
{
((DEV_ViewPort3D *)mpViewPort)->DrawObject(hLight, hObject);
if (!GLD_bFlipDevice(m_hDisplayDevice))
{
ASSERT(0);
// M_GetMainApp()->fn_vDynaFatalError(GLD_szGetLastErrorString());
}
}
ReleaseSemaphore(M_GetMainApp()->m_hDrawSem, 1, NULL);
}
}
void DEV_Device::DrawEditorObject(GLI_tdxHandleToLight hLight, CPA_SuperObject *pRoot)
{
if (!IsFreezed())
{
WaitForSingleObject(M_GetMainApp()->m_hDrawSem, INFINITE);
if (!IsFreezed())
{
((DEV_ViewPort3D *)mpViewPort)->DrawEditorObject(hLight, pRoot);
if (!GLD_bFlipDevice(m_hDisplayDevice))
{
ASSERT(0);
// M_GetMainApp()->fn_vDynaFatalError(GLD_szGetLastErrorString());
}
}
ReleaseSemaphore(M_GetMainApp()->m_hDrawSem, 1, NULL);
}
}
//================================================================================
//================================================================================
COLORREF fn_ComputeColor(char cCaption, char cHasFocus)
{
COLORREF cActive, cNActive;
if(cCaption)
{
cActive = ::GetSysColor(COLOR_ACTIVECAPTION);
cNActive = ::GetSysColor(COLOR_INACTIVECAPTION);
}
else
{
cActive = COLORREF(RGB(150, 0, 0));
cNActive = ::GetSysColor(COLOR_INACTIVECAPTION);
}
if(cHasFocus)
return cActive;
return cNActive;
}
void DEV_Device::DrawDeviceTitle(void)
{
CWindowDC dc(this);
CPen oPen;
CBrush oBrush, oBrush1;
CPen *p_oldPen;
RECT myRect, nRect;
COLORREF Color;
CSize sizeFrame(GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME));
if(mType == DEV_BACKGROUND)
{
sizeFrame.cx = 0;
sizeFrame.cy = 0;
}
GetClientRect(&myRect);
myRect.right += sizeFrame.cx;
// Move area
// Compute color
if(GetParentMultiDevice())
Color = fn_ComputeColor(1, GetParentMultiDevice()->GetParent()->GetFocus() == mpViewPort);
else
Color = fn_ComputeColor(1, 0);
oBrush.CreateSolidBrush(Color);
nRect.left = sizeFrame.cx;
nRect.right = myRect.right;
if(mType == DEV_BACKGROUND)
nRect.top = 0;
else
nRect.top = 1;
nRect.bottom = DEV_YCaption - 2;
dc.FillRect(&nRect, &oBrush);
// A black line under caption
oPen.CreatePen(PS_SOLID, 1, COLORREF(RGB(0, 0, 0)));
p_oldPen = dc.SelectObject(&oPen);
dc.MoveTo(sizeFrame.cx, DEV_YCaption - 2);
dc.LineTo(myRect.right, DEV_YCaption - 2);
dc.SelectObject(p_oldPen);
oPen.DeleteObject();
// A frame line under caption
if(GetParentMultiDevice()->GetNumFocusDevice() == mNumber)
Color = ::GetSysColor(COLOR_ACTIVEBORDER);
else
Color = ::GetSysColor(COLOR_INACTIVEBORDER);
oPen.CreatePen(PS_SOLID, 1, Color);
p_oldPen = dc.SelectObject(&oPen);
dc.MoveTo(sizeFrame.cx, DEV_YCaption - 1);
dc.LineTo(myRect.right, DEV_YCaption - 1);
dc.SelectObject(p_oldPen);
// To close frame
if((mType != DEV_BACKGROUND) && (GetParentFrame()->mbWantClose))
{
CDC dcBitmap;
HBITMAP hBitmapOld;
if (!dcBitmap.CreateCompatibleDC(&dc))
return;
hBitmapOld = (HBITMAP) dcBitmap.SelectObject(&m_oBmClose);
dc.BitBlt(myRect.right - 32, myRect.top, 24, DEV_YCaption, &dcBitmap, 0, 0, SRCCOPY);
dcBitmap.SelectObject(hBitmapOld);
}
// Game refresh
if
(
(GetParentFrame() == M_GetMainWnd())
&&
(
(mType != DEV_BACKGROUND)
|| (GetParent() != GetParentFrame()->m_oSplitter.GetPane(0, 0))
)
)
{
CDC dcBitmap;
HBITMAP hBitmapOld;
if (!dcBitmap.CreateCompatibleDC(&dc))
return;
if(!mbGameRefresh)
hBitmapOld = (HBITMAP) dcBitmap.SelectObject(&m_oBmGameRefresh1);
else
hBitmapOld = (HBITMAP) dcBitmap.SelectObject(&m_oBmGameRefresh2);
dc.BitBlt(myRect.left + sizeFrame.cx + 8, myRect.top, 24, DEV_YCaption, &dcBitmap, 0, 0, SRCCOPY);
dcBitmap.SelectObject(hBitmapOld);
}
}
void DEV_Device::OnNcPaint(void)
{
CWnd::OnNcPaint();
DrawDeviceTitle();
}
void DEV_Device::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
CSize sizeFrame(GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME));
if(mType == DEV_BACKGROUND)
lpncsp->rgrc[0].top += DEV_YCaption;
else
{
lpncsp->rgrc[0].left += sizeFrame.cx;
lpncsp->rgrc[0].right -= sizeFrame.cx;
lpncsp->rgrc[0].bottom -= sizeFrame.cy;
lpncsp->rgrc[0].top += DEV_YCaption;
}
}
UINT DEV_Device::OnNcHitTest(CPoint point)
{
RECT myRect;
GetWindowRect(&myRect);
if(point.y < (myRect.top + DEV_YCaption))
{
CSize sizeFrame(GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME));
// To close a windowed device
if
(
((point.x >= (myRect.right - 32 - sizeFrame.cx)) && (point.x <= (myRect.right - 8 - sizeFrame.cx)))
&& (mType != DEV_BACKGROUND)
&& (GetParentFrame()->mbWantClose)
)
return HTSYSMENU;
// Refresh or not by game
if
(
(point.x >= myRect.left + 8 + sizeFrame.cx)
&& (point.x <= myRect.left + 32 + sizeFrame.cx)
&& (GetParentFrame() == M_GetMainWnd())
&&
(
(mType != DEV_BACKGROUND)
|| (GetParent() != GetParentFrame()->m_oSplitter.GetPane(0, 0))
)
)
{
return HTMENU;
}
return HTCAPTION;
}
UINT uiHit = CWnd::OnNcHitTest(point);
switch(uiHit)
{
case HTBOTTOMLEFT:
return HTBOTTOM;
case HTTOPLEFT:
return HTLEFT;
case HTTOPRIGHT:
return HTRIGHT;
case HTTOP:
return HTNOWHERE;
}
return uiHit;
}
void DEV_Device::OnNcRButtonDown(UINT HitTest, CPoint point)
{
//ANNECY CB
return;
//END
CMenu oMenu;
CMenu *pMenu;
BOOL bActiv = FALSE;
if(!M_bEditorsActive())
return;
// Is there an additional active device ?
for(int i = 1; i < MAX_DEVICE; i++)
{
if(GetParentMultiDevice()->IsActivDevice(i))
{
bActiv = TRUE;
break;
}
}
oMenu.LoadMenu(CPA_IDM_DEVICEMENU);
pMenu = oMenu.GetSubMenu(0);
if
(
(mType == DEV_BACKGROUND)
&& (GetParentFrame() == M_GetMainWnd())
&& (GetParentFrame()->m_oSplitter.GetPane(0, 0) == GetParent())
)
{
pMenu->CheckMenuItem(CPA_ID_DEVICEMENU_VIEWINGAME, MF_BYCOMMAND|MF_CHECKED);
pMenu->EnableMenuItem(CPA_ID_DEVICEMENU_VIEWINGAME, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
}
else
pMenu->CheckMenuItem(CPA_ID_DEVICEMENU_VIEWINGAME, MF_BYCOMMAND|mbGameRefresh ? MF_CHECKED : MF_UNCHECKED);
pMenu->EnableMenuItem(CPA_IDB_DEVICE_MAXIMIZE, MF_BYCOMMAND|mType == DEV_BACKGROUND ? MF_DISABLED|MF_GRAYED : MF_ENABLED);
pMenu->EnableMenuItem(CPA_IDB_DEVICE_RESTORE, MF_BYCOMMAND|mType == DEV_BACKGROUND ? MF_DISABLED|MF_GRAYED : MF_ENABLED);
pMenu->EnableMenuItem(CPA_IDM_DEVICE_CLOSE, MF_BYCOMMAND|mType == DEV_BACKGROUND ? MF_DISABLED|MF_GRAYED : MF_ENABLED);
if(bActiv == FALSE)
{
pMenu->EnableMenuItem(CPA_IDM_DEVICE_CLOSEALL, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
pMenu->EnableMenuItem(CPA_IDB_DEVICE_TILE_VERT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
pMenu->EnableMenuItem(CPA_IDB_DEVICE_TILE_HORZ, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
pMenu->EnableMenuItem(CPA_IDB_DEVICE_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
pMenu->EnableMenuItem(CPA_IDM_DEVICE_CLOSEALL, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
}
if(GetParentFrame()->mbWantNew == FALSE)
pMenu->EnableMenuItem(CPA_IDM_DEVICE_NEWDEVICE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
if(GetParentFrame()->mbWantTile == FALSE)
{
pMenu->EnableMenuItem(CPA_IDB_DEVICE_TILE_VERT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
pMenu->EnableMenuItem(CPA_IDB_DEVICE_TILE_HORZ, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
pMenu->EnableMenuItem(CPA_IDB_DEVICE_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
pMenu->EnableMenuItem(CPA_IDB_DEVICE_MAXIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
pMenu->EnableMenuItem(CPA_IDB_DEVICE_RESTORE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
}
if(GetParentFrame()->mbWantClose == FALSE)
{
pMenu->EnableMenuItem(CPA_IDM_DEVICE_CLOSE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
pMenu->EnableMenuItem(CPA_IDM_DEVICE_CLOSEALL, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
}
if
(
(!(GetParent()->GetParent()->IsKindOf(RUNTIME_CLASS(FRMSplitter))))
|| (mType != DEV_BACKGROUND)
|| (GetParentFrame()->mbWantSplit == FALSE)
)
{
pMenu->EnableMenuItem(CPA_ID_DEVICEMENU_SPLITVERTICAL, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
pMenu->EnableMenuItem(CPA_ID_DEVICEMENU_SPLITHORIZONTAL, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
}
else
{
if(GetParentSplitter()->GetRowCount() == 2)
pMenu->EnableMenuItem(CPA_ID_DEVICEMENU_SPLITHORIZONTAL, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
if(GetParentSplitter()->GetColumnCount() == 2)
pMenu->EnableMenuItem(CPA_ID_DEVICEMENU_SPLITVERTICAL, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
}
// register the popup menu for the tutorial module
TUT_M_vGetTutDll ();
TUT_M_vRegisterMenu (this -> m_hWnd , pMenu -> m_hMenu , point . x , point . y);
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);
oMenu.DestroyMenu();
}
void DEV_Device::OnNcLButtonDown(UINT HitTest, CPoint point)
{
if((HitTest == HTSYSMENU) && (mType != DEV_BACKGROUND))
{
}
else
{
// Refresh or not by game
if(HitTest == HTMENU)
{
mbGameRefresh = mbGameRefresh ? FALSE : TRUE;
DrawDeviceTitle();
return;
}
if(!IsMaximize())
{
SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
RedrawWindow();
CWnd::OnNcLButtonDown(HitTest, point);
}
}
}
void DEV_Device::OnNcLButtonUp(UINT HitTest, CPoint point)
{
if((HitTest == HTSYSMENU) && (mType != DEV_BACKGROUND))
{
if(GetParentFrame()->mbWantClose)
{
FRMBaseMenu *pParent = GetParentFrame();
SendMessage(WM_CLOSE, 0, 0);
pParent->mfn_vUpdateDeviceToolBar();
}
}
else
CWnd::OnNcLButtonUp(HitTest, point);
}
//================================================================================
//================================================================================
BOOL DEV_Device::SwapFullScreen(BOOL Show /*=TRUE*/)
{
// M_GetListOfAllDLL()->DeviceIsSwapping(GetParentMultiDevice(),this);
if (!IsFullScreen())
{
//save the new pos for when we come back from fullscreen
GetParentFrame()->GetWindowRect(m_stRectWhileFullscreen);
g_oBaseFrame.ScreenToClient(&m_stRectWhileFullscreen);
}
// if (M_bEditorsActive() && M_GetMainApp()->m_bViewerOpened == TRUE)
// return;
if (!M_bEditorsActive())
{
if(!mbFullScreen)
{
M_GetMainWnd()->ShowWindow(FALSE);
M_GetMainWnd()->fn_vShowGeneralInterface(FALSE);
}
}
SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);
WaitForSingleObject(M_GetMainApp()->m_hDrawSem, INFINITE);
M_GetMainApp()->m_bFlagTaken = TRUE;
//--------------------------------------------------------
// Freeze all devices
GetParentMultiDevice()->FreezeAll();
if(!mbFullScreen)
{
FRMSplitter *pSplit = &(M_GetMainWnd()->m_oSplitter);
DEV_MultiDevice *pSingle = (DEV_MultiDevice *) pSplit->GetPane(0, 0);
if(pSplit->GetColumnCount() == 2)
{
pSingle = (DEV_MultiDevice *) pSplit->GetPane(0, 1);
pSingle->FreezeAll();
pSingle->EnableWindow(FALSE);
}
if(pSplit->GetRowCount() == 2)
{
pSingle = (DEV_MultiDevice *) pSplit->GetPane(1, 0);
pSingle->FreezeAll();
pSingle->EnableWindow(FALSE);
if(pSplit->GetColumnCount() == 2)
{
pSingle = (DEV_MultiDevice *) pSplit->GetPane(1, 1);
pSingle->FreezeAll();
pSingle->EnableWindow(FALSE);
}
}
}
if (!GLD_bSetFullScreenModeForDevice(m_hDisplayDevice, MAIN_fn_ulGetDeviceWidth(),MAIN_fn_ulGetDeviceHeight(), 16, M_GetMainWnd()->GetSafeHwnd()))
{
ASSERT(0);
}
if (!GLD_bSwapDeviceMode(m_hDisplayDevice, TRUE))
{
ASSERT(0);
}
if(((DEV_ViewPort3D *) mpViewPort)->GetEngineCamera())
GLI_xAdjustCameraToViewport(m_hDisplayDevice, mpViewPort->m_hDisplayViewport, ((DEV_ViewPort3D *) mpViewPort)->GetEngineCamera());
GAMITF_fn_vResizeGameViewport();
if (!mbFullScreen)
{
mbFullScreen = TRUE;
GetParentMultiDevice()->FreezeAllButOne(0);
}
else
{
mbFullScreen = FALSE;
GetParentMultiDevice()->UnfreezeAll();
}
//--------------------------------------------------------
M_GetMainApp()->m_bFlagTaken = FALSE;
ReleaseSemaphore(M_GetMainApp()->m_hDrawSem, 1, NULL);
SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
if(!mbFullScreen && Show)
{
/* if (!M_bEditorsActive())
M_GetMainWnd()->fn_vShowGeneralInterface(FALSE);
else*/
M_GetMainWnd()->fn_vShowGeneralInterface(TRUE);
}
// GetParentFrame()->ShowWindow(TRUE);
#ifdef NDEBUG
if (mbFullScreen == TRUE)
{
RECT stRect,stRect2;
M_GetMainWnd()->GetWindowRect(&stRect2);
stRect.left = stRect2.left + 10;
stRect.top = stRect2.top + 10;
stRect.right = stRect2.left + 10;
stRect.bottom = stRect2.top + 10;
// we are in fullscreen
// confine cursor in the window
ClipCursor(&stRect);
// hide cursor
while (ShowCursor(FALSE) >= 0);
}
else
{
// we are in fullscreen
// confine cursor in the window
ClipCursor(NULL);
// show cursor
while (ShowCursor(TRUE) < 0);
}
#endif
// Unfreeze panes ?
if(!mbFullScreen)
{
FRMSplitter *pSplit = &M_GetMainWnd()->m_oSplitter;
DEV_MultiDevice *pSingle = (DEV_MultiDevice *) pSplit->GetPane(0, 0);
if(pSplit->GetColumnCount() == 2)
{
pSingle = (DEV_MultiDevice *) pSplit->GetPane(0, 1);
pSingle->UnfreezeAll();
pSingle->EnableWindow(TRUE);
}
if(pSplit->GetRowCount() == 2)
{
pSingle = (DEV_MultiDevice *) pSplit->GetPane(1, 0);
pSingle->UnfreezeAll();
pSingle->EnableWindow(TRUE);
if(pSplit->GetColumnCount() == 2)
{
pSingle = (DEV_MultiDevice *) pSplit->GetPane(1, 1);
pSingle->UnfreezeAll();
pSingle->EnableWindow(TRUE);
}
}
}
M_GetMainApp()->m_bFullScreenInEditor = IsFullScreen();
if (!IsFullScreen() || M_bEditorsActive())
{
// RECT r;
// M_GetMainWnd()->GetWindowRect(&r);
// r.left--;
// M_GetMainWnd()->SetWindowPos(&wndTopMost,r.left,r.top,r.right,r.bottom, SWP_NOZORDER | SWP_SHOWWINDOW);
// r.left++;
GetParentFrame()->SetParent(&g_oBaseFrame);
if(!M_bEditorsActive())
{
CSize ss(GetSystemMetrics(SM_CXMAXIMIZED), GetSystemMetrics(SM_CYMAXIMIZED));
CRect cs;
cs.left = (ss.cx - 700) / 2;
cs.top = (ss.cy - 550) / 2;
cs.right = cs.left + 700;
cs.bottom = cs.top + 550;
GetParentFrame()->MoveWindow(cs);
}
else
{
GetParentFrame()->MoveWindow(m_stRectWhileFullscreen.left,
m_stRectWhileFullscreen.top,
m_stRectWhileFullscreen.right - m_stRectWhileFullscreen.left+1,
m_stRectWhileFullscreen.bottom - m_stRectWhileFullscreen.top+1,
FALSE
);
}
// M_GetMainDevice()->DrawObject();
if(M_bEditorsActive())
M_GetMainWnd()->fn_vShowGeneralInterface(TRUE);
else
M_GetMainWnd()->fn_vShowGeneralInterface(FALSE);
}
if(M_bEditorsActive())
{
g_oFrameGest.mfn_vAWindowHasMoved(GetParentFrame(), FRM_C_MoveLeft);
g_oFrameGest.mfn_vRefreshWindows(TRUE);
}
else
{
if(!IsFullScreen() && !IsWindowVisible())
M_GetMainWnd()->ShowWindow(TRUE);
else if (IsFullScreen() && IsWindowVisible())
M_GetMainWnd()->ShowWindow(FALSE);
}
g_oBaseFrame.SetFocus();
return TRUE;
}
//================================================================================
//================================================================================
void DEV_Device::SetMainWindowForRender(BOOL Show)
{
#ifdef USE_DIRECTX
GLI_fn_vSetMainWindowForRender(m_hWnd);
#endif
}
//================================================================================
//================================================================================
void DEV_Device::OnCxtMenu1(void) // Game refresh
{
mbGameRefresh = mbGameRefresh ? FALSE : TRUE;
DrawDeviceTitle();
}
void DEV_Device::OnCxtMenu2(void) // Tile vert
{
GetParentMultiDevice()->OnDeviceTileVert();
}
void DEV_Device::OnCxtMenu3(void) // Tile horiz
{
GetParentMultiDevice()->OnDeviceTileHorz();
}
void DEV_Device::OnCxtMenu4(void) // Cascade
{
GetParentMultiDevice()->OnDeviceCascade();
}
void DEV_Device::OnCxtMenu5(void) // Maximize
{
GetParentMultiDevice()->OnMaximizeDevice();
}
void DEV_Device::OnCxtMenu6(void) // Restore
{
GetParentMultiDevice()->OnRestoreDevice();
}
void DEV_Device::OnCxtMenu7(void) // Close
{
GetParentMultiDevice()->OnCloseDevice();
}
void DEV_Device::OnCxtMenu8(void) // Close all
{
GetParentMultiDevice()->OnCloseAllDevice();
}
void DEV_Device::OnCxtMenu9(void) // New
{
GetParentMultiDevice()->OnOpenDevice();
}
void DEV_Device::OnCxtMenu10(void) // Split vertical
{
GetParentSplitter()->MakeSplit(2);
}
void DEV_Device::OnCxtMenu11(void) // Split horizontal
{
GetParentSplitter()->MakeSplit(1);
}