🔬 The outer flame doesn't sway, but the middle flame uses map(flicker2,0,1,-10,10) to move left and right. What if you add the same offset to the outer flame too? Will it look more or less realistic?
// Outer Flame (Red/Orange)
fill(220, 60, 10, 210);
drawTeardrop(cx, fireY - flameH * 0.4, flameW * 1.5, flameH * 1.1);
// Middle Flame (Orange)
drawingContext.shadowBlur = 20;
drawingContext.shadowColor = color(255, 150, 0);
fill(255, 140, 0, 230);
drawTeardrop(cx + map(flicker2,0,1,-10,10), fireY - flameH * 0.35, flameW * 1.1, flameH * 0.85);
function drawFire(cx, fireY, flicker1, flicker2) {
let flameW = map(flicker1, 0, 1, 70, 90);
let flameH = map(flicker2, 0, 1, 160, 220);
// Ambient Glow (Performance friendly standard ellipses instead of gradients)
let ambientAlpha = map(flicker1, 0, 1, 15, 30);
fill(255, 100, 0, ambientAlpha);
ellipse(cx, fireY - 50, 300, 300);
fill(255, 150, 0, ambientAlpha);
ellipse(cx, fireY - 50, 150, 150);
// Setup performance-friendly localized glowing shadow
drawingContext.shadowBlur = map(flicker1, 0, 1, 40, 80);
drawingContext.shadowColor = color(255, 100, 0);
// Outer Flame (Red/Orange)
fill(220, 60, 10, 210);
drawTeardrop(cx, fireY - flameH * 0.4, flameW * 1.5, flameH * 1.1);
// Middle Flame (Orange)
drawingContext.shadowBlur = 20;
drawingContext.shadowColor = color(255, 150, 0);
fill(255, 140, 0, 230);
drawTeardrop(cx + map(flicker2,0,1,-10,10), fireY - flameH * 0.35, flameW * 1.1, flameH * 0.85);
// Inner Flame (Yellow)
drawingContext.shadowBlur = 10;
drawingContext.shadowColor = color(255, 255, 0);
fill(255, 220, 40, 240);
drawTeardrop(cx, fireY - flameH * 0.3, flameW * 0.7, flameH * 0.6);
// Core (White-hot)
drawingContext.shadowBlur = 5;
drawingContext.shadowColor = color(255, 255, 255);
fill(255, 255, 220);
drawTeardrop(cx, fireY - flameH * 0.2, flameW * 0.4, flameH * 0.3);
drawingContext.shadowBlur = 0; // Reset
}