⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 billboard.cpp

📁 国外网游源码....除工具源码缺少之外,其余程序都全...至于,什么游戏,因为国内还没有,所以找不到测试
💻 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 + -