2019-01-20 16:45:57 +00:00
|
|
|
%import c64lib
|
2018-10-21 21:03:15 +00:00
|
|
|
%import c64utils
|
2018-10-02 23:11:28 +00:00
|
|
|
|
2019-07-29 21:11:13 +00:00
|
|
|
main {
|
2018-10-02 23:11:28 +00:00
|
|
|
|
2019-01-08 00:27:25 +00:00
|
|
|
const uword width = 40
|
|
|
|
const uword height = 25
|
2018-10-02 23:11:28 +00:00
|
|
|
|
|
|
|
; vertices
|
2020-08-22 17:00:03 +00:00
|
|
|
word[] xcoor = [ -40, -40, -40, -40, 40, 40, 40, 40 ]
|
|
|
|
word[] ycoor = [ -40, -40, 40, 40, -40, -40, 40, 40 ]
|
|
|
|
word[] zcoor = [ -40, 40, -40, 40, -40, 40, -40, 40 ]
|
2018-10-02 23:11:28 +00:00
|
|
|
|
|
|
|
; storage for rotated coordinates
|
2019-01-08 00:27:25 +00:00
|
|
|
word[len(xcoor)] rotatedx
|
|
|
|
word[len(ycoor)] rotatedy
|
|
|
|
word[len(zcoor)] rotatedz
|
2018-10-02 23:11:28 +00:00
|
|
|
|
|
|
|
sub start() {
|
2019-01-09 21:01:47 +00:00
|
|
|
|
2019-01-08 00:27:25 +00:00
|
|
|
uword anglex
|
|
|
|
uword angley
|
|
|
|
uword anglez
|
2020-07-25 14:25:02 +00:00
|
|
|
repeat {
|
2019-01-08 00:27:25 +00:00
|
|
|
rotate_vertices(msb(anglex), msb(angley), msb(anglez))
|
|
|
|
c64scr.clear_screenchars(32)
|
|
|
|
draw_edges()
|
|
|
|
anglex+=1000
|
|
|
|
angley+=433
|
|
|
|
anglez+=907
|
2019-03-21 21:36:46 +00:00
|
|
|
c64scr.plot(0,0)
|
2020-03-14 16:11:10 +00:00
|
|
|
c64scr.print("3d cube! ")
|
2019-01-08 00:27:25 +00:00
|
|
|
c64scr.print_ub(c64.TIME_LO)
|
2020-03-14 16:11:10 +00:00
|
|
|
c64scr.print(" jiffies/fr = ")
|
|
|
|
c64scr.print_ub(60/c64.TIME_LO)
|
|
|
|
c64scr.print(" fps")
|
2019-01-08 00:27:25 +00:00
|
|
|
c64.TIME_LO=0
|
2018-10-02 23:11:28 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-08 00:27:25 +00:00
|
|
|
sub rotate_vertices(ubyte ax, ubyte ay, ubyte az) {
|
2018-10-02 23:11:28 +00:00
|
|
|
; rotate around origin (0,0,0)
|
|
|
|
|
|
|
|
; set up the 3d rotation matrix values
|
2019-08-17 09:49:30 +00:00
|
|
|
word wcosa = cos8(ax)
|
|
|
|
word wsina = sin8(ax)
|
|
|
|
word wcosb = cos8(ay)
|
|
|
|
word wsinb = sin8(ay)
|
|
|
|
word wcosc = cos8(az)
|
|
|
|
word wsinc = sin8(az)
|
2019-01-08 00:27:25 +00:00
|
|
|
|
2019-01-09 21:01:47 +00:00
|
|
|
word wcosa_sinb = wcosa*wsinb / 128
|
|
|
|
word wsina_sinb = wsina*wsinb / 128
|
2019-01-08 00:27:25 +00:00
|
|
|
|
2019-01-09 21:01:47 +00:00
|
|
|
word Axx = wcosa*wcosb / 128
|
|
|
|
word Axy = (wcosa_sinb*wsinc - wsina*wcosc) / 128
|
|
|
|
word Axz = (wcosa_sinb*wcosc + wsina*wsinc) / 128
|
|
|
|
word Ayx = wsina*wcosb / 128
|
|
|
|
word Ayy = (wsina_sinb*wsinc + wcosa*wcosc) / 128
|
|
|
|
word Ayz = (wsina_sinb*wcosc - wcosa*wsinc) / 128
|
2019-01-08 00:27:25 +00:00
|
|
|
word Azx = -wsinb
|
2019-01-09 21:01:47 +00:00
|
|
|
word Azy = wcosb*wsinc / 128
|
|
|
|
word Azz = wcosb*wcosc / 128
|
2018-10-02 23:11:28 +00:00
|
|
|
|
2019-08-18 01:16:23 +00:00
|
|
|
ubyte i
|
|
|
|
for i in 0 to len(xcoor)-1 {
|
2019-08-17 09:49:30 +00:00
|
|
|
; don't normalize by dividing by 128, instead keep some precision for perspective calc later
|
2020-03-11 19:47:42 +00:00
|
|
|
rotatedx[i] = Axx*xcoor[i] + Axy*ycoor[i] + Axz*zcoor[i]
|
|
|
|
rotatedy[i] = Ayx*xcoor[i] + Ayy*ycoor[i] + Ayz*zcoor[i]
|
|
|
|
rotatedz[i] = Azx*xcoor[i] + Azy*ycoor[i] + Azz*zcoor[i]
|
2018-10-02 23:11:28 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sub draw_edges() {
|
|
|
|
|
2019-01-08 00:27:25 +00:00
|
|
|
; plot the points of the 3d cube
|
|
|
|
; first the points on the back, then the points on the front (painter algorithm)
|
2018-10-02 23:11:28 +00:00
|
|
|
|
2019-08-05 19:00:55 +00:00
|
|
|
ubyte i
|
|
|
|
word rz
|
|
|
|
word persp
|
|
|
|
byte sx
|
|
|
|
byte sy
|
|
|
|
|
|
|
|
for i in 0 to len(xcoor)-1 {
|
|
|
|
rz = rotatedz[i]
|
2019-01-08 00:27:25 +00:00
|
|
|
if rz >= 10 {
|
2019-08-17 09:49:30 +00:00
|
|
|
persp = 900 + rz/32
|
2019-08-05 19:00:55 +00:00
|
|
|
sx = rotatedx[i] / persp as byte + width/2
|
|
|
|
sy = rotatedy[i] / persp as byte + height/2
|
2019-08-17 09:49:30 +00:00
|
|
|
c64scr.setcc(sx as ubyte, sy as ubyte, 46, 7)
|
2019-01-08 00:27:25 +00:00
|
|
|
}
|
2018-10-02 23:11:28 +00:00
|
|
|
}
|
|
|
|
|
2019-08-05 19:00:55 +00:00
|
|
|
for i in 0 to len(xcoor)-1 {
|
|
|
|
rz = rotatedz[i]
|
2019-01-08 00:27:25 +00:00
|
|
|
if rz < 10 {
|
2019-08-17 09:49:30 +00:00
|
|
|
persp = 900 + rz/32
|
2019-08-05 19:00:55 +00:00
|
|
|
sx = rotatedx[i] / persp as byte + width/2
|
|
|
|
sy = rotatedy[i] / persp as byte + height/2
|
2019-08-17 09:49:30 +00:00
|
|
|
c64scr.setcc(sx as ubyte, sy as ubyte, 81, 7)
|
2019-01-08 00:27:25 +00:00
|
|
|
}
|
2018-10-02 23:11:28 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|