public void update() {

    if (systems == null || systems[index] == null) {
      reset(index);
    }

    for (int j = 0; j < maxStep; j++) {
      ParticleSystem system = systems[j];
      if (system == null) {
        break;
      }
      Vector3 addAccel = THREE.Vector3(0, accel.getY() * steps[j], 0);
      for (int i = 0; i < particleSize; i++) {
        Vector3 vertex = system.getGeometry().vertices().get(i);

        vertex.addSelf(velocity);
        vertex.addSelf(addVelocities[j][i]);
        vertex.addSelf(wind);
        vertex.addSelf(addAccel); // do slow

        // vertex.getPosition().addSelf(winds[i]);
      }
      system.getGeometry().setVerticesNeedUpdate(true);

      ((ParticleBasicMaterial) system.getMaterial()).setSize(baseSize + changeSize * steps[j]);
      ((ParticleBasicMaterial) system.getMaterial())
          .setOpacity(Math.max(0, 1 - changeOpacity * steps[j]));

      steps[j]++;
      if (steps[j] == maxStep) {
        reset(j);
        steps[j] = 0;
      }
    }

    index++;
    if (index == maxStep) {
      index = 0;
    }
  }