HRESULT CPartEmitter::AddForce(char *Name, CPartForce::TForceType Type, int PosX, int PosY, float Angle, float Strength) { CPartForce *Force = AddForceByName(Name); if (!Force) return E_FAIL; Force->m_Type = Type; Force->m_Pos = Vector2(PosX, PosY); Force->m_Direction = Vector2(0, Strength); Matrix4 MatRot; MatRot.RotationZ(DegToRad(CBUtils::NormalizeAngle(Angle - 180))); MatRot.TransformVector2(Force->m_Direction); return S_OK; }
HRESULT CPartEmitter::InitParticle(CPartParticle* Particle, DWORD CurrentTime, DWORD TimerDelta) { if(!Particle) return E_FAIL; if(m_Sprites.GetSize()==0) return E_FAIL; int PosX = CBUtils::RandomInt(m_PosX, m_PosX + m_Width); int PosY = CBUtils::RandomInt(m_PosY, m_PosY + m_Height); float PosZ = CBUtils::RandomFloat(0.0f, 100.0f); float Velocity; if(m_VelocityZBased) Velocity = m_Velocity1 + PosZ * (m_Velocity2 - m_Velocity1) / 100; else Velocity = CBUtils::RandomFloat(m_Velocity1, m_Velocity2); float Scale; if(m_ScaleZBased) Scale = m_Scale1 + PosZ * (m_Scale2 - m_Scale1) / 100; else Scale = CBUtils::RandomFloat(m_Scale1, m_Scale2); int LifeTime; if(m_LifeTimeZBased) LifeTime = m_LifeTime2 - PosZ * (m_LifeTime2 - m_LifeTime1) / 100; else LifeTime = CBUtils::RandomInt(m_LifeTime1, m_LifeTime2); float Angle = CBUtils::RandomAngle(m_Angle1, m_Angle2); int SpriteIndex = CBUtils::RandomInt(0, m_Sprites.GetSize() - 1); float Rotation = CBUtils::RandomAngle(m_Rotation1, m_Rotation2); float AngVelocity = CBUtils::RandomFloat(m_AngVelocity1, m_AngVelocity2); float GrowthRate = CBUtils::RandomFloat(m_GrowthRate1, m_GrowthRate2); if(!CBPlatform::IsRectEmpty(&m_Border)) { int ThicknessLeft = m_BorderThicknessLeft - (float)m_BorderThicknessLeft * PosZ / 100.0f; int ThicknessRight = m_BorderThicknessRight - (float)m_BorderThicknessRight * PosZ / 100.0f; int ThicknessTop = m_BorderThicknessTop - (float)m_BorderThicknessTop * PosZ / 100.0f; int ThicknessBottom = m_BorderThicknessBottom - (float)m_BorderThicknessBottom * PosZ / 100.0f; Particle->m_Border = m_Border; Particle->m_Border.left += ThicknessLeft; Particle->m_Border.right -= ThicknessRight; Particle->m_Border.top += ThicknessTop; Particle->m_Border.bottom -= ThicknessBottom; } Vector2 VecPos((float)PosX, (float)PosY); Vector2 VecVel(0, Velocity); Matrix4 MatRot; MatRot.RotationZ(DegToRad(CBUtils::NormalizeAngle(Angle - 180))); MatRot.TransformVector2(VecVel); if(m_AlphaTimeBased) { Particle->m_Alpha1 = m_Alpha1; Particle->m_Alpha2 = m_Alpha2; } else { int Alpha = CBUtils::RandomInt(m_Alpha1, m_Alpha2); Particle->m_Alpha1 = Alpha; Particle->m_Alpha2 = Alpha; } Particle->m_CreationTime = CurrentTime; Particle->m_Pos = VecPos; Particle->m_PosZ = PosZ; Particle->m_Velocity = VecVel; Particle->m_Scale = Scale; Particle->m_LifeTime = LifeTime; Particle->m_Rotation = Rotation; Particle->m_AngVelocity = AngVelocity; Particle->m_GrowthRate = GrowthRate; Particle->m_ExponentialGrowth = m_ExponentialGrowth; Particle->m_IsDead = FAILED(Particle->SetSprite(m_Sprites[SpriteIndex])); Particle->FadeIn(CurrentTime, m_FadeInTime); if(Particle->m_IsDead) return E_FAIL; else return S_OK; }