#include "common.h"
//extern g_hWindow; //Rect winRect;
//初期化 BOOL DXG::Init(HWND hWnd,unsigned char red,unsigned char green,unsigned char blue) { //float asp; SetCol3(&BackCol,red,green,blue); //IDirect3D9インターフェース取得 pD3D = Direct3DCreate9(D3D_SDK_VERSION);
ZeroMemory(&deviceSt, sizeof(deviceSt));
deviceSt.BackBufferWidth = 0; deviceSt.BackBufferHeight = 0; deviceSt.BackBufferFormat = D3DFMT_UNKNOWN; deviceSt.BackBufferCount = 1; deviceSt.MultiSampleType = D3DMULTISAMPLE_NONE; deviceSt.MultiSampleQuality = 0; deviceSt.SwapEffect = D3DSWAPEFFECT_FLIP; deviceSt.hDeviceWindow = hWnd; deviceSt.Windowed = TRUE; deviceSt.EnableAutoDepthStencil = TRUE; // バックバッファ用 deviceSt.AutoDepthStencilFormat = D3DFMT_D16; // バックバッファ有り deviceSt.Flags = 0; deviceSt.FullScreen_RefreshRateInHz = 0; // deviceSt.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;// 処理中断しない deviceSt.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // fpsを60にする //デバイスインターフェイス取得 if (FAILED(pD3D->CreateDevice(adapter,D3DDEVTYPE_HAL,hWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&deviceSt,&device))) { // 失敗したので HAL で試行 if (FAILED(pD3D->CreateDevice(adapter,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&deviceSt,&device))) { // 失敗したので REF で試行 if (FAILED(pD3D->CreateDevice(adapter,D3DDEVTYPE_REF,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&deviceSt,&device))) { // 結局失敗した MessageBox(NULL,"Direct3D の初期化に失敗しました。","aaa",MB_OK | MB_ICONSTOP); RELEASE(pD3D); return FALSE; } } } //ビューポートの設定 vp.X =0; vp.Y =0; vp.Width =deviceSt.BackBufferWidth; vp.Height=deviceSt.BackBufferHeight; vp.MinZ =0.0f; vp.MaxZ =1.0f; device->SetViewport(&vp); //ビュー行列の設定 D3DXMatrixLookAtLH(&matV,&D3DXVECTOR3(0,0,0),&D3DXVECTOR3(0,0,1),&D3DXVECTOR3(0,1,0)); device->SetTransform(D3DTS_VIEW,&matV); //プロジェクション行列の設定 D3DXMatrixPerspectiveFovLH(&matP,60.0f * 3.141592f /180.0f,1.0f,0.01f,10.0f); device->SetTransform(D3DTS_PROJECTION,&matP); //テクスチャの初期化 for(int i=0;i < TEXTURE_MAX;i++) { Texture[i] = NULL; } //頂点の初期化 for(int i = 0;i < 4;++i) { v2D[i].x = 0; v2D[i].y = 0; v2D[i].z = 0; v2D[i].rhw = 1.0; v2D[i].col = 0xffffffff; v2D[i].tu = 0; v2D[i].tv = 0;
v3D[i].x = 0; v3D[i].y = 0; v3D[i].z = 0; v3D[i].col = 0xffffffff; v3D[i].tu = 0; v3D[i].tv = 0; } v2D[1].tu = 1; v2D[2].tv = 1; v2D[3].tu = 1; v2D[3].tv = 1; v3D[0].x = -1; v3D[0].y = -1; v3D[1].x = 1; v3D[1].y = -1; v3D[2].x = -1; v3D[2].y = 1; v3D[3].x = 1; v3D[3].y = 1; v3D[1].tu = 1; v3D[2].tv = 1; v3D[3].tu = 1; v3D[3].tv = 1; //スプライトの作成 D3DXCreateSprite(device,&Sprite); //頂点フォーマットの設定 device->SetFVF(FVF2); //ライトの無効化 device->SetRenderState(D3DRS_LIGHTING,FALSE); //カリングの設定 device->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE); //アルファ値の設定(カラー抜き) // device->SetRenderState(D3DRS_ALPHAREF,0x00000066); // device->SetRenderState(D3DRS_ALPHATESTENABLE,TRUE); // device->SetRenderState(D3DRS_ALPHAFUNC,D3DCMP_GREATEREQUAL); return TRUE; } //描画開始 BOOL DXG::DrawBegin(void) { device->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(BackCol.red,BackCol.green,BackCol.blue),1.0f,0); return SUCCEEDED(device->BeginScene()); } //描画終了 HRESULT DXG::DrawEnd(void) { device->EndScene(); return device->Present(NULL,NULL,NULL,NULL); } //解放処理 void DXG::End(void) { for(int i = 0;i < TEXTURE_MAX;++i){ RELEASE(Texture[i]); } RELEASE(device); RELEASE(pD3D); } //テクスチャ読み込み BOOL DXG::SetTexture(char *Tname,int Tno,D3DCOLOR ARGB){ //D3DCOLOR colornull = 0; if(Tno >=0 && Tno < TEXTURE_MAX){ hr = D3DXCreateTextureFromFileEx(device,Tname,0,0,0,0, D3DFMT_A8R8G8B8,D3DPOOL_MANAGED,D3DX_FILTER_LINEAR,D3DX_FILTER_LINEAR,ARGB, NULL,NULL,&Texture[Tno]); if(ARGB == 0){//カラーキーを設定していない colorkeyflg[Tno] = 0; }else{//カラーキーを設定している colorkeyflg[Tno] = 1; } if(FAILED(hr)){ sprintf(cbuffer,"テクスチャの読み込みが失敗しました。\nテクスチャ No%d\0",Tno); MSGB(cbuffer); return 0; } return 1; } return 0; } //テクスチャの解放 void DXG::ReleaseTexture(int Tno) { RELEASE(Texture[Tno]); } //スプライトの描画 1 void DXG::SpriteDraw(int Tno,float Mx,float My,D3DCOLOR ARGB) { D3DXVECTOR2 Translation(Mx,My);
Sprite->Begin(0); Sprite->Draw(Texture[Tno],NULL,NULL,NULL,0,&Translation,ARGB); Sprite->End(); } void DXG::SpriteDraw(int Tno,float Sx,float Sy,float Mx,float My,D3DCOLOR ARGB) { D3DXVECTOR2 Scaling(Sx,Sy); D3DXVECTOR2 Translation(Mx,My);
Sprite->Begin(0); // Sprite->Draw(Texture[Tno],NULL,&Scaling,NULL,0.0,&Translation,ARGB); Sprite->Draw(Texture[Tno],NULL,&Scaling,NULL,0.0); Sprite->End(); } void DXG::SpriteDraw(int Tno,float Sx,float Sy,float Mx,float My,float rad,D3DCOLOR ARGB) { D3DXVECTOR2 Scaling(Sx,Sy); D3DXVECTOR2 Translation(Mx,My);
Sprite->Begin(0); // Sprite->Draw(Texture[Tno],NULL,&Scaling,NULL,rad,&Translation,ARGB); Sprite->Draw(Texture[Tno],NULL,&Scaling,NULL,rad); Sprite->End(); } void DXG::SpriteDraw(int Tno,float Sx,float Sy,float Cx,float Cy,float Mx,float My,float rad,D3DCOLOR ARGB) { D3DXVECTOR2 Scaling(Sx,Sy); D3DXVECTOR2 RotationCenter(Cx,Cy); D3DXVECTOR2 Translation(Mx,My);
Sprite->Begin(0); Sprite->Draw(Texture[Tno],NULL,&Scaling,&RotationCenter,rad,&Translation,ARGB); Sprite->End(); } //DrawPrimitiveUPで2D画像を描画 void DXG::DrawPU2D(void) { device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,v2D,sizeof(V2D)); } void DXG::DrawPU2D(int Tno) { SetColorKey(Tno);//カラーキーか半透明化を設定 device->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); device->SetTexture(0,Texture[Tno]);
device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,v2D,sizeof(V2D)); } void DXG::DrawPU2D(int Tno,unsigned char alpha) { SetColorKey(Tno);//カラーキーか半透明化を設定
device->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE); device->SetTexture(0,Texture[Tno]); v2D[0].col = D3DCOLOR_ARGB(alpha,255,255,255); v2D[1].col = D3DCOLOR_ARGB(alpha,255,255,255); v2D[2].col = D3DCOLOR_ARGB(alpha,255,255,255); v2D[3].col = D3DCOLOR_ARGB(alpha,255,255,255); device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,v2D,sizeof(V2D)); } //DrawPrimitiveUPで3D画像を描画 void DXG::DrawPU3D(void) { device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,v3D,sizeof(V3D)); } void DXG::DrawPU3D(int Tno) { // device->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); device->SetTexture(0,Texture[Tno]); device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,v3D,sizeof(V3D)); } void DXG::DrawPU3D(int Tno,unsigned char alpha) { device->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE); device->SetTexture(0,Texture[Tno]); v3D[0].col = D3DCOLOR_ARGB(alpha,255,255,255); v3D[1].col = D3DCOLOR_ARGB(alpha,255,255,255); v3D[2].col = D3DCOLOR_ARGB(alpha,255,255,255); v3D[3].col = D3DCOLOR_ARGB(alpha,255,255,255); device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,v3D,sizeof(V3D)); } //アルファブレンディングの方法 void DXG::SetAlpha(int src,int des) { if(src){ device->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA); }else{ device->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ONE); }
if(des){ device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA); }else{ device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE); } } //アルファブレンディング オフ void DXG::AlphaOff() { device->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); } //アルファブレンディング オン void DXG::AlphaOn() { device->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE); } //頂点の設定 2D void DXG::SetV2D(float Lx,float Uy,float Rx,float Dy) { v2D[0].x = Lx; v2D[0].y = Uy; v2D[1].x = Rx; v2D[1].y = Uy; v2D[2].x = Lx; v2D[2].y = Dy; v2D[3].x = Rx; v2D[3].y = Dy; } //頂点の設定 3D void DXG::SetV3D(float Lx,float Uy,float Rx,float Dy,float z){ v3D[0].x = Lx; v3D[0].y = Uy; v3D[0].z = z; v3D[1].x = Rx; v3D[1].y = Uy; v3D[1].z = z; v3D[2].x = Lx; v3D[2].y = Dy; v3D[2].z = z; v3D[3].x = Rx; v3D[3].y = Dy; v3D[3].z = z; } //頂点フォーマットの設定 void DXG::FVF2D(void) { device->SetFVF(FVF2); } void DXG::FVF3D(void) { device->SetFVF(FVF3); } //Zバッファの設定 void DXG::ZbufferOn(void) { device->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE); } void DXG::ZbufferOff(void) { device->SetRenderState(D3DRS_ZENABLE,D3DZB_FALSE); } void DXG::ZbufferClear(void) { device->Clear( 0,NULL,D3DCLEAR_ZBUFFER, 0, 1.0f, 0); } //高速化用 void DXG::eqMat(D3DXMATRIX *mat1,D3DXMATRIX *mat2) { mat1->_11 = mat2->_11; mat1->_12 = mat2->_12; mat1->_13 = mat2->_13; mat1->_14 = mat2->_14; mat1->_21 = mat2->_21; mat1->_22 = mat2->_22; mat1->_23 = mat2->_23; mat1->_24 = mat2->_24; mat1->_31 = mat2->_31; mat1->_32 = mat2->_32; mat1->_33 = mat2->_33; mat1->_34 = mat2->_34; mat1->_41 = mat2->_41; mat1->_42 = mat2->_42; mat1->_43 = mat2->_43; mat1->_44 = mat2->_44; } //ワールド行列の設定 void DXG::SetMatW(float Rx,float Ry,float Rz,float Tx,float Ty,float Tz) { D3DXMatrixRotationX(&matX,Rx); D3DXMatrixRotationY(&matY,Ry); D3DXMatrixRotationZ(&matZ,Rz); D3DXMatrixTranslation(&matTrans,Tx,Ty,Tz);
D3DXMatrixMultiply(&matW, &matX, &matY); D3DXMatrixMultiply(&matW, &matW, &matZ); D3DXMatrixMultiply(&matW, &matW, &matTrans);
device->SetTransform(D3DTS_WORLD,&matW); } void DXG::SetMatWtr(float Tx,float Ty,float Tz,float Rx,float Ry,float Rz) { D3DXMatrixRotationX(&matX,Rx); D3DXMatrixRotationY(&matX,Ry); D3DXMatrixRotationZ(&matX,Rz); D3DXMatrixTranslation(&matTrans,Tx,Ty,Tz);
D3DXMatrixMultiply(&matW, &matX, &matTrans); D3DXMatrixMultiply(&matW, &matW, &matY); D3DXMatrixMultiply(&matW, &matW, &matZ);
device->SetTransform(D3DTS_WORLD,&matW); } //テクスチャの描画範囲 void DXG::SetUV2D(float left,float top,float right,float bottom) { v2D[0].tu = left; v2D[0].tv = top; v2D[1].tu = right; v2D[1].tv = top; v2D[2].tu = left; v2D[2].tv = bottom; v2D[3].tu = right; v2D[3].tv = bottom; } void DXG::SetUV2D() { v2D[0].tu = 0; v2D[0].tv = 0; v2D[1].tu = 1; v2D[1].tv = 0; v2D[2].tu = 0; v2D[2].tv = 1; v2D[3].tu = 1; v2D[3].tv = 1; } void DXG::SetUV3D(float left,float top,float right,float bottom) { v3D[0].tu = left; v3D[0].tv = top; v3D[1].tu = right; v3D[1].tv = top; v3D[2].tu = left; v3D[2].tv = bottom; v3D[3].tu = right; v3D[3].tv = bottom; } void DXG::SetUV3D() { v3D[0].tu = 0; v3D[0].tv = 0; v3D[1].tu = 1; v3D[1].tv = 0; v3D[2].tu = 0; v3D[2].tv = 1; v3D[3].tu = 1; v3D[3].tv = 1; } void DXG::SetColorKey(int Tno) { static int ColorKeyFlg = 1; if(ColorKeyFlg != colorkeyflg[Tno]){//変更の必要あり if(colorkeyflg[Tno]){ device->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);//カラー抜き可(半透明処理不可) ColorKeyFlg = 1; }else{ device->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE);//半透明処理可(カラー抜き不可) ColorKeyFlg = 0; } } } |