#ifndef __Direct3DFrameH__
#define __Direct3DFrameH__
#include <Windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <MMSystem.h>
#pragma warning(disable:4018)
typedef void (*GAMEINITPROC)(void);
typedef void (*GAMELOGICPROC)(float fElapsedTime);
typedef void (*GAMERENDERPROC)(float fElapsedTime);
typedef void (*GAMECLEARUPPROC)(void);
void CreateDirect3DFrame(WNDPROC WindowProc, IDirect3DDevice9*& pDevice, HWND& hWnd, HINSTANCE hInstance, GAMEINITPROC GameInit, GAMELOGICPROC GameLogic, GAMERENDERPROC GameRender, GAMECLEARUPPROC GameClearUp, int nWidth, int nHeight)
{
// Register Class
WNDCLASSW wc;
ZeroMemory(&wc,sizeof(wc));
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor = LoadCursorW(0, IDC_ARROW);
wc.hIcon = LoadIconW(0, IDI_APPLICATION);
wc.hInstance = 0;
wc.lpfnWndProc = WindowProc;
wc.lpszClassName = L"ClassName";
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wc);
// Get Display Mode
D3DDISPLAYMODE d3ddm;
ZeroMemory(&d3ddm, sizeof(d3ddm));
IDirect3D9* pD3D;
pD3D = Direct3DCreate9(D3D_SDK_VERSION);
pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
// Resize Window Width And Height
if(nWidth > d3ddm.Width || nWidth < 0) nWidth = d3ddm.Width;
if(nHeight > d3ddm.Height || nHeight < 0) nHeight = d3ddm.Height;
// Create Window
hWnd = CreateWindowW(wc.lpszClassName, L"PLAY", WS_POPUP, (d3ddm.Width - nWidth) / 2, (d3ddm.Height - nHeight) / 2, nWidth, nHeight, 0, 0, hInstance, 0);
//
D3DCAPS9 caps;
pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
int vp = 0;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
// Fill Parameter
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.BackBufferWidth = nWidth;
d3dpp.BackBufferHeight = nHeight;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.Windowed = TRUE;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
// Create Device
pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, vp, &d3dpp, &pDevice);
// Init Game
GameInit();
// Show Window
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
// Message Loop
MSG msg;
ZeroMemory(&msg, sizeof(msg));
while(msg.message != WM_QUIT)
{
if(PeekMessageW(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
else
{
static float fLastTime = (float)timeGetTime();
float fCurrentTime = (float)timeGetTime();
float fElapsedTime = (fCurrentTime - fLastTime) * 0.001f;
GameLogic(fElapsedTime);
GameRender(fElapsedTime);
fLastTime = fCurrentTime;
}
}
GameClearUp();
if(pD3D) pD3D->Release();
if(pDevice) pDevice->Release();
}
#endif
//#include "Direct3DFrame.h"
//
//// Global Values
//LPDIRECT3D9 g_pD3D;
//LPDIRECT3DDEVICE9 g_pDevice;
//HWND g_hWnd;
//ID3DXMesh* g_pMesh;
//
//
//void GameInit()
//{
// // Set World Matrix
// D3DXMATRIX matWorld;
// D3DXMatrixIdentity(&matWorld);
// g_pDevice->SetTransform(D3DTS_WORLD, &matWorld);
// // Set View Matrix
// D3DXMATRIX matView;
// D3DXVECTOR3 vEyePos(0.0f, 0.0f, -3.0f);
// D3DXVECTOR3 vLookAt(0.0f, 0.0f, 0.0f);
// D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f);
// D3DXMatrixLookAtLH(&matView, &vEyePos, &vLookAt, &vUp);
// g_pDevice->SetTransform(D3DTS_VIEW, &matView);
// // Set Projection Matrix
// D3DXMATRIX matProj;
// D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI * 0.25f, 1366.0f/768.0f, 1.0f, 1000.0f);
// g_pDevice->SetTransform(D3DTS_PROJECTION, &matProj);
// // Init Render State
// g_pDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
// g_pDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
// g_pDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
// // Init
// D3DXCreateSphere(g_pDevice, 0.3f, 20, 20, &g_pMesh, NULL);
//}
//
//void GameLogic(float fElapsedTime)
//{
//
//}
//
//void GameRender(float fElapsedTime)
//{
// g_pDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(123,123,234), 1.0f, 0);
// g_pDevice->BeginScene();
// g_pMesh->DrawSubset(0);
// g_pDevice->EndScene();
// g_pDevice->Present(NULL, NULL, NULL, NULL);
//}
//
//void GameClearUp()
//{
// if(g_pMesh) g_pMesh->Release();
//}
//
//LRESULT CALLBACK WindowProc(HWND, int, WPARAM, LPARAM);
//
//int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
//{
// CreateDirect3DFrame((WNDPROC)WindowProc, g_pDevice, g_hWnd, hInstance, GameInit, GameLogic, GameRender, GameClearUp, 640, 480);
// return 0;
//}
//
//LRESULT CALLBACK WindowProc(HWND hWnd, int uMsg, WPARAM wParam, LPARAM lParam)
//{
// if(uMsg == WM_KEYDOWN && wParam == VK_ESCAPE) PostQuitMessage(0);
// return DefWindowProcW(hWnd, uMsg, wParam, lParam);
//}