ALERROR IEffectPainter::ValidateClass (SLoadCtx &Ctx, const CString &sOriginalClass) // ValidateClass // // Reads the class string. If the class does not match the current painter, // we read the old data and return ERR_FAIL. { if (Ctx.dwVersion >= 40) { CString sClass; sClass.ReadFromStream(Ctx.pStream); // If the original class doesn't match the current one, then it means // that the design changed. In that case, we load the painter using the // old class. if (!strEquals(sClass, sOriginalClass)) { // If sClass is blank, then it means that the original did not have // an effect painter (but the current design does) if (!sClass.IsBlank()) { // Get the original creator CEffectCreator *pOriginalCreator; if (CEffectCreator::CreateFromTag(sClass, &pOriginalCreator) != NOERROR) { kernelDebugLogMessage("Unable to find original effect creator: %s", sClass.GetASCIIZPointer()); return ERR_FAIL; } // Load the original painter IEffectPainter *pOriginalPainter = pOriginalCreator->CreatePainter(); pOriginalPainter->ReadFromStream(Ctx); // Discard pOriginalPainter->Delete(); delete pOriginalCreator; } // Done return ERR_FAIL; } } return NOERROR; }
void CSmokeTrailPainter::OnReadFromStream (SLoadCtx &Ctx) // OnReadFromStream // // Load from stream { m_Particles.ReadFromStream(Ctx); Ctx.pStream->Read((char *)&m_iLastDirection, sizeof(DWORD)); Ctx.pStream->Read((char *)&m_iEmitLifetime, sizeof(DWORD)); Ctx.pStream->Read((char *)&m_iTick, sizeof(DWORD)); if (m_pParticlePainter) m_pParticlePainter->Delete(); m_pParticlePainter = CEffectCreator::CreatePainterFromStreamAndCreator(Ctx, m_pCreator->GetParticleEffect()); }
void CEffectEntry::GetImage (const CCompositeImageSelector &Selector, CObjectImageArray *retImage) // GetImage // // Fills in the image { // Short circuit if (m_pEffect.IsEmpty()) { *retImage = EMPTY_IMAGE; return; } // Create a painter CCreatePainterCtx Ctx; IEffectPainter *pPainter = m_pEffect->CreatePainter(Ctx); if (pPainter == NULL) { *retImage = EMPTY_IMAGE; return; } // Get the painter bounds RECT rcBounds; pPainter->GetBounds(&rcBounds); int cxWidth = RectWidth(rcBounds); int cyHeight = RectHeight(rcBounds); // Manual compositing bool bCanComposite = pPainter->CanPaintComposite(); // Create a resulting image CG32bitImage *pDest = new CG32bitImage; pDest->Create(cxWidth, cyHeight, CG32bitImage::alpha8, (bCanComposite ? CG32bitPixel::Null() : CG32bitPixel(0))); // Set up paint context SViewportPaintCtx PaintCtx; // Since we don't have an object, we use the viewport center to indicate // the center of the object. PaintCtx.xCenter = -rcBounds.left; PaintCtx.yCenter = -rcBounds.top; // Paint pPainter->PaintComposite(*pDest, (cxWidth / 2), (cyHeight / 2), PaintCtx); // Initialize an image RECT rcFinalRect; rcFinalRect.left = 0; rcFinalRect.top = 0; rcFinalRect.right = cxWidth; rcFinalRect.bottom = cyHeight; CObjectImageArray Comp; Comp.Init(pDest, rcFinalRect, 0, 0, true); // Done retImage->TakeHandoff(Comp); pPainter->Delete(); }