[187] | 1 | 'このファイルには、DirectGraphicsをCOMインターフェイスレベルで扱うための関数が定義されています。
|
---|
| 2 |
|
---|
| 3 |
|
---|
| 4 | '----------------------------------------------------
|
---|
| 5 | ' DirectGraphicsに必要なヘッダファイルをインクルード
|
---|
| 6 | '----------------------------------------------------
|
---|
| 7 | #include <directx9\d3dx9.sbp>
|
---|
| 8 |
|
---|
| 9 |
|
---|
| 10 | Dim dx_lpD3D As LPDIRECT3D9
|
---|
| 11 | Dim dx_lpD3DDEV As LPDIRECT3DDEVICE9 'Direct3Dデバイスを扱うインターフェイス
|
---|
| 12 | Dim dx_lpD3DXFont As LPD3DXFONT '文字列描画を扱うインターフェイス
|
---|
| 13 | Dim dx_d3dpp As D3DPRESENT_PARAMETERS
|
---|
| 14 |
|
---|
| 15 |
|
---|
| 16 | Function dx_InitD3D(hWnd As HWND, ScreenX As Long, ScreenY As Long, bWindowMode As Long) As Long
|
---|
| 17 | dx_lpD3D=Direct3DCreate9(D3D_SDK_VERSION)
|
---|
| 18 | If dx_lpD3D=0 Then
|
---|
| 19 | MessageBox(0, "Direct3D オブジェクトの生成に失敗しました。", "エラー", MB_OK or MB_ICONSTOP)
|
---|
| 20 | ExitProcess(0)
|
---|
| 21 | End If
|
---|
| 22 |
|
---|
| 23 | Dim d3ddm As D3DDISPLAYMODE
|
---|
| 24 | dx_lpD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, VarPtr(d3ddm))
|
---|
| 25 |
|
---|
| 26 | ZeroMemory(VarPtr(dx_d3dpp), SizeOf(D3DPRESENT_PARAMETERS))
|
---|
| 27 | dx_d3dpp.BackBufferWidth = ScreenX ' バックバッファの幅
|
---|
| 28 | dx_d3dpp.BackBufferHeight = ScreenY ' バックバッファの高さ
|
---|
| 29 | dx_d3dpp.BackBufferFormat = D3DFMT_R5G6B5 ' バックバッファのフォーマット
|
---|
| 30 | dx_d3dpp.BackBufferCount = 1 ' バックバッファの数
|
---|
| 31 | dx_d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE ' マルチサンプリングの種類
|
---|
| 32 | dx_d3dpp.MultiSampleQuality = 0 ' マルチサンプリングの品質
|
---|
| 33 | dx_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD ' スワップエフェクト
|
---|
| 34 | dx_d3dpp.hDeviceWindow = hWnd ' デバイスウインドウハンドル
|
---|
| 35 | dx_d3dpp.Windowed = bWindowMode ' ウインドウモードならTRUE
|
---|
| 36 | dx_d3dpp.EnableAutoDepthStencil = TRUE ' Zバッファの有無
|
---|
| 37 | dx_d3dpp.AutoDepthStencilFormat = D3DFMT_D16 ' Zバッファのフォーマット
|
---|
| 38 | dx_d3dpp.Flags = 0 ' 動作設定
|
---|
| 39 | dx_d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT ' リフレッシュレート
|
---|
| 40 | dx_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE ' 画面の更新間隔
|
---|
| 41 |
|
---|
| 42 | Dim result As Long
|
---|
| 43 |
|
---|
| 44 | 'T&L HAL デバイスの生成
|
---|
| 45 | result=dx_lpD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING, VarPtr(dx_d3dpp), VarPtr(dx_lpD3DDEV))
|
---|
| 46 | If result Then
|
---|
| 47 | '失敗時 HAL デバイスの生成
|
---|
| 48 | result=dx_lpD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,VarPtr(dx_d3dpp), VarPtr(dx_lpD3DDEV))
|
---|
| 49 | If result Then
|
---|
| 50 | '失敗時 REF デバイスの生成
|
---|
| 51 | result=dx_lpD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,VarPtr(dx_d3dpp), VarPtr(dx_lpD3DDEV))
|
---|
| 52 | If result Then
|
---|
| 53 | '全て失敗
|
---|
| 54 | dx_InitD3D=0
|
---|
| 55 | Exit Function
|
---|
| 56 | End If
|
---|
| 57 | End If
|
---|
| 58 | End If
|
---|
| 59 | dx_InitD3D=1
|
---|
| 60 | End Function
|
---|
| 61 |
|
---|
| 62 | ' Direct3Dフォントを生成する関数
|
---|
| 63 | Function dx_InitFont() As Long As Long
|
---|
| 64 | Dim hr As DWord
|
---|
| 65 |
|
---|
| 66 | '論理フォント構造体
|
---|
| 67 | Dim dfont As D3DXFONT_DESC
|
---|
| 68 | ZeroMemory(VarPtr(dfont), Len(dfont))
|
---|
| 69 | dfont.Height=16
|
---|
| 70 | dfont.Width=0
|
---|
| 71 | dfont.Weight=FW_NORMAL
|
---|
| 72 | dfont.MipLevels=0
|
---|
| 73 | dfont.CharSet=SHIFTJIS_CHARSET
|
---|
| 74 | dfont.OutputPrecision=OUT_DEFAULT_PRECIS
|
---|
| 75 | dfont.Quality=DEFAULT_QUALITY
|
---|
| 76 | dfont.PitchAndFamily=DEFAULT_PITCH
|
---|
| 77 |
|
---|
| 78 | 'Direct3D フォント生成
|
---|
| 79 | hr = D3DXCreateFontIndirect(dx_lpD3DDEV, VarPtr(dfont), VarPtr(dx_lpD3DXFont))
|
---|
| 80 | If hr Then dx_InitFont=0 Else dx_InitFont=1
|
---|
| 81 | End Function
|
---|
| 82 |
|
---|
| 83 | ' デバイスを生成する関数
|
---|
| 84 | Function dx_Init(hWnd As HWND, ScreenX As Long, ScreenY As Long, bWindowMode As Long) As Long
|
---|
| 85 | 'COMを初期化
|
---|
| 86 | CoInitialize(NULL)
|
---|
| 87 |
|
---|
| 88 | 'D3Dデバイスを生成
|
---|
| 89 | If dx_InitD3D(hWnd,ScreenX,ScreenY,bWindowMode)=0 Then
|
---|
| 90 | dx_Init=0
|
---|
| 91 | Exit Function
|
---|
| 92 | End If
|
---|
| 93 |
|
---|
| 94 | 'フォントを生成
|
---|
| 95 | If dx_InitFont()=0 Then
|
---|
| 96 | dx_Init=0
|
---|
| 97 | Exit Function
|
---|
| 98 | End If
|
---|
| 99 |
|
---|
| 100 | 'DirectInputを初期化
|
---|
| 101 | If dx_InitDInput()=0 Then
|
---|
| 102 | dx_Init=0
|
---|
| 103 | Exit Function
|
---|
| 104 | End If
|
---|
| 105 |
|
---|
| 106 | 'DirectMusicを初期化
|
---|
| 107 | If dx_InitDMusic()=0 Then
|
---|
| 108 | dx_Init=0
|
---|
| 109 | Exit Function
|
---|
| 110 | End If
|
---|
| 111 |
|
---|
| 112 | dx_Init=1
|
---|
| 113 | End Function
|
---|
| 114 |
|
---|
| 115 | ' 各デバイスの終了処理
|
---|
| 116 | Sub dx_Quit()
|
---|
| 117 | 'DirectMusicの終了
|
---|
| 118 | dx_QuitDMusic()
|
---|
| 119 |
|
---|
| 120 | 'DirectInputの終了
|
---|
| 121 | dx_QuitDInput()
|
---|
| 122 |
|
---|
| 123 | If dx_lpD3DXFont Then dx_lpD3DXFont->Release()
|
---|
| 124 | If dx_lpD3DDEV Then dx_lpD3DDEV->Release()
|
---|
| 125 | If dx_lpD3D Then dx_lpD3D->Release()
|
---|
| 126 |
|
---|
| 127 | 'COMの終了
|
---|
| 128 | CoUninitialize()
|
---|
| 129 | End Sub
|
---|
| 130 |
|
---|
| 131 | ' デバイスインターフェイスを取得するための関数
|
---|
| 132 | Function dx_GetDevice() As LPDIRECT3DDEVICE9
|
---|
| 133 | dx_GetDevice=dx_lpD3DDEV
|
---|
| 134 | End Function
|
---|
| 135 |
|
---|
| 136 | ' 画面描画の開始
|
---|
| 137 | Sub dx_BeginScene()
|
---|
| 138 | dx_lpD3DDEV->BeginScene()
|
---|
| 139 | End Sub
|
---|
| 140 |
|
---|
| 141 | ' 画面描画の終了
|
---|
| 142 | Sub dx_EndScene()
|
---|
| 143 | dx_lpD3DDEV->EndScene()
|
---|
| 144 | End Sub
|
---|
| 145 |
|
---|
| 146 | ' バックバッファとZバッファの初期化
|
---|
| 147 | Sub dx_Clear()
|
---|
| 148 | dx_lpD3DDEV->Clear(0,
|
---|
| 149 | NULL,
|
---|
| 150 | D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER,
|
---|
| 151 | D3DCOLOR_XRGB(0,0,0),
|
---|
| 152 | 1.0,
|
---|
| 153 | 0)
|
---|
| 154 | End Sub
|
---|
| 155 |
|
---|
| 156 | ' 文字列を描画
|
---|
| 157 | Sub dx_DrawText(x As Long, y As Long, psz As BytePtr, d3dColor As D3DCOLOR)
|
---|
| 158 | Dim rc As RECT
|
---|
| 159 | rc.left=x
|
---|
| 160 | rc.top=y
|
---|
| 161 | 'DT_NOCLIPフラグを指定するため、rc.right及びrc.bottomは無視される
|
---|
| 162 |
|
---|
| 163 | dx_lpD3DXFont->DrawText(0,
|
---|
| 164 | psz,
|
---|
| 165 | -1,
|
---|
| 166 | VarPtr(rc),
|
---|
| 167 | DT_LEFT or DT_NOCLIP or DT_EXPANDTABS,
|
---|
| 168 | d3dColor)
|
---|
| 169 | End Sub
|
---|
| 170 |
|
---|
| 171 | ' 画面を更新
|
---|
| 172 | Function dx_Present() As DWord
|
---|
| 173 | dx_Present=dx_lpD3DDEV->Present(NULL,NULL,NULL,NULL)
|
---|
| 174 | End Function
|
---|
| 175 |
|
---|
| 176 | 'カリングモードの設定
|
---|
| 177 | Sub dx_SetCullMode(CullMode As D3DCULL)
|
---|
| 178 | dx_lpD3DDEV->SetRenderState(D3DRS_CULLMODE,CullMode)
|
---|
| 179 | End Sub
|
---|
| 180 |
|
---|
| 181 | 'カメラの位置、角度の設定
|
---|
| 182 | Sub dx_SetCamera(pVectorEye As *D3DVECTOR, pVectorAt As *D3DVECTOR, pVectorUp As *D3DVECTOR)
|
---|
| 183 | Dim mView As D3DXMATRIX
|
---|
| 184 | D3DXMatrixLookAtLH(VarPtr(mView),
|
---|
| 185 | pVectorEye As *D3DXVECTOR3, 'カメラ位置
|
---|
| 186 | pVectorAt As *D3DXVECTOR3, 'カメラ注視点
|
---|
| 187 | pVectorUp As *D3DXVECTOR3 'カメラ上方向
|
---|
| 188 | )
|
---|
| 189 | dx_lpD3DDEV->SetTransform(D3DTS_VIEW, VarPtr(mView))
|
---|
| 190 | End Sub
|
---|
| 191 |
|
---|
| 192 | '射影変換行列の設定
|
---|
| 193 | Sub dx_SetProjection(angle As Single, aspect As Single, nearclip As Single, backclip As Single)
|
---|
| 194 | Dim mProjection As D3DXMATRIX
|
---|
| 195 | D3DXMatrixPerspectiveFovLH(
|
---|
| 196 | VarPtr(mProjection),
|
---|
| 197 | angle, '視野角
|
---|
| 198 | aspect, 'アスペクト比
|
---|
| 199 | nearclip, '前方投影面
|
---|
| 200 | backclip) '後方投影面
|
---|
| 201 | dx_lpD3DDEV->SetTransform(D3DTS_PROJECTION, VarPtr(mProjection))
|
---|
| 202 | End Sub
|
---|
| 203 |
|
---|
| 204 | ' 光源の設定
|
---|
| 205 | Sub dx_SetDefaultLight()
|
---|
| 206 | ' ポイントライトの設定
|
---|
| 207 | Dim PointLight As D3DLIGHT9
|
---|
| 208 | ZeroMemory(VarPtr(PointLight), SizeOf(D3DLIGHT9))
|
---|
| 209 | PointLight.Type_ = D3DLIGHT_POINT '光源の種類
|
---|
| 210 | PointLight.Diffuse.r = 0.0 'ディフューズ R
|
---|
| 211 | PointLight.Diffuse.g = 1.0 'ディフューズ G
|
---|
| 212 | PointLight.Diffuse.b = 0.0 'ディフューズ B
|
---|
| 213 | PointLight.Diffuse.a = 0.0 'ディフューズ A
|
---|
| 214 | PointLight.Specular.r = 0.1 'スペキュラー R
|
---|
| 215 | PointLight.Specular.g = 0.1 'スペキュラー G
|
---|
| 216 | PointLight.Specular.b = 0.1 'スペキュラー B
|
---|
| 217 | PointLight.Specular.a = 0.0 'スペキュラー A
|
---|
| 218 | PointLight.Ambient.r = 0.5 'アンビエント R
|
---|
| 219 | PointLight.Ambient.g = 0.5 'アンビエント G
|
---|
| 220 | PointLight.Ambient.b = 0.5 'アンビエント B
|
---|
| 221 | PointLight.Ambient.a = 0.0 'アンビエント A
|
---|
| 222 | PointLight.Position.x = -5 '光源の位置
|
---|
| 223 | PointLight.Position.y = 5
|
---|
| 224 | PointLight.Position.z = 0
|
---|
| 225 | PointLight.Range = 100.0 '有効範囲
|
---|
| 226 | PointLight.Attenuation0 = 0.0 '輝度の減衰値
|
---|
| 227 | PointLight.Attenuation1 = 1.0 '輝度の減衰値
|
---|
| 228 | PointLight.Attenuation2 = 0.0 '輝度の減衰値
|
---|
| 229 | dx_lpD3DDEV->SetLight(0, VarPtr(PointLight))
|
---|
| 230 | dx_lpD3DDEV->LightEnable(0, TRUE)
|
---|
| 231 |
|
---|
| 232 | 'スポットライトの設定
|
---|
| 233 | Dim SpotLight As D3DLIGHT9
|
---|
| 234 | ZeroMemory(VarPtr(SpotLight), SizeOf(D3DLIGHT9))
|
---|
| 235 | SpotLight.Type_ = D3DLIGHT_SPOT '光源の種類
|
---|
| 236 | SpotLight.Diffuse.r = 1.0 'ディフューズ R
|
---|
| 237 | SpotLight.Diffuse.g = 0.0 'ディフューズ G
|
---|
| 238 | SpotLight.Diffuse.b = 0.0 'ディフューズ B
|
---|
| 239 | SpotLight.Diffuse.a = 0.0 'ディフューズ A
|
---|
| 240 | SpotLight.Specular.r = 0.1 'スペキュラー R
|
---|
| 241 | SpotLight.Specular.g = 0.1 'スペキュラー G
|
---|
| 242 | SpotLight.Specular.b = 0.1 'スペキュラー B
|
---|
| 243 | SpotLight.Specular.a = 0.0 'スペキュラー A
|
---|
| 244 | SpotLight.Ambient.r = 0.5 'アンビエント R
|
---|
| 245 | SpotLight.Ambient.g = 0.5 'アンビエント G
|
---|
| 246 | SpotLight.Ambient.b = 0.5 'アンビエント B
|
---|
| 247 | SpotLight.Ambient.a = 0.0 'アンビエント A
|
---|
| 248 | SpotLight.Position.x = 0 '光源の位置
|
---|
| 249 | SpotLight.Position.y = 5
|
---|
| 250 | SpotLight.Position.z = 0
|
---|
| 251 | SpotLight.Direction.x = 0 '光の方向
|
---|
| 252 | SpotLight.Direction.y = -1
|
---|
| 253 | SpotLight.Direction.z = 0
|
---|
| 254 | SpotLight.Range = 100.0 '有効範囲
|
---|
| 255 | SpotLight.Falloff = 1.0 '減衰率
|
---|
| 256 | SpotLight.Attenuation0 = 0.0 '輝度の減衰値
|
---|
| 257 | SpotLight.Attenuation1 = 1.0 '輝度の減衰値
|
---|
| 258 | SpotLight.Attenuation2 = 0.0 '輝度の減衰値
|
---|
| 259 | SpotLight.Theta = 30.0 * D3DX_PI/180.0 '内部コーン角度
|
---|
| 260 | SpotLight.Phi = 60.0 * D3DX_PI/180.0 '外部コーン角度
|
---|
| 261 | dx_lpD3DDEV->SetLight(1, VarPtr(SpotLight))
|
---|
| 262 | dx_lpD3DDEV->LightEnable(1, TRUE)
|
---|
| 263 |
|
---|
| 264 | 'ディレクショナルライトの設定
|
---|
| 265 | Dim DirectionalLight As D3DLIGHT9
|
---|
| 266 | ZeroMemory(VarPtr(DirectionalLight), SizeOf(D3DLIGHT9))
|
---|
| 267 | DirectionalLight.Type_ = D3DLIGHT_DIRECTIONAL '光源の種類
|
---|
| 268 | DirectionalLight.Diffuse.r = 0.7 'ディフューズ R
|
---|
| 269 | DirectionalLight.Diffuse.g = 0.7 'ディフューズ G
|
---|
| 270 | DirectionalLight.Diffuse.b = 0.8 'ディフューズ B
|
---|
| 271 | DirectionalLight.Diffuse.a = 0.0 'ディフューズ A
|
---|
| 272 | DirectionalLight.Specular.r = 0.1 'スペキュラー R
|
---|
| 273 | DirectionalLight.Specular.g = 0.1 'スペキュラー G
|
---|
| 274 | DirectionalLight.Specular.b = 0.1 'スペキュラー B
|
---|
| 275 | DirectionalLight.Specular.a = 0.0 'スペキュラー A
|
---|
| 276 | DirectionalLight.Ambient.r = 0.5 'アンビエント R
|
---|
| 277 | DirectionalLight.Ambient.g = 0.5 'アンビエント G
|
---|
| 278 | DirectionalLight.Ambient.b = 0.5 'アンビエント B
|
---|
| 279 | DirectionalLight.Ambient.a = 0.0 'アンビエント A
|
---|
| 280 | DirectionalLight.Direction.x=-1 '光の方向
|
---|
| 281 | DirectionalLight.Direction.y=-1
|
---|
| 282 | DirectionalLight.Direction.z=-1
|
---|
| 283 | dx_lpD3DDEV->SetLight(2, VarPtr(DirectionalLight))
|
---|
| 284 | dx_lpD3DDEV->LightEnable(2, TRUE)
|
---|
| 285 |
|
---|
| 286 | 'ライトの有効化
|
---|
| 287 | dx_lpD3DDEV->SetRenderState(D3DRS_SPECULARENABLE, TRUE) 'スペキュラー
|
---|
| 288 | dx_lpD3DDEV->SetRenderState(D3DRS_LIGHTING, TRUE) 'ライト
|
---|
| 289 | End Sub
|
---|
| 290 |
|
---|
| 291 | ' ライトをオフにする関数
|
---|
| 292 | Sub dx_SetLightOff()
|
---|
| 293 | dx_lpD3DDEV->SetRenderState(D3DRS_LIGHTING, FALSE)
|
---|
| 294 | End Sub
|
---|
| 295 |
|
---|
| 296 | ' デバイスの復元を行う関数
|
---|
| 297 | ' メモ - Alt+Tabキーでタスクが切り替わるなどのアクションでデバイスが消失した後、
|
---|
| 298 | ' フォーカスが戻ったときに呼び出されます。
|
---|
| 299 | ' 別途、OnLostDevice、OnResetDevice及びライトの設定をコーディングしなけれ
|
---|
| 300 | ' ばなりません。
|
---|
| 301 | Function dx_RestoreDevice() As DWord
|
---|
| 302 | Dim hr As DWord
|
---|
| 303 |
|
---|
| 304 | hr=dx_lpD3DDEV->TestCooperativeLevel()
|
---|
| 305 | If hr=D3D_OK Then
|
---|
| 306 | dx_RestoreDevice=hr
|
---|
| 307 | Exit Function
|
---|
| 308 | End If
|
---|
| 309 |
|
---|
| 310 | If hr=D3DERR_DEVICELOST Then
|
---|
| 311 | '現在は復元不可能の場合
|
---|
| 312 | dx_RestoreDevice=hr
|
---|
| 313 | Exit Function
|
---|
| 314 | End If
|
---|
| 315 |
|
---|
| 316 |
|
---|
| 317 | '----------
|
---|
| 318 | ' 復元する
|
---|
| 319 | '----------
|
---|
| 320 |
|
---|
| 321 | ' TODO: この位置でOnLostDevice関数で解放可能なオブジェクトを解放します。
|
---|
| 322 | dx_lpD3DXFont->OnLostDevice()
|
---|
| 323 |
|
---|
| 324 | 'デバイスをリセット
|
---|
| 325 | hr=dx_lpD3DDEV->Reset(VarPtr(dx_d3dpp))
|
---|
| 326 |
|
---|
| 327 | ' TODO: この位置でOnResetDevice関数でリセット可能なオブジェクトをリセットします。
|
---|
| 328 | dx_lpD3DXFont->OnResetDevice()
|
---|
| 329 |
|
---|
| 330 | ' TODO: この位置でライトをリセットします。
|
---|
| 331 | dx_SetDefaultLight()
|
---|
| 332 |
|
---|
| 333 | dx_RestoreDevice=hr
|
---|
| 334 | End Function
|
---|
| 335 |
|
---|
| 336 |
|
---|
| 337 | '--------------------------------------
|
---|
| 338 | ' 頂点バッファ2Dポリゴンモデルのクラス
|
---|
| 339 | '--------------------------------------
|
---|
| 340 |
|
---|
| 341 | Type DEFAULTVERTEX2D
|
---|
| 342 | x As Single
|
---|
| 343 | y As Single
|
---|
| 344 | z As Single
|
---|
| 345 | rhw As Single
|
---|
| 346 | dwColor As DWord
|
---|
| 347 | tu As Single
|
---|
| 348 | tv As Single
|
---|
| 349 | End Type
|
---|
| 350 |
|
---|
| 351 | Const D3DFVF_DEFAULT2D = D3DFVF_XYZRHW or D3DFVF_DIFFUSE or D3DFVF_TEX1
|
---|
| 352 |
|
---|
| 353 | Class CImage2D
|
---|
| 354 | lpD3DTexture As LPDIRECT3DTEXTURE9
|
---|
| 355 | vertices[ELM(4)] As DEFAULTVERTEX2D
|
---|
| 356 |
|
---|
| 357 | TextureSize As SIZE
|
---|
| 358 | Public
|
---|
| 359 | 'コンストラクタ
|
---|
| 360 | Sub CImage2D()
|
---|
| 361 | vertices[0].z=0
|
---|
| 362 | vertices[0].rhw=1
|
---|
| 363 | vertices[0].dwColor=D3DCOLOR_RGBA(&HFF, &HFF, &HFF, &HFF)
|
---|
| 364 | vertices[0].tu=0
|
---|
| 365 | vertices[0].tv=0
|
---|
| 366 |
|
---|
| 367 | vertices[1].z=0
|
---|
| 368 | vertices[1].rhw=1
|
---|
| 369 | vertices[1].dwColor=D3DCOLOR_RGBA(&HFF, &HFF, &HFF, &HFF)
|
---|
| 370 | vertices[1].tu=1
|
---|
| 371 | vertices[1].tv=0
|
---|
| 372 |
|
---|
| 373 | vertices[2].z=0
|
---|
| 374 | vertices[2].rhw=1
|
---|
| 375 | vertices[2].dwColor=D3DCOLOR_RGBA(&HFF, &HFF, &HFF, &HFF)
|
---|
| 376 | vertices[2].tu=0
|
---|
| 377 | vertices[2].tv=1
|
---|
| 378 |
|
---|
| 379 | vertices[3].z=0
|
---|
| 380 | vertices[3].rhw=1
|
---|
| 381 | vertices[3].dwColor=D3DCOLOR_RGBA(&HFF, &HFF, &HFF, &HFF)
|
---|
| 382 | vertices[3].tu=1
|
---|
| 383 | vertices[3].tv=1
|
---|
| 384 |
|
---|
| 385 | lpD3DTexture=0
|
---|
| 386 | End Sub
|
---|
| 387 |
|
---|
| 388 | 'デストラクタ
|
---|
| 389 | Sub ~CImage2D()
|
---|
| 390 | If lpD3DTexture Then lpD3DTexture->Release()
|
---|
| 391 | End Sub
|
---|
| 392 |
|
---|
| 393 | Sub SetColor(dwColor As D3DCOLOR)
|
---|
| 394 | vertices[0].dwColor=dwColor
|
---|
| 395 | vertices[1].dwColor=dwColor
|
---|
| 396 | vertices[2].dwColor=dwColor
|
---|
| 397 | vertices[3].dwColor=dwColor
|
---|
| 398 | End Sub
|
---|
| 399 |
|
---|
| 400 | Function SetTexture(pFileName As BytePtr, TransparentColor As D3DCOLOR) As Long
|
---|
| 401 | '-----------------------
|
---|
| 402 | ' テクスチャを読み込む
|
---|
| 403 | '-----------------------
|
---|
| 404 |
|
---|
| 405 | '画像の幅、高さを取得
|
---|
| 406 | Dim hBmp As HBITMAP
|
---|
| 407 | Dim BitmapReport As BITMAP
|
---|
| 408 | hBmp=LoadImage(NULL,pFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)
|
---|
| 409 | If hBmp=0 Then
|
---|
| 410 | SetTexture=0
|
---|
| 411 | lpD3DTexture=0
|
---|
| 412 | Exit Function
|
---|
| 413 | End If
|
---|
| 414 | GetObject(hBmp,SizeOf(BITMAP),BitmapReport)
|
---|
| 415 | DeleteObject(hBmp)
|
---|
| 416 | TextureSize.cx=BitmapReport.bmWidth
|
---|
| 417 | TextureSize.cy=BitmapReport.bmHeight
|
---|
| 418 |
|
---|
| 419 | 'テクスチャーの読み込み
|
---|
| 420 | Dim hr As Long
|
---|
| 421 | hr=D3DXCreateTextureFromFileEx(dx_lpD3DDEV,
|
---|
| 422 | pFileName,
|
---|
| 423 | D3DX_DEFAULT,
|
---|
| 424 | D3DX_DEFAULT,
|
---|
| 425 | D3DX_DEFAULT,
|
---|
| 426 | 0,
|
---|
| 427 | D3DFMT_UNKNOWN,
|
---|
| 428 | D3DPOOL_MANAGED,
|
---|
| 429 | D3DX_DEFAULT,
|
---|
| 430 | D3DX_DEFAULT,
|
---|
| 431 | TransparentColor,
|
---|
| 432 | NULL,
|
---|
| 433 | NULL,
|
---|
| 434 | VarPtr(lpD3DTexture))
|
---|
| 435 | If hr<>S_OK Then
|
---|
| 436 | SetTexture=0
|
---|
| 437 | lpD3DTexture=0
|
---|
| 438 | Exit Function
|
---|
| 439 | End If
|
---|
| 440 |
|
---|
| 441 | SetTexture=1
|
---|
| 442 | End Function
|
---|
| 443 |
|
---|
| 444 | Sub Draw(x As Single, y As Single, width As Single, height As Single)
|
---|
| 445 | 'テクスチャーブレンディングの設定
|
---|
| 446 | dx_lpD3DDEV->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE)
|
---|
| 447 | dx_lpD3DDEV->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE)
|
---|
| 448 | dx_lpD3DDEV->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE)
|
---|
| 449 |
|
---|
| 450 | 'アルファブレンディングの設定
|
---|
| 451 | dx_lpD3DDEV->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE)
|
---|
| 452 | dx_lpD3DDEV->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA)
|
---|
| 453 | dx_lpD3DDEV->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA)
|
---|
| 454 |
|
---|
| 455 | 'テクスチャー設定
|
---|
| 456 | dx_lpD3DDEV->SetTexture(0, lpD3DTexture)
|
---|
| 457 |
|
---|
| 458 | dx_lpD3DDEV->SetFVF(D3DFVF_DEFAULT2D) '頂点フォーマット設定
|
---|
| 459 |
|
---|
| 460 | vertices[0].x=x
|
---|
| 461 | vertices[0].y=y
|
---|
| 462 | vertices[0].tu=0
|
---|
| 463 | vertices[0].tv=0
|
---|
| 464 |
|
---|
| 465 | vertices[1].x=x+width
|
---|
| 466 | vertices[1].y=y
|
---|
| 467 | vertices[1].tu=1
|
---|
| 468 | vertices[1].tv=0
|
---|
| 469 |
|
---|
| 470 | vertices[2].x=x+width
|
---|
| 471 | vertices[2].y=y+height
|
---|
| 472 | vertices[2].tu=1
|
---|
| 473 | vertices[2].tv=1
|
---|
| 474 |
|
---|
| 475 | vertices[3].x=x
|
---|
| 476 | vertices[3].y=y+height
|
---|
| 477 | vertices[3].tu=0
|
---|
| 478 | vertices[3].tv=1
|
---|
| 479 |
|
---|
| 480 | dx_lpD3DDEV->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertices, SizeOf(DEFAULTVERTEX2D)) 'ポリゴン描画
|
---|
| 481 |
|
---|
| 482 | 'アルファブレンディングの無効化
|
---|
| 483 | dx_lpD3DDEV->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE)
|
---|
| 484 | End Sub
|
---|
| 485 |
|
---|
| 486 | Sub DrawStretch(x As Single, y As Single, width As Single, height As Single,
|
---|
| 487 | ImageX As Single, ImageY As Single, ImageWidth As Single, ImageHeight As Single)
|
---|
| 488 |
|
---|
| 489 | 'テクスチャーブレンディングの設定
|
---|
| 490 | dx_lpD3DDEV->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE)
|
---|
| 491 | dx_lpD3DDEV->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE)
|
---|
| 492 | dx_lpD3DDEV->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE)
|
---|
| 493 |
|
---|
| 494 | 'アルファブレンディングの設定
|
---|
| 495 | dx_lpD3DDEV->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE)
|
---|
| 496 | dx_lpD3DDEV->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA)
|
---|
| 497 | dx_lpD3DDEV->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA)
|
---|
| 498 |
|
---|
| 499 | 'テクスチャー設定
|
---|
| 500 | dx_lpD3DDEV->SetTexture(0, lpD3DTexture)
|
---|
| 501 |
|
---|
| 502 | dx_lpD3DDEV->SetFVF(D3DFVF_DEFAULT2D) '頂点フォーマット設定
|
---|
| 503 |
|
---|
| 504 | ImageX=ImageX+0.5
|
---|
| 505 | ImageY=ImageY+0.5
|
---|
| 506 |
|
---|
| 507 | vertices[0].x=x
|
---|
| 508 | vertices[0].y=y
|
---|
| 509 | vertices[0].tu=ImageX/TextureSize.cx
|
---|
| 510 | vertices[0].tv=ImageY/TextureSize.cy
|
---|
| 511 |
|
---|
| 512 | vertices[1].x=x+width
|
---|
| 513 | vertices[1].y=y
|
---|
| 514 | vertices[1].tu=(ImageX+ImageWidth)/TextureSize.cx
|
---|
| 515 | vertices[1].tv=ImageY/TextureSize.cy
|
---|
| 516 |
|
---|
| 517 | vertices[2].x=x+width
|
---|
| 518 | vertices[2].y=y+height
|
---|
| 519 | vertices[2].tu=(ImageX+ImageWidth)/TextureSize.cx
|
---|
| 520 | vertices[2].tv=(ImageY+ImageHeight)/TextureSize.cy
|
---|
| 521 |
|
---|
| 522 | vertices[3].x=x
|
---|
| 523 | vertices[3].y=y+height
|
---|
| 524 | vertices[3].tu=ImageX/TextureSize.cx
|
---|
| 525 | vertices[3].tv=(ImageY+ImageHeight)/TextureSize.cy
|
---|
| 526 |
|
---|
| 527 | dx_lpD3DDEV->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertices, SizeOf(DEFAULTVERTEX2D)) 'ポリゴン描画
|
---|
| 528 |
|
---|
| 529 | 'アルファブレンディングの無効化
|
---|
| 530 | dx_lpD3DDEV->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE)
|
---|
| 531 | End Sub
|
---|
| 532 | End Class
|
---|
| 533 |
|
---|
| 534 |
|
---|
| 535 | '--------------------------------------
|
---|
| 536 | ' 頂点バッファ3Dポリゴンモデルのクラス
|
---|
| 537 | '--------------------------------------
|
---|
| 538 |
|
---|
| 539 | Type DEFAULTVERTEX3D
|
---|
| 540 | x As Single
|
---|
| 541 | y As Single
|
---|
| 542 | z As Single
|
---|
| 543 | dwColor As DWord
|
---|
| 544 | tu As Single
|
---|
| 545 | tv As Single
|
---|
| 546 | End Type
|
---|
| 547 |
|
---|
| 548 | Const D3DFVF_DEFAULT3D = D3DFVF_XYZ or D3DFVF_DIFFUSE or D3DFVF_TEX1
|
---|
| 549 |
|
---|
| 550 | Class CRectPolygon
|
---|
| 551 | lpD3DVB As LPDIRECT3DVERTEXBUFFER9
|
---|
| 552 | lpD3DTexture As LPDIRECT3DTEXTURE9
|
---|
| 553 | vertices[3] As DEFAULTVERTEX3D
|
---|
| 554 | Public
|
---|
| 555 |
|
---|
| 556 | 'コンストラクタ
|
---|
| 557 | Sub CRectPolygon()
|
---|
| 558 | vertices[0].dwColor=D3DCOLOR_RGBA(&HFF, &HFF, &HFF, &HFF)
|
---|
| 559 | vertices[0].tu=0
|
---|
| 560 | vertices[0].tv=0
|
---|
| 561 |
|
---|
| 562 | vertices[1].dwColor=D3DCOLOR_RGBA(&HFF, &HFF, &HFF, &HFF)
|
---|
| 563 | vertices[1].tu=1
|
---|
| 564 | vertices[1].tv=0
|
---|
| 565 |
|
---|
| 566 | vertices[2].dwColor=D3DCOLOR_RGBA(&HFF, &HFF, &HFF, &HFF)
|
---|
| 567 | vertices[2].tu=0
|
---|
| 568 | vertices[2].tv=1
|
---|
| 569 |
|
---|
| 570 | vertices[3].dwColor=D3DCOLOR_RGBA(&HFF, &HFF, &HFF, &HFF)
|
---|
| 571 | vertices[3].tu=1
|
---|
| 572 | vertices[3].tv=1
|
---|
| 573 |
|
---|
| 574 |
|
---|
| 575 | '頂点バッファの生成
|
---|
| 576 | Dim hr As DWord
|
---|
| 577 | hr = dx_lpD3DDEV->CreateVertexBuffer(SizeOf(DEFAULTVERTEX3D)*4, 0,
|
---|
| 578 | D3DFVF_DEFAULT3D, D3DPOOL_DEFAULT, VarPtr(lpD3DVB), NULL)
|
---|
| 579 | If hr Then
|
---|
| 580 | lpD3DVB=0
|
---|
| 581 | Exit Sub
|
---|
| 582 | End If
|
---|
| 583 |
|
---|
| 584 | lpD3DTexture=0
|
---|
| 585 | End Sub
|
---|
| 586 |
|
---|
| 587 | 'デストラクタ
|
---|
| 588 | Sub ~CRectPolygon()
|
---|
| 589 | If lpD3DVB Then lpD3DVB->Release()
|
---|
| 590 | If lpD3DTexture Then lpD3DTexture->Release()
|
---|
| 591 | End Sub
|
---|
| 592 |
|
---|
| 593 | Sub SetVertices(pVertices As *D3DVECTOR)
|
---|
| 594 | vertices[0].x=pVertices[0].x
|
---|
| 595 | vertices[0].y=pVertices[0].y
|
---|
| 596 | vertices[0].z=pVertices[0].z
|
---|
| 597 |
|
---|
| 598 | vertices[1].x=pVertices[1].x
|
---|
| 599 | vertices[1].y=pVertices[1].y
|
---|
| 600 | vertices[1].z=pVertices[1].z
|
---|
| 601 |
|
---|
| 602 | vertices[2].x=pVertices[2].x
|
---|
| 603 | vertices[2].y=pVertices[2].y
|
---|
| 604 | vertices[2].z=pVertices[2].z
|
---|
| 605 |
|
---|
| 606 | vertices[3].x=pVertices[3].x
|
---|
| 607 | vertices[3].y=pVertices[3].y
|
---|
| 608 | vertices[3].z=pVertices[3].z
|
---|
| 609 |
|
---|
| 610 | '頂点バッファのコピー
|
---|
| 611 | Dim hr As Long
|
---|
| 612 | Dim pBufferOfVertices As VoidPtr
|
---|
| 613 | hr = lpD3DVB->Lock(0, SizeOf(DEFAULTVERTEX3D)*4, VarPtr(pBufferOfVertices), 0)
|
---|
| 614 | If hr Then Exit Sub
|
---|
| 615 | memcpy(pBufferOfVertices, vertices, SizeOf(DEFAULTVERTEX3D)*4)
|
---|
| 616 | lpD3DVB->Unlock()
|
---|
| 617 | End Sub
|
---|
| 618 |
|
---|
| 619 | Sub SetColor(dwColor As D3DCOLOR)
|
---|
| 620 | vertices[0].dwColor=dwColor
|
---|
| 621 | vertices[1].dwColor=dwColor
|
---|
| 622 | vertices[2].dwColor=dwColor
|
---|
| 623 | vertices[3].dwColor=dwColor
|
---|
| 624 | End Sub
|
---|
| 625 |
|
---|
| 626 | Function SetTexture(pFileName As BytePtr, TransparentColor As D3DCOLOR) As Long
|
---|
| 627 | 'テクスチャーの読み込み
|
---|
| 628 | Dim hr As Long
|
---|
| 629 | hr=D3DXCreateTextureFromFileEx(dx_lpD3DDEV,
|
---|
| 630 | pFileName,
|
---|
| 631 | D3DX_DEFAULT,
|
---|
| 632 | D3DX_DEFAULT,
|
---|
| 633 | D3DX_DEFAULT,
|
---|
| 634 | 0,
|
---|
| 635 | D3DFMT_UNKNOWN,
|
---|
| 636 | D3DPOOL_MANAGED,
|
---|
| 637 | D3DX_DEFAULT,
|
---|
| 638 | D3DX_DEFAULT,
|
---|
| 639 | TransparentColor,
|
---|
| 640 | NULL,
|
---|
| 641 | NULL,
|
---|
| 642 | VarPtr(lpD3DTexture))
|
---|
| 643 | If hr<>S_OK Then
|
---|
| 644 | SetTexture=0
|
---|
| 645 | lpD3DTexture=0
|
---|
| 646 | Exit Function
|
---|
| 647 | End If
|
---|
| 648 |
|
---|
| 649 | SetTexture=1
|
---|
| 650 | End Function
|
---|
| 651 |
|
---|
| 652 | Sub Draw(VectorPosition As *D3DVECTOR, VectorDirection As *D3DVECTOR)
|
---|
| 653 | Dim i As Long
|
---|
| 654 |
|
---|
| 655 | 'ワールド変換行列の設定
|
---|
| 656 | Dim mWorld As D3DXMATRIX
|
---|
| 657 | Dim mRotX As D3DXMATRIX
|
---|
| 658 | Dim mRotY As D3DXMATRIX
|
---|
| 659 | Dim mRotZ As D3DXMATRIX
|
---|
| 660 | Dim mTrans As D3DXMATRIX
|
---|
| 661 | Dim mScale As D3DXMATRIX
|
---|
| 662 | D3DXMatrixRotationX(VarPtr(mRotX), VectorDirection->x) 'X軸回転行列
|
---|
| 663 | D3DXMatrixRotationY(VarPtr(mRotY), VectorDirection->y) 'Y軸回転行列
|
---|
| 664 | D3DXMatrixRotationZ(VarPtr(mRotZ), VectorDirection->z) 'Z軸回転行列
|
---|
| 665 |
|
---|
| 666 | '平行移動行列
|
---|
| 667 | D3DXMatrixTranslation(VarPtr(mTrans),VectorPosition->x,VectorPosition->y,VectorPosition->z)
|
---|
| 668 |
|
---|
| 669 | 'スケーリング行列
|
---|
| 670 | D3DXMatrixScaling(VarPtr(mScale),1,1,1)
|
---|
| 671 |
|
---|
| 672 | Dim mTemp As D3DXMATRIX
|
---|
| 673 | D3DXMatrixMultiply(VarPtr(mWorld),VarPtr(mRotZ),VarPtr(mRotX))
|
---|
| 674 | D3DXMatrixMultiply(VarPtr(mWorld),VarPtr(mWorld),VarPtr(mRotY))
|
---|
| 675 | D3DXMatrixMultiply(VarPtr(mWorld),VarPtr(mWorld),VarPtr(mTrans))
|
---|
| 676 | D3DXMatrixMultiply(VarPtr(mWorld),VarPtr(mWorld),VarPtr(mScale))
|
---|
| 677 |
|
---|
| 678 | dx_lpD3DDEV->SetTransform(D3DTS_WORLD, VarPtr(mWorld))
|
---|
| 679 |
|
---|
| 680 |
|
---|
| 681 | 'テクスチャーブレンディングの設定
|
---|
| 682 | dx_lpD3DDEV->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE)
|
---|
| 683 | dx_lpD3DDEV->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE)
|
---|
| 684 | dx_lpD3DDEV->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE)
|
---|
| 685 |
|
---|
| 686 | 'アルファブレンディングの設定
|
---|
| 687 | dx_lpD3DDEV->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE)
|
---|
| 688 | dx_lpD3DDEV->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA)
|
---|
| 689 | dx_lpD3DDEV->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA)
|
---|
| 690 |
|
---|
| 691 | 'テクスチャー設定
|
---|
| 692 | dx_lpD3DDEV->SetTexture(0, lpD3DTexture)
|
---|
| 693 |
|
---|
| 694 | dx_lpD3DDEV->SetStreamSource(0, lpD3DVB, 0, SizeOf(DEFAULTVERTEX3D)) '頂点バッファ設定
|
---|
| 695 | dx_lpD3DDEV->SetFVF(D3DFVF_DEFAULT3D) '頂点フォーマット設定
|
---|
| 696 | dx_lpD3DDEV->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2) 'ポリゴン描画
|
---|
| 697 |
|
---|
| 698 | 'アルファブレンディングの無効化
|
---|
| 699 | dx_lpD3DDEV->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE)
|
---|
| 700 | End Sub
|
---|
| 701 | End Class
|
---|
| 702 |
|
---|
| 703 |
|
---|
| 704 | '-------------------------------------
|
---|
| 705 | ' メッシュモデル(Xファイル)のクラス
|
---|
| 706 | '-------------------------------------
|
---|
| 707 | Class CMeshModel
|
---|
| 708 | pD3DXMesh As LPD3DXMESH 'メッシュ
|
---|
| 709 | D3DMaterial As *D3DMATERIAL9 '質感
|
---|
| 710 | ppD3DTexture As *LPDIRECT3DTEXTURE9 'テクスチャ
|
---|
| 711 | dwNumMaterials As DWord 'マテリアル数
|
---|
| 712 | Public
|
---|
| 713 | 'コンストラクタ
|
---|
| 714 | Sub CMeshModel(pszFileName_xfile As BytePtr)
|
---|
| 715 | Dim i As Long
|
---|
| 716 | Dim hr As DWord
|
---|
| 717 | Dim lpD3DXBuffer As LPD3DXBUFFER
|
---|
| 718 |
|
---|
| 719 | 'Xファイルの読み込み
|
---|
| 720 | D3DXLoadMeshFromX(pszFileName_xfile,
|
---|
| 721 | D3DXMESH_SYSTEMMEM,
|
---|
| 722 | dx_lpD3DDEV,
|
---|
| 723 | NULL,
|
---|
| 724 | VarPtr(lpD3DXBuffer),
|
---|
| 725 | NULL,
|
---|
| 726 | VarPtr(dwNumMaterials),
|
---|
| 727 | VarPtr(pD3DXMesh))
|
---|
| 728 |
|
---|
| 729 |
|
---|
| 730 | '質感・テクスチャーの読み込み
|
---|
| 731 | D3DMaterial=malloc(SizeOf(D3DMATERIAL9)*dwNumMaterials)
|
---|
| 732 | ppD3DTexture=malloc(SizeOf(DWord)*dwNumMaterials)
|
---|
| 733 |
|
---|
| 734 | Dim d3dxMaterials As *D3DXMATERIAL
|
---|
| 735 | d3dxMaterials = lpD3DXBuffer->GetBufferPointer()
|
---|
| 736 |
|
---|
| 737 | Dim a[255] As Byte
|
---|
| 738 | For i=0 To dwNumMaterials-1
|
---|
| 739 | '質感
|
---|
| 740 | memcpy(VarPtr(D3DMaterial[i]),VarPtr(d3dxMaterials[i].MatD3D),SizeOf(D3DMATERIAL9))
|
---|
| 741 | memcpy(VarPtr(D3DMaterial[i].Ambient),VarPtr(D3DMaterial[i].Diffuse),SizeOf(D3DCOLORVALUE))
|
---|
| 742 |
|
---|
| 743 | 'テクスチャー
|
---|
| 744 | hr = D3DXCreateTextureFromFile(dx_lpD3DDEV,
|
---|
| 745 | d3dxMaterials[i].pTextureFilename, VarPtr(ppD3DTexture[i]))
|
---|
| 746 | If hr Then
|
---|
| 747 | ppD3DTexture[i] = NULL
|
---|
| 748 | End If
|
---|
| 749 | Next
|
---|
| 750 |
|
---|
| 751 |
|
---|
| 752 | 'マテリアル情報の開放
|
---|
| 753 | lpD3DXBuffer->Release()
|
---|
| 754 | End Sub
|
---|
| 755 |
|
---|
| 756 | 'デストラクタ
|
---|
| 757 | Sub ~CMeshModel()
|
---|
| 758 | '各種メモリを解放
|
---|
| 759 | Dim i As Long
|
---|
| 760 | Dim lpTex As LPDIRECT3DTEXTURE9
|
---|
| 761 |
|
---|
| 762 | If ppD3DTexture Then
|
---|
| 763 | For i=0 To dwNumMaterials-1
|
---|
| 764 | If ppD3DTexture[i] Then
|
---|
| 765 | lpTex=ppD3DTexture[i] As LPDIRECT3DTEXTURE9
|
---|
| 766 | lpTex->Release()
|
---|
| 767 | ppD3DTexture[i]=0
|
---|
| 768 | End If
|
---|
| 769 | Next
|
---|
| 770 | free(ppD3DTexture)
|
---|
| 771 | End If
|
---|
| 772 |
|
---|
| 773 | If D3DMaterial Then
|
---|
| 774 | free(D3DMaterial)
|
---|
| 775 | End If
|
---|
| 776 |
|
---|
| 777 | pD3DXMesh->Release()
|
---|
| 778 | End Sub
|
---|
| 779 |
|
---|
| 780 | 'メッシュを描画
|
---|
| 781 | Sub Draw(VectorPosition As *D3DVECTOR, VectorDirection As *D3DVECTOR)
|
---|
| 782 | Dim i As Long
|
---|
| 783 |
|
---|
| 784 | 'ワールド変換行列の設定
|
---|
| 785 | Dim mWorld As D3DXMATRIX
|
---|
| 786 | Dim mRotX As D3DXMATRIX
|
---|
| 787 | Dim mRotY As D3DXMATRIX
|
---|
| 788 | Dim mRotZ As D3DXMATRIX
|
---|
| 789 | Dim mTrans As D3DXMATRIX
|
---|
| 790 | Dim mScale As D3DXMATRIX
|
---|
| 791 | D3DXMatrixRotationX(VarPtr(mRotX), VectorDirection->x) 'X軸回転行列
|
---|
| 792 | D3DXMatrixRotationY(VarPtr(mRotY), VectorDirection->y) 'Y軸回転行列
|
---|
| 793 | D3DXMatrixRotationZ(VarPtr(mRotZ), VectorDirection->z) 'Z軸回転行列
|
---|
| 794 |
|
---|
| 795 | '平行移動行列
|
---|
| 796 | D3DXMatrixTranslation(VarPtr(mTrans),VectorPosition->x,VectorPosition->y,VectorPosition->z)
|
---|
| 797 |
|
---|
| 798 | 'スケーリング行列
|
---|
| 799 | D3DXMatrixScaling(VarPtr(mScale),1,1,1)
|
---|
| 800 |
|
---|
| 801 | Dim mTemp As D3DXMATRIX
|
---|
| 802 | D3DXMatrixMultiply(VarPtr(mWorld),VarPtr(mRotZ),VarPtr(mRotX))
|
---|
| 803 | D3DXMatrixMultiply(VarPtr(mWorld),VarPtr(mWorld),VarPtr(mRotY))
|
---|
| 804 | D3DXMatrixMultiply(VarPtr(mWorld),VarPtr(mWorld),VarPtr(mTrans))
|
---|
| 805 | D3DXMatrixMultiply(VarPtr(mWorld),VarPtr(mWorld),VarPtr(mScale))
|
---|
| 806 |
|
---|
| 807 | dx_lpD3DDEV->SetTransform(D3DTS_WORLD, VarPtr(mWorld))
|
---|
| 808 |
|
---|
| 809 |
|
---|
| 810 | 'Xファイルの表示
|
---|
| 811 | For i=0 To dwNumMaterials-1
|
---|
| 812 | dx_lpD3DDEV->SetMaterial(VarPtr(D3DMaterial[i]))
|
---|
| 813 | dx_lpD3DDEV->SetTexture(0, ppD3DTexture[i] As *IDirect3DBaseTexture9)
|
---|
| 814 | pD3DXMesh->DrawSubset(i)
|
---|
| 815 | Next
|
---|
| 816 | End Sub
|
---|
| 817 | End Class
|
---|