📄 billboard.cpp
字号:
// Billboard.cpp: implementation of the CBillboard class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Billboard.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
// 叼竣荐 祭敲窍备 度鞍捞 秦焊厘..
// Tree textures to use
const DWORD BILLVERTEX::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1; // 秦歹俊辑 静搁 俊矾巢.. 吝汗沁促绰 皋矫瘤.. 秦歹俊辑绰 急攫父窍备 利侩篮 夯郴侩俊辑 秦具窃..
TCHAR* g_strTreeTextures[] =
{
_T(".\\data\\Game\\Effect\\Tree02S.dds"),
_T(".\\data\\Game\\Effect\\Tree35S.dds"),
_T(".\\data\\Game\\Effect\\Tree01S.dds"),
};
#define NUMTREETEXTURES 3
//-----------------------------------------------------------------------------
// Name: TreeSortCB()
// Desc: Callback function for sorting trees in back-to-front order
//-----------------------------------------------------------------------------
int __cdecl TreeSortCB( const VOID* arg1, const VOID* arg2 )
{
// Tree* p1 = (Tree*)arg1;
// Tree* p2 = (Tree*)arg2;
//
// FLOAT d1 = p1->vPos.x * g_vDir.x + p1->vPos.z * g_vDir.z;
// FLOAT d2 = p2->vPos.x * g_vDir.x + p2->vPos.z * g_vDir.z;
// if (d1 < d2)
// return +1;
return -1;
}
CBillboard::CBillboard()
{
m_nBillBoardCount = 0;
m_vPosTree = NULL;
m_dwTexIndex = NULL;
for( DWORD i=0; i<NUMTREETEXTURES; i++ )
m_pTextureEx[i] = NULL;
m_pVertexBuffer = NULL;
}
CBillboard::~CBillboard()
{
SAFE_DELETE_ARRAY(m_vPosTree);
SAFE_DELETE_ARRAY(m_dwTexIndex);
for( DWORD i=0; i<NUMTREETEXTURES; i++ )
SAFE_RELEASE( m_pTextureEx[i] );
SAFE_RELEASE( m_pVertexBuffer );
}
//HRESULT CBillboard::Create( DWORD nMax)
HRESULT CBillboard::Create()
{
return S_OK;
}
HRESULT CBillboard::LoadTexture( char * szFileName )
{
// HRESULT hr = E_FAIL;
HRESULT hr = S_OK;
for( DWORD i=0; i<NUMTREETEXTURES; i++ )
{
// Create the texture using D3DX
if( FAILED( hr = D3DXCreateTextureFromFileEx( g_pApp->GetD3dDevice(), g_strTreeTextures[i],
D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN,
MEMORY_POOL, D3DX_FILTER_TRIANGLE|D3DX_FILTER_MIRROR,
D3DX_FILTER_TRIANGLE|D3DX_FILTER_MIRROR, 0, NULL, NULL, &m_pTextureEx[i] ) ) )
return hr;
}
// if( FAILED( hr = D3DXCreateTextureFromFileEx( g_pApp->GetD3dDevice(), szFileName,
// D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN,
// MEMORY_POOL, D3DX_FILTER_TRIANGLE|D3DX_FILTER_MIRROR,
// D3DX_FILTER_TRIANGLE|D3DX_FILTER_MIRROR, 0, NULL, NULL, &m_pTexture[0] ) ) )
// return hr;
m_nBillBoardCount = 1000;
CreateVertexBuffer();
return hr;
}
HRESULT CBillboard::CreateVertexBuffer()
{
// Set up a rotation matrix to orient the billboard towards the camera.
// D3DXVECTOR3 vDir = vLookatPt - vEyePt;
// if( vDir.x > 0.0f )
// D3DXMatrixRotationY( &m_matBillboardMatrix, -atanf(vDir.z/vDir.x)+D3DX_PI/2 );
// else
// D3DXMatrixRotationY( &m_matBillboardMatrix, -atanf(vDir.z/vDir.x)-D3DX_PI/2 );
// g_vDir = vDir;
//
// // Sort trees in back-to-front order
// qsort( m_Trees, NUM_TREES, sizeof(Tree), TreeSortCB );
// if(FAILED( g_pApp->GetD3dDevice()->CreateVertexBuffer(m_nBillBoardCount*4*sizeof(BILLVERTEX),
// D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY,
// BILLVERTEX::FVF,D3DPOOL_DEFAULT, &m_pVertexBuffer, NULL) ))
if(FAILED( g_pApp->GetD3dDevice()->CreateVertexBuffer(m_nBillBoardCount*4*sizeof(BILLVERTEX),
D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY,
BILLVERTEX::FVF,MEMORY_POOL, &m_pVertexBuffer, NULL) ))
{
OutputDebugString("[角菩] CMD3Mesh::CreateVertexBuffer");
return E_FAIL;
}
m_vPosTree = new D3DXVECTOR3[m_nBillBoardCount];
m_dwTexIndex = new DWORD[m_nBillBoardCount];
for( int i=0; i<m_nBillBoardCount; i++)
{
m_vPosTree[i].x = (float)(rand()%128);
m_vPosTree[i].y = 0.0f;
m_vPosTree[i].z = (float)(rand()%128);
// m_vPosTree[i].x = 2.0f;
// m_vPosTree[i].y = 0.0f;
// m_vPosTree[i].z = 2.0f*i;
m_dwTexIndex[i] = (rand()%3);
}
// BILLVERTEX Billvertex = {D3DXVECTOR3(1.0f, 0.0f, 1.0f),0xFFFFFFFF,1.0f,0.0f};
// BILLVERTEX Billvertex[2] = {{1.0f, 0.0f, 1.0f,0xFFFFFFFF,1.0f,0.0f},{1.0f, 0.0f, 1.0f,0xFFFFFFFF,1.0f,0.0f}};
static struct { float x,y,z;DWORD dwColor; float u,v; } s_Verts[] =
{
{ 1.0f,-1.0f,1.0f,0xFFFFFFFF,1.0f,0.0f},
{ 1.0f, 1.0f,1.0f,0xFFFFFFFF,1.0f,1.0f},
{-1.0f,-1.0f,1.0f,0xFFFFFFFF,0.0f,0.0f},
{-1.0f, 1.0f,1.0f,0xFFFFFFFF,0.0f,1.0f},
};
BILLVERTEX Billvertex[4];
for( i=0;i<4;i++)
{
Billvertex[i].p = D3DXVECTOR3(s_Verts[i].x,s_Verts[i].y,s_Verts[i].z);
Billvertex[i].color = s_Verts[i].dwColor;
Billvertex[i].tu = s_Verts[i].u;
Billvertex[i].tv = s_Verts[i].v;
}
// BILLVERTEX Billvertex[4] =
// {
// {D3DXVECTOR3(1.0f, 0.0f, 1.0f),0xFFFFFFFF,1.0f,0.0f},
// {D3DXVECTOR3(1.0f, 1.0f, 1.0f),0xFFFFFFFF,1.0f,1.0f},
// {D3DXVECTOR3(0.0f, 0.0f, 1.0f),0xFFFFFFFF,0.0f,0.0f},
// {D3DXVECTOR3(0.0f, 1.0f, 1.0f),0xFFFFFFFF,0.0f,1.0f},
// };
return S_OK;
}
HRESULT CBillboard::Update()
{
// static struct { float x,y,z;DWORD dwColor; float u,v; } s_Verts[] =
// {
// { 1.0f,-1.0f,1.0f,0xFFFFFFFF,1.0f,0.0f},
// { 1.0f, 1.0f,1.0f,0xFFFFFFFF,1.0f,1.0f},
// {-1.0f,-1.0f,1.0f,0xFFFFFFFF,0.0f,0.0f},
// {-1.0f, 1.0f,1.0f,0xFFFFFFFF,0.0f,1.0f},
// };
// static struct { float x,y,z;DWORD dwColor; float u,v; } s_Verts[] =
// {
// { 4.0f,0.0f,1.0f,0xFFFFFFFF,0.0f,1.0f},
// { 4.0f,4.0f,1.0f,0xFFFFFFFF,0.0f,0.0f},
// { 0.0f,0.0f,1.0f,0xFFFFFFFF,1.0f,1.0f},
// { 0.0f,4.0f,1.0f,0xFFFFFFFF,1.0f,0.0f},
// };
static struct { float x,y,z;DWORD dwColor; float u,v; } s_Verts[] =
{
{ -1.0f,0.0f,0.0f,0xFFFFFFFF,0.0f,1.0f},
{ -1.0f,4.0f,0.0f,0xFFFFFFFF,0.0f,0.0f},
{ 1.0f,0.0f,0.0f,0xFFFFFFFF,1.0f,1.0f},
{ 1.0f,4.0f,0.0f,0xFFFFFFFF,1.0f,0.0f},
};
BILLVERTEX Billvertex[4];
for(int i=0;i<4;i++)
{
Billvertex[i].p = D3DXVECTOR3(s_Verts[i].x,s_Verts[i].y,s_Verts[i].z);
Billvertex[i].color = s_Verts[i].dwColor;
Billvertex[i].tu = s_Verts[i].u;
Billvertex[i].tv = s_Verts[i].v;
}
D3DXVECTOR3 vLookatPt = g_pCamera->GetLookatPt();
D3DXVECTOR3 vEyePt = g_pCamera->GetEyePt();
D3DXVECTOR3 vDir = vLookatPt - vEyePt;
if( vDir.x > 0.0f )
D3DXMatrixRotationY( &m_matBillboardMatrix, -atanf(vDir.z/vDir.x)+D3DX_PI/2 );
else
D3DXMatrixRotationY( &m_matBillboardMatrix, -atanf(vDir.z/vDir.x)-D3DX_PI/2 );
m_vDir = vDir;
BILLVERTEX *pVertex=NULL;
if( FAILED( m_pVertexBuffer->Lock(0,0, (void **)&pVertex, D3DLOCK_DISCARD) ))
return E_FAIL;
// if( FAILED( hr = m_pVB->Lock( m_dwBase * sizeof(POINTVERTEX), m_dwFlush * sizeof(POINTVERTEX),
// (void**) &pVertices, m_dwBase ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD ) ) )
// {
// return hr;
// }
DWORD dwOffset = 0;
for( i=0; i<m_nBillBoardCount; i++) // 鞘夸 茄 何盒父 ..
{
memcpy( &pVertex[dwOffset], Billvertex, 4*sizeof(BILLVERTEX) );
dwOffset += 4;
// D3DXVECTOR3 vVector = m_pMCVertex[i].vVector;
// D3DXVec3TransformCoord(&vVector,&vVector,&m_matLocalTM);
// pVertex[i].vVector = vVector;
//
// pVertex[i].vNoraml = m_pMCVertex[i].vNoraml;
// pVertex[i].Tex = m_pMCVertex[i].Tex;
}
if( FAILED( m_pVertexBuffer->Unlock() ) )
return E_FAIL;
return S_OK;
}
void CBillboard::Render()
{
Update();
//D3DXVec3Project()
D3DXMATRIXA16 matWorld;
D3DXMatrixIdentity( &matWorld );
g_pApp->GetD3dDevice()->SetTransform( D3DTS_WORLD, &matWorld );
g_pApp->GetD3dDevice()->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
g_pApp->GetD3dDevice()->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
g_pApp->GetD3dDevice()->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
// Enable alpha testing (skips pixels with less than a certain alpha.)
// if( m_d3dCaps.AlphaCmpCaps & D3DPCMPCAPS_GREATEREQUAL )
{
g_pApp->GetD3dDevice()->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
g_pApp->GetD3dDevice()->SetRenderState( D3DRS_ALPHAREF, 0x08 );
g_pApp->GetD3dDevice()->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );
}
// Loop through and render all trees
// g_pApp->GetD3dDevice()->SetStreamSource( 0, m_pVertexBuffer, 0, m_nBillBoardCount * sizeof(BILLVERTEX) );
g_pApp->GetD3dDevice()->SetStreamSource( 0, m_pVertexBuffer, 0, sizeof(BILLVERTEX) );
g_pApp->GetD3dDevice()->SetFVF( BILLVERTEX::FVF );
DWORD dwOffset = 0;
for( int i=0; i<m_nBillBoardCount; i++) // 鞘夸 茄 何盒父 ..
{
g_pApp->GetD3dDevice()->SetTexture( 0, m_pTextureEx[m_dwTexIndex[i]] );
// Translate the billboard into place
// m_matBillboardMatrix._41 = m_vPosTree[i].x;
// m_matBillboardMatrix._42 = m_vPosTree[i].y;
// m_matBillboardMatrix._43 = m_vPosTree[i].z;
/** /
D3DXMATRIX mBillboard;
D3DXMatrixIdentity( &mBillboard );
mBillboard._11 = g_pCamera->GetViewMatrix()._11;
mBillboard._13 = g_pCamera->GetViewMatrix()._13;
mBillboard._31 = g_pCamera->GetViewMatrix()._31;
mBillboard._33 = g_pCamera->GetViewMatrix()._33;
D3DXMatrixInverse( &mBillboard, NULL, &mBillboard );
mBillboard._41 = m_vPosTree[i].x;
mBillboard._42 = m_vPosTree[i].y;
mBillboard._43 = m_vPosTree[i].z;
g_pApp->GetD3dDevice()->SetTransform( D3DTS_WORLD, &mBillboard );
/** /
D3DXMATRIX mBillboard = g_pCamera->GetBillboardMatrix();
mBillboard._41 = m_vPosTree[i].x;
mBillboard._42 = m_vPosTree[i].y;
mBillboard._43 = m_vPosTree[i].z;
// 夸扁辑 局聪皋捞拣 贸府 窍伙..
// D3DXMATRIX mBillboard = g_pCamera->GetBillboardMatrix();
g_pApp->GetD3dDevice()->SetTransform( D3DTS_WORLD, &mBillboard );
/**/
m_matBillboardMatrix._41 = m_vPosTree[i].x;
m_matBillboardMatrix._42 = m_vPosTree[i].y;
m_matBillboardMatrix._43 = m_vPosTree[i].z;
g_pApp->GetD3dDevice()->SetTransform( D3DTS_WORLD, &m_matBillboardMatrix );
/**/
g_pApp->GetD3dDevice()->DrawPrimitive( D3DPT_TRIANGLESTRIP, dwOffset, 2 );
dwOffset+=4;
}
g_pApp->GetD3dDevice()->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
g_pApp->GetD3dDevice()->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -