	    				 /*---------------------------------------------------------+
						  |						vip2Dlg.cpp							|
						  |															|
						  |	   Sera la boite de dialogue de la demo principale		|
						  |		 (celle ou l'on va gérer les messages etc...)		|
						  |															|
						  | 	U2^PoPsy TeAm 2000									|
						  +---------------------------------------------------------*/


//----------------------------------------------------------------------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////////////////////////////////
// I N F O S
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------------------------------------------
/*
	-	DEbut de coding de la demo le 3/04/2000. Et c'est parti mon kiki wiiiiz la je met en place 
		moult chose pour ke la demo affiche enfin qq chose ( enfin c'est pas gagné pour l'instant ), mais
		on y croa.

	-	le 5/04/2000 : avec ghell on viens de décider d'essayer de tout faire pour présenter cette demo a 
		la Take Over woooooooouuuu fo ke ca torche alors.
		En + je vais jouer un mp3 ( pour le demo ) pour la première fois ( toute premier fois tout toute 
		première fois ( Jeanne M. ) ).

	-	le 7/04/2000 : vais essayer d'enfin afficher la premiere scene ( waaaaaaa )

	-	le 9/04/2000 : bon la nébuleuse a bien avancée, je vais maintenant intégrer un joli fondu ( huhu ).
					   Yop je vais aussi essayer mon new system de synchros de la mort ki tue la life under the hell.

	-	le 19/04/2000 : apres avoir normalement terminé la nebuleuse j'attak la deusième partie avec les
						neurooooones.

	-	le 22/04/2000 : avant de partir a la maison de campagne je finis de foutre le lens flare dans la 
						scene des neurones.

	-	le 1/05/2000 : j'assure une compatibilité avec les 3Dfx en faisant une version ou les maps ne dépasseront pas 256.

	-	le 5/05/2000 : la demo avance petitement mais surement. La j'attak la scene de l'oeil. plus ke 1 mois et 10 jous.
						J'espere kon arrivera a finir le TRES gros de la demo avant le depart pour la hollande..

	-	le 16/05/2000 : Wow crash de mon dur, fait chier !! j'ai du en changer mais heureusement ke j'vais backuppé la demo ( ouf!)
						Mais tain j'ai du tout reinstaller et perdre de ce fait moult temps !


	-	le 26/05/2000 : la demo avance, maintenant la scene des cils et de ghost s'enchaine parfaitement ! mais il reste
						encore pas mal de boulot kan meme, aller j'y retourne......


	-	le 28/05/2000 : wow la demo avance pas mal ces temps-ci je suis preske sur k'il ny aura plus ke des details a régler sur 
						place.... je croise les jambes pour ca ! Today j'attak l'intégration des scene multiples avant le final...

	-	le 11/06/2000 : yeaaahhh on part dans 5 jours et c'est wiiiiz top mega bien paskeu la demo est quasi terminée.
						il ne reste plus ke des finitions et 2,3 map 3d a faire ( mais ca c'est pas mon boulot na! ).
						Donc ca s'annonce plutot bien pour la TakeOver

	-	le 17/06/2000 : waaaaaa la deadline est dans qq heures waaaaaaa fo vraiment finir now !!!

*/
//----------------------------------------------------------------------------------------------------------------------------------------


#include "stdafx.h"
#include "vip2.h"
#include "vip2Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


#define MP3_PATH	"Datas/zic/vip2.mp3"


#define DATA_PATH "Vip2.Zob"


//#define NOMP3 1	// remove the sound

//----------------------------------------------------------------------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
// Variables globales
//----------------------------------------------------------------------------------------------------------------------------------------

HWND				hWndMain=NULL		;
Udouble				LaunchTime = 0.0	;	// depuis VIP2Headers.h
USynchronisater*	AllSynchro = NULL	;	// depuis VIP2Headers.h
double				TimePreced = 0.0	;	// var pour calcul de Fps ( voar utils.h )
U32					TickNum = 0			;	// var pour calcul de Fps ( voar utils.h )
float				m_fps =0.0f			;	// var pour calcul de Fps ( voar utils.h )
MP3Manager			mp3					;


// variable statics pour launcher la demo ( je sais c'est crade mais c'est du sur place )
#ifdef _MASTER
	BOOL	CVip2Dlg::m_Fullscreen = TRUE	;
#else
	BOOL	CVip2Dlg::m_Fullscreen = FALSE	;
#endif

U32		CVip2Dlg::m_Resx = 800			;
U32		CVip2Dlg::m_Resy = 600			;	// resolution choisie
BOOL	CVip2Dlg::m_TrueColor = TRUE	;	// est-ce ke l'on veux du 32 bit
BOOL	CVip2Dlg::m_Stereo = TRUE		;	// le son en stereo ?
BOOL	CVip2Dlg::m_Hiddenpart1	= FALSE	;	// est-ce ke ya la partie cachée 1 ?
BOOL	CVip2Dlg::m_Active = FALSE		;

//----------------------------------------------------------------------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
// CVip2Dlg dialog
//----------------------------------------------------------------------------------------------------------------------------------------

CVip2Dlg::CVip2Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(CVip2Dlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CVip2Dlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);


/*	m_Fullscreen = FALSE	;
//	m_Fullscreen = TRUE		;
	m_Resx = 640			;
	m_Resy = 480			;
	m_TrueColor	 = TRUE		;
//	m_TrueColor	 = FALSE	;
	m_Hiddenpart1 = FALSE	;
//	m_Hiddenpart1 = TRUE	;*/
	m_Numimage = 0			;
	m_FirstPaint = FALSE	;
	m_Active = FALSE		;
}

void CVip2Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CVip2Dlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CVip2Dlg, CDialog)
	//{{AFX_MSG_MAP(CVip2Dlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//----------------------------------------------------------------------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
// CVip2Dlg message handlers
//----------------------------------------------------------------------------------------------------------------------------------------

BOOL CVip2Dlg::OnInitDialog()
{
	BOOL resRes	;

	CDialog::OnInitDialog();


	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	

	//--------------------------- Ini taille de la fenetre
	CRect	rect	;

	if( m_Fullscreen )
	{
		ModifyStyleEx( GetExStyle(), WS_EX_TOPMOST )	;
		ModifyStyle( GetStyle(), WS_POPUP )				;

		if( m_TrueColor )
			resRes = ChangeScreenResolution( m_Resx, m_Resy )		;
		else
			resRes = ChangeScreenResolution( m_Resx, m_Resy, 16 )	;

		if( !resRes )
		{
			FatalError( "imposible to set resolution tonton !" )	;
			EndDialog( FALSE )										;
			return TRUE												;
		}

		MoveWindow( 0, 0, GetSystemMetrics( SM_CXSCREEN ), GetSystemMetrics( SM_CYSCREEN ) )	;
		ShowCursor( FALSE )																		;
	}
	else
	{
		rect.SetRect( 0, 0, m_Resx-1, m_Resy-1 )								;
		AdjustWindowRectEx(  (LPRECT)rect, GetStyle(),	NULL, GetExStyle() )	;
		MoveWindow( 0, 0, rect.Width(), rect.Height() )							;
	}

	//-------------------------- Ini Variables d'environnement
	m_FirstPaint = TRUE		;
	m_Active = TRUE			;
	hWndMain = m_hWnd		;

//	SetFocus()	;

	return TRUE;  // return TRUE  unless you set the focus to a control
}

//----------------------------------------------------------------------------------------------------------------------------------------
// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.
void CVip2Dlg::OnPaint() 
{
	CDialog::OnPaint();

	if( m_FirstPaint )
	{
		m_FirstPaint = FALSE	;
		MainLoop()				;	// appelle 1 seule fois la MainLoop
	}
}
//----------------------------------------------------------------------------------------------------------------------------------------
// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CVip2Dlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}
//----------------------------------------------------------------------------------------------------------------------------------------
LRESULT CVip2Dlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	if( message== WM_DESTROY )
		m_Active = FALSE	;
	if( message== WM_QUIT )
		m_Active = FALSE	;
	if( message== WM_CLOSE )
		m_Active = FALSE	;

	if( message == WM_KEYUP )
	{
		switch( wParam )
		{
			case VK_ESCAPE:
				m_Active = FALSE	;
				break;

			case VK_SPACE:
				GrabScreen( m_Resx, m_Resy, m_Numimage++ )	;
				break;
		}
	}

	return CDialog::DefWindowProc(message, wParam, lParam);
}
//----------------------------------------------------------------------------------------------------------------------------------------
// loop principale
void CVip2Dlg::MainLoop()
{
	UScheduler	MainScheduler	;


	IniEnvironmentU3D3( m_Resx, m_Resy )							;
	if( !m_TrueColor ) TextureManager::SetForceFlag( LOW_TEXTURE )	;	// demande de ne loader ke des textures 16 bit


	//-------------------------- Ini Timer
	ClockU3D::Initialise()	;


	//-------------------------- Load GTZFile
	if( !U3D3DataManager->LoadGTZ( DATA_PATH )	 )
		FatalError( "Vip2.ZOB Missing ( like the desert miss the rain....) !!!" )	;


	//-------------------------- Ini MP3 Manager
#ifndef NOMP3
	mp3.Load( MP3_PATH, m_Stereo )	;
#endif


	//-------------------------- Ini le synchronisater
	AllSynchro = new USynchronisater	;


	//-------------------------- Ini Rendu OpenGL
	m_DC = GetDC()						;
	EnableOpenGL( m_hWnd, m_DC->m_hDC )	;


	//-------------------------- fait les Pre-loading	
	FinalPart::PreLoad()	;
#if !defined( BFINAL_PART  )
	SmilePart::PreLoad()	;
#if ! defined( BSMILE_PART )
	LettresPart::PreLoad()	;
	ColonnePart::PreLoad()	;
	EtoilePart::PreLoad()	;
#if !defined( BMULTI_PART )
	CouplePart::PreLoad()	;
#if !defined( BCOUPLE_PART )
	GhostPart::PreLoad()	;
	CilsPart::PreLoad()		;
	OeilPart::PreLoad()		;
#if !defined( BOEIL_PART )
	PlansPart::PreLoad()	;
	NeuronePart::PreLoad()	;
#endif
#endif
#endif
#endif
#endif
	BPeloche::Initialise()	;
	XGrezille::Initialise()	;


	if( m_Hiddenpart1 )
		PlansPart::ActiveHidenPart()	;

	//-------------------------- Ini la 1ere part de la demo
#ifdef  BFINAL_PART
	FinalPart::Initialise( &MainScheduler, 0 )		;	// commence a partir des scenes final
#elif defined( BSMILE_PART )
	SmilePart::Initialise( &MainScheduler, 0 )		;	// commence a partir des scenes du smile de gonzesse
#elif defined( BMULTI_PART )
	MultiPart::Initialise( &MainScheduler, 0 )		;	// commence a partir des scenes multiples
#elif defined( BCOUPLE_PART )
	CouplePart::Initialise( &MainScheduler, 0 )	;	// commence a partir du couple
#elif defined( BLETTRES_PART )
	LettresPart::Initialise( &MainScheduler, 0 )	;	// commence a partir des lettres
#elif defined( BGHOST_PART )
	GhostPart::Initialise(  &MainScheduler, 0 )	;	// commence a partir de la colonne	
#elif defined( BCOLONNE_PART )
	ColonnePart::Initialise(  &MainScheduler, 0 )	;	// commence a partir de la colonne	
#elif defined( BCILS_PART )
	CilsPart::Initialise( &MainScheduler, 0 )		;	// commence a partir des cils
#elif defined( BETOILE_PART )
	EtoilePart::Initialise( &MainScheduler, 0 )	;	// commence a partir de l'etoile
#elif defined( BOEIL_PART )
	OeilPart::Initialise( &MainScheduler, 0 )		;	// commence a partir de l'oeil
#elif defined( BPLANS_PART )
	PlansPart::Initialise( &MainScheduler, 0 )		;	// commence a partir des plans
#elif defined( BNEURO_PART )
	NeuronePart::Initialise( &MainScheduler, 0 )	;	// commence a partir des neurones
#else
	NebuleusePart::Initialise( &MainScheduler, 0 )	;	// commence au debut 
#endif


#ifndef NOMP3
		mp3.Play()							;	// commence a jouer le mp3
#endif
		LaunchTime = ClockU3D::GetTime()	;	// ini temps d'offset

#ifdef BSMILE_PART
	ClockU3D::IncTime( SMILE_TIME_BEGIN )		;
#elif defined( BMULTI_PART )
		ClockU3D::IncTime( MULTI_TIME_BEGIN )	;
#elif defined( BCOUPLE_PART )
		ClockU3D::IncTime( COUPLE_TIME_BEGIN )	;
#elif defined( BGHOST_PART )
		ClockU3D::IncTime( GHOST_TIME_BEGIN )	;
#elif defined( BCILS_PART )
		ClockU3D::IncTime( CILS_TIME_BEGIN )	;
#elif defined( BOEIL_PART )
		ClockU3D::IncTime( OEIL_TIME_BEGIN )	;
#elif defined( BPLANS_PART )
		ClockU3D::IncTime( PLANS_TIME_BEGIN )	;
#elif defined( BNEURO_PART )
		ClockU3D::IncTime( NEURO_TIME_BEGIN )	;
#endif

	//////////////////////////////////////////////////////////////
	//				M A I N		L O O P						    //
	//////////////////////////////////////////////////////////////

		while( m_Active )
		{
			AllSynchro->Run()	;	// op gère les gnolies synchros
			MainScheduler.Run()	;	// lance les différentes taches
#ifndef NOMP3
			mp3.Poll()			;	// poll ce fameux mp3
#endif
			WindowsLife()		;	// permet de gérer les messages windows
		}

	//////////////////////////////////////////////////////////////
	//															//
	//////////////////////////////////////////////////////////////


	//------------------------ Stop MP3
#ifndef NOMP3
	mp3.Stop()	;
#endif


	//------------------------ Kill toutes les parts koi kil arrive
	XGrezille::Release()				;
	BPeloche::Release()					;
	NebuleusePart::Release( NULL, 0 )	;
	NeuronePart::Release( NULL, 0 )		;
	PlansPart::Release( NULL, 0 )		;
	OeilPart::Release( NULL, 0 )		;
	EtoilePart::Release( NULL, 0 )		;
	CilsPart::Release( NULL, 0 )		;
	ColonnePart::Release( NULL, 0 )		;
	GhostPart::Release( NULL, 0 )		;
	LettresPart::Release( NULL, 0 )		;
	CouplePart::Release( NULL, 0 )		;
	MultiPart::Release( NULL, 0 )		;
	SmilePart::Release( NULL, 0 )		;
	FinalPart::Release( NULL, 0 )		;


	//------------------------ Kill toutes les synchros
	DeleteBlinde( AllSynchro )	;

	//------------------------ Op la c'est la fin ...
	PostMessage( WM_CLOSE, 0, 0 )	;
}
//----------------------------------------------------------------------------------------------------------------------------------------
void CVip2Dlg::OnDestroy() 
{
	//------------------------ Kill OpenGl	
	DisableOpenGL( TRUE )		;
	ReleaseDC( m_DC )			;
	if( m_Fullscreen )
	{
		RestoreScreenResolution()	;
		ShowCursor(TRUE)			;
	}

	KillEnvironmentU3D3()	;


	CDialog::OnDestroy();
}
//----------------------------------------------------------------------------------------------------------------------------------------
