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; }
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; }
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; }
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; }
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; }
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(); }