517 lines
14 KiB
C++
517 lines
14 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 "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"
|
|
|
|
// 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_NCACTIVATE()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
//================================================================================
|
|
//================================================================================
|
|
DEV_Device::DEV_Device()
|
|
{
|
|
}
|
|
|
|
DEV_Device::~DEV_Device()
|
|
{
|
|
}
|
|
|
|
#ifndef ACTIVE_EDITOR
|
|
CFrameWnd *DEV_Device::GetParentFrame()
|
|
{
|
|
return GetParentMultiDevice()->GetParentFrame();
|
|
}
|
|
#endif
|
|
|
|
|
|
//================================================================================
|
|
//================================================================================
|
|
// return the number of Device
|
|
int DEV_Device::GetNumber()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
//================================================================================
|
|
//================================================================================
|
|
// 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;
|
|
}
|
|
|
|
|
|
//================================================================================
|
|
//================================================================================
|
|
// 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);
|
|
Create(NULL, (LPCTSTR) "",
|
|
WS_OVERLAPPED | WS_CLIPSIBLINGS | WS_VISIBLE | WS_CHILD | WS_MAXIMIZE,
|
|
stRect, m_p_oWndParent, 1);
|
|
|
|
// positioning of Device in rear plan
|
|
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
|
|
SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
|
|
|
|
|
|
}
|
|
|
|
//================================================================================
|
|
//================================================================================
|
|
void DEV_Device::OnDestroy()
|
|
{
|
|
if (WaitForSingleObject(M_GetMainApp()->m_hDrawSem,10000) == WAIT_TIMEOUT)
|
|
ASSERT(0);
|
|
CWnd::OnDestroy();
|
|
|
|
// Destroy the DisplayViewport.
|
|
// fn_bDeleteViewport3D(mDisplayDevice3D, mViewPort.GetDisplayViewport3D());
|
|
|
|
GLD_bReleaseViewportAndDevice(m_hDisplayDevice,mpViewPort->m_hDisplayViewport);
|
|
|
|
mpViewPort->SendMessage(WM_DESTROY);
|
|
delete(mpViewPort);
|
|
|
|
|
|
ReleaseSemaphore(M_GetMainApp()->m_hDrawSem, 1, NULL);
|
|
|
|
}
|
|
|
|
//================================================================================
|
|
//================================================================================
|
|
|
|
//================================================================================
|
|
//================================================================================
|
|
void DEV_Device::OnSize(UINT type, int cx, int cy)
|
|
{
|
|
RECT r;
|
|
|
|
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
|
|
{
|
|
if (!IsFreezed())
|
|
{
|
|
CWnd::OnSize(type, cx, cy);
|
|
if (!IsFullScreen())
|
|
{
|
|
|
|
if (!GLD_bAdjustDeviceToWindow(m_hDisplayDevice))
|
|
{
|
|
ASSERT(0);
|
|
}
|
|
|
|
}
|
|
|
|
// 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();
|
|
|
|
|
|
CWnd::GetClientRect(&r);
|
|
mpViewPort->SetWindowPos(&wndTopMost,r.left,r.top,r.right,r.bottom, SWP_NOZORDER | SWP_SHOWWINDOW);
|
|
}
|
|
}
|
|
}
|
|
|
|
//================================================================================
|
|
// 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)
|
|
{
|
|
int iRes = CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);
|
|
return iRes;
|
|
}
|
|
|
|
#ifndef ACTIVE_EDITOR
|
|
|
|
|
|
void DEV_Device::PostCreate()
|
|
{
|
|
GLD_tdstDeviceAttributes stDeviceAttr;
|
|
|
|
// Create the DisplayDevice.
|
|
if (GLI_lWhatIsGLI() != GLI_C_VersionGlide)
|
|
{
|
|
//VL0
|
|
//stDeviceAttr.bFullScreen = TRUE;
|
|
//mbFullScreen = TRUE;
|
|
stDeviceAttr.bFullScreen = mbFullScreen = MAIN_fn_ulDeviceIsFullScreen();
|
|
//EVL0
|
|
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_SOFT | 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);
|
|
}
|
|
*/ SetBackgroundColor(0, 0, 0);
|
|
|
|
// M_GetMainWnd->OnActivateApp(TRUE,NULL);
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
//================================================================================
|
|
//================================================================================
|
|
int DEV_Device::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
GLD_tdstDeviceAttributes stDeviceAttr;
|
|
|
|
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
|
|
{
|
|
|
|
if (CWnd::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
// Create the DisplayDevice.
|
|
//VL0
|
|
//stDeviceAttr.bFullScreen = FALSE;
|
|
//mbFullScreen = FALSE;
|
|
stDeviceAttr.bFullScreen = mbFullScreen = MAIN_fn_ulDeviceIsFullScreen();
|
|
//EVL
|
|
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_SOFT | 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);
|
|
}
|
|
else
|
|
{
|
|
return CWnd::OnCreate(lpCreateStruct);
|
|
}
|
|
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);
|
|
|
|
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
|
|
{
|
|
GetClientRect(&r);
|
|
mpViewPort->SetWindowPos(&wndTopMost,r.left,r.top,r.right-r.left,r.bottom-r.top,0);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//================================================================================
|
|
//================================================================================
|
|
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()
|
|
{
|
|
CWnd::OnPaint();
|
|
}
|
|
|
|
|
|
//================================================================================
|
|
//================================================================================
|
|
BOOL DEV_Device::SwapFullScreen(BOOL)
|
|
{
|
|
/*
|
|
if (GLI_lWhatIsGLI() != GLI_C_VersionGlide)
|
|
{
|
|
if (!IsFullScreen())
|
|
{
|
|
//save the new pos for when we come back from fullscreen
|
|
M_GetMainWnd()->GetWindowRect(m_stRectWhileFullscreen);
|
|
}
|
|
|
|
|
|
SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);
|
|
|
|
M_GetMainApp()->m_bFlagTaken = TRUE;
|
|
GAMITF_fn_vResizeGameViewport();
|
|
|
|
if (!mbFullScreen)
|
|
{
|
|
if (!GLD_bSwapDeviceMode(m_hDisplayDevice))
|
|
{
|
|
ASSERT(0);
|
|
return FALSE;
|
|
}
|
|
mbFullScreen = TRUE;
|
|
}
|
|
else
|
|
{
|
|
mbFullScreen = FALSE;
|
|
}
|
|
|
|
//--------------------------------------------------------
|
|
M_GetMainApp()->m_bFlagTaken = FALSE;
|
|
|
|
SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
|
|
|
|
#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 not in fullscreen
|
|
// free cursor
|
|
ClipCursor(NULL);
|
|
// show cursor
|
|
while (ShowCursor(TRUE) < 0);
|
|
}
|
|
|
|
#endif
|
|
|
|
return TRUE;
|
|
}
|
|
else
|
|
*/
|
|
{
|
|
if (!IsFullScreen())
|
|
{
|
|
//save the new pos for when we come back from fullscreen
|
|
M_GetMainWnd()->GetWindowRect(m_stRectWhileFullscreen);
|
|
//M_GetMainWnd()->ShowWindow(FALSE);
|
|
}
|
|
|
|
SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);
|
|
|
|
WaitForSingleObject(M_GetMainApp()->m_hDrawSem, INFINITE);
|
|
M_GetMainApp()->m_bFlagTaken = TRUE;
|
|
//--------------------------------------------------------
|
|
// Freeze all devices
|
|
GetParentMultiDevice()->FreezeAll();
|
|
|
|
|
|
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);
|
|
//M_GetMainWnd()->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
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//================================================================================
|
|
//================================================================================
|
|
|