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

696 lines
20 KiB
C++
Raw Blame History

//=========================================================================
// CPAProject.cpp : Defines the class behaviors for the application.
// This is a part of the CPA project.
//
// Version 1.0
// Creation date 06/06/96
// Revision date
//
// (c) Ubi Studios 1996
//
// DO NOT MODIFY THAT FILE. IF SOMETHING NEEDS TO BE CHANGE, PLEASE CONTACT
// VINCENT GRECO OR CHRISTOPHE BEAUDET.
//=========================================================================
#include "stdafx.h"
#include "acp_base.h"
#define __DeclareGlobalVariableErrInt_h__
#include "ErrInt.h"
#undef __DeclareGlobalVariableErrInt_h__
#define __DeclareGlobalVariableMmgInt_h__
#include "MmgInt.h"
#undef __DeclareGlobalVariableMmgInt_h__
#include "direct.h"
#undef EXTERN
#include "geo.h"
#include "gli.h"
#include "col.h"
#define HieFriend
#include "spo.h"
#include "lst.h"
#undef HieFriend
#include "Itf/CPARes.h"
#include "Itf/CPAProj.hpp"
#include "Itf/CPADoc.hpp"
#include "Itf/DEVMul3D.hpp"
#include "Itf/FRMGest.Hpp"
#include "Itf/CPACont.hpp"
#include "Itf/CPAConst.hpp"
#include "Itf/CPAkacnf.hpp"
#include "Itf/cpamworl.hpp"
#include "Itf/cpakacnf.hpp"
#include "Itf/CPAAbout.hpp"
#include "Itf/CPAInter.hpp"
/////////////////////////////////////////////////////////////////////////////
// CPA_ProjectApp
BEGIN_MESSAGE_MAP(CPA_ProjectApp, CWinApp)
//{{AFX_MSG_MAP(CPA_ProjectApp)
ON_THREAD_MESSAGE(WM_USER,OnUserMsg)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
END_MESSAGE_MAP()
//###########################################################################
// Constructor and destructor of application
//###########################################################################
//===========================================================================
// Description: CONSTRUCTOR
// => Change windows parameters
// Creation date: 27 Jun 96
// Author: CB
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
CPA_ProjectApp::CPA_ProjectApp()
{
//---------------------------------------------------------------------------
// memory and error messages initialisations
// For memory usage and errors
Erm_M_InitErrMsg(Erm);
Erm_M_InitErrMsg(Mmg);
Erm_M_InitErrMsg(Int);
Mmg_fn_vFirstInitMmgModule(10);
Mmg_M_InitMmg(Int);
m_bWasInFullScreenBeforeLooseFocus = FALSE;
m_bLeavingApplication = FALSE;
m_bBadResolution = FALSE;
m_bFlagTaken = FALSE;
//---------------------------------------------------------------------------
m_bProjectIsClosing = 0;
m_bEngineIsStopped = FALSE;
m_bEditorsAreActive = FALSE;
m_bAppliAskedToStopEngine = FALSE;
m_bAppliPulsedOneStep = FALSE;
m_bAppliAskedToActivateEditors = FALSE;
m_bEngineAskedToForceEditors = FALSE;
m_bAppliAskedToEndGame = FALSE;
m_bEngineIsOver = FALSE;
m_bFinishEngine = FALSE;
}
//===========================================================================
// Description: DESTRUCTOR
// => Kill all editors
// => Restore windows parameters
// Creation date: 27 Jun 96
// Author: CB
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
CPA_ProjectApp::~CPA_ProjectApp()
{
}
//###########################################################################
// CPA_ProjectApp initializations and close
//###########################################################################
//===========================================================================
// Description: Set and reset windows parameters.
// Creation date: 27 Jun 96
// Author: CB
//---------------------------------------------------------------------------
// Return void
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void CPA_ProjectApp::fn_vSetWindowsParameters(void)
{
// => No screen saver
/* SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &m_bOldScreenSaveActive, 0);
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);*/
}
void CPA_ProjectApp::fn_vResetWindowsParameters(void)
{
// => Screen saver
//SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, m_bOldScreenSaveActive, NULL, 0);
}
//===========================================================================
// Description: Test windows config. to be sure that it's correct for
// game.
// Fatal error if not correct.
// Creation date: 27 Jun 96
// Author: CB
//---------------------------------------------------------------------------
// Return void
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void CPA_ProjectApp::fn_vTestWindowsConfig(void)
{
HDC hdc;
int iAppBPP;
hdc = ::GetDC(NULL);
iAppBPP = ::GetDeviceCaps(hdc, PLANES);
iAppBPP *= ::GetDeviceCaps(hdc, BITSPIXEL);
::ReleaseDC(NULL, hdc);
if(iAppBPP != 16)
m_bBadResolution = TRUE;
}
//===========================================================================
// Description: Init camera to see the world correctly
// Creation date: 05 sept 96
// Author: FBF
//---------------------------------------------------------------------------
// Return niet
//---------------------------------------------------------------------------
// Revision date: ?
// Author:
//===========================================================================
//===========================================================================
// Description: First init of application.
// Creation date: 21 Jun 96
// Author: CB
//---------------------------------------------------------------------------
// Return BOOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
extern "C"
{
long (*GLI_DRV_lSendDataToDll)(char *, void *);
}
BOOL CPA_ProjectApp::InitApplication(void)
{
// Change protection of EXE if there's auto generate code, and virtual lock
// code.
// fn_vChangeExeProtection((unsigned long) m_hInstance);
// Test windows environment
fn_vTestWindowsConfig();
// Change windows parameters
fn_vSetWindowsParameters();
// Create all semaphores
m_hDrawSem = CreateSemaphore(NULL, 1, 1, (LPCTSTR) "DRAWSEM");
GLI_DRV_lSendDataToDll("DrawSem", m_hDrawSem );
// To avoid list of dump memory at the end of execution
AfxEnableMemoryTracking(FALSE);
//FBFFBF temporaire V3.1, <20> virer ds la prochaine version
HIE_fn_vInitGlobalMatrixFrameCounter(3);
return CWinApp::InitApplication();
}
//===========================================================================
// Description: Last exit of application.
// Creation date: 27 Jun 96
// Author: CB
//---------------------------------------------------------------------------
// Return BOOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void CPA_ProjectApp::ExitApplication(void)
{
ClipCursor(NULL);
// show cursor
while (ShowCursor(TRUE) < 0);
m_bLeavingApplication = TRUE;
// Free all semaphores
CloseHandle(m_hDrawSem);
// Restore windows parameters
fn_vResetWindowsParameters();
}
//===========================================================================
// Description: Call for each new instance of application.
// Creation date: 10 Jun 96
// Author: CB
//---------------------------------------------------------------------------
// Return void
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
BOOL CPA_ProjectApp::InitInstance()
{
// Register document templates
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
CPA_IDR_MAINFRAME,
RUNTIME_CLASS(CPA_ProjectDoc),
RUNTIME_CLASS(CPA_MainFrame),
RUNTIME_CLASS(DEV_MultiDevice3D));
AddDocTemplate(pDocTemplate);
//
// Add all DLLs to list.
//
// New file
OnFileNew();
if (m_pMainWnd == NULL)
return FALSE;
m_nCmdShow = SW_SHOWNORMAL;
if (GLI_lWhatIsGLI() != GLI_C_VersionGlide)
{
M_GetMainDevice()->GetDevice(0)->AfterCreate();
}
// Clear main device
GLD_bClearDevice(M_GetMainDevice()->GetDevice(0)->m_hDisplayDevice);
GLD_bFlipDevice(M_GetMainDevice()->GetDevice(0)->m_hDisplayDevice);
// Special frame
//
// Create a new process for engine
//
fn_vCreateEngineThread();
M_GetMainWnd()->SetFocus();
if (GLI_lWhatIsGLI() != GLI_C_VersionGlide)
{
m_p_oEngineThread->ResumeThread();
}
#ifdef NDEBUG
while (ShowCursor(FALSE) >= 0);
#endif
return TRUE;
}
//###########################################################################
//###########################################################################
BOOL CPA_ProjectApp::PreTranslateMessageEditor(MSG *p_stMsg)
{
return FALSE;
}
//###########################################################################
//###########################################################################
void CPA_ProjectApp::BeforeWindows()
{
if (m_p_oEngineThread == NULL)
return;
if (WaitForSingleObject(m_hDrawSem,10000) == WAIT_TIMEOUT)
ASSERT(0);
ASSERT(m_p_oEngineThread->SuspendThread() >= 0);
ReleaseSemaphore(m_hDrawSem,1,NULL);
}
//###########################################################################
//###########################################################################
void CPA_ProjectApp::AfterWindows()
{
if (m_p_oEngineThread == NULL)
return;
if (WaitForSingleObject(m_hDrawSem,10000) == WAIT_TIMEOUT)
ASSERT(0);
ReleaseSemaphore(m_hDrawSem,1,NULL);
m_p_oEngineThread->ResumeThread();
}
//###########################################################################
//###########################################################################
extern BOOL GLD_fn_bCanBeWindowed( void );
void fnv_SwapFullScreen(void)
{
/*
* Device is in full screen
*/
if (M_GetMainDevice()->GetDevice(0)->IsFullScreen())
{
M_GetMainDevice()->GetDevice(0)->SwapFullScreen();
/*
* can't be windowed
*/
if (M_GetMainApp()->m_bBadResolution || !GLD_fn_bCanBeWindowed() )
{
M_GetMainApp()->fn_vAppliAskToStopEngine();
M_GetMainApp()->m_bWasInFullScreenBeforeLooseFocus = TRUE;
M_GetMainWnd()->SendMessage(WM_SYSCOMMAND, SC_MINIMIZE);
}
}
/*
* device is windowed or minimized
*/
else
{
/*
* can't be windowed
*/
if(M_GetMainWnd()->IsIconic())
M_GetMainWnd()->SendMessage(WM_SYSCOMMAND, SC_RESTORE);
M_GetMainDevice()->GetDevice(0)->SwapFullScreen();
M_GetMainApp()->m_bWasInFullScreenBeforeLooseFocus = FALSE;
}
/*
if((M_GetMainApp()->m_bBadResolution) && (M_GetMainDevice()->GetDevice(0)->IsFullScreen()))
{
M_GetMainApp()->fn_vAppliAskToStopEngine();
M_GetMainDevice()->GetDevice(0)->SwapFullScreen();
M_GetMainApp()->m_bWasInFullScreenBeforeLooseFocus = TRUE;
M_GetMainWnd()->SendMessage(WM_SYSCOMMAND, SC_MINIMIZE);
}
else
{
if(M_GetMainDevice()->GetDevice(0)->IsFullScreen())
{
if(M_GetMainWnd()->IsIconic())
M_GetMainWnd()->SendMessage(WM_SYSCOMMAND, SC_RESTORE);
M_GetMainApp()->m_bWasInFullScreenBeforeLooseFocus = FALSE;
}
M_GetMainDevice()->GetDevice(0)->SwapFullScreen();
}
*/
}
//###########################################################################
//###########################################################################
BOOL CPA_ProjectApp::PreTranslateMessageEngine(MSG *p_stMsg)
{
BOOL bRes = FALSE;
static BOOL bMenu = FALSE;
BeforeWindows();
switch(p_stMsg->message)
{
/*
* Want to restore window. If window was in full screen before been minimized,
* for to swap to full screen.
*/
case WM_SYSCOMMAND:
switch(p_stMsg->wParam)
{
case SC_RESTORE:
case SC_MAXIMIZE:
if(m_bWasInFullScreenBeforeLooseFocus)
fnv_SwapFullScreen();
break;
}
break;
case WM_SYSKEYUP:
switch(p_stMsg->wParam)
{
case VK_RETURN:
fnv_SwapFullScreen();
bRes = TRUE;
break;
case VK_TAB:
M_GetMainApp()->fn_vAppliAskToStopEngine();
if (M_GetMainDevice()->GetDevice(0)->IsFullScreen())
fnv_SwapFullScreen();
bRes = TRUE;
break;
case VK_F10:
bRes = TRUE;
break;
}
break;
// Keyboard messages
case WM_KEYDOWN:
case WM_KEYUP:
case WM_CHAR:
case WM_DEADCHAR:
if (p_stMsg->wParam == VK_NUMLOCK ||
p_stMsg->wParam == VK_SCROLL ||
p_stMsg->wParam == VK_CAPITAL ||
p_stMsg->wParam == VK_SHIFT ||
p_stMsg->wParam == VK_LSHIFT ||
p_stMsg->wParam == VK_RSHIFT)
bRes = FALSE;
else
bRes = TRUE;
break;
// No mouse messages
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_MOUSEMOVE:
case WM_LBUTTONDBLCLK:
case WM_RBUTTONDBLCLK:
bRes = TRUE;
break;
default:
bRes = FALSE;
break;
}
AfterWindows();
return bRes;
}
//###########################################################################
//###########################################################################
BOOL CPA_ProjectApp::PreTranslateMessage( MSG* pMsg )
{
BOOL bRes;
//call base member
bRes = CWinApp::PreTranslateMessage(pMsg);
if (!bRes)
{
bRes = CPA_ProjectApp::PreTranslateMessageEngine(pMsg);
}
return bRes;
}
//###########################################################################
//###########################################################################
int CPA_ProjectApp::Run(void)
{
MSG stMsg;
BOOL bRes;
// loop while message is not WM_QUIT
while (::GetMessage(&stMsg, NULL, 0, 0))
{
if (stMsg.message == WM_CANCELMODE)
{
fnv_SwapFullScreen();
}
bRes = PreTranslateMessage(&stMsg);
if(!bRes)
{
::TranslateMessage(&stMsg);
::DispatchMessage(&stMsg);
}
}
// Application exit code
ExitApplication();
return stMsg.wParam;
}
//===========================================================================
// Description: Called by the appli when the appli wants to stop the engine
// result :
// The Engine has not been stopped, but it has been notified to do so. We will receive a
// user message when the engine wants to be stopped
// Creation date: 19 jun 97
// Author: FBF
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void CPA_ProjectApp::fn_vAppliAskToStopEngine(void)
{
m_bAppliAskedToStopEngine = TRUE;
}
//===========================================================================
// Description: Called by the appli when the appli wants to start the engine
// result :
// The Engine will restart
// Creation date: 19 jun 97
// Author: FBF
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void CPA_ProjectApp::fn_vAppliAskToStartEngine(void)
{
m_bAppliAskedToStopEngine = FALSE;
if (m_bEngineIsStopped)
fn_vRestartEngine();
}
//===========================================================================
// Description: Called by the appli when the appli wants to start the engine
// for one step
// Creation date: aujourd'hui
// Author: VL mais j'avoue avoir copi<70> la fonction de FBF de CpaProj.cpp
// par contre j'aime pas du tout le style des commentaires mais
// c'est plutot personnel
//===========================================================================
void CPA_ProjectApp::fn_vAppliAskOneStep(void)
{
// pulse if engine has been stopped by the appli and if the engine is stopped and if one step has not allready been asked
if ((m_bAppliAskedToStopEngine == TRUE) && (m_bEngineIsStopped == TRUE) && (m_bAppliPulsedOneStep == FALSE))
{
m_bAppliPulsedOneStep = TRUE;
fn_vRestartEngine();
}
}
//===========================================================================
// Description: Called by the appli when the appli wants to end the game
// result :
// The Engine has been notified to begin the closing process
// we will receive a user message when the engine begin this process,
// and when the engine has finished this process
// Creation date: 19 jun 97
// Author: FBF
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void CPA_ProjectApp::fn_vAppliAskToEndGame(void)
{
// tell that we want to close
m_bAppliAskedToEndGame = TRUE;
// if editors are active, then we must restart the engine so that it can close
// to allow the engine to restart
M_GetMainApp()->m_bEditorsAreActive = FALSE;
// to prevent the engine from going back to editors
M_GetMainApp()->m_bAppliAskedToActivateEditors = FALSE;
M_GetMainApp()->fn_vRestartEngine();
}
//===========================================================================
// Description: a user message has been received
// return value:
// Creation date: 19 jun 97
// Author: FBF
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
afx_msg void CPA_ProjectApp::OnUserMsg(UINT wParam,LONG lParam)
{
// structure for Message box request
tdstMsgBox * p_stMsgBox;
switch(wParam)
{
case C_uiWinCm_RequestMessageBox:
p_stMsgBox = (tdstMsgBox*) lParam;
SendMessage(m_pMainWnd->m_hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
p_stMsgBox->iResult = MessageBox(NULL,p_stMsgBox->szText,p_stMsgBox->szTitle,p_stMsgBox->uiStyle);
SendMessage(m_pMainWnd->m_hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
// SetEvent(p_stMsgBox->hEvent);
break;
case USERM_STOP_ENGINE:
// if the flag is not right, do nothing
if (m_bAppliAskedToStopEngine == FALSE)
break;
fn_vStopEngine();
break;
case USERM_ENGINE_IS_CLOSING:
m_bLeavingApplication = TRUE;
break;
case USERM_ENGINE_IS_DONE:
m_bLeavingApplication = TRUE;
m_bEngineIsOver = TRUE;
m_bFinishEngine = TRUE;
M_GetMainWnd()->PostMessage(WM_CLOSE,0,0);
break;
case USERM_SWAP_FULLSCREEN:
fnv_SwapFullScreen();
break;
}
}
//===========================================================================
// Description: Stops the engine
// return value:
// Creation date: 19 jun 97
// Author: FBF
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void CPA_ProjectApp::fn_vStopEngine()
{
// if the engine is allready stopped, do nothing
if (m_bEngineIsStopped)
return;
// stop the engine
VERIFY(m_p_oEngineThread->SuspendThread() >= 0);
m_bEngineIsStopped = TRUE;
}
//===========================================================================
// Description: resume the engine
// return value:
// Creation date: 19 jun 97
// Author: FBF
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void CPA_ProjectApp::fn_vRestartEngine()
{
// if engine runs, do nothing
if (!m_bEngineIsStopped)
return;
ASSERT(m_bEditorsAreActive == FALSE);
if (m_p_oEngineThread)
{
m_bEngineIsStopped = FALSE;
m_p_oEngineThread->ResumeThread();
}
}