コード例 #1
0
//=============================================================================
// 終了処理
//=============================================================================
void UninitBillboard(void)
{
	if(g_pD3DTextureBillboard != NULL)
	{// テクスチャの開放
		g_pD3DTextureBillboard->Release();
		g_pD3DTextureBillboard = NULL;
	}

	if(g_pD3DVtxBuffBillboard != NULL)
	{// 頂点バッファの開放
		g_pD3DVtxBuffBillboard->Release();
		g_pD3DVtxBuffBillboard = NULL;
	}
}
コード例 #2
0
ファイル: SimpleLighting.cpp プロジェクト: chenbk85/3dlearn
//-----------------------------------------------------------------------------
// Desc: 释放创建的对象
//-----------------------------------------------------------------------------
VOID Cleanup()
{
	//释放顶点缓冲区对象
	if( g_pVB != NULL )
		g_pVB->Release();

	//释放Direct3D设备对象
	if( g_pd3dDevice != NULL )
		g_pd3dDevice->Release();

	//释放Direct3D对象
	if( g_pD3D != NULL )
		g_pD3D->Release();
}
コード例 #3
0
VOID Cleanup()
{
	if( g_pVB != NULL )        
		g_pVB->Release();

	if(g_pCubeTexture != NULL)
		g_pCubeTexture->Release();

	if( g_pd3dDevice != NULL ) 
		g_pd3dDevice->Release();

	if( g_pD3D != NULL )       
		g_pD3D->Release();
}
コード例 #4
0
//=============================================================================
// 終了処理
//=============================================================================
void UninitExplosion(void)
{
	if(g_pD3DTextureExplosion != NULL)
	{// テクスチャの開放
		g_pD3DTextureExplosion->Release();
		g_pD3DTextureExplosion = NULL;
	}

	if(g_pD3DVtxBuffExplosion != NULL)
	{// 頂点バッファの開放
		g_pD3DVtxBuffExplosion->Release();
		g_pD3DVtxBuffExplosion = NULL;
	}
}
コード例 #5
0
ファイル: TestScene.cpp プロジェクト: loctho1995/DemoDirectX
void TestScene::initEffect()
{
    LPD3DXBUFFER bufferErrors = NULL;
    HRESULT hr;

    //D3DXMatrixIdentity(&world);
    //D3DXMatrixIdentity(&view);
    //D3DXMatrixIdentity(&proj);

    //D3DXMatrixPerspectiveFovLH(&proj, D3DXToRadian(40.0f), (float)GameGlobal::GetWidth() / (float)GameGlobal::GetHeight(), 0.0f, 100.0f);

    unsigned int vertexDataSize = 4 * sizeof(VertexData);

    //create vertex buffer
    GameGlobal::GetCurrentDevice()->CreateVertexBuffer(vertexDataSize, D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, 
                                                        D3DPOOL_DEFAULT, &vertexBuffer, 0);

    void *pVertices = NULL;
    vertexBuffer->Lock(0, vertexDataSize, (void**)&pVertices, 0);
    memcpy(pVertices, vertexData, vertexDataSize);
    vertexBuffer->Unlock();

    hr = D3DXCreateEffectFromFileA(GameGlobal::GetCurrentDevice(), "Empty.fx", 0, 0, 0, 0, &effect, &bufferErrors);

    //D3DXMatrixTranslation(&view, 0, 0, 2.75);
    //D3DXMATRIX matrix = world * view * proj;
    //effect->SetMatrix("WorldViewProj", &(world * view * proj));

    //D3DXCreateTexture(GameGlobal::GetCurrentDevice(), GameGlobal::GetWidth(), GameGlobal::GetHeight(), D3DX_DEFAULT,
    //                        D3DUSAGE_RENDERTARGET, D3DFMT_A8B8G8R8, D3DPOOL_DEFAULT, &texture0);

    //D3DXCreateTexture(GameGlobal::GetCurrentDevice(), GameGlobal::GetWidth(), GameGlobal::GetHeight(), D3DX_DEFAULT,
    //                        D3DUSAGE_RENDERTARGET, D3DFMT_A8B8G8R8, D3DPOOL_DEFAULT, &texture1);

    D3DXCreateTextureFromFileA(GameGlobal::GetCurrentDevice(), "valve.png", &texture0);
    D3DXCreateTextureFromFileA(GameGlobal::GetCurrentDevice(), "hungtrung.png", &texture1);  
}
コード例 #6
0
void TriangleExercise::setupPipeline() {
	// create the vertices using the CUSTOMVERTEX struct
	CUSTOMVERTEX vertices[] =
	{
		{ 400.0f, 62.5f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), },
		{ 650.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), },
		{ 150.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), },
	};

	// create a vertex buffer interface called v_buffer
	d3ddev->CreateVertexBuffer(3 * sizeof(CUSTOMVERTEX),
		0,
		CUSTOMFVF,
		D3DPOOL_MANAGED,
		&v_buffer,
		NULL);

	VOID* pVoid;    // a void pointer

	// lock v_buffer and load the vertices into it
	v_buffer->Lock(0, 0, (void**)&pVoid, 0);
	memcpy(pVoid, vertices, sizeof(vertices));
	v_buffer->Unlock();
}
コード例 #7
0
ファイル: Main.cpp プロジェクト: jameskun77/3DSample
VOID Cleanup()
{
	if( g_pVB != NULL )
		g_pVB->Release();

	if( g_pd3dDevice != NULL )
		g_pd3dDevice->Release();

	if( g_pD3D != NULL )
		g_pD3D->Release();
	if(Objects != NULL){
		Objects->Release();
	}

}
コード例 #8
0
ファイル: PointSprites.cpp プロジェクト: BillyKim/directxcode
HRESULT CreateVertex()
{
	POINTVERTEX points[] = 
	{
		{-5.0f, 5.0f, 0.0f, 0xffff0000},
		{ 0.0f, 5.0f, 0.0f, 0xffff0000},
		{ 5.0f, 5.0f, 0.0f, 0xffff0000},

		{-5.0f, 0.0f, 0.0f, 0xff00ff00},
		{ 0.0f, 0.0f, 0.0f, 0xff00ff00},
		{ 5.0f, 0.0f, 0.0f, 0xff00ff00},

		{-5.0f, -5.0f, 0.0f, 0xff0000ff},
		{ 0.0f, -5.0f, 0.0f, 0xff0000ff},
		{ 5.0f, -5.0f, 0.0f, 0xff0000ff}
	} ;

	// Create vertex buffer
	if (FAILED(g_pd3dDevice->CreateVertexBuffer(
		NUM_VERTEX * sizeof(POINTVERTEX), 
		D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY | D3DUSAGE_POINTS, 
		D3DFVF_POINTVERTEX, 
		D3DPOOL_DEFAULT, 
		&g_pVB,
		NULL)))
	{
		return E_FAIL ;
	}

	// Copy vertex data
	VOID* pVertices;
	if( FAILED( g_pVB->Lock( 0, sizeof(points), (void**)&pVertices, 0 ) ) )
		return E_FAIL;
	memcpy( pVertices, points, sizeof(points) );
	g_pVB->Unlock();
}
コード例 #9
0
VOID Cleanup()
{
	// meshes 
	if ( g_pMeshMaterials != NULL )
		delete[] g_pMeshMaterials;

	if ( g_pMeshTextures )
	{
		for ( DWORD i = 0; i < g_dwNumMaterials; ++i )
		{
			if ( g_pMeshTextures[i] )
				g_pMeshTextures[i]->Release();
		}
		delete[] g_pMeshTextures;
	}

	if ( g_pMesh != NULL )
		g_pMesh->Release();

	if ( g_pMeshMaterialsSecond != NULL )
		delete[] g_pMeshMaterialsSecond;

	if ( g_pMeshTexturesSecond )
	{
		for ( DWORD i = 0; i < g_dwNumMaterialsSecond; ++i )
		{
			if ( g_pMeshTexturesSecond[i] )
				g_pMeshTexturesSecond[i]->Release();
		}
		delete[] g_pMeshTexturesSecond;
	}

	if ( g_pMeshSecond != NULL )
		g_pMeshSecond->Release();

	// cylinder
	if ( g_pTexture != NULL )
		g_pTexture->Release();

	if ( g_pVB != NULL )
		g_pVB->Release();

	if ( g_pd3dDevice != NULL )
		g_pd3dDevice->Release();

	if ( g_pD3D != NULL )
		g_pD3D->Release();
}
コード例 #10
0
VOID shutDown() {
	if (d3dDevice != NULL) {
		d3dDevice->Release();
		d3dDevice = NULL;
	}

	if (d3dManager != NULL) {
		d3dManager->Release();
		d3dManager = NULL;
	}

	if (d3dVertexBuf != NULL) {
		d3dVertexBuf->Release();
		d3dVertexBuf = NULL;
	}
}
コード例 #11
0
//////////////////////////////////////////////////////////////////////////
// 객체 정리 - 순서 주의!
//////////////////////////////////////////////////////////////////////////
VOID Cleanup()
{
	if ( g_pVB != NULL )
	{
		g_pVB->Release();
	}

	if ( g_pd3dDevice != NULL )
	{
		g_pd3dDevice->Release();
	}

	if ( g_pD3D != NULL )
	{
		g_pD3D->Release();
	}
}
コード例 #12
0
ファイル: Device.cpp プロジェクト: OtterBub/GameServer2016
void ReleaseD3D()
{
	if (g_pVB) g_pVB->Release();

	if(g_pDevice)
	{
		g_pDevice->Release();		
		g_pDevice = NULL;
	}

	if(g_pD3D)
	{
		g_pD3D->Release();
		g_pD3D = NULL;
	}

}
コード例 #13
0
ファイル: Graphics.cpp プロジェクト: Griffone/Everward
// this is the function that cleans up Direct3D and COM
void cleanD3D(void) {
	if (d3ddev != NULL) {
		d3ddev->Release();
	}
	if (d3ddev != NULL) {
		d3d->Release();
	}
	if (tx != NULL) {
		tx->Release();
	}
	if (vb != NULL) {
		vb->Release();
	}
	if (font != NULL) {
		font->Release();
	}
}
コード例 #14
0
ファイル: botton.cpp プロジェクト: andylam5538/sango
//=============================================================================
// 終了処理
//=============================================================================
void UninitBotton(void)
{
	for(int nCntTex = 0; nCntTex < MAX_BOTTON; nCntTex++)
	{
		if(g_apD3DTextureBotton[nCntTex] != NULL)
		{// テクスチャの開放
			g_apD3DTextureBotton[nCntTex]->Release();
			g_apD3DTextureBotton[nCntTex] = NULL;
		}
	}

	if(g_pD3DVtxBuffBotton != NULL)
	{// 頂点バッファの開放
		g_pD3DVtxBuffBotton->Release();
		g_pD3DVtxBuffBotton = NULL;
	}
}
コード例 #15
0
ファイル: playbar.cpp プロジェクト: andylam5538/sango
//=============================================================================
// 終了処理
//=============================================================================
void UninitPlaybar(void)
{
	for(int nCntTex = 0; nCntTex < MAX_PLAYBAR; nCntTex++)
	{
		if(g_apD3DTexturePlaybar[nCntTex] != NULL)
		{// テクスチャの開放
			g_apD3DTexturePlaybar[nCntTex]->Release();
			g_apD3DTexturePlaybar[nCntTex] = NULL;
		}
	}

	if(g_pD3DVtxBuffPlaybar != NULL)
	{// 頂点バッファの開放
		g_pD3DVtxBuffPlaybar->Release();
		g_pD3DVtxBuffPlaybar = NULL;
	}
}
コード例 #16
0
//-----------------------------------------------------------------------------
// Name: VertexData::AddVertexStream()
//-----------------------------------------------------------------------------
VOID VertexData::AddVertexStream( LPDIRECT3DVERTEXBUFFER9 pBuffer, DWORD Stride, DWORD NumVerts, DWORD Divider )
{
    // vertex buffers are assumed to have the correct bound
    assert( pBuffer );

    DWORD dwStreamIndex = (DWORD)m_VertexStreams.size();
    assert( dwStreamIndex < MaxStreamCount );
    m_dwStreamStrides[dwStreamIndex] = Stride;

    VertexStream Stream;
    Stream.pVertexBuffer = pBuffer;
    Stream.Divider = Divider;
    Stream.Stride = Stride;
    m_VertexStreams.push_back( Stream );
    m_NumVertices += NumVerts;

    pBuffer->AddRef();
}
コード例 #17
0
//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: Releases all previously initialized objects
//-----------------------------------------------------------------------------
VOID Cleanup()
{
    if( g_pFont != NULL )
		g_pFont->Release();
	
	if( g_pVBCylinder != NULL )
        g_pVBCylinder->Release();

	if (g_pTexture != NULL )
		g_pTexture->Release();

	if (g_pTexture2 != NULL )
		g_pTexture2->Release();

    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();

    if( g_pD3D != NULL )
        g_pD3D->Release();
}
コード例 #18
0
	void release_objects()
	{
		if ( lpsurface )
		{
			lpsurface->Release();
			lpsurface = 0;
		}

		if ( lptex )
		{
			lptex->Release();
			lptex = 0;
		}

		if ( lpvbuf )
		{
			lpvbuf->Release();
			lpvbuf = 0;
		}
	}
コード例 #19
0
VOID Cleanup()
{
	// Release vertex buffer
	if (g_pVB != NULL)
	{
		g_pVB->Release() ;
		g_pVB = NULL ;
	}

	// Release teapot mesh
	if(g_pTeapotMesh != NULL)
		g_pTeapotMesh->Release() ;

	// Release D3D
	if( g_pD3D != NULL)
		g_pD3D->Release();

	// Release device
	if( g_pd3dDevice != NULL) 
		g_pd3dDevice->Release();
}
コード例 #20
0
//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: Releases all previously initialized objects
//-----------------------------------------------------------------------------
VOID Cleanup()
{
	if (g_pTexture[0] != NULL)
		g_pTexture[0]->Release();

	if (g_pTexture[1] != NULL)
		g_pTexture[1]->Release();

	if (g_pVB != NULL)
		g_pVB->Release();

	if (g_pMeshMaterials != NULL)
	{
		for (int loop = 0; loop < MESH_COUNT; ++loop)
			delete[] g_pMeshMaterials[loop];
	}
		
    if( g_pMeshTextures )
    {
		for (int loop = 0; loop < MESH_COUNT; ++loop)
		{
			for (DWORD i = 0; i < g_dwNumMaterials[loop]; i++)
			{
				if (g_pMeshTextures[loop][i])
					g_pMeshTextures[loop][i]->Release();
			}
		}
    }
	if (g_pMesh[0] != NULL)
		g_pMesh[0]->Release();

	if (g_pMesh[1] != NULL)
		g_pMesh[1]->Release();

    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();

    if( g_pD3D != NULL )
        g_pD3D->Release();
}
コード例 #21
0
ファイル: Textures.cpp プロジェクト: chinajeffery/dx_sdk
//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: Releases all previously initialized objects
//-----------------------------------------------------------------------------
VOID Cleanup()
{
    CleanupDShow();

    if( g_pTexture != NULL )   
        g_pTexture->Release();
        
    if( g_pVB != NULL )
        g_pVB->Release();
        
    if( g_pd3dDevice != NULL ) 
        g_pd3dDevice->Release();
        
    if( g_pD3D != NULL )
        g_pD3D->Release();

    if( g_pFont )
    {
        delete g_pFont;
        g_pFont = NULL;
    }
}
コード例 #22
0
ファイル: fImage.cpp プロジェクト: nekocode/FScript0.2
void ReleaseImg()
{
	// 释放贴图列表
	for(int i=0;i<65535;i++)
	{
		texlist *sch = texlist_headp[i];
		while(sch)
		{
			sch->tex->tex->Release();
			texlist *tmp = sch;
			sch = sch->next;
			delete tmp;
		}
	}

	// 释放顶点缓存
	if( lpVB != NULL )
		lpVB->Release();

	// 释放化着色器资源
	ReleaseEffect();
}
コード例 #23
0
ファイル: TexAddressMode.cpp プロジェクト: chenbk85/3dlearn
//-----------------------------------------------------------------------------
// Desc: 释放除创建的对象
//-----------------------------------------------------------------------------
VOID Cleanup()
{
	//释放纹理对象1
	if( g_pTexture1 != NULL )        
		g_pTexture1->Release();

	//释放纹理对象2
	if( g_pTexture2 != NULL ) 
		g_pTexture2->Release();

	//释放顶点缓冲区对象
	if( g_pVB != NULL )        
		g_pVB->Release();

	//释放Direct3D设备对象
	if( g_pd3dDevice != NULL ) 
		g_pd3dDevice->Release();

	//释放Direct3D对象
	if( g_pD3D != NULL )       
		g_pD3D->Release();
}
コード例 #24
0
HRESULT ResetDevice(D3DPRESENT_PARAMETERS d3dpp)
{
	// Check device state
	HRESULT hr = g_pd3dDevice->TestCooperativeLevel() ;

	// Device can be reset now
	if (SUCCEEDED(hr) || hr == D3DERR_DEVICENOTRESET)
	{
		// Release resource allocated as D3DPOOL_DEFAULT
		g_pVB->Release();

		// Reset device
		HRESULT hr = g_pd3dDevice->Reset(&d3dpp) ;
		if (FAILED(hr))
		{
			const CHAR* errorString = DXGetErrorString(hr) ;
			DXTRACE_ERR_MSGBOX(errorString, hr) ;
		}

		// Recreate the vertex buffer, since it is create by using
		// D3DPOOL_DEFAULT, the function MUST placed here!!! why?
		// you cann't place it before the return clause of this function
		// what's the inner cause?
		InitVB();
	}
	// Device is still in lost state, wait
	else if (hr == D3DERR_DEVICELOST)
	{
		Sleep(25) ;
	}
	else // Other error, Show error box
	{
		const CHAR* errorString = DXGetErrorString(hr) ;
		DXTRACE_ERR_MSGBOX(errorString, hr) ;
	}

	return hr ;
}
コード例 #25
0
void ImGui_ImplDX9_InvalidateDeviceObjects()
{
    if (!g_pd3dDevice)
        return;
    if (g_pVB)
    {
        g_pVB->Release();
        g_pVB = NULL;
    }
    if (g_pIB)
    {
        g_pIB->Release();
        g_pIB = NULL;
    }

    // At this point note that we set ImGui::GetIO().Fonts->TexID to be == g_FontTexture, so clear both.
    ImGuiIO& io = ImGui::GetIO();
    IM_ASSERT(g_FontTexture == io.Fonts->TexID);
    if (g_FontTexture)
        g_FontTexture->Release();
    g_FontTexture = NULL;
    io.Fonts->TexID = NULL;
}
コード例 #26
0
ファイル: Main.cpp プロジェクト: junglek/DirectX-Basic
VOID cleanup(){
	if(g_pMeshMaterials != NULL)
		delete [] g_pMeshMaterials;

	if(g_pMeshTextures){
		for(DWORD i=0; i<g_dwNumMaterials; ++i){
			if(g_pMeshTextures[i])
				g_pMeshTextures[i]->Release();
		}
		delete [] g_pMeshTextures;
	}

	if(g_pMesh != NULL)
		g_pMesh->Release();

	if(g_pShutter != NULL)
		g_pShutter->Release();

	if(g_pDevice != NULL)
		g_pDevice->Release();

	if(g_pD3D != NULL)
		g_pD3D->Release();
}
コード例 #27
0
/************************************************************
Render

Renders the water to the screen relative to the currect origin.
Doesnt do any translations on the matrix.  Each row is done
in one individual triangular strip (so all interior vertices are
done twice :-|  I do not believe it is possible to do it all
as one triangular strip (and have every vertex specified once).
************************************************************/
void WaterField::Render()
{
	int i, j, k;
  
  if (!m_textureMode)
  {
	  COLORVERTEX* pVertices;
    //for(int l=0;l<2;l++)
	  for(i=0; i<myXdivs-1; i++)
	  {
		  //Get a pointer to the vertex buffer vertices and lock the vertex buffer
		  g_pVertexBuffer->Lock(0, 2 * myYdivs*  sizeof(COLORVERTEX), (void **) &pVertices, 0);

		  for(j=0; j<myYdivs; j++)
		  {
			  for (k=0; k<2; k++)
			  {
			    pVertices[2*j+k].x = myXmin + (float)((i+k)*m_xdivdist);//+ (float)((j)*m_xdivdist)/2.0f;
			    pVertices[2*j+k].y = myYmin + (float)(j*m_ydivdist);
			    pVertices[2*j+k].z = (float)(myPoints[i+k][j].height);
          pVertices[2*j+k].nx = myPoints[i+k][j].normal.x;
          pVertices[2*j+k].ny = myPoints[i+k][j].normal.y;
          pVertices[2*j+k].nz = myPoints[i+k][j].normal.z;
          pVertices[2*j+k].color = *((DWORD*)&(myPoints[i+k][j].color));
			  }
		  }
		  //Unlock the vertex buffer
		  g_pVertexBuffer->Unlock();
			// Draw it
      g_pd3dDevice->SetFVF(D3DFVF_COLORVERTEX);
      g_pd3dDevice->SetStreamSource(0, g_pVertexBuffer, 0, sizeof(COLORVERTEX));
		  g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2*(myYdivs-1));
      //g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2*(myYdivs-1), g_pVertexBuffer, sizeof(COLORVERTEX));
	  }
  }
  else
  {
    TEXTUREDVERTEX* pVertices;
    //for(int l=0;l<2;l++)
	  for(i=0; i<myXdivs-1; i++)
	  {
		  //Get a pointer to the vertex buffer vertices and lock the vertex buffer
		  g_pVertexBuffer->Lock(0, 2 * myYdivs*  sizeof(TEXTUREDVERTEX), (void**)&pVertices, 0);

		  for(j=0; j<myYdivs; j++)
		  {
			  for (k=0; k<2; k++)
			  {
			    pVertices[2*j+k].x = myXmin + (float)((i+k)*m_xdivdist);//+ (float)((j)*m_xdivdist)/2.0f;
			    pVertices[2*j+k].y = myYmin + (float)(j*m_ydivdist);
			    pVertices[2*j+k].z = (float)(myPoints[i+k][j].height);
          pVertices[2*j+k].nx = myPoints[i+k][j].normal.x;
          pVertices[2*j+k].ny = myPoints[i+k][j].normal.y;
          pVertices[2*j+k].nz = myPoints[i+k][j].normal.z;
          pVertices[2*j+k].tu = 0.0f+1.0f*(float)(i+k)/(float)myXdivs + 0.5f*myPoints[i+k][j].normal.x;
          pVertices[2*j+k].tv = 0.0f+1.0f*(float)j/(float)myYdivs + 0.5f*myPoints[i+k][j].normal.y;
			  }
		  }
		  //Unlock the vertex buffer
		  g_pVertexBuffer->Unlock();
			// Draw it
      g_pd3dDevice->SetFVF(D3DFVF_TEXTUREDVERTEX);
      g_pd3dDevice->SetStreamSource(0, g_pVertexBuffer, 0, sizeof(TEXTUREDVERTEX));
		  g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2*(myYdivs-1));
	  }
  }
}
コード例 #28
0
WaterField::~WaterField()
{
	g_pVertexBuffer->Release();
}
コード例 #29
0
 ~PMDDataDx9()
 {
     if(m_Material) delete[] m_Material;
     if(m_IndexBuffer)  m_IndexBuffer->Release();
     if(m_VertexBuffer) m_VertexBuffer->Release();
 }
コード例 #30
0
HRESULT CreateCube()
{
    // The vertex order in each face is in the following order when you
    // look at the face perpendicular against it's normal
    // bottom left -> bottom right -> top right -> top left
    // So you need to set the cull mode as D3DCULL_CW, since the default mode is D3DCULL_CCW
    Vertex vertices[] =
    {
        // Front face
        { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f }, // 0
        { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f }, // 1
        { 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f }, // 2
        { 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f }, // 3

        // Back face
        { 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
        { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f },
        { 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f },
        { 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f },

        // Left face
        { 0.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f },
        { 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f },
        { 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f },
        { 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f },

        // Right face
        { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f },
        { 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f },
        { 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f },
        { 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f },

        // Top face
        { 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f },
        { 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f },
        { 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f },
        { 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f },

        // Bottom face
        { 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f },
        { 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f },
        { 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f },
        { 1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f },
    } ;

    // Index buffer
    WORD indices[] =
    {
        // Front side
        0, 1, 2, 0, 2, 3,

        // Back side
        4, 5, 6, 4, 6, 7,

        // Top side
        8, 9, 10, 8, 10, 11,

        // Bottom side
        12, 13, 14, 12, 14, 15,

        // Left side
        16, 17, 18, 16, 18, 19,

        // Right side
        20, 21, 22, 20, 22, 23,
    } ;

    // Create vertex buffer
    if( FAILED( g_pd3dDevice->CreateVertexBuffer( sizeof(vertices) * sizeof(Vertex),
                D3DUSAGE_WRITEONLY,
                VERTEX_FVF,
                D3DPOOL_MANAGED,
                &g_pVB,
                NULL ) ) )
    {
        return E_FAIL;
    }

    // Copy vertex data
    VOID* pVertices;
    if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
        return E_FAIL;
    memcpy( pVertices, vertices, sizeof(vertices) );
    g_pVB->Unlock();

    // Create index buffer
    if( FAILED( g_pd3dDevice->CreateIndexBuffer( sizeof(indices) * sizeof(WORD),
                D3DUSAGE_WRITEONLY,
                D3DFMT_INDEX16,
                D3DPOOL_MANAGED,
                &g_pIB,
                0) ) )
    {
        return E_FAIL ;
    }

    // Copy index data
    VOID *pIndices;
    if( FAILED( g_pIB->Lock( 0, sizeof(indices), (void **)&pIndices, 0) ) )
        return E_FAIL;
    memcpy(pIndices, indices, sizeof(indices) );
    g_pIB->Unlock() ;
}