示例#1
0
void GEMesh::loadFromMemory(void* Data, unsigned int SizeOfData)
{
    LPD3DXBUFFER pD3DXMtrlBuffer;
    D3DXMATERIAL* d3dxMaterials;

    // load mesh
    D3DXLoadMeshFromXInMemory(Data, SizeOfData, D3DXMESH_SYSTEMMEM, d3ddev, NULL, &pD3DXMtrlBuffer, NULL, 
                              &iNumMaterials, &mMesh);
    
    // load materials and textures
    d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
    mMaterials = new D3DMATERIAL9[iNumMaterials];
    mTextures = new LPDIRECT3DTEXTURE9[iNumMaterials];

    for(DWORD i = 0; i < iNumMaterials; i++)
    {
        mMaterials[i] = d3dxMaterials[i].MatD3D;
        mMaterials[i].Ambient = mMaterials[i].Diffuse;
        mMaterials[i].Specular = mMaterials[i].Diffuse;
        mTextures[i] = NULL;

        if(d3dxMaterials[i].pTextureFilename != NULL && lstrlenA(d3dxMaterials[i].pTextureFilename) > 0)
            D3DXCreateTextureFromFileA(d3ddev, d3dxMaterials[i].pTextureFilename, &mTextures[i]);
    }

    pD3DXMtrlBuffer->Release();
}
示例#2
0
文件: Mesh.cpp 项目: morita-/fighting
// コンストラクタ
CMesh::CMesh(LPDIRECT3DDEVICE9 device, string file, CArchiveLoader* archive)
:	Device(device),
	Mesh(NULL), NumMaterials(0), 
	Materials(NULL), Textures(NULL),
	ColorMultiplier(1, 1, 1, 1), ColorAddition(0, 0, 0, 0)
{
	string path=ExtractFilePath(file);

	// ファイルを読み込む
	LPD3DXBUFFER buf_materials=NULL;
	if (archive) {
		ARCHIVE_ENTRY* e=archive->Find(file);
		if (e) {
			D3DXLoadMeshFromXInMemory(
				e->Data, e->Size, D3DXMESH_SYSTEMMEM, 
				Device, NULL, &buf_materials, NULL, 
				&NumMaterials, &Mesh);
		}
	} else {
		D3DXLoadMeshFromX(
			file.c_str(), D3DXMESH_SYSTEMMEM, 
			Device, NULL, &buf_materials, NULL, 
			&NumMaterials, &Mesh);
	}
	
	// マテリアルとテクスチャのための配列を確保する
	D3DXMATERIAL* materials;
	if (buf_materials) {
		materials=(D3DXMATERIAL*)buf_materials->GetBufferPointer();
		Materials=new D3DMATERIAL9[NumMaterials];
		Textures=new LPDIRECT3DTEXTURE9[NumMaterials];
	}

	// マテリアルをコピーし,テクスチャを読み込む
	for (DWORD i=0; i<NumMaterials; i++ ) {

		// マテリアルをコピーする
		Materials[i]=materials[i].MatD3D;

		// アンビエント色を設定する
		Materials[i].Ambient=Materials[i].Diffuse;

		// テクスチャを読み込む
		Textures[i]=NULL;
		char* texture_file=materials[i].pTextureFilename;
		if (texture_file && lstrlen(texture_file)>0) {
			if (archive) {
				ARCHIVE_ENTRY* e=archive->Find(path+texture_file);
				if (!e) continue;
				D3DXCreateTextureFromFileInMemory(
					Device, e->Data, e->Size, &Textures[i]);
			} else {
				D3DXCreateTextureFromFile(
					Device, (path+texture_file).c_str(), &Textures[i]);
			}
		}
	}

/*
	// 最適化
	DWORD* adjacency=new DWORD[Mesh->GetNumFaces()*3];
	HRESULT result;
	result=Mesh->GenerateAdjacency(0, adjacency);
	result=Mesh->OptimizeInplace(D3DXMESHOPT_STRIPREORDER, adjacency, NULL, NULL, NULL);
	delete adjacency;
*/

	// 後片づけ
	if (buf_materials) buf_materials->Release();
}