-
Notifications
You must be signed in to change notification settings - Fork 1
/
glenz.p8
332 lines (286 loc) · 13.1 KB
/
glenz.p8
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
pico-8 cartridge // http://www.pico-8.com
version 16
__lua__
function _init()
--music(0)
poke(0x5f34, 1)
-- create fx coroutines
cboard = cocreate(board)
ccube = cocreate(cube)
cdiamond = cocreate(diamond)
frameflag = false
end
function _update60()
frameflag = not frameflag
end
shape = 0
function _draw()
memset(0x6000, 0, 0x2000)
coresume(cboard)
if shape == 0 then
coresume(ccube)
else
coresume(cdiamond)
end
if btnp(0) then
shape = shape == 0 and 1 or 0
end
-- print cpu load
--cursor(0, 0)
--color(15)
--print(stat(1))
end
-- fx2: rotating 3d object
function cube()
local vertices = {
{1, 1, 1}, {1, -1, 1}, {-1, -1, 1}, {-1, 1, 1},
{1, 1, -1}, {1, -1, -1}, {-1, -1, -1}, {-1, 1, -1},
}
local tris = {
{1, 2, 3, 8}, {3, 4, 1, 8},
{7, 6, 5, 9}, {5, 8, 7, 9},
{1, 5, 2, 10}, {5, 6, 2, 10},
{8, 4, 3, 11}, {3, 7, 8, 11},
{5, 1, 4, 12}, {4, 8, 5, 12},
{2, 6, 3, 13}, {3, 6, 7, 13}
}
local angles, scales, offsets = {0, 0, 0}, {60, 60, 60}, {0, 0, 0}
while true do
offsets[1] = sin(angles[1]) * 150
offsets[2] = cos(angles[2]) * 150
offsets[3] = sin(angles[3]) * 150 + 400
draw_model(vertices, tris, angles, scales, offsets, true)
angles[1] += 0.006
angles[2] += 0.003
angles[3] += 0.002
yield()
end
end
function diamond()
local vertices = {
{1, 1, 1}, {1, -1, 1}, {-1, -1, 1}, {-1, 1, 1},
{1, 1, -1}, {1, -1, -1}, {-1, -1, -1}, {-1, 1, -1},
{0, 0, -2}, {0, 0, 2}, {-2, 0, 0}, {2, 0, 0}, {0, -2, 0}, {0, 2, 0}
}
local tris = {
{1, 2, 10, 8}, {10, 3, 4, 9},
{9, 6, 5, 10}, {8, 7, 9, 11},
{1, 5, 12, 12}, {12, 6, 2, 13},
{3, 2, 13, 14}, {13, 6, 7, 15},
{8, 4, 11, 4}, {11, 3, 7, 6},
{1, 4, 14, 7}, {14, 8, 5, 3}
}
local angles, scales, offsets, phspike = {0, 0, 0}, {60, 60, 60}, {0, 0, 400}, 0
local len
while true do
offsets[1] = sin(angles[1]) * 50
offsets[2] = cos(angles[2]) * 50
offsets[3] = sin(angles[3]) * 50 + 400
vertices[9][3] = -2.5 - sin(phspike)
vertices[10][3] = 2.5 + sin(phspike + 0.1)
vertices[11][1] = -2.5 - sin(phspike + 0.2)
vertices[12][1] = 2.5 + sin(phspike + 0.3)
vertices[13][2] = -2.5 - sin(phspike + 0.4)
vertices[14][2] = 2.5 + sin(phspike + 0.5)
for i = 1, 8 do
len = sin(phspike * 1.5 + i * 0.1) * 0.1 + 1.1
vertices[i][1] = (vertices[i][1] < 0) and -len or len
vertices[i][2] = (vertices[i][2] < 0) and -len or len
vertices[i][3] = (vertices[i][3] < 0) and -len or len
end
draw_model(vertices, tris, angles, scales, offsets, true)
angles[1] += 0.001
angles[2] += 0.002
angles[3] += 0.001
phspike += 0.01
yield()
end
end
function draw_model(vertices, tris, angles, scales, offsets, glenz)
local v2d, matrix, pv = {}
matrix = matrixmultiply(scalematrix(scales), rotationmatrix(angles))
matrix = matrixmultiply(translatematrix(offsets), matrix)
matrix = matrixmultiply(projectionmatrix(), matrix)
for i = 1, #vertices do
pv = vmatrixmultiply(vertices[i], matrix)
v2d[i] = {64 + pv[1] / pv[4], 64 - pv[2] / pv[4]}
end
for i = 1, #tris do
triangle(v2d[tris[i][1]], v2d[tris[i][2]], v2d[tris[i][3]], tris[i][4], glenz)
end
end
function triangle(p1, p2, p3, col, glenz)
local clockwise = (p2[1] - p1[1]) * (p3[2] - p1[2]) - (p2[2] - p1[2]) * (p3[1] - p1[1]) > 0
if (not glenz and clockwise) return
if glenz then
fillp((clockwise != frameflag) and 0x5a5a.8 or 0xa5a5.8)
else
fillp(0x0000)
end
if (p1[2] > p2[2]) p2, p1 = p1, p2
if (p2[2] > p3[2]) p3, p2 = p2, p3
if (p1[2] > p2[2]) p2, p1 = p1, p2
local dydx_p1p2 = 0
if p2[2] - p1[2] > 0 then
dydx_p1p2 = (p2[1] - p1[1]) / (p2[2] - p1[2])
end
local dydx_p1p3 = 0
if p3[2] - p1[2] > 0 then
dydx_p1p3 = (p3[1] - p1[1]) / (p3[2] - p1[2])
end
if dydx_p1p2 > dydx_p1p3 then
for y = ceil(p1[2]), ceil(p3[2]) do
if y < p2[2] then
draw_scanline(y, p1, p3, p1, p2, col)
else
draw_scanline(y, p1, p3, p2, p3, col)
end
end
else
for y = ceil(p1[2]), ceil(p3[2]) do
if y < p2[2] then
draw_scanline(y, p1, p2, p1, p3, col)
else
draw_scanline(y, p2, p3, p1, p3, col)
end
end
end
end
function draw_scanline(y, p1, p2, p3, endpoint, color)
if (y < 0 or y > 127) return
grad1 = (y - p1[2]) / (p2[2] - p1[2])
grad2 = (y - p3[2]) / (endpoint[2] - p3[2])
x0 = p1[1] + (p2[1] - p1[1]) * (max(0, min(grad1, 1)))
xend = p3[1] + (endpoint[1] - p3[1]) * (max(0, min(grad2, 1)))
line(x0, y, xend, y, color)
end
function rotationmatrix(angles)
local ca, cb, cg, sa, sb, sg = cos(angles[1]), cos(angles[2]), cos(angles[3]), sin(angles[1]), sin(angles[2]), sin(angles[3])
return {
ca * cg - sa * cb * sg, -ca * sg - sa * cb * cg, sa * sb, 0,
sa * cg + ca * cb * sg, -sa * sg + ca * cb * cg, -ca * sb, 0,
sb * sg, sb * cg, cb, 0,
0, 0, 0, 1
}
end
function scalematrix(scales)
return {
scales[1], 0, 0, 0,
0, scales[2], 0, 0,
0, 0, scales[3], 0,
0, 0, 0, 1
}
end
function translatematrix(offsets)
return {
1, 0, 0, offsets[1],
0, 1, 0, offsets[2],
0, 0, 1, offsets[3],
0, 0, 0, 1
}
end
function projectionmatrix()
local f, n = 0.01, 1000
return {
2, 0, 0, 0,
0, 2, 0, 0,
0, 0, (f + n) / (f - n), 1,
0, 0, (-2 * f * n) / (f - n), 0
}
end
function vmatrixmultiply(v, m)
return {
m[1] * v[1] + m[2] * v[2] + m[3] * v[3] + m[4],
m[5] * v[1] + m[6] * v[2] + m[7] * v[3] + m[8],
m[9] * v[1] + m[10] * v[2] + m[11] * v[3] + m[12],
m[13] * v[1] + m[14] * v[2] + m[15] * v[3] + m[16],
}
end
function matrixmultiply(m1, m2)
return {
m1[1] * m2[1] + m1[2] * m2[5] + m1[3] * m2[9] + m1[4] * m2[13],
m1[1] * m2[2] + m1[2] * m2[6] + m1[3] * m2[10] + m1[4] * m2[14],
m1[1] * m2[3] + m1[2] * m2[7] + m1[3] * m2[11] + m1[4] * m2[15],
m1[1] * m2[4] + m1[2] * m2[8] + m1[3] * m2[12] + m1[4] * m2[16],
m1[5] * m2[1] + m1[6] * m2[5] + m1[7] * m2[9] + m1[8] * m2[13],
m1[5] * m2[2] + m1[6] * m2[6] + m1[7] * m2[10] + m1[8] * m2[14],
m1[5] * m2[3] + m1[6] * m2[7] + m1[7] * m2[11] + m1[8] * m2[15],
m1[5] * m2[4] + m1[6] * m2[8] + m1[7] * m2[12] + m1[8] * m2[16],
m1[9] * m2[1] + m1[10] * m2[5] + m1[11] * m2[9] + m1[12] * m2[13],
m1[9] * m2[2] + m1[10] * m2[6] + m1[11] * m2[10] + m1[12] * m2[14],
m1[9] * m2[3] + m1[10] * m2[7] + m1[11] * m2[11] + m1[12] * m2[15],
m1[9] * m2[4] + m1[10] * m2[8] + m1[11] * m2[12] + m1[12] * m2[16],
m1[13] * m2[1] + m1[14] * m2[5] + m1[15] * m2[9] + m1[16] * m2[13],
m1[13] * m2[2] + m1[14] * m2[6] + m1[15] * m2[10] + m1[16] * m2[14],
m1[13] * m2[3] + m1[14] * m2[7] + m1[15] * m2[11] + m1[16] * m2[15],
m1[13] * m2[4] + m1[14] * m2[8] + m1[15] * m2[12] + m1[16] * m2[16],
}
end
function board()
local ph, phw, oy, x, x1, toy, phy, width = 0, 0, 0, false
while true do
phy = ph
toy = oy
color(0x5)
fillp(frameflag and 0xa5a5.8 or 0x5a5a.8)
for y = 0, 127 do
x = 64 + sin(phy) * 20
width = 30 + sin(phw) * 6
if (toy % 32 < 16) x -= width
x1 = x
while x1 > -width do
line(x1, y, x1 + width - 1, y)
x1 -= width * 2
end
x1 = x
while x1 < 128 + width do
line(x1, y, x1 + width - 1, y)
x1 += width * 2
end
phy += 0.001
toy += 1 + sin(phw * 1.2) * 0.1
end
ph += 0.001
phw += 0.002
oy += 1
yield()
end
end
__gfx__
00000000aaaaaaaa1111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000aaaaaaaa1111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700aaaaaaaa1111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000aaaaaaaa1111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000aaaaaaaa1111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700aaaaaaaa1111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000aaaaaaaa1111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000aaaaaaaa1111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
__map__
0101020102020102010201020102010201020102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0202010201010201020102010201020102010201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0101020102020102010201020102010201020102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0202010201010201020102010201020102010201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0102010201020102010201020102010201020102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0201020102010201020102010201020102010201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0102010201020102010201020102010201020102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0201020102010201020102010201020102010201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0102010201020102010201020102010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0201020102010201020102010201020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0102010201020102010201020102010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0201020102010201020102010201020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
__sfx__
011000000c7750c535182750c375184750c1750c235183750c4750c735181750c375185750c7750c335187750c2750c235181750c775184750c3750c735181750c7750c235187750c375185750c4750c33518275
01100000180761b0761f06622066180561b0561f04622046180361b0361f02622026180161b0161f0162201613500165000c5000f50013500165000c5000f50013500165000c5000f50000000000000000000000
01100000180761b0761f06621066180561b0561f04621046180361b0361f02621026180161b0161f0162101600000000000000000000000000000000000000000000000000000000000000000000000000000000
010400001817318163181531815318153181431814318143181331813318133181231812318123181131811318113000000000000000000000000000000000000000000000000000000000000000000000000005
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
011000000c7750c535182750c375184750c1750c235183750c4750c735181750c375185750c7750c335187750c2750c235181750c775184750c3750c735181750c7750c235187750c375185750c4750c33518275
011000001f9401f9401f9401f9401f9401f9401f9401f9401f9401f9401f9401f9401f9401f9401f9401f9401fa401fa401fa401fa401fa401fa401fa401fa401fa401fa401fa401fa401fa401fa401fa401fa40
011000000cb700cb7018b700cb700cb000cb7318b7018b700cb700cb7018b700cb700cb700cb7318b7019b700cb700cb7018b700cb700cb700cb7318b7018b700cb700cb7018b700cb7018b7019b701ab701bb70
0110000013173002440c2400024013173002440c2400024013173002440c2400024013173002440c2410024113173002440c2400024013173002440c2400024013173002440c2400024013173002440c24100241
__music__
03 48090a44
02 080a4344