実行すると画面が灰色になって表示されません。
大変長文ですが、親切な人お願いします。
//ヘッダ//
#include <Windows.h>
#include <mmsystem.h>
#include <d3dx9.h>
#include <tchar.h>
struct Model{
LPD3DXMESH pmesh;
D3DMATERIAL9* pmaterials;
DWORD nummaterials;
BOOL used;
};
//グローバル変数
extern LPDIRECT3D9 g_pD3D;
extern LPDIRECT3DDEVICE9 g_pd3dDevice;
extern float g_aspect;
extern Model g_models[];
//関数プロトタイプ宣言
HRESULT InitD3DWindow(LPCTSTR wintitle, int w, int h);
int LoadModel(LPCTSTR filename);
void RenderModel(int idx);
//cpp//
#include "my3dlib.h"
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
float g_aspect = 1.0f;
const int MAXMODEL = 64;
Model g_models[MAXMODEL];
int modelindex;
void CleanupD3D(){
for (int i = 0; i < MAXMODEL; i++){
if (g_models[i].used == TRUE){
if (g_models[i].pmaterials != NULL){
delete[] g_models[i].pmaterials;
}
if (g_models[i].pmesh != NULL){
g_models[i].pmesh->Release();
}
}
}
if (g_pd3dDevice != NULL) g_pd3dDevice->Release();
if (g_pD3D != NULL) g_pD3D->Release();
}
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
switch (msg) {
case WM_DESTROY:
CleanupD3D();
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
HRESULT InitD3DWindow(LPCTSTR wintitle, int w, int h) {
ZeroMemory(&g_models, sizeof(Model)*MAXMODEL);
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL),
NULL, NULL, NULL, NULL, _T("D3D Window Class"), NULL };
RegisterClassEx(&wc);
HWND hWnd = CreateWindow(_T("D3D Window Class"), wintitle, WS_OVERLAPPED | WS_SYSMENU, 100,
100, w, h, NULL, NULL, wc.hInstance, NULL);
g_aspect = (float)w / (float)h;
if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice))){
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice))){
return E_FAIL;
}
}
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
ShowWindow(hWnd, SW_SHOWDEFAULT);
return S_OK;
}
void Render(){
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 225), 1.0f, 0);
if (SUCCEEDED(g_pd3dDevice->BeginScene() ) ){
g_pd3dDevice->SetRenderState(D3DRS_AMBIENT, 0xffffffff);
D3DXMATRIXA16 matWorld1, matWorld2;
D3DXMatrixTranslation(&matWorld1, 0.0f, 0.0f, 1.0f);
D3DXMatrixRotationY(&matWorld2, D3DX_PI);
matWorld2 *= matWorld1;
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld2);
RenderModel(modelindex);
g_pd3dDevice->EndScene();
}
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
int LoadModel(LPCTSTR filename){
int idx;
for (idx = 0; idx < MAXMODEL; idx = idx + 1){
if (g_models[idx].used == FALSE) break;
}
if (idx >= MAXMODEL) return -1;
LPD3DXBUFFER pD3DXMtrlBuffer;
if (FAILED(D3DXLoadMeshFromX(filename, D3DXMESH_SYSTEMMEM, g_pd3dDevice, NULL, &pD3DXMtrlBuffer,
NULL, &g_models[idx].nummaterials, &g_models[idx].pmesh))){
MessageBox(NULL, _T("Xファイルが見つかりません"), _T("3D Lib"), MB_OK);
return -1;
}
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
int num = g_models[idx].nummaterials;
g_models[idx].pmaterials = new D3DMATERIAL9[num];
if (g_models[idx].pmaterials == NULL) return -1;
for (int i = 0; i < num; i = i + 1){
g_models[idx].pmaterials[i] = d3dxMaterials[i].MatD3D;
g_models[idx].pmaterials[i].Ambient = g_models[idx].pmaterials[i].Diffuse;
}
pD3DXMtrlBuffer->Release();
g_models[idx].used = TRUE;
return idx;
}
void RenderModel(int idx){
if (g_models[idx].used == FALSE) return;
for (DWORD i = 0; i < g_models[idx].nummaterials; i++){
g_pd3dDevice->SetMaterial(&g_models[idx].pmaterials[i]);
g_models[idx].pmesh->DrawSubset(i);
}
}
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT){
if (SUCCEEDED(InitD3DWindow(_T("My3DLibtest"), 640, 480))){
modelindex = LoadModel(_T("box.x"));
if (modelindex == -1) return 0;
MSG msg = { 0 };
while (msg.message != WM_QUIT){
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else {
Render();
}
}
}
UnregisterClass(_T("D3D Window Class"), GetModuleHandle(NULL));
return 0;
}