$init method

void $init(
  1. GSimpleParticleSystem emitter, [
  2. bool invalidate = true
])

(Internal usage)

Initializes the particle with the given emitter.

This method is called by the GSimpleParticleSystem to initialize the particle with the emitter's properties. It calculates the particle's initial and end scales, velocities, accelerations, colors, and energy based on the emitter's properties and random variance.

The emitter parameter is the emitter that the particle belongs to.

The invalidate parameter is not used in the GSimpleParticle class.

Implementation

void $init(GSimpleParticleSystem emitter, [bool invalidate = true]) {
  accumulatedEnergy = 0;
  texture = emitter.texture;
  var ratioEnergy = 1000;
  energy = emitter.energy * ratioEnergy;
  if (emitter.energyVariance > 0) {
    energy += (emitter.energyVariance * ratioEnergy) * Math.random();
  }
  initialScale = emitter.initialScale;
  if (emitter.initialScaleVariance > 0) {
    initialScale += emitter.initialScaleVariance * Math.random();
  }
  endScale = emitter.endScale;
  if (emitter.endScaleVariance > 0) {
    endScale += emitter.endScaleVariance * Math.random();
  }

  double particleVelocityX, particleVelocityY;
  var v = emitter.initialVelocity;
  if (emitter.initialVelocityVariance > 0) {
    v += emitter.initialVelocityVariance * Math.random();
  }

  double particleAccelerationX, particleAccelerationY;
  var a = emitter.initialAcceleration;
  if (emitter.initialAccelerationVariance > 0) {
    a += emitter.initialAccelerationVariance * Math.random();
  }

  var vx = particleVelocityX = v;
  var vy = particleVelocityY = 0;
  var ax = particleAccelerationX = a;
  var ay = particleAccelerationY = 0;
  var rot = emitter.rotation;
  if (rot != 0) {
    var sin = Math.sin(rot);
    var cos = Math.cos(rot);
    vx = particleVelocityX = v * cos;
    vy = particleVelocityY = v * sin;
    ax = particleAccelerationX = a * cos;
    ay = particleAccelerationY = a * sin;
  }
  if (emitter.dispersionAngle != 0 || emitter.dispersionAngleVariance != 0) {
    var dispersionAngle = emitter.dispersionAngle;
    if (emitter.dispersionAngleVariance > 0) {
      dispersionAngle += emitter.dispersionAngleVariance * Math.random();
    }
    var sin = Math.sin(dispersionAngle);
    var cos = Math.cos(dispersionAngle);
    particleVelocityX = (vx * cos - vy * sin);
    particleVelocityY = (vy * cos + vx * sin);
    particleAccelerationX = (ax * cos - ay * sin);
    particleAccelerationY = (ay * cos + ay * sin);
  }

  var ratioVel = .001;

  initialVelocityX = velocityX = particleVelocityX * ratioVel;
  initialVelocityY = velocityY = particleVelocityY * ratioVel;

  initialAccelerationX = accelerationX = particleAccelerationX * ratioVel;
  initialAccelerationY = accelerationY = particleAccelerationY * ratioVel;

  initialVelocityAngular = emitter.initialAngularVelocity;
  if (emitter.initialAngularVelocityVariance > 0) {
    initialVelocityAngular +=
        emitter.initialAngularVelocityVariance * Math.random();
  }

  // print("Initial vel x: $initialVelocityX");
  initialAlpha = emitter.initialAlpha;
  if (emitter.initialAlphaVariance > 0) {
    initialAlpha += emitter.initialAlphaVariance * Math.random();
  }
  initialRed = emitter.initialRed;
  if (emitter.initialRedVariance > 0) {
    initialRed += emitter.initialRedVariance * Math.random();
  }
  initialGreen = emitter.initialGreen;
  if (emitter.initialGreenVariance > 0) {
    initialGreen += emitter.initialGreenVariance * Math.random();
  }
  initialBlue = emitter.initialBlue;
  if (emitter.initialBlueVariance > 0) {
    initialBlue += emitter.initialBlueVariance * Math.random();
  }

  endAlpha = emitter.endAlpha;
  if (emitter.endAlphaVariance > 0) {
    endAlpha += emitter.endAlphaVariance * Math.random();
  }
  endRed = emitter.endRed;
  if (emitter.endRedVariance > 0) {
    endRed += emitter.endRedVariance * Math.random();
  }
  endGreen = emitter.endGreen;
  if (emitter.endGreenVariance > 0) {
    endGreen += emitter.endGreenVariance * Math.random();
  }
  endBlue = emitter.endBlue;
  if (emitter.endBlueVariance > 0) {
    endBlue += emitter.endBlueVariance * Math.random();
  }

  _redDif = endRed - initialRed;
  _greenDif = endGreen - initialGreen;
  _blueDif = endBlue - initialBlue;
  _alphaDif = endAlpha - initialAlpha;
  _scaleDif = endScale - initialScale;
}