Flame torch;
void setup()
{
  torch = new Flame(
    220    //xPos
    , 200  //yPos
    , 10  //width flux
    , 4  //tail length flux
    , 200  //torch thickness
    , 150  //torch source curve
    , 100  //torch tail slope
    , 200  //torch tail length
    , 8  //inner flame offset
    , 100  //inner flame tail difference
    , 160  //inner flame thickness difference
    , 0.8  //inner flame flux strength
    );
  size(640, 480);
}

void draw()
{ 
  background(0,0,0);
  torch.draw();
}
class Flame
{
  
  float positionX = 320;
  float positionY = 240;
  
  int fluxRange = 10;
  int fluxLength = 4;
  
  float torchThickness = 100;
  float torchSourceCurve = 60;

  float torchTailSlope = 50;
  float torchTailLength = 80;
  
  float innerFlameOffset = 2;
  float innerFlameTailDifference = 40;
  float innerFlameThicknessDifference = 60;
  float innerFlameFluxEffect = 0.5;
  
 Flame(
   float inPositionX
   , float inPositionY
   , int inFluxRange
   , int inFluxLength
   , float inTorchThickness
   , float inTorchSourceCurve
   , float inTorchTailSlope
   , float inTorchTailLength
   , float inInnerFlameOffset
   , float inInnerFlameTailDifference
   , float inInnerFlameThicknessDifference
   , float inInnerFlameFluxEffect
   ) {
  positionX = inPositionX;
  positionY = inPositionY;
  
  fluxRange = inFluxRange;
  fluxLength = inFluxLength;
  
  torchThickness = inTorchThickness;
  torchSourceCurve = inTorchSourceCurve;

  torchTailSlope = inTorchTailSlope;
  torchTailLength = inTorchTailLength;
  
  innerFlameOffset = inInnerFlameOffset;
  innerFlameTailDifference = inInnerFlameTailDifference;
  innerFlameThicknessDifference = inInnerFlameThicknessDifference;
  innerFlameFluxEffect = inInnerFlameFluxEffect;
 }

  void draw()
 {
    stroke(64,0,128);
    fill(32, 0, 64);

    float randomFlux = random(-fluxRange, fluxRange);
    float randomLength = random(-fluxLength, fluxLength);
    curve(
      positionX + torchSourceCurve, positionY + torchThickness + randomFlux
      , positionX, positionY
      , positionX + torchTailLength + randomLength, positionY
      , positionX + torchTailLength, positionY + torchTailSlope
      );
    curve(
      positionX + torchSourceCurve, positionY - torchThickness - randomFlux
      , positionX, positionY
      , positionX + torchTailLength + randomLength, positionY
      , positionX + torchTailLength, positionY - torchTailSlope
      );


    stroke(128, 64, 212);
    fill(128, 64, 212);
    curve(
      positionX + torchSourceCurve, positionY + (torchThickness - innerFlameThicknessDifference) + (randomFlux * innerFlameFluxEffect)
      , positionX + innerFlameOffset, positionY
      , positionX + (torchTailLength - innerFlameTailDifference) + (randomLength * innerFlameFluxEffect) + innerFlameOffset, positionY
      , positionX + torchTailLength, positionY + torchTailSlope
      );
    curve(
      positionX + torchSourceCurve, positionY - (torchThickness - innerFlameThicknessDifference) - (randomFlux * innerFlameFluxEffect)
      , positionX + innerFlameOffset, positionY
      , positionX + (torchTailLength - innerFlameTailDifference) + (randomLength * innerFlameFluxEffect) + innerFlameOffset, positionY
      , positionX + torchTailLength, positionY - torchTailSlope
      );

 } 
}
