//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//
//  Copyright (C) Microsoft Corporation, 1998 - 1999
//
//  File:       dxglob7obj.h
//
//--------------------------------------------------------------------------


#include "resource.h"       // main symbols


typedef HRESULT (__stdcall *DDRAWCREATE)( GUID FAR *lpGUID, LPDIRECTDRAW FAR *lplpDD, IUnknown FAR *pUnkOuter );
typedef HRESULT (__stdcall *DDCREATECLIPPER)( DWORD dwFlags, LPDIRECTDRAWCLIPPER FAR *lplpDDClipper, IUnknown FAR *pUnkOuter );
typedef HRESULT (__stdcall *DDENUMERATE)(LPDDENUMCALLBACK, LPVOID);
typedef HRESULT (__stdcall *DDENUMERATEEX)(LPDDENUMCALLBACKEX, LPVOID, DWORD);
typedef HRESULT (__stdcall *DIRECT3DRMCREATE)(LPDIRECT3DRM *lpCreate);
typedef HRESULT (__stdcall *DSOUNDCREATE)(GUID FAR * lpGUID, LPDIRECTSOUND * ppDS, IUnknown FAR *pUnkOuter );
typedef HRESULT (__stdcall *DSOUNDCAPTURECREATE)(GUID FAR * lpGUID, LPDIRECTSOUNDCAPTURE * ppDS, IUnknown FAR *pUnkOuter );
typedef HRESULT (CALLBACK *DSOUNDENUMERATE)(LPDSENUMCALLBACK lpCallback, LPVOID lpContext );
typedef HRESULT (CALLBACK *DSOUNDCAPTUREENUMERATE)(LPDSENUMCALLBACK lpCallback, LPVOID lpContext );
typedef HRESULT (__stdcall *DIRECTPLAYCREATE)( LPGUID lpGUID, LPDIRECTPLAY *lplpDP, IUnknown *pUnk);
typedef HRESULT (__stdcall *DIRECTPLAYENUMERATE)( LPDPENUMDPCALLBACK, LPVOID );
typedef HRESULT (__stdcall *DIRECTPLAYLOBBYCREATE)(LPGUID, LPDIRECTPLAYLOBBY *, IUnknown *, LPVOID, DWORD );
typedef HRESULT (__stdcall *DDRAWCREATEEX)(  GUID FAR * rGuid, LPVOID  *lplpDD, REFIID  iid,IUnknown FAR *pUnkOuter );


typedef struct tag_EVENTTHREADINFO {
	HANDLE hEvent;
	struct tag_EVENTTHREADINFO *pNext;
	IStream *pStream;
	I_dxj_DirectXEvent *pCallback;
	DWORD threadID;
	HANDLE hThread;
	BOOL	fEnd;
	HANDLE  hEndEvent;
} EVENTTHREADINFO;


class C_dxj_DirectX7Object :
	public I_dxj_DirectX7,
	public CComCoClass<C_dxj_DirectX7Object, &CLSID__dxj_DirectX7>, public CComObjectRoot
{
public:
	C_dxj_DirectX7Object() ;
	virtual ~C_dxj_DirectX7Object() ;

BEGIN_COM_MAP(C_dxj_DirectX7Object)
	COM_INTERFACE_ENTRY(I_dxj_DirectX7)
END_COM_MAP()

	DECLARE_REGISTRY(CLSID__dxj_DirectX7,	"DIRECT.DirectX6.0",		"DIRECT.DirectX6.0",	IDS_DIRECTX6_DESC, THREADFLAGS_BOTH)

// Use DECLARE_NOT_AGGREGATABLE(C_dxj_DirectSoundResourceObject) if you don't want your object
// to support aggregation
DECLARE_AGGREGATABLE(C_dxj_DirectX7Object)


public:

        HRESULT STDMETHODCALLTYPE direct3dRMCreate( 
            /* [retval][out] */ I_dxj_Direct3dRM3 __RPC_FAR *__RPC_FAR *ret);
        
        HRESULT STDMETHODCALLTYPE directDrawCreate( 
            /* [in] */ BSTR guid,
            /* [retval][out] */ I_dxj_DirectDraw7 __RPC_FAR *__RPC_FAR *ret);        
			
        HRESULT STDMETHODCALLTYPE getDDEnum( 
            /* [retval][out] */ I_dxj_DirectDrawEnum __RPC_FAR *__RPC_FAR *ret);
        
        HRESULT STDMETHODCALLTYPE directSoundCreate( 
            /* [in] */ BSTR guid,
            /* [retval][out] */ I_dxj_DirectSound __RPC_FAR *__RPC_FAR *ret);
        
        HRESULT STDMETHODCALLTYPE directSoundCaptureCreate( 
            /* [in] */ BSTR guid,
            /* [retval][out] */ I_dxj_DirectSoundCapture __RPC_FAR *__RPC_FAR *ret);
        
        HRESULT STDMETHODCALLTYPE getDSEnum( 
            /* [retval][out] */ I_dxj_DSEnum __RPC_FAR *__RPC_FAR *retVal);
        
        HRESULT STDMETHODCALLTYPE getDSCaptureEnum( 
            /* [retval][out] */ I_dxj_DSEnum __RPC_FAR *__RPC_FAR *retVal);
        
        HRESULT STDMETHODCALLTYPE directInputCreate( 
            /* [retval][out] */ I_dxj_DirectInput __RPC_FAR *__RPC_FAR *ret);
        
        HRESULT STDMETHODCALLTYPE directPlayCreate( 
            /* [in] */ BSTR guid,
            /* [retval][out] */ I_dxj_DirectPlay4 __RPC_FAR *__RPC_FAR *ret);
        
        HRESULT STDMETHODCALLTYPE directPlayLobbyCreate( 
            /* [retval][out] */ I_dxj_DirectPlayLobby3 __RPC_FAR *__RPC_FAR *ret);
        
        HRESULT STDMETHODCALLTYPE getDPEnum( 
            /* [retval][out] */ I_dxj_DPEnumServiceProviders __RPC_FAR *__RPC_FAR *retval);
        
        HRESULT STDMETHODCALLTYPE colorGetAlpha( 
            /* [in] */ long color,
            /* [retval][out] */ float __RPC_FAR *ret);
        
        HRESULT STDMETHODCALLTYPE colorGetBlue( 
            /* [in] */ long color,
            /* [retval][out] */ float __RPC_FAR *ret);
        
        HRESULT STDMETHODCALLTYPE colorGetGreen( 
            /* [in] */ long color,
            /* [retval][out] */ float __RPC_FAR *ret);
        
        HRESULT STDMETHODCALLTYPE colorGetRed( 
            /* [in] */ long color,
            /* [retval][out] */ float __RPC_FAR *ret);
        
        HRESULT STDMETHODCALLTYPE createColorRGB( 
            /* [in] */ float r,
            /* [in] */ float g,
            /* [in] */ float b,
            /* [retval][out] */ long __RPC_FAR *color);
        
        HRESULT STDMETHODCALLTYPE createColorRGBA( 
            /* [in] */ float r,
            /* [in] */ float g,
            /* [in] */ float b,
            /* [in] */ float a,
            /* [retval][out] */ long __RPC_FAR *color);
        
        HRESULT STDMETHODCALLTYPE matrixFromQuaternion( 
            /* [out] */ D3dMatrix __RPC_FAR *matrix,
            /* [in] */ D3dRMQuaternion __RPC_FAR *quat);
        
        HRESULT STDMETHODCALLTYPE quaternionRotation( 
            /* [out] */ D3dRMQuaternion __RPC_FAR *quat,
            /* [in] */ D3dVector __RPC_FAR *axis,
            /* [in] */ float theta);
        
        HRESULT STDMETHODCALLTYPE quaternionMultiply( 
            /* [out] */ D3dRMQuaternion __RPC_FAR *quat,
            /* [in] */ D3dRMQuaternion __RPC_FAR *quatA,
            /* [in] */ D3dRMQuaternion __RPC_FAR *quatB);
        
        HRESULT STDMETHODCALLTYPE quaternionSlerp( 
            /* [out] */ D3dRMQuaternion __RPC_FAR *quat,
            /* [in] */ D3dRMQuaternion __RPC_FAR *quatA,
            /* [in] */ D3dRMQuaternion __RPC_FAR *quatB,
            /* [in] */ float alpha);
        
        HRESULT STDMETHODCALLTYPE vectorAdd( 
            /* [out] */ D3dVector __RPC_FAR *v,
            /* [in] */ D3dVector __RPC_FAR *vA,
            /* [in] */ D3dVector __RPC_FAR *vB);
        
        HRESULT STDMETHODCALLTYPE vectorCrossProduct( 
            /* [out] */ D3dVector __RPC_FAR *v,
            /* [in] */ D3dVector __RPC_FAR *vA,
            /* [in] */ D3dVector __RPC_FAR *vB);
        
        HRESULT STDMETHODCALLTYPE vectorDotProduct( 
            /* [in] */ D3dVector __RPC_FAR *vA,
            /* [in] */ D3dVector __RPC_FAR *vB,
            /* [retval][out] */ float __RPC_FAR *ret);
        
        HRESULT STDMETHODCALLTYPE vectorModulus( 
            /* [in] */ D3dVector __RPC_FAR *vA,
            /* [retval][out] */ float __RPC_FAR *ret);
        
        HRESULT STDMETHODCALLTYPE vectorNormalize( 
            /* [out][in] */ D3dVector __RPC_FAR *v);
        
        HRESULT STDMETHODCALLTYPE vectorRandom( 
            /* [out][in] */ D3dVector __RPC_FAR *v);
        
        HRESULT STDMETHODCALLTYPE vectorReflect( 
            /* [out] */ D3dVector __RPC_FAR *vDest,
            /* [in] */ D3dVector __RPC_FAR *vRay,
            /* [in] */ D3dVector __RPC_FAR *vNormal);
        
        HRESULT STDMETHODCALLTYPE vectorRotate( 
            /* [out] */ D3dVector __RPC_FAR *vDest,
            /* [in] */ D3dVector __RPC_FAR *vA,
            /* [in] */ D3dVector __RPC_FAR *vAxis,
            /* [in] */ float theta);
        
        HRESULT STDMETHODCALLTYPE vectorScale( 
            /* [out] */ D3dVector __RPC_FAR *vDest,
            /* [in] */ D3dVector __RPC_FAR *vA,
            /* [in] */ float factor);
        
        HRESULT STDMETHODCALLTYPE vectorSubtract( 
            /* [out] */ D3dVector __RPC_FAR *v,
            /* [in] */ D3dVector __RPC_FAR *vA,
            /* [in] */ D3dVector __RPC_FAR *vB);
        
        HRESULT STDMETHODCALLTYPE vectorCopy( 
            /* [out][in] */ D3dVector __RPC_FAR *vDest,
            /* [in] */ D3dVector __RPC_FAR *vSrc);
        
        HRESULT STDMETHODCALLTYPE rotateXMatrix( 
            /* [out][in] */ D3dMatrix __RPC_FAR *mDest,
            /* [in] */ float radians);
        
        HRESULT STDMETHODCALLTYPE rotateYMatrix( 
            /* [out][in] */ D3dMatrix __RPC_FAR *mDest,
            /* [in] */ float radians);
        
        HRESULT STDMETHODCALLTYPE rotateZMatrix( 
            /* [out][in] */ D3dMatrix __RPC_FAR *mDest,
            /* [in] */ float radians);
        
        HRESULT STDMETHODCALLTYPE viewMatrix( 
            /* [out][in] */ D3dMatrix __RPC_FAR *mDest,
            /* [in] */ D3dVector __RPC_FAR *vFrom,
            /* [in] */ D3dVector __RPC_FAR *vTo,
            /* [in] */ D3dVector __RPC_FAR *vUp,
            /* [in] */ float roll);
        
        HRESULT STDMETHODCALLTYPE matrixMultiply( 
            /* [out][in] */ D3dMatrix __RPC_FAR *mDest,
            /* [in] */ D3dMatrix __RPC_FAR *mA,
            /* [in] */ D3dMatrix __RPC_FAR *mB);
        
        HRESULT STDMETHODCALLTYPE projectionMatrix( 
            /* [out][in] */ D3dMatrix __RPC_FAR *mDest,
            /* [in] */ float nearPlane,
            /* [in] */ float farplane,
            /* [in] */ float fov);
        
        HRESULT STDMETHODCALLTYPE copyMatrix( 
            /* [out][in] */ D3dMatrix __RPC_FAR *mDest,
            /* [in] */ D3dMatrix __RPC_FAR *mSrc);
        
        HRESULT STDMETHODCALLTYPE identityMatrix( 
            /* [out][in] */ D3dMatrix __RPC_FAR *mDest);
        
        HRESULT STDMETHODCALLTYPE zeroMatrix( 
            /* [out][in] */ D3dMatrix __RPC_FAR *mDest);
        
        
        HRESULT STDMETHODCALLTYPE tickCount( 
            /* [retval][out] */ long __RPC_FAR *retv);
        
        HRESULT STDMETHODCALLTYPE systemBpp( 
            /* [retval][out] */ long __RPC_FAR *retv);
        
      
        HRESULT STDMETHODCALLTYPE directMusicLoaderCreate( 
            /* [retval][out] */ I_dxj_DirectMusicLoader __RPC_FAR *__RPC_FAR *ret);
        
        HRESULT STDMETHODCALLTYPE directMusicComposerCreate( 
            /* [retval][out] */ I_dxj_DirectMusicComposer __RPC_FAR *__RPC_FAR *ret);
        
        HRESULT STDMETHODCALLTYPE directMusicPerformanceCreate( 
            /* [retval][out] */ I_dxj_DirectMusicPerformance __RPC_FAR *__RPC_FAR *ret);
			
    
        HRESULT STDMETHODCALLTYPE getWindowRect( 
            /* [in] */ long hwnd,
            /* [out][in] */ Rect __RPC_FAR *r) ;
        
        HRESULT STDMETHODCALLTYPE createEvent( 
            /* [in] */ I_dxj_DirectXEvent __RPC_FAR *event,
            /* [retval][out] */ long __RPC_FAR *h) ;
        
        HRESULT STDMETHODCALLTYPE setEvent( 
            /* [in] */ long eventId) ;
        
        HRESULT STDMETHODCALLTYPE destroyEvent( 
            /* [in] */ long eventId) ;


		HRESULT STDMETHODCALLTYPE createD3DVertex(float x, float y, float z, float nx, float ny, float nz, float tu, float tv,  D3dVertex *v);
		HRESULT STDMETHODCALLTYPE createD3DLVertex(float x, float y, float z, long color,  long specular,  float tu,  float tv,  D3dLVertex *v);
		HRESULT STDMETHODCALLTYPE createD3DTLVertex(float sx, float sy, float sz, float rhw, long color, long  specular, float tu, float tv,   D3dTLVertex *v);

        HRESULT STDMETHODCALLTYPE directDraw4Create( 
            /* [in] */ BSTR guid,
            /* [retval][out] */ I_dxj_DirectDraw4 __RPC_FAR *__RPC_FAR *ret);        

		HRESULT STDMETHODCALLTYPE createNewGuid(BSTR *ret);

        void LoadDDRAW();
        void LoadDPLAY();
        void LoadDSOUND();
        void LoadDINPUT();
        void LoadD3DRM();

private:

	DDRAWCREATE				m_pDirectDrawCreate;
	DDRAWCREATEEX	    	m_pDirectDrawCreateEx;
	DDCREATECLIPPER			m_pDirectDrawCreateClipper;
	DSOUNDCREATE			m_pDirectSoundCreate;
	DSOUNDCAPTURECREATE		m_pDirectSoundCaptureCreate;
	DSOUNDENUMERATE			m_pDirectSoundEnumerate;
	DSOUNDCAPTUREENUMERATE	m_pDirectSoundCaptureEnumerate;
	DIRECTPLAYCREATE		m_pDirectPlayCreate;
	DIRECTPLAYENUMERATE		m_pDirectPlayEnumerate;
	DIRECTPLAYLOBBYCREATE	m_pDirectPlayLobbyCreate;
	DIRECT3DRMCREATE		m_pDirect3DRMCreate;
	DDENUMERATE				m_pDirectDrawEnumerate;
	DDENUMERATEEX			m_pDirectDrawEnumerateEx;
	EVENTTHREADINFO			*m_pEventList;

};