Esempio n. 1
0
Prim_t* Chunk::CreateBox( const char* tex, float scale ) {
	IVideoInterface3D* pVideoInterface3D = g_pCoreSystem->GetVideoInterface3D();
	if ( !pVideoInterface3D) {
		return NULL;
	}

	Prim_t* pPrim = new Prim_t;
	if( pPrim ) {
		HTEXTURE hTex = pVideoInterface3D->CreateTexture( tex );

		int nFaces = 6;

		pPrim->vPos.Set(0.0f, -10.0f, 0.0f);
		pPrim->hTex = hTex;

		pPrim->numVertsBaked = 4 * nFaces;
		pPrim->vertsBaked = new Vert3dBaked_t[pPrim->numVertsBaked];

		pPrim->numIdxBaked = 6 * nFaces;
		pPrim->idxBaked = new unsigned short[pPrim->numIdxBaked];


		//set up the verts

		//bottom
		SetupVert(&pPrim->vertsBaked[0], -scale, 0.0f, scale, 0.0f, 0.0f);
		SetupVert(&pPrim->vertsBaked[1], scale, 0.0f, scale, 1.0f, 0.0f);
		SetupVert(&pPrim->vertsBaked[2], scale, 0.0f, -scale, 1.0f, 1.0f);
		SetupVert(&pPrim->vertsBaked[3], -scale, 0.0f, -scale, 0.0f, 1.0f);

		pPrim->idxBaked[0] = 3;
		pPrim->idxBaked[1] = 1;
		pPrim->idxBaked[2] = 0;
		pPrim->idxBaked[3] = 3;
		pPrim->idxBaked[4] = 2;
		pPrim->idxBaked[5] = 1;

		//left
		SetupVert(&pPrim->vertsBaked[4], -scale, scale * 2.0f, scale, 0.0f, 0.0f);
		SetupVert(&pPrim->vertsBaked[5], -scale, scale * 2.0f, -scale, 1.0f, 0.0f);
		SetupVert(&pPrim->vertsBaked[6], -scale, 0.0f, -scale, 1.0f, 1.0f);
		SetupVert(&pPrim->vertsBaked[7], -scale, 0.0f, scale, 0.0f, 1.0f);

		pPrim->idxBaked[6] = 7;
		pPrim->idxBaked[7] = 5;
		pPrim->idxBaked[8] = 4;
		pPrim->idxBaked[9] = 7;
		pPrim->idxBaked[10] = 6;
		pPrim->idxBaked[11] = 5;

		//back
		SetupVert(&pPrim->vertsBaked[8], scale, scale * 2.0f, scale, 0.0f, 0.0f);
		SetupVert(&pPrim->vertsBaked[9], -scale, scale * 2.0f, scale, 1.0f, 0.0f);
		SetupVert(&pPrim->vertsBaked[10], -scale, 0.0f, scale, 1.0f, 1.0f);
		SetupVert(&pPrim->vertsBaked[11], scale, 0.0f, scale, 0.0f, 1.0f);

		pPrim->idxBaked[12] = 11;
		pPrim->idxBaked[13] = 9;
		pPrim->idxBaked[14] = 8;
		pPrim->idxBaked[15] = 11;
		pPrim->idxBaked[16] = 10;
		pPrim->idxBaked[17] = 9;

		//right
		SetupVert(&pPrim->vertsBaked[12], scale, scale * 2.0f, -scale, 0.0f, 0.0f);
		SetupVert(&pPrim->vertsBaked[13], scale, scale * 2.0f, scale, 1.0f, 0.0f);
		SetupVert(&pPrim->vertsBaked[14], scale, 0.0f, scale, 1.0f, 1.0f);
		SetupVert(&pPrim->vertsBaked[15], scale, 0.0f, -scale, 0.0f, 1.0f);

		pPrim->idxBaked[18] = 15;
		pPrim->idxBaked[19] = 13;
		pPrim->idxBaked[20] = 12;
		pPrim->idxBaked[21] = 15;
		pPrim->idxBaked[22] = 14;
		pPrim->idxBaked[23] = 13;

		//front
		SetupVert(&pPrim->vertsBaked[16], -scale, scale * 2.0f, -scale, 0.0f, 0.0f);
		SetupVert(&pPrim->vertsBaked[17], scale, scale * 2.0f, -scale, 1.0f, 0.0f);
		SetupVert(&pPrim->vertsBaked[18], scale, 0.0f, -scale, 1.0f, 1.0f);
		SetupVert(&pPrim->vertsBaked[19], -scale, 0.0f, -scale, 0.0f, 1.0f);

		pPrim->idxBaked[24] = 19;
		pPrim->idxBaked[25] = 17;
		pPrim->idxBaked[26] = 16;
		pPrim->idxBaked[27] = 19;
		pPrim->idxBaked[28] = 18;
		pPrim->idxBaked[29] = 17;

		SetupVert(&pPrim->vertsBaked[20], -scale, scale * 2.0f, scale, 0.0f, 0.0f);
		SetupVert(&pPrim->vertsBaked[21], scale, scale * 2.0f, scale, 1.0f, 0.0f);
		SetupVert(&pPrim->vertsBaked[22], scale, scale * 2.0f, -scale, 1.0f, 1.0f);
		SetupVert(&pPrim->vertsBaked[23], -scale, scale * 2.0f, -scale, 0.0f, 1.0f);

		pPrim->idxBaked[30] = 23;
		pPrim->idxBaked[31] = 21;
		pPrim->idxBaked[32] = 20;
		pPrim->idxBaked[33] = 23;
		pPrim->idxBaked[34] = 22;
		pPrim->idxBaked[35] = 21;

		pPrim->FastBake();

		return pPrim;
	}
	
	return NULL;
}
Esempio n. 2
0
void ChunkPrim::AddBoxOpt(Vector3d &pos) {
	int nFaces = 6;
	float scale = 4.0f;
	//m_Prim.numVertsBaked += 4 * nFaces;
	//m_Prim.numIdxBaked += 6 * nFaces;
	//int vert_offset = m_nBoxes * 24;
	//int index_offset = m_nBoxes * 36;
	
	Vert3dBaked_t vertsBaked[4];
	unsigned short idxBaked[6];

	SetupVert(&vertsBaked[0], -scale + pos.x, 0.0f + pos.y, scale + pos.z, 0.0f, 0.0f);
	SetupVert(&vertsBaked[1], scale + pos.x, 0.0f + pos.y, scale + pos.z, 1.0f, 0.0f);
	SetupVert(&vertsBaked[2], scale + pos.x, 0.0f + pos.y, -scale + pos.z, 1.0f, 1.0f);
	SetupVert(&vertsBaked[3], -scale + pos.x, 0.0f + pos.y, -scale + pos.z, 0.0f, 1.0f);

	idxBaked[0] = 3;
	idxBaked[1] = 1;
	idxBaked[2] = 0;
	idxBaked[3] = 3;
	idxBaked[4] = 2;
	idxBaked[5] = 1;

	CacheFace( (Vert3dBaked_t*)&vertsBaked, (unsigned short *)idxBaked );

	//left
	SetupVert(&vertsBaked[0], -scale + pos.x, scale * 2.0f + pos.y, scale + pos.z, 0.0f, 0.0f);
	SetupVert(&vertsBaked[1], -scale + pos.x, scale * 2.0f + pos.y, -scale + pos.z, 1.0f, 0.0f);
	SetupVert(&vertsBaked[2], -scale + pos.x, 0.0f + pos.y, -scale + pos.z, 1.0f, 1.0f);
	SetupVert(&vertsBaked[3], -scale + pos.x, 0.0f + pos.y, scale + pos.z, 0.0f, 1.0f);

	idxBaked[0] = 0;
	idxBaked[1] = 1;
	idxBaked[2] = 3;
	idxBaked[3] = 1;
	idxBaked[4] = 2;
	idxBaked[5] = 3;

	CacheFace( (Vert3dBaked_t*)&vertsBaked, (unsigned short *)idxBaked );

	//back
	SetupVert(&vertsBaked[0], -scale + pos.x, 0.0f + pos.y, scale + pos.z, 1.0f, 1.0f);
	SetupVert(&vertsBaked[1], scale + pos.x, 0.0f + pos.y, scale + pos.z, 0.0f, 1.0f);
	SetupVert(&vertsBaked[2], scale + pos.x, scale * 2.0f + pos.y, scale + pos.z, 0.0f, 0.0f);
	SetupVert(&vertsBaked[3], -scale + pos.x, scale * 2.0f + pos.y, scale + pos.z, 1.0f, 0.0f);

	idxBaked[0] = 0;
	idxBaked[1] = 1;
	idxBaked[2] = 3;
	idxBaked[3] = 1;
	idxBaked[4] = 2;
	idxBaked[5] = 3;

	CacheFace( (Vert3dBaked_t*)&vertsBaked, (unsigned short *)idxBaked );

	//right
	SetupVert(&vertsBaked[0], scale + pos.x, 0.0f + pos.y, scale + pos.z, 1.0f, 1.0f);
	SetupVert(&vertsBaked[1], scale + pos.x, 0.0f + pos.y, -scale + pos.z, 0.0f, 1.0f);
	SetupVert(&vertsBaked[2], scale + pos.x, scale * 2.0f + pos.y, -scale + pos.z, 0.0f, 0.0f);
	SetupVert(&vertsBaked[3], scale + pos.x, scale * 2.0f + pos.y, scale + pos.z, 1.0f, 0.0f);

	idxBaked[0] = 0;
	idxBaked[1] = 1;
	idxBaked[2] = 3;
	idxBaked[3] = 1;
	idxBaked[4] = 2;
	idxBaked[5] = 3;

	CacheFace( (Vert3dBaked_t*)&vertsBaked, (unsigned short *)idxBaked );

	//front
	SetupVert(&vertsBaked[0], -scale + pos.x, scale * 2.0f + pos.y, -scale + pos.z, 0.0f, 0.0f);
	SetupVert(&vertsBaked[1], scale + pos.x, scale * 2.0f + pos.y, -scale + pos.z, 1.0f, 0.0f);
	SetupVert(&vertsBaked[2], scale + pos.x, 0.0f + pos.y, -scale + pos.z, 1.0f, 1.0f);
	SetupVert(&vertsBaked[3], -scale + pos.x, 0.0f + pos.y, -scale + pos.z, 0.0f, 1.0f);

	idxBaked[0] = 0;
	idxBaked[1] = 1;
	idxBaked[2] = 3;
	idxBaked[3] = 1;
	idxBaked[4] = 2;
	idxBaked[5] = 3;

	CacheFace( (Vert3dBaked_t*)&vertsBaked, (unsigned short *)idxBaked );

	SetupVert(&vertsBaked[0], -scale + pos.x, scale * 2.0f + pos.y, -scale + pos.z, 0.0f, 1.0f);
	SetupVert(&vertsBaked[1], scale + pos.x, scale * 2.0f + pos.y, -scale + pos.z, 1.0f, 1.0f);
	SetupVert(&vertsBaked[2], scale + pos.x, scale * 2.0f + pos.y, scale + pos.z, 1.0f, 0.0f);
	SetupVert(&vertsBaked[3], -scale + pos.x, scale * 2.0f + pos.y, scale + pos.z, 0.0f, 0.0f);

	idxBaked[0] = 0;
	idxBaked[1] = 3;
	idxBaked[2] = 1;
	idxBaked[3] = 1;
	idxBaked[4] = 3;
	idxBaked[5] = 2;

	CacheFace( (Vert3dBaked_t*)&vertsBaked, (unsigned short *)idxBaked );

	++m_nBoxes;
}
Esempio n. 3
0
void ChunkPrim::AddBox(Vector3d &pos) {
	int nFaces = 6;
	float scale = 4.0f;
	m_Prim.numVertsBaked += 4 * nFaces;
	m_Prim.numIdxBaked += 6 * nFaces;
	int vert_offset = m_nBoxes * 24;
	int index_offset = m_nBoxes * 36;

	SetupVert(&m_Prim.vertsBaked[vert_offset + 0], -scale + pos.x, 0.0f + pos.y, scale + pos.z, 0.0f, 0.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 1], scale + pos.x, 0.0f + pos.y, scale + pos.z, 1.0f, 0.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 2], scale + pos.x, 0.0f + pos.y, -scale + pos.z, 1.0f, 1.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 3], -scale + pos.x, 0.0f + pos.y, -scale + pos.z, 0.0f, 1.0f);

	//AddFace( &m_Prim.vertsBaked[vert_offset] );

	m_Prim.idxBaked[index_offset + 0] = vert_offset + 3;
	m_Prim.idxBaked[index_offset + 1] = vert_offset + 1;
	m_Prim.idxBaked[index_offset + 2] = vert_offset + 0;
	m_Prim.idxBaked[index_offset + 3] = vert_offset + 3;
	m_Prim.idxBaked[index_offset + 4] = vert_offset + 2;
	m_Prim.idxBaked[index_offset + 5] = vert_offset + 1;

	//left
	SetupVert(&m_Prim.vertsBaked[vert_offset + 4], -scale + pos.x, scale * 2.0f + pos.y, scale + pos.z, 0.0f, 0.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 5], -scale + pos.x, scale * 2.0f + pos.y, -scale + pos.z, 1.0f, 0.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 6], -scale + pos.x, 0.0f + pos.y, -scale + pos.z, 1.0f, 1.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 7], -scale + pos.x, 0.0f + pos.y, scale + pos.z, 0.0f, 1.0f);

	//AddFace( &m_Prim.vertsBaked[vert_offset + 4] );

	m_Prim.idxBaked[index_offset + 6] = vert_offset + 4;
	m_Prim.idxBaked[index_offset + 7] = vert_offset + 5;
	m_Prim.idxBaked[index_offset + 8] = vert_offset + 7;
	m_Prim.idxBaked[index_offset + 9] = vert_offset + 5;
	m_Prim.idxBaked[index_offset + 10] = vert_offset + 6;
	m_Prim.idxBaked[index_offset + 11] = vert_offset + 7;

	//back
	SetupVert(&m_Prim.vertsBaked[vert_offset + 8], -scale + pos.x, 0.0f + pos.y, scale + pos.z, 1.0f, 1.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 9], scale + pos.x, 0.0f + pos.y, scale + pos.z, 0.0f, 1.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 10], scale + pos.x, scale * 2.0f + pos.y, scale + pos.z, 0.0f, 0.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 11], -scale + pos.x, scale * 2.0f + pos.y, scale + pos.z, 1.0f, 0.0f);

	//AddFace( &m_Prim.vertsBaked[vert_offset + 8] );

	m_Prim.idxBaked[index_offset + 12] = vert_offset + 8;
	m_Prim.idxBaked[index_offset + 13] = vert_offset + 9;
	m_Prim.idxBaked[index_offset + 14] = vert_offset + 11;
	m_Prim.idxBaked[index_offset + 15] = vert_offset + 9;
	m_Prim.idxBaked[index_offset + 16] = vert_offset + 10;
	m_Prim.idxBaked[index_offset + 17] = vert_offset + 11;

	//right
	SetupVert(&m_Prim.vertsBaked[vert_offset + 12], scale + pos.x, 0.0f + pos.y, scale + pos.z, 1.0f, 1.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 13], scale + pos.x, 0.0f + pos.y, -scale + pos.z, 0.0f, 1.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 14], scale + pos.x, scale * 2.0f + pos.y, -scale + pos.z, 0.0f, 0.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 15], scale + pos.x, scale * 2.0f + pos.y, scale + pos.z, 1.0f, 0.0f);

	//AddFace( &m_Prim.vertsBaked[vert_offset + 12] );

	m_Prim.idxBaked[index_offset + 18] = vert_offset + 12;
	m_Prim.idxBaked[index_offset + 19] = vert_offset + 13;
	m_Prim.idxBaked[index_offset + 20] = vert_offset + 15;
	m_Prim.idxBaked[index_offset + 21] = vert_offset + 13;
	m_Prim.idxBaked[index_offset + 22] = vert_offset + 14;
	m_Prim.idxBaked[index_offset + 23] = vert_offset + 15;

	//front
	SetupVert(&m_Prim.vertsBaked[vert_offset + 16], -scale + pos.x, scale * 2.0f + pos.y, -scale + pos.z, 0.0f, 0.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 17], scale + pos.x, scale * 2.0f + pos.y, -scale + pos.z, 1.0f, 0.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 18], scale + pos.x, 0.0f + pos.y, -scale + pos.z, 1.0f, 1.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 19], -scale + pos.x, 0.0f + pos.y, -scale + pos.z, 0.0f, 1.0f);

	//AddFace( &m_Prim.vertsBaked[vert_offset + 16] );

	m_Prim.idxBaked[index_offset + 24] = vert_offset + 16;
	m_Prim.idxBaked[index_offset + 25] = vert_offset + 17;
	m_Prim.idxBaked[index_offset + 26] = vert_offset + 19;
	m_Prim.idxBaked[index_offset + 27] = vert_offset + 17;
	m_Prim.idxBaked[index_offset + 28] = vert_offset + 18;
	m_Prim.idxBaked[index_offset + 29] = vert_offset + 19;

	SetupVert(&m_Prim.vertsBaked[vert_offset + 20], -scale + pos.x, scale * 2.0f + pos.y, -scale + pos.z, 0.0f, 1.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 21], scale + pos.x, scale * 2.0f + pos.y, -scale + pos.z, 1.0f, 1.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 22], scale + pos.x, scale * 2.0f + pos.y, scale + pos.z, 1.0f, 0.0f);
	SetupVert(&m_Prim.vertsBaked[vert_offset + 23], -scale + pos.x, scale * 2.0f + pos.y, scale + pos.z, 0.0f, 0.0f);

	//AddFace( &m_Prim.vertsBaked[vert_offset + 20] );

	m_Prim.idxBaked[index_offset + 30] = vert_offset + 20;
	m_Prim.idxBaked[index_offset + 31] = vert_offset + 23;
	m_Prim.idxBaked[index_offset + 32] = vert_offset + 21;
	m_Prim.idxBaked[index_offset + 33] = vert_offset + 21;
	m_Prim.idxBaked[index_offset + 34] = vert_offset + 23;
	m_Prim.idxBaked[index_offset + 35] = vert_offset + 22;

	++m_nBoxes;
}
Esempio n. 4
0
bool CLightningFX::Render()
{
	if(!CBaseFX::Render())
		return false;
	
	// Render the bolts...

	uint32 nTris = 0;
	uint32 nVerts = 0;

	LT_POLYGT3 *pTri = g_pTris;
	LTVector *pVerts = g_pVerts;


	ILTDrawPrim *pDrawPrimLT;
	pDrawPrimLT = m_pLTClient->GetDrawPrim();

	if(!pDrawPrimLT)
		return false;

	// Draw the polylist
	pDrawPrimLT->SetTexture( m_hTexture );
	pDrawPrimLT->SetReallyClose( m_bReallyClose );
	pDrawPrimLT->SetCamera( m_hCamera );
	pDrawPrimLT->SetTransformType( DRAWPRIM_TRANSFORM_CAMERA );
	pDrawPrimLT->SetZBufferMode( DRAWPRIM_ZRO );
	pDrawPrimLT->SetFillMode( GetProps()->m_eFillMode );
	pDrawPrimLT->SetAlphaTestMode( GetProps()->m_eAlphaTest );
	pDrawPrimLT->SetAlphaBlendMode( GetProps()->m_eBlendMode );
	pDrawPrimLT->SetColorOp( GetProps()->m_eColorOp );

	pDrawPrimLT->BeginDrawPrim();

	CLinkListNode<PT_TRAIL_SECTION> *pNode = LTNULL;
	CLightningBolt *pBolt = LTNULL;
	LightningBolts::iterator iter;
	
	for( iter = m_lstBolts.begin(); iter != m_lstBolts.end(); ++iter )
	{
		pBolt = *iter;

		if( !pBolt->m_bActive )
			continue;

		pNode = pBolt->m_collPathPts.GetHead();
	
		while (pNode->m_pNext)
		{
			LTVector vStart = pNode->m_Data.m_vTran;
			LTVector vEnd   = pNode->m_pNext->m_Data.m_vTran;
		
			LTVector vBisector1 = pNode->m_Data.m_vBisector;
			LTVector vBisector2 = pNode->m_pNext->m_Data.m_vBisector;

			*pVerts ++ = vStart + vBisector1;
			*pVerts ++ = vEnd + vBisector2;
			*pVerts ++ = vEnd - vBisector2;
			*pVerts ++ = vStart - vBisector1;

			uint8 r1 = pNode->m_Data.m_red;
			uint8 g1 = pNode->m_Data.m_green;
			uint8 b1 = pNode->m_Data.m_blue;
			uint8 a1 = pNode->m_Data.m_alpha;
			
			uint8 r2 = pNode->m_pNext->m_Data.m_red;
			uint8 g2 = pNode->m_pNext->m_Data.m_green;
			uint8 b2 = pNode->m_pNext->m_Data.m_blue;
			uint8 a2 = pNode->m_pNext->m_Data.m_alpha;
			

			SetupVert(pTri, 0, g_pVerts[nVerts], r1, g1, b1, a1, 0.0f, 0.0f);
			SetupVert(pTri, 1, g_pVerts[nVerts + 1], r2, g2, b2, a2, 1.0f, 0.0f);
			SetupVert(pTri, 2, g_pVerts[nVerts + 2], r2, g2, b2, a2, 1.0f, 1.0f);

			pTri ++;
			nTris ++;

			SetupVert(pTri, 0, g_pVerts[nVerts], r1, g1, b1, a1, 0.0f, 0.0f);
			SetupVert(pTri, 1, g_pVerts[nVerts + 2], r2, g2, b2, a2, 1.0f, 1.0f);
			SetupVert(pTri, 2, g_pVerts[nVerts + 3], r1, g1, b1, a1, 0.0f, 1.0f);

			pTri ++;
			nTris ++;

			nVerts += 4;

			pNode = pNode->m_pNext;

			//see if we need to flush our buffer
			if(nTris >= MAX_BUFFER_TRIS - 2)
			{
				pDrawPrimLT->DrawPrim(g_pTris, nTris);
				nTris = 0;
				nVerts = 0;
				pTri = g_pTris;
				pVerts = g_pVerts;
			}
		}
	}

	if(nTris > 0)
	{
		pDrawPrimLT->DrawPrim(g_pTris, nTris);
	}

	pDrawPrimLT->EndDrawPrim();

	return true;
}
Esempio n. 5
0
bool CPolyTubeFX::Render()
{
	if(!CBaseFX::Render())
		return false;

	CLinkListNode<PT_TRAIL_SECTION> *pNode = m_collPathPts.GetHead();

	//make sure that we have at least one node
	if(!pNode)
		return true;

	ILTDrawPrim *pDrawPrimLT;
	pDrawPrimLT = m_pLTClient->GetDrawPrim();

	// Draw the polylist
	if( !pDrawPrimLT )
		return false;

	pDrawPrimLT->SetTexture( m_hTexture );
	pDrawPrimLT->SetReallyClose( m_bReallyClose );
	pDrawPrimLT->SetCamera( m_hCamera );
	pDrawPrimLT->SetTransformType( (GetProps()->m_eAllignment == ePTA_Camera ? DRAWPRIM_TRANSFORM_CAMERA : DRAWPRIM_TRANSFORM_WORLD) );
	pDrawPrimLT->SetZBufferMode( DRAWPRIM_ZRO );
	pDrawPrimLT->SetFillMode( GetProps()->m_eFillMode );
	pDrawPrimLT->SetAlphaTestMode( GetProps()->m_eAlphaTest );
	pDrawPrimLT->SetAlphaBlendMode( GetProps()->m_eBlendMode );
	pDrawPrimLT->SetColorOp( GetProps()->m_eColorOp );

	uint32 nTris = 0;
	uint32 nVerts = 0;

	LT_POLYGT3 *pTri = g_pTris;
	LTVector *pVerts = g_pVerts;

	pDrawPrimLT->BeginDrawPrim();

	while (pNode->m_pNext)
	{
		LTVector vStart = pNode->m_Data.m_vTran;
		LTVector vEnd   = pNode->m_pNext->m_Data.m_vTran;
	
		LTVector vBisector1 = pNode->m_Data.m_vBisector;
		LTVector vBisector2 = pNode->m_pNext->m_Data.m_vBisector;

		*pVerts ++ = vStart + vBisector1;
		*pVerts ++ = vEnd + vBisector2;
		*pVerts ++ = vEnd - vBisector2;
		*pVerts ++ = vStart - vBisector1;

		uint8 r1 = pNode->m_Data.m_red;
		uint8 g1 = pNode->m_Data.m_green;
		uint8 b1 = pNode->m_Data.m_blue;
		uint8 a1 = pNode->m_Data.m_alpha;
		float u1 = pNode->m_Data.m_uVal + m_uOffset;

		uint8 r2 = pNode->m_pNext->m_Data.m_red;
		uint8 g2 = pNode->m_pNext->m_Data.m_green;
		uint8 b2 = pNode->m_pNext->m_Data.m_blue;
		uint8 a2 = pNode->m_pNext->m_Data.m_alpha;
		float u2 = pNode->m_pNext->m_Data.m_uVal + m_uOffset;		

		SetupVert(pTri, 0, g_pVerts[nVerts], r1, g1, b1, a1, u1, 0.0f);
		SetupVert(pTri, 1, g_pVerts[nVerts + 1], r2, g2, b2, a2, u2, 0.0f);
		SetupVert(pTri, 2, g_pVerts[nVerts + 2], r2, g2, b2, a2, u2, 1.0f);

		pTri ++;
		nTris ++;

		SetupVert(pTri, 0, g_pVerts[nVerts], r1, g1, b1, a1, u1, 0.0f);
		SetupVert(pTri, 1, g_pVerts[nVerts + 2], r2, g2, b2, a2, u2, 1.0f);
		SetupVert(pTri, 2, g_pVerts[nVerts + 3], r1, g1, b1, a1, u1, 1.0f);

		pTri ++;
		nTris ++;

		nVerts += 4;

		pNode = pNode->m_pNext;

		//see if we need to flush our buffer
		if(nTris >= MAX_BUFFER_TRIS - 2)
		{
			pDrawPrimLT->DrawPrim(g_pTris, nTris);
			nTris = 0;
			nVerts = 0;
			pTri = g_pTris;
			pVerts = g_pVerts;
		}
	}


	if(nTris > 0)
	{
		pDrawPrimLT->DrawPrim(g_pTris, nTris);
	}

	pDrawPrimLT->EndDrawPrim();

	return true;
}
Esempio n. 6
0
void RenderPolyTrail(ILTClient *pClientDE, 
					 CLinkList<TRAIL_SECTION> *pList, 
					 HOBJECT hCamera, 
					 float fTrailWidth,
					 uint8 r,
					 uint8 g,
					 uint8 b,
					 uint8 a,
					 HTEXTURE hTexture,
					 uint32 dwExtraFlags)
{
	CLinkListNode<TRAIL_SECTION> *pNode = pList->GetHead();

	// Transform the path

	LTMatrix mCam = GetCamTransform(pClientDE, hCamera);

	while (pNode)
	{
		MatVMul(&pNode->m_Data.m_vTran, &mCam, &pNode->m_Data.m_vPos);	
		
		pNode = pNode->m_pNext;
	}

	// Do some precalculations

	pNode = pList->GetHead();

	float fCurU = 0.0f;
	
	while (pNode)
	{	
		LTVector vBisector;
		vBisector.z = 0.0f;

		// Compute the midpoint vectors

		if (pNode == pList->GetHead())
		{
			LTVector vStart = pNode->m_Data.m_vTran;
			LTVector vEnd   = pNode->m_pNext->m_Data.m_vTran;
			
			vBisector.x = vEnd.y - vStart.y;
			vBisector.y = -(vEnd.x - vStart.x);
		}
		else if (pNode == pList->GetTail())
		{
			LTVector vEnd   = pNode->m_Data.m_vTran;
			LTVector vStart = pNode->m_pPrev->m_Data.m_vTran;
			
			vBisector.x = vEnd.y - vStart.y;
			vBisector.y = -(vEnd.x - vStart.x);
		}
		else
		{
			LTVector vPrev  = pNode->m_pPrev->m_Data.m_vTran;
			LTVector vStart = pNode->m_Data.m_vTran;
			LTVector vEnd   = pNode->m_pNext->m_Data.m_vTran;

			float x1 = vEnd.y - vStart.y;
			float y1 = -(vEnd.x - vStart.x);

			float x2 = vStart.y - vPrev.y;
			float y2 = -(vStart.x - vPrev.x);
			
			vBisector.x = (x1 + x2) / 2.0f;
			vBisector.y = (y1 + y2) / 2.0f;
		}

		vBisector.Norm(fTrailWidth);
		pNode->m_Data.m_vBisector = vBisector;

		pNode->m_Data.m_red   = r;
		pNode->m_Data.m_green = g;
		pNode->m_Data.m_blue  = b;
		pNode->m_Data.m_alpha = a;

		pNode = pNode->m_pNext;
	}

	pNode = pList->GetHead();

	if (pList->GetSize() < 2) return;

	pNode = pList->GetHead();

	ILTDrawPrim *pDrawPrimLT;
	pDrawPrimLT = pClientDE->GetDrawPrim();

	pDrawPrimLT->SetTexture(hTexture);
	pDrawPrimLT->SetTransformType(DRAWPRIM_TRANSFORM_CAMERA);
	pDrawPrimLT->BeginDrawPrim();


	if (g_bAppFocus)
	{
		uint32 nTris = 0;
		uint32 nVerts = 0;

		LT_POLYGT3 *pTri = g_pTris;
		LTVector *pVerts = g_pVerts;

		while (pNode->m_pNext)
		{
			LTVector vStart = pNode->m_Data.m_vTran;
			LTVector vEnd   = pNode->m_pNext->m_Data.m_vTran;
		
			LTVector vBisector1 = pNode->m_Data.m_vBisector;
			LTVector vBisector2 = pNode->m_pNext->m_Data.m_vBisector;

			*pVerts ++ = vStart + vBisector1;
			*pVerts ++ = vEnd + vBisector2;
			*pVerts ++ = vEnd - vBisector2;
			*pVerts ++ = vStart - vBisector1;

			uint8 r1 = pNode->m_Data.m_red;
			uint8 g1 = pNode->m_Data.m_green;
			uint8 b1 = pNode->m_Data.m_blue;
			uint8 a1 = pNode->m_Data.m_alpha;
			float u1 = pNode->m_Data.m_uVal;

			uint8 r2 = pNode->m_pNext->m_Data.m_red;
			uint8 g2 = pNode->m_pNext->m_Data.m_green;
			uint8 b2 = pNode->m_pNext->m_Data.m_blue;
			uint8 a2 = pNode->m_pNext->m_Data.m_alpha;
			float u2 = pNode->m_pNext->m_Data.m_uVal;
			
			SetupVert(pTri, 0, g_pVerts[nVerts].x, g_pVerts[nVerts].y, g_pVerts[nVerts].z, r1, g1, b1, a1, u1, 0.0f);
			SetupVert(pTri, 1, g_pVerts[nVerts + 1].x, g_pVerts[nVerts + 1].y, g_pVerts[nVerts + 1].z, r2, g2, b2, a2, u2, 1.0f);
			SetupVert(pTri, 2, g_pVerts[nVerts + 2].x, g_pVerts[nVerts + 2].y, g_pVerts[nVerts + 2].z, r2, g2, b2, a2, u2, 1.0f);

			pTri ++;
			nTris ++;

			SetupVert(pTri, 0, g_pVerts[nVerts].x, g_pVerts[nVerts].y, g_pVerts[nVerts].z, r1, g1, b1, a1, u1, 0.0f);
			SetupVert(pTri, 1, g_pVerts[nVerts + 2].x, g_pVerts[nVerts + 2].y, g_pVerts[nVerts + 2].z, r2, g2, b2, a2, u2, 1.0f);
			SetupVert(pTri, 2, g_pVerts[nVerts + 3].x, g_pVerts[nVerts + 3].y, g_pVerts[nVerts + 3].z, r1, g1, b1, a1, u1, 0.0f);

			pTri ++;
			nTris ++;

			nVerts += 4;

			pNode = pNode->m_pNext;

			//see if we need to flush our buffer
			if(nTris >= MAX_BUFFER_TRIS - 2)
			{
				pDrawPrimLT->DrawPrim(g_pTris, nTris);
				nTris = 0;
			}
		}

		// Draw the polylist
		if(nTris > 0)
		{
			pDrawPrimLT->DrawPrim(g_pTris, nTris);
			nTris = 0;
		}
	}

	pDrawPrimLT->BeginDrawPrim();
}