//------------------------------------------------------------------------------
// Lamp : Open source game middleware
// Copyright (C) 2004  Junpei Ohtani ( Email : junpee@users.sourceforge.jp )
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//------------------------------------------------------------------------------

/** @file
 * DirectX定義ヘッダ
 * @author Junpee
 */

#ifndef DIRECT_X_DEFINITION_H_
#define DIRECT_X_DEFINITION_H_

/// ウィンドウズヘッダ。WinNT4.0、Win98以降
#define _WIN32_WINNT 0x400
#include <Windows.h>

#ifdef _DEBUG
/// デバッグ時にDirectGraphicsのデバッグ情報を出力する
#define D3D_DEBUG_INFO
#endif// End of _DEBUG

// DirectGraphics
#include <d3d9.h>

// DirectGraphicsエクステンション
#include <d3dx9.h>

/// DirectInputバージョン8
#define DIRECTINPUT_VERSION 0x800
#include <dinput.h>

// DirectSound
#include <dsound.h>

//------------------------------------------------------------------------------
// DirectX用マクロ
//------------------------------------------------------------------------------
/**
 * DirectXの成功
 *
 * リリース時にも実行されます
 * @param dxStatus DirectXのステータス。成功していればtrueを返す
 */
#define DirectXSucceeded(dxStatus) ((dxStatus) >= 0)

/**
 * DirectXの失敗
 *
 * リリース時にも実行されます
 * @param dxStatus DirectXのステータス。失敗していればtrueを返す
 */
#define DirectXFailed(dxStatus) ((dxStatus) < 0)

//------------------------------------------------------------------------------
// デバッグ時
#ifdef _DEBUG
/**
 * DirectXのアサート
 *
 * リリース時には実行されません
 * @param expression 失敗だとアサートが発生します
 */
#define DirectXAssert(expression) \
	if(DirectXFailed(expression)){\
		DebugOut("DirectXAssert %s %d\n", __FILE__, __LINE__);\
		_asm{ int 3 }\
	}

/**
 * DirectXのメッセージ付アサート
 *
 * リリース時には実行されません
 * @param expression 失敗だとアサートが発生します
 * @param message アサート時に出力するメッセージ
 */
#define DirectXAssertMessage(expression, message) \
	if(DirectXFailed(expression)){\
		DebugOut("DirectXAssert %s\n%s %d\n", message, __FILE__, __LINE__);\
		_asm{ int 3 }\
	}

/**
 * DirectXのチェック
 *
 * リリース時にチェックは実行されませんが、引数の構文は実行されます
 * @param expression 失敗だとアサートが発生します
 */
#define DirectXCheck(expression) DirectXAssert(expression)

/**
 * DirectXのメッセージ付チェック
 *
 * リリース時にチェックは実行されませんが、引数の構文は実行されます
 * @param expression 失敗だとアサートが発生します
 * @param message アサート時に出力するメッセージ
 */
#define DirectXCheckMessage(expression, message) \
	DirectXAssertMessage(expression, message)

//------------------------------------------------------------------------------
// 非デバッグ時
#else // _DEBUG

/// アサートダミー
#define DirectXAssert(expression)

/// メッセージ付アサートダミー
#define DirectXAssertMessage(expression, message)

/// DirectXのチェックダミー
#define DirectXCheck(expression) (expression)

/// DirectXのメッセージ付チェックダミー
#define DirectXCheckMessage(expression, message) (expression)

#endif// End of _DEBUG

//------------------------------------------------------------------------------
// バージョンナンバー無しインターフェースの定義
//------------------------------------------------------------------------------

// DirectGraphics

/// Direct3D
typedef IDirect3D9 Direct3D;

/// Direct3DDevice
typedef IDirect3DDevice9 Direct3DDevice;

/// Direct3DStateBlock
typedef IDirect3DStateBlock9 Direct3DStateBlock;

/// Direct3DSurface
typedef IDirect3DSurface9 Direct3DSurface;

/// Direct3DIndexBuffer
typedef IDirect3DIndexBuffer9 Direct3DIndexBuffer;

/// Direct3DVertexDeclaration
typedef IDirect3DVertexDeclaration9 Direct3DVertexDeclaration;

/// Direct3DVertexBuffer
typedef IDirect3DVertexBuffer9 Direct3DVertexBuffer;

/// Direct3DIndexBuffer
typedef IDirect3DIndexBuffer9 Direct3DIndexBuffer;

/// Direct3DTexture
typedef IDirect3DTexture9 Direct3DTexture;

// DirectGraphicsExtension

/// Direct3DXBuffer
typedef ID3DXBuffer Direct3DXBuffer;

/// Direct3DXMesh
typedef ID3DXMesh Direct3DXMesh;

// DirectInput

/// DirectInput
typedef IDirectInput8 DirectInput;

/// DirectInputDevice
typedef IDirectInputDevice8 DirectInputDevice;

// DirectSound

/// DirectSound
typedef IDirectSound8 DirectSound;

/// DirectSoundPrimaryBuffer
typedef IDirectSoundBuffer DirectSoundPrimaryBuffer;

/// DirectSoundBuffer
typedef IDirectSoundBuffer8 DirectSoundBuffer;

/// DirectSoundNotify
typedef IDirectSoundNotify8 DirectSoundNotify;

/// DirectSound3DBuffer
typedef IDirectSound3DBuffer8 DirectSound3DBuffer;

/// DirectSound3DBuffer
typedef IDirectSound3DListener8 DirectSound3DListener;

//------------------------------------------------------------------------------
// バージョンナンバー無し構造体の定義
//------------------------------------------------------------------------------

// DirectGraphics

/// D3DADAPTER_IDENTIFIER
typedef D3DADAPTER_IDENTIFIER9 D3DAdapterIdentifier;

/// D3DCAPS
typedef D3DCAPS9 D3DCapacity;

/// D3DSURFACE_DESC
typedef D3DSURFACE_DESC D3DSurfaceDescription;

/// D3DVIEWPORT9
typedef D3DVIEWPORT9 D3DViewport;

/// D3DLIGHT9
typedef D3DLIGHT9 D3DLight;

/// D3DMATERIAL9
typedef D3DMATERIAL9 D3DMaterial;

/// D3DVERTEXELEMENT9
typedef D3DVERTEXELEMENT9 D3DVertexElement;

//------------------------------------------------------------------------------
// バージョンナンバー無し関数の定義
//------------------------------------------------------------------------------

// DirectGraphics

/// Direct3DCreate
#define Direct3DCreate Direct3DCreate9

// DirectInput

/// DirectInputCreate
#define DirectInputCreate DirectInput8Create

//------------------------------------------------------------------------------
// バージョンナンバー無し定数の定義
//------------------------------------------------------------------------------

// DirectInput

/// DirectInputInterfaceID
#define DirectInputInterfaceID IID_IDirectInput8

/// DirectInputDeviceClass_GameController
#define DirectInputDeviceClass_GameController DI8DEVCLASS_GAMECTRL

// DirectSound

/// DirectSoundBufferInterfaceID
#define DirectSoundBufferInterfaceID IID_IDirectSoundBuffer8

/// DirectSoundNotifyInterfaceID
#define DirectSoundNotifyInterfaceID IID_IDirectSoundNotify8

/// DirectSound3DBufferInterfaceID
#define DirectSound3DBufferInterfaceID IID_IDirectSound3DBuffer8

/// DirectSound3DBufferInterfaceID
#define DirectSound3DListenerInterfaceID IID_IDirectSound3DListener8

//------------------------------------------------------------------------------
// DirectXライブラリの追加
//------------------------------------------------------------------------------

// DirectXGUID
#pragma comment(lib, "dxguid.lib")

// DirectGraphics
#pragma comment(lib, "d3d9.lib")

// DirectXグラフィックスエクステンションライブラリの追加
#ifdef _DEBUG
	#pragma comment(lib, "d3dx9d.lib")
#else
	#pragma comment(lib, "d3dx9.lib")
#endif

// DirectInput
#pragma comment(lib, "dinput8.lib")

// DirectSound
#pragma comment(lib, "dsound.lib")

//dxerr9.lib

//------------------------------------------------------------------------------
#endif // End of DIRECT_X_DEFINITION_H_
//------------------------------------------------------------------------------
