void CSmokeTrailPainter::Paint (CG16bitImage &Dest, int x, int y, SViewportPaintCtx &Ctx) // Paint // // Paint { int iParticleLifetime = m_pCreator->GetParticleLifetimeMax(); // Particles move the opposite direction from the shot int iTrailDirection = (Ctx.iRotation + m_pCreator->GetRotation()) % 360; // If we haven't created any particles yet, do it now if (m_iLastDirection == -1) { CreateNewParticles(m_pCreator->GetNewParticleCount(), iTrailDirection); } // Paint with the painter if (m_pParticlePainter) { // If we can get a paint descriptor, use that because it is faster SParticlePaintDesc Desc; if (m_pParticlePainter->GetParticlePaintDesc(&Desc)) { Desc.iMaxLifetime = iParticleLifetime; m_Particles.Paint(Dest, x, y, Ctx, Desc); } // Otherwise, we use the painter for each particle else m_Particles.Paint(Dest, x, y, Ctx, m_pParticlePainter); } // Update m_iLastDirection = iTrailDirection; }
void CParticleJetEffectPainter::Paint (CG32bitImage &Dest, int x, int y, SViewportPaintCtx &Ctx) // Paint // // Paint the effect { int iParticleLifetime = m_ParticleLifetime.GetMaxValue(); // Particles move the opposite direction from the shot int iTrailDirection = Ctx.iRotation; // If we're using the object center then we paint at the object center. // Otherwise we paint at the given position. int xPaint; int yPaint; if (m_bUseObjectCenter) { if (Ctx.pObj) Ctx.XForm.Transform(Ctx.pObj->GetPos(), &xPaint, &yPaint); else { // If we don't have an object then we use the viewport center. This // handles the case where we paint in TransData (where there is // no object). xPaint = Ctx.xCenter; yPaint = Ctx.yCenter; } } else { xPaint = x; yPaint = y; } // If we haven't created any particles yet, do it now if (m_iCurDirection == -1 && !Ctx.bFade) { m_iLastDirection = iTrailDirection; m_iCurDirection = iTrailDirection; // Figure out the position where we create particles CVector vPos; // If we're using the object center then it means that x,y is where // we emit particles from. We need to convert from screen coordinates // to object-relative coordinates. if (m_bUseObjectCenter) vPos = CVector((x - xPaint) * g_KlicksPerPixel, (yPaint - y) * g_KlicksPerPixel); // Initialize last emit position m_vLastEmitPos = (m_bUseObjectMotion && Ctx.pObj ? Ctx.pObj->GetPos() + vPos : vPos); // Create particles CreateNewParticles(Ctx.pObj, m_EmitRate.Roll(), vPos, CalcInitialVel(Ctx.pObj)); } // Paint with the painter if (m_pParticlePainter) { // If we can get a paint descriptor, use that because it is faster SParticlePaintDesc Desc; if (m_pParticlePainter->GetParticlePaintDesc(&Desc)) { Desc.iMaxLifetime = iParticleLifetime; m_Particles.Paint(Dest, xPaint, yPaint, Ctx, Desc); } // Otherwise, we use the painter for each particle else m_Particles.Paint(Dest, xPaint, yPaint, Ctx, m_pParticlePainter); } // Update m_iCurDirection = iTrailDirection; }