#define STRICT

// Includes standard Windows
#include <windows.h>
#include <windowsx.h>
#include <time.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <stdio.h>

// Includes D3D
#define  D3D_OVERLOADS
#include <ddraw.h>
#include <d3d.h>
#include <d3dx.h>
#include "D3DEnum.h"

// Constantes
#include "const.h"

// Types
#include "types.h"

// Variables globales
HINSTANCE hInst;
LPDIRECTDRAW7			lpDD = NULL;				// Interface IDirectDraw7 
LPDIRECT3D7				lpD3D = NULL;				// Interface IDirect3D7 
LPDIRECTDRAWSURFACE7	lpddsRender = NULL;			// Surface Rendering
LPDIRECTDRAWSURFACE7	lpddsBackBuffer = NULL;		// Surface Backing store
LPDIRECTDRAWSURFACE7	g_pddsZBuffer    = NULL;	// Surface Z-buffer  
LPDIRECT3DDEVICE7		lpd3dDevice = NULL;			// Device D3D 
RECT					sRectangle;					// Rectangle courant
DDSURFACEDESC2			ddsd;
GUID gDeviceGUID;

BOOL bActive  = FALSE;								// Application active (non minimisée)
BOOL bReady   = FALSE;								// Application prête à faire un render
BOOL bGrid	  = FALSE;								// Grille o/n

float fGridSize = 1.0;								// Pas de la grille

D3DVECTOR Observer( 0.0f, 0.0f, 9.0f ),				// Coord. observateur par défaut
		  Target( 0.0f, 0.0f, 0.0f );				// Coord. cible par défaut

D3DVECTOR Cursor1( 5.0f, -5.0f, 5.0f ),				// Coord. curseur 1 par défaut
		  Cursor2( 1.0f, 1.0f, 1.0f ),				// Coord. curseur 2 par défaut
		  Cursor3( -1.0f, -1.0f, -1.0f );			// Coord. curseur 3 par défaut

D3DVECTOR vTracker;

D3DMATRIX	matView,								// Matrice caméra
			matProj,								// Matrice caméra
			matWorld;								// Matrice caméra

float	fXmin = -10.,								// Espace de travail triview : X min
		fXmax = 10.,								// Espace de travail triview : X max
		fYmin = -10.,								// Espace de travail triview : Y min
		fYmax = 10.,								// Espace de travail triview : Y max
		fZmin = -10.,								// Espace de travail triview : Z min
		fZmax = 10.;								// Espace de travail triview : Z max

SkulptGadget  gAddPoint,								  // Gadget Sculpt3D : Ajouter point
		gCenter,									// Gadget Sculpt3D : Centrer la vue sur le curseur
		gGoDown,									// Gadget Sculpt3D : Descendre (dans la vue courante)
		gGoLeft,									// Gadget Sculpt3D : Aller à gauche (idem)
		gGoUp,										// Gadget Sculpt3D : Monter (idem)
		gGoRight,									// Gadget Sculpt3D : Aller à droite (idem)
		gGrab,										// Gadget Sculpt3D : Activer pince
		gMakeTri,									// Gadget Sculpt3D : Créer triangle (entre les 3 curseurs)
		gReverse,									// Gadget Sculpt3D : ???
		gRotAnti,									// Gadget Sculpt3D : Rotation anti clockwise
		gRotClock,									// Gadget Sculpt3D : Rotation clockwise
		gZoomIn,									// Gadget Sculpt3D : Zoomer en avant
		gZoomOut;									// Gadget Sculpt3D : Zoomer en arrière

HWND	hWndPersp,									// Handle fenêtre vue 3D
		hWndTop,									// Handle fenêtre vue de dessus
		hWndFace,									// Handle fenêtre vue de face
		hWndRight,									// Handle fenêtre vue de droite
		hWndMenu,									// Handle fenêtre menu
		hWndTrace;									// Handle sous-fenêtre listbox trace

gSommet Vertices[XDC_NUMPT];						// Tableau global de points
gEdge	Edges[XDC_NUMEDGE];							// Tableau global de segments
gTri	Triangles[XDC_NUMTRI];						// Tableau global de triangles
gLamp	Lampes[XDC_NUMLAMP];						// Tableau global de lampes
gObject	Objects[XDC_NUMOBJECTS];                    // Tableua global d'objets
gMtrl   Materials[XDC_NUMMTRL];

int iVertLastUsed = -1, iVertFirstAvailable = 0;
int iEdgeLastUsed = -1, iEdgeFirstAvailable = 0;
int iTriaLastUsed = -1, iTriaFirstAvailable = 0;
int iLampLastUsed = -1, iLampFirstAvailable = 0;
int iObjtLastUsed = -1, iObjtFirstAvailable = 0;
int iMtrlLastUsed = -1, iMtrlFirstAvailable = 0;

BOOL bCoords = FALSE;								// Afficher les coordonnées o/n

D3DCOLOR	cAmbient = 0xffffffff,					// Couleur lumière ambiante
			cBack = 0x00500000;						// Couleur arrière plan

DWORD dFillMode = D3DFILL_SOLID;					// Mode de dessin 3D par défaut (point, fil, face)
DWORD dZBuf = D3DZB_TRUE;							// Z-Buffer (o/n)
BOOL  bAlpha = FALSE;								// Alpha blending o/n
BOOL  bSpecular = FALSE;
DWORD dCull = D3DCULL_CCW;
BOOL bAntialias = TRUE;

char *sLogo = "wcLogo";								// Nom de la classe de fenêtre logo
char *sMenu = "wcMenu";								// Nom de la classe de fenêtre menu
char *sPersp = "wcPersp";							// Nom de la classe de fenêtre 3D
char *sPlanar = "wcPlanar";							// Nom de la classe de fenêtre 2D

char cTool = XDC_TOOL_NONE;							// Outil courant : NONE, GRAB, SELECT, CURVE, MAGNET

D3DEnum_DeviceInfo *m_pDeviceInfo;

char cTitle[255], cString[255];

long lWActive;										// HWND de la fenêtre 2D active (face, top, right)

int iHoles;											// Nombre de trous dans une courbe à trianguler
HWND hHoleDlgActive = NULL;							// Booléen indiquant à la proc de gestion des fenêtres 2D si les clics doivent être passés à la dlgproc de gestion des trous dans le fill pour les identifier
double dHoles[XDC_MAX_HOLES * 2];					// suite de iHoles couples XY des trous
SMALLBOOL bFillAndRemoveEdges = TRUE;				// Si TRUE, fill() doit supprimer les arêtes après triangulation d'une courbe

BOOL bTracking = FALSE;							 // Poursuite curseur en cours o/n (WM_LBUTTONDOWN / WM_MOUSEMOVE)

#ifdef _AMIGA_
struct Library *GadToolsBase    = (struct Library *) NULL;
struct Library *UtilityBase     = (struct Library *) NULL;
struct Library *AslBase         = (struct Library *) NULL;
struct Library *AmigaGuideBase  = (struct Library *) NULL;
struct Library *DataTypesBase   = (struct Library *) NULL;
struct Library *IconBase        = (struct Library *) NULL;
struct Library *CyberGfxBase    = (struct Library *) NULL;
W3D_Context *hW3DContext = NULL;
W3D_Scissor sScissor;
ULONG l2DWinSigMask;
#ifndef __PPC__
struct Library *Warp3DBase      = (struct Library *) NULL;
#else
struct Library *Warp3DPPCBase   = (struct Library *) NULL;
#endif
struct Task    *hApp = (struct Task *) NULL;
#endif
