void CMoltenBoltEffectCreator::Paint (CG16bitImage &Dest, int x, int y, SViewportPaintCtx &Ctx) // Paint // // Paint effect { // Compute the length of the bolt based on the time int iLength = m_iLength + (m_iGrowth * (Min(8, Ctx.iTick))); // Create the outer shape SPoint Poly[SHAPE_COUNT]; CreateBoltShape(Ctx.iRotation, iLength, m_iWidth, Poly); // Paint CG16bitRegion Region; WORD wColor = CG16bitImage::BlendPixel(Ctx.wSpaceColor, m_wSecondaryColor, 200); Region.CreateFromConvexPolygon(SHAPE_COUNT, Poly); Region.Fill(Dest, x, y, wColor); // Create the inner shape CreateBoltShape(Ctx.iRotation, Max(16, iLength * 7 / 8), Max(2, m_iWidth * 7 / 8), Poly); // Paint Region.CreateFromConvexPolygon(SHAPE_COUNT, Poly); Region.Fill(Dest, x, y, m_wPrimaryColor); }
void CBeamEffectCreator::DrawBeamHeavyBlaster (CG16bitImage &Dest, SLineDesc &Line, SViewportPaintCtx &Ctx) // DrawBeamHeavyBlaster // // Draws the appropriate beam { // Convert to an angle relative to xTo, yTo CVector vVec(Line.xFrom - Line.xTo, Line.yFrom - Line.yTo); Metric rRadius; int iAngle = VectorToPolar(vVec, &rRadius); int iRadius = (int)rRadius; // Can't deal with 0 sized lines if (iRadius == 0) return; CG16bitRegion Region; SPoint Poly[8]; // Compute some metrics int iLengthUnit = iRadius * (10 + m_iIntensity) / 40; int iWidthUnit = Max(1, iRadius * m_iIntensity / 60); // Paint the outer-most glow WORD wColor = CG16bitImage::BlendPixel(Ctx.wSpaceColor, m_wSecondaryColor, 100); CreateBlasterShape(iAngle, 4 * iLengthUnit, 3 * iWidthUnit / 2, Poly); Region.CreateFromConvexPolygon(8, Poly); Region.Fill(Dest, Line.xTo, Line.yTo, wColor); // Paint the inner transition wColor = CG16bitImage::BlendPixel(m_wSecondaryColor, m_wPrimaryColor, 128); wColor = CG16bitImage::BlendPixel(Ctx.wSpaceColor, wColor, 200); CreateBlasterShape(iAngle, 3 * iLengthUnit, iWidthUnit, Poly); Region.CreateFromConvexPolygon(8, Poly); Region.Fill(Dest, Line.xTo, Line.yTo, wColor); // Paint the inner core CreateBlasterShape(iAngle, iLengthUnit, iWidthUnit - 1, Poly); Region.CreateFromConvexPolygon(8, Poly); Region.Fill(Dest, Line.xTo, Line.yTo, m_wPrimaryColor); }
void CBeamEffectCreator::DrawBeamLightning (CG16bitImage &Dest, SLineDesc &Line, SViewportPaintCtx &Ctx) // DrawBeamLightning // // Draws the appropriate beam { // The central part of the beam is different depending on the // intensity. if (m_iIntensity < 4) { WORD wStart = CG16bitImage::BlendPixel(Ctx.wSpaceColor, m_wPrimaryColor, 128); Dest.DrawBiColorLine(Line.xFrom, Line.yFrom, Line.xTo, Line.yTo, 3, Ctx.wSpaceColor, wStart); WORD wEnd = CG16bitImage::BlendPixel(Ctx.wSpaceColor, m_wPrimaryColor, 155); Dest.DrawBiColorLine(Line.xFrom, Line.yFrom, Line.xTo, Line.yTo, 1, wEnd, m_wPrimaryColor); } else if (m_iIntensity < 10) { WORD wStart = CG16bitImage::BlendPixel(Ctx.wSpaceColor, m_wSecondaryColor, 155); Dest.DrawBiColorLine(Line.xFrom, Line.yFrom, Line.xTo, Line.yTo, 5, Ctx.wSpaceColor, wStart); Dest.DrawBiColorLine(Line.xFrom, Line.yFrom, Line.xTo, Line.yTo, 3, Ctx.wSpaceColor, m_wSecondaryColor); WORD wEnd = CG16bitImage::BlendPixel(Ctx.wSpaceColor, m_wPrimaryColor, 155); Dest.DrawBiColorLine(Line.xFrom, Line.yFrom, Line.xTo, Line.yTo, 1, wEnd, m_wPrimaryColor); } else { // Convert to an angle relative to xTo, yTo CVector vVec(Line.xFrom - Line.xTo, Line.yFrom - Line.yTo); Metric rRadius; int iAngle = VectorToPolar(vVec, &rRadius); int iRadius = (int)rRadius; // Can't deal with 0 sized lines if (iRadius == 0) return; CG16bitRegion Region; SPoint Poly[8]; // Paint the outer-most glow WORD wColor = CG16bitImage::BlendPixel(Ctx.wSpaceColor, m_wSecondaryColor, 100); CreateBlasterShape(iAngle, iRadius, iRadius / 6, Poly); Region.CreateFromConvexPolygon(8, Poly); Region.Fill(Dest, Line.xTo, Line.yTo, wColor); // Paint the inner transition wColor = CG16bitImage::BlendPixel(m_wSecondaryColor, m_wPrimaryColor, 128); wColor = CG16bitImage::BlendPixel(Ctx.wSpaceColor, wColor, 200); CreateBlasterShape(iAngle, iRadius * 2 / 3, iRadius / 7, Poly); Region.CreateFromConvexPolygon(8, Poly); Region.Fill(Dest, Line.xTo, Line.yTo, wColor); // Paint the inner core CreateBlasterShape(iAngle, iRadius / 2, iRadius / 8, Poly); Region.CreateFromConvexPolygon(8, Poly); Region.Fill(Dest, Line.xTo, Line.yTo, m_wPrimaryColor); } // Compute the half-way point int xHalf = (Line.xFrom + Line.xTo) / 2; int yHalf = (Line.yFrom + Line.yTo) / 2; // Draw lightning int iCount = m_iIntensity + mathRandom(0, 2); for (int j = 0; j < iCount; j++) if (mathRandom(1, 2) == 1) DrawLightning(Dest, xHalf, yHalf, Line.xTo, Line.yTo, m_wPrimaryColor, LIGHTNING_POINT_COUNT, 0.5); else DrawLightning(Dest, Line.xFrom, Line.yFrom, Line.xTo, Line.yTo, m_wSecondaryColor, LIGHTNING_POINT_COUNT, 0.3); }
void CFlarePainter::Paint (CG16bitImage &Dest, int x, int y, SViewportPaintCtx &Ctx) // Paint // // Paint { int i; COLORREF wPrimaryColor = m_pCreator->GetPrimaryColor(); switch (m_pCreator->GetStyle()) { case CFlareEffectCreator::styleFadingBlast: { // Radius shrinks proportionally each tick int iRadius; if (m_iTick < m_pCreator->GetLifetime()) iRadius = (int)(m_pCreator->GetRadius() * ((Metric)(m_pCreator->GetLifetime() - m_iTick) / (Metric)m_pCreator->GetLifetime())); else iRadius = 0; // Paint if (iRadius) { // Paint each of the spikes first int iAngle = 360 / MAIN_SPIKE_COUNT; for (i = 0; i < MAIN_SPIKE_COUNT; i++) { SPoint Spike[4]; m_pCreator->CreateFlareSpike(i * iAngle, iRadius, iRadius / MAIN_SPIKE_WIDTH_RATIO, Spike); CG16bitRegion Region; Region.CreateFromConvexPolygon(4, Spike); Region.FillTrans(Dest, x, y, wPrimaryColor, 128); } // Paint central glow #if 0 DrawAlphaGradientCircle(Dest, x, y, iRadius / 8, wPrimaryColor); #endif // Paint the extended glow DrawAlphaGradientCircle(Dest, x, y, iRadius, wPrimaryColor); } break; } } }