0001: // ----------------------------------------------------------------------------
0002: //
0003: // load.cpp - Load the Object
0004: //
0005: // Copyright (c) 2002 IMAGIRE Takashi (imagire@gmail.com)
0006: // All Rights Reserved.
0007: //
0008: // ----------------------------------------------------------------------------
0009: #define STRICT
0010:
0011: #include "main.h"
0012: #include "load.h"
0013:
0014: // ----------------------------------------------------------------------------
0015: // Declaration
0016: // ----------------------------------------------------------------------------
0017: // Original model
0018: typedef struct {
0019: float x,y,z;
0020: float nx,ny,nz;
0021: float tu0,tv0;
0022: }D3DVERTEX;
0023: #define D3DFVF_VERTEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)
0024:
0025: // D3D_CUSTOMVERTEX
0026: DWORD dwDecl[] = {
0027: D3DVSD_STREAM(0),
0028: D3DVSD_REG( D3DVSDE_POSITION, D3DVSDT_FLOAT3 ), // D3DVSDE_POSITION = 0
0029: D3DVSD_REG( D3DVSDE_BLENDWEIGHT,D3DVSDT_FLOAT4 ), // D3DVSDE_BLENDWEIGHT = 1
0030: D3DVSD_REG( D3DVSDE_NORMAL, D3DVSDT_FLOAT3 ), // D3DVSDE_NORMAL, = 3
0031: D3DVSD_REG( D3DVSDE_TEXCOORD0, D3DVSDT_FLOAT2 ), // D3DVSDE_TEXCOORD0= 7
0032: D3DVSD_END()
0033: };
0034:
0035: // ----------------------------------------------------------------------------
0036: // モデル
0037: // ----------------------------------------------------------------------------
0038: HRESULT CMyMesh::Load(LPDIRECT3DDEVICE8 lpD3DDev, char *filename)
0039: {
0040: LPD3DXMESH pMesh, pMeshOpt;
0041: LPD3DXBUFFER pD3DXMtrlBuffer = NULL;
0042: DWORD i;
0043: HRESULT hr;
0044:
0045: this->Release();
0046: hr = D3DXLoadMeshFromX(filename, D3DXMESH_MANAGED,
0047: lpD3DDev, NULL,
0048: &pD3DXMtrlBuffer, &this->dwNumMaterials,
0049: &pMesh);
0050: if(FAILED(hr)) return E_FAIL;
0051:
0052: // sort the data
0053: pMesh->Optimize(D3DXMESHOPT_ATTRSORT, NULL, NULL, NULL, NULL, &pMeshOpt);
0054: RELEASE(pMesh);
0055:
0056: // search the size of the mesh
0057: LPDIRECT3DVERTEXBUFFER8 pVB;
0058: BYTE* pVByte;
0059: pMeshOpt->GetVertexBuffer(&pVB);
0060: pVB->Lock(0,0,&pVByte,0);
0061: D3DXComputeBoundingSphere(pVByte, pMeshOpt->GetNumVertices(), pMeshOpt->GetFVF(), &this->center, &this->radius);
0062: pVB->Unlock();
0063: pVB->Release();
0064:
0065: pMeshOpt->GetAttributeTable(NULL,&this->dwNumMaterials);
0066: this->pSubsetTable = new D3DXATTRIBUTERANGE[this->dwNumMaterials];
0067: pMeshOpt->GetAttributeTable(this->pSubsetTable, &this->dwNumMaterials);
0068:
0069: // transformation of the FVF
0070: hr = pMeshOpt->CloneMeshFVF(pMeshOpt->GetOptions(), D3DFVF_VERTEX, lpD3DDev, &pMesh);
0071: if(FAILED(hr)) return E_FAIL;
0072: RELEASE(pMeshOpt);
0073: D3DXComputeNormals(pMesh,NULL);
0074:
0075: // Copy to the Vertex Buffer
0076: D3DVERTEX* pSrc;
0077: D3D_CUSTOMVERTEX* pDest;
0078: LPDIRECT3DINDEXBUFFER8 pSrcIndex;
0079: WORD* pISrc;
0080: WORD* pIDest;
0081:
0082: DWORD nMeshVertices = pMesh->GetNumVertices();
0083: DWORD nMeshFaces = pMesh->GetNumFaces();
0084: lpD3DDev->CreateVertexBuffer(nMeshVertices * sizeof(D3D_CUSTOMVERTEX),
0085: D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED, &this->pVB);
0086: lpD3DDev->CreateIndexBuffer(nMeshFaces * 3 * sizeof(WORD),0,D3DFMT_INDEX16,D3DPOOL_MANAGED,&this->pIndex);
0087:
0088: pMesh->GetVertexBuffer(&pVB);
0089: pVB->Lock(0,0,(BYTE**)&pSrc,0);
0090: this->pVB->Lock(0,0,(BYTE**)&pDest,0);
0091: for(i=0;i<nMeshVertices;i++){
0092: pDest->position[0] = pSrc->x;
0093: pDest->position[1] = pSrc->y;
0094: pDest->position[2] = pSrc->z;
0095: pDest->position[3] = 1.0f;
0096: pDest->texcoord0[0] = pSrc->tu0;
0097: pDest->texcoord0[1] = pSrc->tv0;
0098:
0099: pSrc++;
0100: pDest++;
0101: }
0102: pVB->Unlock();
0103: pVB->Release();
0104: this->pVB->Unlock();
0105:
0106: // Copy the Index buffer
0107: pMesh->GetIndexBuffer(&pSrcIndex);
0108: pSrcIndex->Lock(0,0,(BYTE**)&pISrc,0);
0109: this->pIndex->Lock(0,0,(BYTE**)&pIDest,0);
0110: CopyMemory(pIDest,pISrc,nMeshFaces * 3 * sizeof(WORD));
0111: pSrcIndex->Unlock();
0112: this->pIndex->Unlock();
0113: pSrcIndex->Release();
0114:
0115: // Read the material information
0116: D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
0117: this->pTextures = new LPDIRECT3DTEXTURE8[this->dwNumMaterials];
0118: this->pMaterials = new D3DMATERIAL8[this->dwNumMaterials];
0119:
0120: for(i = 0; i < this->dwNumMaterials; i++){
0121: this->pMaterials[i] = d3dxMaterials[i].MatD3D;
0122: this->pMaterials[i].Ambient = this->pMaterials[i].Diffuse;
0123: hr = D3DXCreateTextureFromFile( lpD3DDev,
0124: d3dxMaterials[i].pTextureFilename,
0125: &this->pTextures[i] );
0126: if(FAILED(hr)) this->pTextures[i] = NULL;
0127: }
0128: RELEASE(pD3DXMtrlBuffer);
0129:
0130: RELEASE(pMesh);
0131:
0132: this->bActive = true; // OK. Use this mesh!
0133:
0134: return S_OK;
0135: }
0136: // ----------------------------------------------------------------------------
0137: void CMyMesh::Release()
0138: {
0139: DWORD i;
0140:
0141: if(this->pVB == NULL) return;
0142:
0143: for(i=0; i<this->dwNumMaterials; i++){
0144: RELEASE(this->pTextures[i]);
0145: }
0146: delete[] this->pTextures;
0147: delete[] this->pMaterials;
0148: delete[] this->pSubsetTable;
0149:
0150: RELEASE(this->pVB);
0151: RELEASE(this->pIndex);
0152:
0153: this->bActive = false;
0154: }
0155: // ----------------------------------------------------------------------------
0156: // Texture
0157: // ----------------------------------------------------------------------------
0158: HRESULT CTextureMgr::Load(LPDIRECT3DDEVICE8 lpD3DDev, const char *filename, LPDIRECT3DTEXTURE8 *ppTexture)
0159: {
0160: D3DXCreateTextureFromFileEx(lpD3DDev, filename,0,0,0,0,D3DFMT_A8R8G8B8,
0161: D3DPOOL_MANAGED, D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR,
0162: 0, NULL, NULL, ppTexture);
0163:
0164: return S_OK;
0165: }
0166: // ----------------------------------------------------------------------------
0167: void CTextureMgr::Release(LPDIRECT3DTEXTURE8 pTexture)
0168: {
0169: RELEASE(pTexture);
0170: }
0171: