private static Flame morphFlames_fade(
     Prefs pPrefs, Flame pFlame1, Flame pFlame2, int pFrame, int pFrames) {
   if (pFrame < 1 || pFrames < 2) return pFlame1;
   double fScl = (double) (pFrame - 1) / (pFrames - 1);
   if (fScl <= MathLib.EPSILON) {
     return pFlame1;
   } else if (fScl >= 1.0 - MathLib.EPSILON) {
     return pFlame2;
   }
   // fade out layerz of the source flame
   Flame res = pFlame1.makeCopy();
   morphFlameValues(pFlame1, pFlame2, fScl, res);
   for (Layer layer : res.getLayers()) {
     layer.setWeight(layer.getWeight() * (1.0 - fScl));
   }
   // add and fade in layerz of the dest flame
   for (Layer layer : pFlame2.getLayers()) {
     Layer copy = layer.makeCopy();
     copy.setWeight(copy.getWeight() * fScl);
     res.getLayers().add(copy);
   }
   return res;
 }