-
Notifications
You must be signed in to change notification settings - Fork 0
/
fire.js
156 lines (123 loc) · 5.01 KB
/
fire.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
const firePixelsArray = []
let fireWidth = 40
let fireHeight = 40
let debug = false
var sentido = 0
const fireColorsPalette = [{"r":7,"g":7,"b":7},{"r":31,"g":7,"b":7},{"r":47,"g":15,"b":7},{"r":71,"g":15,"b":7},{"r":87,"g":23,"b":7},{"r":103,"g":31,"b":7},{"r":119,"g":31,"b":7},{"r":143,"g":39,"b":7},{"r":159,"g":47,"b":7},{"r":175,"g":63,"b":7},{"r":191,"g":71,"b":7},{"r":199,"g":71,"b":7},{"r":223,"g":79,"b":7},{"r":223,"g":87,"b":7},{"r":223,"g":87,"b":7},{"r":215,"g":95,"b":7},{"r":215,"g":95,"b":7},{"r":215,"g":103,"b":15},{"r":207,"g":111,"b":15},{"r":207,"g":119,"b":15},{"r":207,"g":127,"b":15},{"r":207,"g":135,"b":23},{"r":199,"g":135,"b":23},{"r":199,"g":143,"b":23},{"r":199,"g":151,"b":31},{"r":191,"g":159,"b":31},{"r":191,"g":159,"b":31},{"r":191,"g":167,"b":39},{"r":191,"g":167,"b":39},{"r":191,"g":175,"b":47},{"r":183,"g":175,"b":47},{"r":183,"g":183,"b":47},{"r":183,"g":183,"b":55},{"r":207,"g":207,"b":111},{"r":223,"g":223,"b":159},{"r":239,"g":239,"b":199},{"r":255,"g":255,"b":255}]
function start() {
createFireDataStructure()
createFireSource()
setInterval(calculateFirePropagation, 50)
}
function createFireDataStructure() {
const numberOfPixels = fireWidth * fireHeight
for (let i = 0; i < numberOfPixels; i++) {
firePixelsArray[i] = 0
}
}
function calculateFirePropagation() {
for (let column = 0; column < fireWidth; column++) {
for (let row = 0; row < fireHeight; row++) {
const pixelIndex = column + ( fireWidth * row )
updateFireIntensityPerPixel(pixelIndex)
}
}
renderFire()
}
function changeWindDirection(value){
sentido = value
}
function updateFireIntensityPerPixel(currentPixelIndex) {
const belowPixelIndex = currentPixelIndex + fireWidth
// below pixel index overflows canvas
if (belowPixelIndex >= fireWidth * fireHeight) {
return
}
const decay = Math.floor(Math.random() * 3)
const belowPixelFireIntensity = firePixelsArray[belowPixelIndex]
const newFireIntensity =
belowPixelFireIntensity - decay >= 0 ? belowPixelFireIntensity - decay : 0
switch(sentido){
case 0: firePixelsArray[currentPixelIndex - decay] = newFireIntensity; break; //wind comes to the left
case 1: firePixelsArray[currentPixelIndex] = newFireIntensity; break; //no wind (fire set to up)
case 2: firePixelsArray[currentPixelIndex + decay] = newFireIntensity; break; //wind comes to the right
}
}
function renderFire() {
let html = '<table cellpadding=0 cellspacing=0>'
for (let row = 0; row < fireHeight; row++) {
html += '<tr>'
for (let column = 0; column < fireWidth; column++) {
const pixelIndex = column + ( fireWidth * row )
const fireIntensity = firePixelsArray[pixelIndex]
const color = fireColorsPalette[fireIntensity]
const colorString = `${color.r},${color.g},${color.b}`
if (debug === true) {
html += '<td>'
html += `<div class="pixel-index">${pixelIndex}</div>`
html += `<div style="color: rgb(${colorString})">${fireIntensity}</div>`
html += '</td>'
} else {
html += `<td class="pixel" style="background-color: rgb(${colorString})">`
html += '</td>'
}
}
html += '</tr>'
}
html += '</table>'
document.querySelector('#fireCanvas').innerHTML = html
}
function createFireSource() {
for (let column = 0; column <= fireWidth; column++) {
const overflowPixelIndex = fireWidth * fireHeight
const pixelIndex = (overflowPixelIndex - fireWidth) + column
firePixelsArray[pixelIndex] = 36
}
}
function destroyFireSource() {
for (let column = 0; column <= fireWidth; column++) {
const overflowPixelIndex = fireWidth * fireHeight
const pixelIndex = (overflowPixelIndex - fireWidth) + column
firePixelsArray[pixelIndex] = 0
}
}
function increaseFireSource() {
for (let column = 0; column <= fireWidth; column++) {
const overflowPixelIndex = fireWidth * fireHeight
const pixelIndex = (overflowPixelIndex - fireWidth) + column
const currentFireIntensity = firePixelsArray[pixelIndex]
if (currentFireIntensity < 36) {
const increase = Math.floor(Math.random() * 14)
const newFireIntensity =
currentFireIntensity + increase >= 36 ? 36 : currentFireIntensity + increase
firePixelsArray[pixelIndex] = newFireIntensity
}
}
}
function decreaseFireSource() {
for (let column = 0; column <= fireWidth; column++) {
const overflowPixelIndex = fireWidth * fireHeight
const pixelIndex = (overflowPixelIndex - fireWidth) + column
const currentFireIntensity = firePixelsArray[pixelIndex]
if (currentFireIntensity > 0) {
const decay = Math.floor(Math.random() * 14)
const newFireIntensity =
currentFireIntensity - decay >= 0 ? currentFireIntensity - decay : 0
firePixelsArray[pixelIndex] = newFireIntensity
}
}
}
function toggleDebugMode() {
if (debug === false) {
fireWidth = 25
fireHeight = 17
debug = true
} else {
fireWidth = 60
fireHeight = 40
debug = false
}
createFireDataStructure()
createFireSource()
}
start()