//----------------------------------------------------------------------------- // Purpose: // Input : pRender - //----------------------------------------------------------------------------- void CMapLine::Render3D(CRender3D *pRender) { if ( (m_pStartEntity == NULL) || (m_pEndEntity == NULL) ) return; pRender->BeginRenderHitTarget(this); pRender->PushRenderMode(RENDER_MODE_WIREFRAME); Vector Start, End; m_pStartEntity->GetOrigin(Start); m_pEndEntity->GetOrigin(End); CMeshBuilder meshBuilder; CMatRenderContextPtr pRenderContext( MaterialSystemInterface() ); IMesh* pMesh = pRenderContext->GetDynamicMesh(); // FIXME: Can't do this...! glLineWidth(2); meshBuilder.Begin( pMesh, MATERIAL_LINES, 1 ); unsigned char color[3]; if (IsSelected()) { color[0] = SELECT_EDGE_RED; color[1] = SELECT_EDGE_GREEN; color[2] = SELECT_EDGE_BLUE; } else { color[0] = r; color[1] = g; color[2] = b; } meshBuilder.Color3ubv( color ); meshBuilder.Position3f(Start.x, Start.y, Start.z); meshBuilder.AdvanceVertex(); meshBuilder.Color3ubv( color ); meshBuilder.Position3f(End.x, End.y, End.z); meshBuilder.AdvanceVertex(); meshBuilder.End(); pMesh->Draw(); pRender->EndRenderHitTarget(); pRender->PopRenderMode(); }
//----------------------------------------------------------------------------- // Purpose: Renders us in the 3D view. // Input : pRender - Interface to use for rendering. //----------------------------------------------------------------------------- void CMapSideList::Render3D(CRender3D *pRender) { if (Parent->IsSelected()) { // // Draw lines from us to the center of all faces in the list. // pRender->SetRenderMode(RENDER_MODE_WIREFRAME); CMeshBuilder meshBuilder; IMesh *pMesh = MaterialSystemInterface()->GetDynamicMesh(); meshBuilder.Begin(pMesh, MATERIAL_LINES, m_Faces.Count()); for (int i = 0; i < m_Faces.Count(); i++) { CMapFace *pFace = m_Faces.Element(i); Vector Center; pFace->GetCenter(Center); unsigned char color[3]; color[0] = SELECT_EDGE_RED; color[1] = SELECT_EDGE_GREEN; color[2] = SELECT_EDGE_BLUE; meshBuilder.Color3ubv( color ); meshBuilder.Position3f(m_Origin.x, m_Origin.y, m_Origin.z); meshBuilder.AdvanceVertex(); meshBuilder.Color3ubv( color ); meshBuilder.Position3f(Center.x, Center.y, Center.z); meshBuilder.AdvanceVertex(); } meshBuilder.End(); pMesh->Draw(); } }
//----------------------------------------------------------------------------- // Draws shield decals //----------------------------------------------------------------------------- void C_Shield::DrawShieldDecals( Vector* pt, bool hitDecals ) { if (m_Decals.Size() == 0) return; // Compute ripples: for ( int r = m_Decals.Size(); --r >= 0; ) { // At the moment, nothing passes! bool passDecal = false; if ((!hitDecals) && (passDecal == hitDecals)) continue; SetCurrentDecal( r ); // We have to force a flush here because we're changing the proxy state if (!hitDecals) materials->Bind( m_pPassDecal, (IClientRenderable*)this ); else materials->Bind( passDecal ? m_pPassDecal2 : m_pHitDecal, (IClientRenderable*)this ); float dtime = gpGlobals->curtime - m_Decals[r].m_StartTime; float decay = exp( -( 2 * dtime) ); // Retire the animation if it wraps // This gets set by TextureAnimatedWrapped above if ((m_Decals[r].m_StartTime < 0.0f) || (decay < 1e-3)) { m_Decals.Remove(r); continue; } IMesh* pMesh = materials->GetDynamicMesh(); // Figure out the quads we must mod2x.... float u0 = m_Decals[r].m_RippleU - m_Decals[r].m_Radius; float u1 = m_Decals[r].m_RippleU + m_Decals[r].m_Radius; float v0 = m_Decals[r].m_RippleV - m_Decals[r].m_Radius; float v1 = m_Decals[r].m_RippleV + m_Decals[r].m_Radius; float du = u1 - u0; float dv = v1 - v0; int i0 = Floor2Int( v0 * (m_SubdivisionCount - 1) ); int i1 = Ceil2Int( v1 * (m_SubdivisionCount - 1) ); int j0 = Floor2Int( u0 * (m_SubdivisionCount - 1) ); int j1 = Ceil2Int( u1 * (m_SubdivisionCount - 1) ); if (i0 < 0) i0 = 0; if (i1 >= m_SubdivisionCount) i1 = m_SubdivisionCount - 1; if (j0 < 0) j0 = 0; if (j1 >= m_SubdivisionCount) j1 = m_SubdivisionCount - 1; int numTriangles = (i1 - i0) * (j1 - j0) * 2; CMeshBuilder meshBuilder; meshBuilder.Begin( pMesh, MATERIAL_TRIANGLES, numTriangles ); float decalDu = m_InvSubdivisionCount / du; float decalDv = m_InvSubdivisionCount / dv; unsigned char color[3]; color[0] = s_ImpactDecalColor[0] * decay; color[1] = s_ImpactDecalColor[1] * decay; color[2] = s_ImpactDecalColor[2] * decay; for ( int i = i0; i < i1; ++i) { float t = (float)i * m_InvSubdivisionCount; for (int j = j0; j < j1; ++j) { float s = (float)j * m_InvSubdivisionCount; int idx = i * m_SubdivisionCount + j; // Compute (u,v) into the decal float decalU = (s - u0) / du; float decalV = (t - v0) / dv; meshBuilder.Position3fv( pt[idx].Base() ); meshBuilder.Color3ubv( color ); meshBuilder.TexCoord2f( 0, decalU, decalV ); meshBuilder.AdvanceVertex(); meshBuilder.Position3fv( pt[idx + m_SubdivisionCount].Base() ); meshBuilder.Color3ubv( color ); meshBuilder.TexCoord2f( 0, decalU, decalV + decalDv ); meshBuilder.AdvanceVertex(); meshBuilder.Position3fv( pt[idx + 1].Base() ); meshBuilder.Color3ubv( color ); meshBuilder.TexCoord2f( 0, decalU + decalDu, decalV ); meshBuilder.AdvanceVertex(); meshBuilder.Position3fv( pt[idx + 1].Base() ); meshBuilder.Color3ubv( color ); meshBuilder.TexCoord2f( 0, decalU + decalDu, decalV ); meshBuilder.AdvanceVertex(); meshBuilder.Position3fv( pt[idx + m_SubdivisionCount].Base() ); meshBuilder.Color3ubv( color ); meshBuilder.TexCoord2f( 0, decalU, decalV + decalDv ); meshBuilder.AdvanceVertex(); meshBuilder.Position3fv( pt[idx + m_SubdivisionCount + 1].Base() ); meshBuilder.Color3ubv( color ); meshBuilder.TexCoord2f( 0, decalU + decalDu, decalV + decalDv ); meshBuilder.AdvanceVertex(); } } meshBuilder.End(); pMesh->Draw(); } }