/*****************************************************************************\
    FILE: main.h

    DESCRIPTION:
        Here we can subclass CDXScreenSaver if we want to override the behavior.

    BryanSt 12/24/2000
    Copyright (C) Microsoft Corp 2000-2001. All rights reserved.
\*****************************************************************************/

#ifndef SSMAIN_H
#define SSMAIN_H

extern IDirect3D8 * g_pD3D;
extern DWORD g_dwWidth;
extern DWORD g_dwHeight;
extern BOOL g_fFirstFrame;

class CMSLogoDXScreenSaver;
extern CMSLogoDXScreenSaver * g_pScreenSaver;

#include "texture.h"
#include "d3dfont.h"
#include "object.h"
#include "util.h"
#include "CameraMove.h"
#include "room.h"
#include "painting.h"
#include "pictures.h"
#include "config.h"
#include "resource.h"

class CCameraMove;

#define ITEM_FLOOR                  0
#define ITEM_WALLPAPER              1
#define ITEM_CEILING                2
#define ITEM_TOEGUARD               3
#define ITEM_RUG                    4
#define ITEM_FRAME                  5
#define ITEM_POWEROUTLET            6

#define MAX_DEVICE_OBJECTS 10

const LPCWSTR c_pszGlobalTextures[] =
{
    L"Floor.bmp",
    L"Walls.bmp",
    L"Ceiling.bmp",
    L"ToeGuard.bmp",
    L"Rug.bmp",
    L"Frame.bmp",
    L"PowerSocket.bmp"
};


#ifdef MANUAL_CAMERA
//-----------------------------------------------------------------------------
// Name: struct Camera
// Desc: 
//-----------------------------------------------------------------------------
struct Camera
{
    D3DXVECTOR3        m_vPosition;
    D3DXVECTOR3        m_vVelocity;
    FLOAT              m_fYaw;
    FLOAT              m_fYawVelocity;
    FLOAT              m_fPitch;
    FLOAT              m_fPitchVelocity;
    D3DXMATRIX         m_matView;
    D3DXMATRIX         m_matOrientation;
};
#endif

struct DeviceObjects
{
    CD3DFont* m_pStatsFont;
};


class CMSLogoDXScreenSaver : public CD3DScreensaver
{
public:
    virtual void DoConfig(void);
    CTexture * GetGlobalTexture(DWORD dwItem, float * pfScale);
    IDirect3DDevice8 * GetD3DDevice(void);
    virtual void SetDevice(UINT iDevice);
    virtual HRESULT ConfirmDevice(D3DCAPS8 * pCaps, DWORD dwBehavior, D3DFORMAT fmtBackBuffer);
    void DisplayMonitorSettings(HWND hwndParent) {DoScreenSettingsDialog(hwndParent);}
    virtual VOID ReadSettings();
    HRESULT GetCurrentScreenSize(int * pnWidth, int * pnHeight);
    int GetNumberOfMonitors(void) {return m_dwNumAdapters;}
    int GetCurrMonitorIndex(void) {return m_nCurrentDevice;}
    VOID ReadScreenSettingsPublic( HKEY hkey ) { ReadScreenSettings( hkey ); }
    VOID WriteScreenSettingsPublic( HKEY hkey ) { WriteScreenSettings( hkey ); }
    CULLINFO* PCullInfo(void) { return &m_cullInfo; }
    BOOL UseSmallImages(void) {return m_fUseSmallImages;}

    CMSLogoDXScreenSaver();
    virtual ~CMSLogoDXScreenSaver();

protected:
    // Member Functions
    virtual HRESULT RegisterSoftwareDevice(void);

    virtual HRESULT OneTimeSceneInit(void) {return S_OK;}
    virtual HRESULT FrameMove(void);
    virtual HRESULT Render(void);
    virtual HRESULT DeleteDeviceObjects(void);
    virtual HRESULT FinalCleanup(void);
    virtual HRESULT InitDeviceObjects(void);
    virtual HRESULT RestoreDeviceObjects();
    virtual HRESULT InvalidateDeviceObjects();
    virtual BOOL UseLowResolution(int * pRecommendX, int * pRecommendY);
#ifdef MANUAL_CAMERA
    VOID    UpdateCamera(Camera* pCamera);
    virtual LRESULT SaverProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
#endif


private:
    // Helper Functions
    HRESULT SetViewParams(IDirect3DDevice8 * pD3DDevice, D3DXVECTOR3 * pvecEyePt, D3DXVECTOR3 * pvecLookatPt, D3DXVECTOR3 * pvecUpVec, float nNumber);
    HRESULT _Init(void);
    HRESULT _SetTestCameraPosition(void);
    HRESULT _OneTimeSceneInit(void);
    HRESULT _CheckMachinePerf(void);

    // Member Variables
    CTheRoom * m_pCurrentRoom;
    BOOL m_fFrontToBack;
    int m_nCurrentDevice;
    BOOL m_fShowFrameInfo;
    CULLINFO m_cullInfo;
    BOOL m_fUseSmallImages;         // If TRUE, Cap images at 512x512, otherwise 1024x1024

#ifdef MANUAL_CAMERA
    BYTE m_bKey[256];
    Camera m_camera;
#endif

    CCameraMove * m_ptheCamera;

    DeviceObjects  m_DeviceObjects[MAX_DEVICE_OBJECTS];
    DeviceObjects * m_pDeviceObjects;

    CTexture * m_pTextures[ARRAYSIZE(c_pszGlobalTextures)];

    FLOAT m_fTimeKeyIn;
};






#endif // SSMAIN_H