Platzierung und Animation
(Daniel Kliewer)
Da man die vier Komponenten eines Feuers nicht alle separat in die Szene setzten möchte, werden diese alle zusammen mit der "addFire" Funktion gesetzt.
function addFire(x, y, z, width, height, depth, spacing, index)
Diese Funktion bekommt die Koordinaten des Feuers, die Größe des Feuers und einen Index übergeben. Der Index wird verwendet um informationen über das jeweilige Feuer in einem Array zu speichern und der spacing Wert hat Einfluss auf die Größe der einzelnen Teilstücke einer Flamme (die restlichen parameter sind selbsterklärend).
In dieser Funktion findet auch das Klonen der meshes einer VolumetricFire Instanz statt (wie in Kapitel "Flamme" erwähnt). Dazu wird beim aufruf von addFire zuerst geprüft ob man schon mal ein VolumetricFire Objekt mit den übergebenen Werten erstellt hat. Falls nicht wird ein neues Objekt erstellt und in ein Array gespeichert, hatte man ein Objekt mit diesen Werten schon mal erstellt wird dieses wieder benutzt.
Nachdem die Flamme geklont wurde, erstellt die Funktion noch die weiteren drei Bestandteile des Feuers an der richtigen Position und den richtigen größen. Als nächstes werden die Bestandteile der Szene hinzugefügt und zusätzlich noch in Arrays abgespeichert, da sie noch in anderen Funktionen benutzt werden.
Wenn man nun alle Feuer mit der addFire Funktion in sein Level eingefügt hat, muss zum Schluss die animateFire Funktion einmalig aufgerufen werden.
function animateFire() {
requestAnimationFrame(animateFire);
fireElapsed = clock.getElapsedTime();
// update alle fire Objekte aus dem Array
for (f_i = 0; f_i < fire_count; f_i++) {
fire_list[f_i].update(fireElapsed);
}
// update alle smoke und pointlights
for (f_j = 0; f_j < smoke_and_light_count; f_j++) {
if (!performantfire) pointlight_list[f_j].intensity = Math.sin(fireElapsed * 30) * 0.25 + 3;
smoke_list[f_j].material.uniforms.time.value = clock.getElapsedTime();
}
}
Durch das requestAnimationFrame(animateFire)
ruft sich die Funktion immer wieder selbst auf und ist somit in einer Endlosschleife. Dabei werden die Objekte die vorhin in Arrays abgespeichert wurden durchgegangen und animiert.
Punktlichter verändern hier ihre Intensität (wenn die Einstellung "Performanteres Feuer" nicht ausgewählt wurde).
Beim Rauch wird der Wert von den uniforms verändert. Die uniforms werden von den Vertex Shadern benutzt und durch den geänderten Wert bringt man die Partikel dazu langsam aufzusteigen.
Die Flammen werden durch das aufrufen der update Funktion der einzelnen VolumetricFire Objekte animiert.