void C_SteamJet::RenderParticles( CParticleRenderIterator *pIterator ) { const SteamJetParticle *pParticle = (const SteamJetParticle*)pIterator->GetFirst(); while ( pParticle ) { // Render. Vector tPos; TransformParticle(m_pParticleMgr->GetModelView(), pParticle->m_Pos, tPos); float sortKey = tPos.z; float lifetimeT = pParticle->m_Lifetime / (pParticle->m_DieTime + 0.001); float fRamp = lifetimeT * (STEAMJET_NUMRAMPS-1); int iRamp = (int)fRamp; float fraction = fRamp - iRamp; Vector vRampColor = m_Ramps[iRamp] + (m_Ramps[iRamp+1] - m_Ramps[iRamp]) * fraction; vRampColor[0] = min( 1.0f, vRampColor[0] ); vRampColor[1] = min( 1.0f, vRampColor[1] ); vRampColor[2] = min( 1.0f, vRampColor[2] ); #ifdef GE_DLL // Determine a linear alpha falloff based on our limits float alphamod = 1.0f; float fadetime = gpGlobals->curtime - m_flStartFadeTime; if ( m_bIsForExplosion && fadetime > 0 && m_flStartFadeTime > 0 ) alphamod = RemapValClamped( fadetime, 0, m_flFadeDuration, 1.0f, 0 ); float sinLifetime = sin(pParticle->m_Lifetime * 3.14159f / pParticle->m_DieTime) * alphamod; #else float sinLifetime = sin(pParticle->m_Lifetime * 3.14159f / pParticle->m_DieTime); #endif if ( m_nType == STEAM_HEATWAVE ) { RenderParticle_ColorSizePerturbNormal( pIterator->GetParticleDraw(), tPos, vRampColor, sinLifetime * (m_clrRender->a/255.0f), FLerp(m_StartSize, m_EndSize, pParticle->m_Lifetime)); } else { RenderParticle_ColorSizeAngle( pIterator->GetParticleDraw(), tPos, vRampColor, sinLifetime * (m_clrRender->a/255.0f), FLerp(pParticle->m_uchStartSize, pParticle->m_uchEndSize, pParticle->m_Lifetime), pParticle->m_flRoll ); } pParticle = (const SteamJetParticle*)pIterator->GetNext( sortKey ); } }
void C_SmokeStack::RenderParticles( CParticleRenderIterator *pIterator ) { const SmokeStackParticle *pParticle = (const SmokeStackParticle*)pIterator->GetFirst(); while ( pParticle ) { // Transform. Vector tPos; TransformParticle( m_pParticleMgr->GetModelView(), pParticle->m_Pos, tPos ); // Figure out its alpha. Squaring it after it gets halfway through its lifetime // makes it get translucent and fade out for a longer time. //float alpha = cosf( -M_PI_F + tLifetime * M_PI_F * 2.f ) * 0.5f + 0.5f; float tLifetime = pParticle->m_Lifetime * m_InvLifetime; float alpha = TableCos( -M_PI_F + tLifetime * M_PI_F * 2.f ) * 0.5f + 0.5f; if( tLifetime > 0.5f ) alpha *= alpha; m_Renderer.RenderParticle( pIterator->GetParticleDraw(), pParticle->m_Pos, tPos, alpha * m_flAlphaScale, FLerp(m_StartSize, m_EndSize, tLifetime), DEG2RAD( pParticle->m_flAngle ) ); pParticle = (const SmokeStackParticle*)pIterator->GetNext( pParticle->m_flSortPos ); } }
void CLitSmokeEmitter::RenderParticles( CParticleRenderIterator *pIterator ) { const LitSmokeParticle *pParticle = (const LitSmokeParticle*)pIterator->GetFirst(); while ( pParticle ) { float tLifetime = pParticle->m_flLifetime / pParticle->m_flDieTime; // Transform. Vector tPos; TransformParticle( ParticleMgr()->GetModelView(), pParticle->m_Pos, tPos ); float sortKey = tPos.z; float alpha255 = ( ( (float) pParticle->m_uchColor[3]/255.0f ) * sin( M_PI_F * tLifetime ) ) * 255.0f; Vector color01 = Vector( pParticle->m_uchColor[0], pParticle->m_uchColor[1], pParticle->m_uchColor[2] ) * (tLifetime / 255.0f); m_Renderer.RenderParticle_AddColor ( pIterator->GetParticleDraw(), pParticle->m_Pos, tPos, alpha255, FLerp( pParticle->m_uchStartSize, pParticle->m_uchEndSize, tLifetime ), color01 ); pParticle = (const LitSmokeParticle*)pIterator->GetNext( sortKey ); } }
void C_SteamJet::RenderParticles( CParticleRenderIterator *pIterator ) { const SteamJetParticle *pParticle = (const SteamJetParticle*)pIterator->GetFirst(); while ( pParticle ) { // Render. Vector tPos; TransformParticle(m_pParticleMgr->GetModelView(), pParticle->m_Pos, tPos); float sortKey = tPos.z; float lifetimeT = pParticle->m_Lifetime / (pParticle->m_DieTime + 0.001); float fRamp = lifetimeT * (STEAMJET_NUMRAMPS-1); int iRamp = (int)fRamp; float fraction = fRamp - iRamp; Vector vRampColor = m_Ramps[iRamp] + (m_Ramps[iRamp+1] - m_Ramps[iRamp]) * fraction; vRampColor[0] = min( 1.0f, vRampColor[0] ); vRampColor[1] = min( 1.0f, vRampColor[1] ); vRampColor[2] = min( 1.0f, vRampColor[2] ); float sinLifetime = sin(pParticle->m_Lifetime * 3.14159f / pParticle->m_DieTime); if ( m_nType == STEAM_HEATWAVE ) { RenderParticle_ColorSizePerturbNormal( pIterator->GetParticleDraw(), tPos, vRampColor, sinLifetime * (m_clrRender->a/255.0f), FLerp(m_StartSize, m_EndSize, pParticle->m_Lifetime)); } else { RenderParticle_ColorSizeAngle( pIterator->GetParticleDraw(), tPos, vRampColor, sinLifetime * (m_clrRender->a/255.0f), FLerp(pParticle->m_uchStartSize, pParticle->m_uchEndSize, pParticle->m_Lifetime), pParticle->m_flRoll ); } pParticle = (const SteamJetParticle*)pIterator->GetNext( sortKey ); } }
//----------------------------------------------------------------------------- // Purpose: Update and draw the frame //----------------------------------------------------------------------------- void VideoPanel::Paint( void ) { BaseClass::Paint(); // No video to play, so do nothing if ( m_BIKHandle == BIKHANDLE_INVALID || m_bPlaying == false ) { return; } // Update our frame if ( bik->Update( m_BIKHandle ) == false ) { if ( m_bRepeat ) { Play(); } else { OnClose(); } } // Sit in the "center" int xpos, ypos; GetPanelPos( xpos, ypos ); // Black out the background (we could omit drawing under the video surface, but this is straight-forward) if ( m_bBlackBackground ) { vgui::surface()->DrawSetColor( 0, 0, 0, 255 ); vgui::surface()->DrawFilledRect( 0, 0, GetWide(), GetTall() ); } // Draw the polys to draw this out CMatRenderContextPtr pRenderContext( materials ); pRenderContext->MatrixMode( MATERIAL_VIEW ); pRenderContext->PushMatrix(); pRenderContext->LoadIdentity(); pRenderContext->MatrixMode( MATERIAL_PROJECTION ); pRenderContext->PushMatrix(); pRenderContext->LoadIdentity(); pRenderContext->Bind( m_pMaterial, NULL ); CMeshBuilder meshBuilder; IMesh* pMesh = pRenderContext->GetDynamicMesh( true ); meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 ); float flLeftX = xpos; float flRightX = xpos + (m_nPlaybackWidth-1); float flTopY = ypos; float flBottomY = ypos + (m_nPlaybackHeight-1); // Map our UVs to cut out just the portion of the video we're interested in float flLeftU = 0.0f; float flTopV = 0.0f; // We need to subtract off a pixel to make sure we don't bleed float flRightU = m_flU - ( 1.0f / (float) m_nPlaybackWidth ); float flBottomV = m_flV - ( 1.0f / (float) m_nPlaybackHeight ); // Get the current viewport size int vx, vy, vw, vh; pRenderContext->GetViewport( vx, vy, vw, vh ); // map from screen pixel coords to -1..1 flRightX = FLerp( -1, 1, 0, vw, flRightX ); flLeftX = FLerp( -1, 1, 0, vw, flLeftX ); flTopY = FLerp( 1, -1, 0, vh ,flTopY ); flBottomY = FLerp( 1, -1, 0, vh, flBottomY ); float alpha = ((float)GetFgColor()[3]/255.0f); for ( int corner=0; corner<4; corner++ ) { bool bLeft = (corner==0) || (corner==3); meshBuilder.Position3f( (bLeft) ? flLeftX : flRightX, (corner & 2) ? flBottomY : flTopY, 0.0f ); meshBuilder.Normal3f( 0.0f, 0.0f, 1.0f ); meshBuilder.TexCoord2f( 0, (bLeft) ? flLeftU : flRightU, (corner & 2) ? flBottomV : flTopV ); meshBuilder.TangentS3f( 0.0f, 1.0f, 0.0f ); meshBuilder.TangentT3f( 1.0f, 0.0f, 0.0f ); meshBuilder.Color4f( 1.0f, 1.0f, 1.0f, alpha ); meshBuilder.AdvanceVertex(); } meshBuilder.End(); pMesh->Draw(); pRenderContext->MatrixMode( MATERIAL_VIEW ); pRenderContext->PopMatrix(); pRenderContext->MatrixMode( MATERIAL_PROJECTION ); pRenderContext->PopMatrix(); }
//----------------------------------------------------------------------------- // Purpose: Update and draw the frame //----------------------------------------------------------------------------- void VideoPlayerPanel::Paint( void ) { BaseClass::Paint(); // Get our dimensions int xpos = 0; int ypos = 0; vgui::ipanel()->GetAbsPos( GetVPanel(), xpos, ypos ); // GetPanelPos( xpos, ypos ); int width = GetWide(); int height = GetTall(); // Are we playing the video? Do we even have a video? if ( !m_VideoLoaded || !m_VideoPlaying ) { vgui::surface()->DrawSetColor( 0, 0, 0, 255 ); vgui::surface()->DrawFilledRect( 0, 0, width, height ); return; } if ( m_VideoMaterial == NULL ) return; if ( m_VideoMaterial->Update() == false ) { StopVideo(); return; } // Black out the letterbox ares if we have them if ( m_letterBox != 0 ) { vgui::surface()->DrawSetColor( 0, 0, 0, 255 ); if ( m_letterBox == 1 ) // bars on top, bottom { int excess = ( height - m_nPlaybackHeight ); int top = excess /2; int bot = excess - top; vgui::surface()->DrawFilledRect( 0, 0, width, top ); vgui::surface()->DrawFilledRect( 0, height - bot, width, height ); } if ( m_letterBox == 2 ) // bars on left, right { int excess = ( width - m_nPlaybackWidth ); int left = excess /2; int right = excess - left; vgui::surface()->DrawFilledRect( 0, 0, left, height ); vgui::surface()->DrawFilledRect( width-right, 0, width, height ); } } // Draw the polys to draw this out CMatRenderContextPtr pRenderContext( materials ); pRenderContext->MatrixMode( MATERIAL_VIEW ); pRenderContext->PushMatrix(); pRenderContext->LoadIdentity(); pRenderContext->MatrixMode( MATERIAL_PROJECTION ); pRenderContext->PushMatrix(); pRenderContext->LoadIdentity(); pRenderContext->Bind( m_pMaterial, NULL ); CMeshBuilder meshBuilder; IMesh* pMesh = pRenderContext->GetDynamicMesh( true ); meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 ); float flLeftX = xpos; float flRightX = xpos + ( m_nPlaybackWidth-1 ); float flTopY = ypos; float flBottomY = ypos + ( m_nPlaybackHeight-1 ); // Map our UVs to cut out just the portion of the video we're interested in float flLeftU = 0.0f; float flTopV = 0.0f; // We need to subtract off a pixel to make sure we don't bleed float flRightU = m_flU - ( 1.0f / (float) m_nPlaybackWidth ); float flBottomV = m_flV - ( 1.0f / (float) m_nPlaybackHeight ); // Get the current viewport size int vx, vy, vw, vh; pRenderContext->GetViewport( vx, vy, vw, vh ); // map from screen pixel coords to -1..1 flRightX = FLerp( -1, 1, 0, vw, flRightX ); flLeftX = FLerp( -1, 1, 0, vw, flLeftX ); flTopY = FLerp( 1, -1, 0, vh ,flTopY ); flBottomY = FLerp( 1, -1, 0, vh, flBottomY ); float alpha = ((float)GetFgColor()[3]/255.0f); for ( int corner=0; corner<4; corner++ ) { bool bLeft = (corner==0) || (corner==3); meshBuilder.Position3f( (bLeft) ? flLeftX : flRightX, (corner & 2) ? flBottomY : flTopY, 0.0f ); meshBuilder.Normal3f( 0.0f, 0.0f, 1.0f ); meshBuilder.TexCoord2f( 0, (bLeft) ? flLeftU : flRightU, (corner & 2) ? flBottomV : flTopV ); meshBuilder.TangentS3f( 0.0f, 1.0f, 0.0f ); meshBuilder.TangentT3f( 1.0f, 0.0f, 0.0f ); meshBuilder.Color4f( 1.0f, 1.0f, 1.0f, alpha ); meshBuilder.AdvanceVertex(); } meshBuilder.End(); pMesh->Draw(); pRenderContext->MatrixMode( MATERIAL_VIEW ); pRenderContext->PopMatrix(); pRenderContext->MatrixMode( MATERIAL_PROJECTION ); pRenderContext->PopMatrix(); }