protected virtual void AdvanceParticle(ParticleVO aParticle, float passedTime) { PDParticle particle = aParticle as PDParticle; float restTime = particle.totalTime - particle.currentTime; passedTime = restTime > passedTime ? passedTime : restTime; particle.currentTime += passedTime; if (m_particleConfigVO.emitterType == EmitterType.RADIAL) { particle.emitRotation += particle.emitRotationDelta * passedTime; particle.emitRadius += particle.emitRadiusDelta * passedTime; particle.x = emitterX - Mathf.Cos(particle.emitRotation) * particle.emitRadius; particle.y = emitterY - Mathf.Sin(particle.emitRotation) * particle.emitRadius; } else { float distanceX = particle.x - particle.startX; float distanceY = particle.y - particle.startY; float distanceScalar = Mathf.Sqrt(distanceX * distanceX + distanceY * distanceY); if (distanceScalar < 0.01f) { distanceScalar = 0.01f; } float radialX = distanceX / distanceScalar; float radialY = distanceY / distanceScalar; float tangentialX = radialX; float tangentialY = radialY; radialX *= particle.radialAcceleration; radialY *= particle.radialAcceleration; float newY = tangentialX; tangentialX = -tangentialY * particle.tangentialAcceleration; tangentialY = newY * particle.tangentialAcceleration; particle.velocityX += passedTime * (m_particleConfigVO.gravityX + radialX + tangentialX); particle.velocityY += passedTime * (m_particleConfigVO.gravityY + radialY + tangentialY); particle.x += particle.velocityX * passedTime; particle.y += particle.velocityY * passedTime; } particle.scale += particle.scaleDelta * passedTime; particle.rotation += particle.rotationDelta * passedTime; particle.colorArgb.r += particle.colorArgbDelta.r * passedTime; particle.colorArgb.g += particle.colorArgbDelta.g * passedTime; particle.colorArgb.b += particle.colorArgbDelta.b * passedTime; particle.colorArgb.a += particle.colorArgbDelta.a * passedTime; particle.color = particle.colorArgb; }
protected virtual void InitParticle(ParticleVO aParticle) { PDParticle particle = aParticle as PDParticle; // for performance reasons, the random variances are calculated inline instead // of calling a function float lifespan = m_particleConfigVO.lifespan + m_particleConfigVO.lifespanVariance * (Random.value * 2.0f - 1.0f); particle.currentTime = 0.0f; particle.totalTime = lifespan > 0.0f ? lifespan : 0.0f; if (lifespan <= 0.0f) { return; } float emitterX = this.emitterX; float emitterY = this.emitterY; if (m_transform != null && (simulationSpace == Space.World && m_particleConfigVO.emitterType != EmitterType.RADIAL)) { Vector2 help = m_transform.InverseTransformPoint(emitterX, emitterY, 0); emitterX = -help.x; emitterY = -help.y; } particle.x = emitterX + m_particleConfigVO.emitterXVariance * (Random.value * 2.0f - 1.0f); particle.y = emitterY + m_particleConfigVO.emitterYVariance * (Random.value * 2.0f - 1.0f); particle.startX = emitterX; particle.startY = emitterY; float angle = m_particleConfigVO.emitAngle + m_particleConfigVO.emitAngleVariance * (Random.value * 2.0f - 1.0f); float speed = m_particleConfigVO.speed + m_particleConfigVO.speedVariance * (Random.value * 2.0f - 1.0f); particle.velocityX = speed * Mathf.Cos(angle); particle.velocityY = speed * Mathf.Sin(angle); float startRadius = m_particleConfigVO.maxRadius + m_particleConfigVO.maxRadiusVariance * (Random.value * 2.0f - 1.0f); float endRadius = m_particleConfigVO.minRadius + m_particleConfigVO.minRadiusVariance * (Random.value * 2.0f - 1.0f); particle.emitRadius = startRadius; particle.emitRadiusDelta = (endRadius - startRadius) / lifespan; particle.emitRotation = m_particleConfigVO.emitAngle + m_particleConfigVO.emitAngleVariance * (Random.value * 2.0f - 1.0f); particle.emitRotationDelta = m_particleConfigVO.rotatePerSecond + m_particleConfigVO.rotatePerSecondVariance * (Random.value * 2.0f - 1.0f); particle.radialAcceleration = m_particleConfigVO.radialAcceleration + m_particleConfigVO.radialAccelerationVariance * (Random.value * 2.0f - 1.0f); particle.tangentialAcceleration = m_particleConfigVO.tangentialAcceleration + m_particleConfigVO.tangentialAccelerationVariance * (Random.value * 2.0f - 1.0f); float startSize = m_particleConfigVO.startSize + m_particleConfigVO.startSizeVariance * (Random.value * 2.0f - 1.0f); float endSize = m_particleConfigVO.endSize + m_particleConfigVO.endSizeVariance * (Random.value * 2.0f - 1.0f); if (startSize < 0.1f) { startSize = 0.1f; } if (endSize < 0.1f) { endSize = 0.1f; } if (m_particleConfigVO != null && m_particleConfigVO.texture != null) { particle.scale = startSize / textureWidth; particle.scaleDelta = ((endSize - startSize) / lifespan) / textureWidth; } else { particle.scale = 1f; particle.scaleDelta = 0f; } // colors Color startColor = particle.colorArgb; Color colorDelta = particle.colorArgbDelta; startColor.r = m_particleConfigVO.startColor.r; startColor.g = m_particleConfigVO.startColor.g; startColor.b = m_particleConfigVO.startColor.b; startColor.a = m_particleConfigVO.startColor.a; if (m_particleConfigVO.startColorVariance.r != 0) { startColor.r += m_particleConfigVO.startColorVariance.r * (Random.value * 2.0f - 1.0f); } if (m_particleConfigVO.startColorVariance.g != 0) { startColor.g += m_particleConfigVO.startColorVariance.g * (Random.value * 2.0f - 1.0f); } if (m_particleConfigVO.startColorVariance.b != 0) { startColor.b += m_particleConfigVO.startColorVariance.b * (Random.value * 2.0f - 1.0f); } if (m_particleConfigVO.startColorVariance.a != 0) { startColor.a += m_particleConfigVO.startColorVariance.a * (Random.value * 2.0f - 1.0f); } particle.colorArgb = startColor; float endColorRed = m_particleConfigVO.endColor.r; float endColorGreen = m_particleConfigVO.endColor.g; float endColorBlue = m_particleConfigVO.endColor.b; float endColorAlpha = m_particleConfigVO.endColor.a; if (m_particleConfigVO.endColorVariance.r != 0) { endColorRed += m_particleConfigVO.endColorVariance.r * (Random.value * 2.0f - 1.0f); } if (m_particleConfigVO.endColorVariance.g != 0) { endColorGreen += m_particleConfigVO.endColorVariance.g * (Random.value * 2.0f - 1.0f); } if (m_particleConfigVO.endColorVariance.b != 0) { endColorBlue += m_particleConfigVO.endColorVariance.b * (Random.value * 2.0f - 1.0f); } if (m_particleConfigVO.endColorVariance.a != 0) { endColorAlpha += m_particleConfigVO.endColorVariance.a * (Random.value * 2.0f - 1.0f); } colorDelta.r = (endColorRed - startColor.r) / lifespan; colorDelta.g = (endColorGreen - startColor.g) / lifespan; colorDelta.b = (endColorBlue - startColor.b) / lifespan; colorDelta.a = (endColorAlpha - startColor.a) / lifespan; particle.colorArgbDelta = colorDelta; // rotation float startRotation = m_particleConfigVO.startRotation + m_particleConfigVO.startRotationVariance * (Random.value * 2.0f - 1.0f); float endRotation = m_particleConfigVO.endRotation + m_particleConfigVO.endRotationVariance * (Random.value * 2.0f - 1.0f); particle.rotation = startRotation; if (m_particleConfigVO.enableEndRotation) { particle.rotationDelta = (endRotation - startRotation) / lifespan; } else { particle.rotationDelta = 0f; } }