mirror of
https://github.com/irmen/prog8.git
synced 2025-02-18 05:30:34 +00:00
cube3d and tweaks
This commit is contained in:
parent
4df397d057
commit
4501276217
142
compiler/examples/cube3d.p8
Normal file
142
compiler/examples/cube3d.p8
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
%option enable_floats
|
||||||
|
|
||||||
|
~ irq {
|
||||||
|
word global_time
|
||||||
|
byte time_changed
|
||||||
|
|
||||||
|
sub irq() {
|
||||||
|
global_time++
|
||||||
|
time_changed = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
~ main {
|
||||||
|
|
||||||
|
const word width = 320
|
||||||
|
const word height = 200
|
||||||
|
|
||||||
|
; vertices
|
||||||
|
float[8] xcoor = [ -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0 ]
|
||||||
|
float[8] ycoor = [ -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0 ]
|
||||||
|
float[8] zcoor = [ -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 ]
|
||||||
|
|
||||||
|
; edges (msb=from vertex, lsb=to vertex)
|
||||||
|
word[12] edges = [$0001, $0103, $0302, $0200, $0405, $0507, $0706, $0604, $0004, $0105, $0206, $0307]
|
||||||
|
|
||||||
|
; storage for rotated coordinates
|
||||||
|
float[len(xcoor)] rotatedx
|
||||||
|
float[len(ycoor)] rotatedy
|
||||||
|
float[len(zcoor)] rotatedz
|
||||||
|
|
||||||
|
; general index var
|
||||||
|
byte i
|
||||||
|
|
||||||
|
sub start() {
|
||||||
|
if irq.time_changed {
|
||||||
|
irq.time_changed = 0
|
||||||
|
_vm_gfx_clearscr(0)
|
||||||
|
_vm_gfx_text(14, 5, 5, "Spin to Win !!!")
|
||||||
|
|
||||||
|
for i in 0 to width//10 {
|
||||||
|
_vm_gfx_line(i*2+width//2-width//10, 130, i*10, 199, 6)
|
||||||
|
}
|
||||||
|
|
||||||
|
rotate_vertices(flt(irq.global_time) / 30.0)
|
||||||
|
draw_edges()
|
||||||
|
|
||||||
|
}
|
||||||
|
goto start
|
||||||
|
}
|
||||||
|
|
||||||
|
sub rotate_vertices(t: float) {
|
||||||
|
; rotate around origin (0,0,0)
|
||||||
|
|
||||||
|
; set up the 3d rotation matrix values
|
||||||
|
float cosa
|
||||||
|
float sina
|
||||||
|
float cosb
|
||||||
|
float sinb
|
||||||
|
float cosc
|
||||||
|
float sinc
|
||||||
|
float Axx
|
||||||
|
float Axy
|
||||||
|
float Axz
|
||||||
|
float Ayx
|
||||||
|
float Ayy
|
||||||
|
float Ayz
|
||||||
|
float Azx
|
||||||
|
float Azy
|
||||||
|
float Azz
|
||||||
|
|
||||||
|
cosa = cos(t)
|
||||||
|
sina = sin(t)
|
||||||
|
cosb = cos(t*0.33)
|
||||||
|
sinb = sin(t*0.33)
|
||||||
|
cosc = cos(t*0.78)
|
||||||
|
sinc = sin(t*0.78)
|
||||||
|
|
||||||
|
Axx = cosa*cosb
|
||||||
|
Axy = cosa*sinb*sinc - sina*cosc
|
||||||
|
Axz = cosa*sinb*cosc + sina*sinc
|
||||||
|
Ayx = sina*cosb
|
||||||
|
Ayy = sina*sinb*sinc + cosa*cosc
|
||||||
|
Ayz = sina*sinb*cosc - cosa*sinc
|
||||||
|
Azx = -sinb
|
||||||
|
Azy = cosb*sinc
|
||||||
|
Azz = cosb*cosc
|
||||||
|
|
||||||
|
for i in 0 to len(xcoor)-1 {
|
||||||
|
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]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub draw_edges() {
|
||||||
|
word edge
|
||||||
|
byte e_from
|
||||||
|
byte e_to
|
||||||
|
|
||||||
|
sub toscreenx(x: float, z: float) -> word {
|
||||||
|
return floor(x/(4.2+z) * height) + width // 2
|
||||||
|
}
|
||||||
|
|
||||||
|
sub toscreeny(y: float, z: float) -> word {
|
||||||
|
return floor(y/(4.2+z) * height) + height // 2
|
||||||
|
}
|
||||||
|
|
||||||
|
; draw all edges of the object
|
||||||
|
for edge in edges {
|
||||||
|
e_from = msb(edge)
|
||||||
|
e_to = lsb(edge)
|
||||||
|
_vm_gfx_line(toscreenx(rotatedx[e_from], rotatedz[e_from]), toscreeny(rotatedy[e_from], rotatedz[e_from]),
|
||||||
|
toscreenx(rotatedx[e_to], rotatedz[e_to]), toscreeny(rotatedy[e_to], rotatedz[e_to]), e_from+e_to)
|
||||||
|
}
|
||||||
|
|
||||||
|
; accentuate the vertices a bit with small boxes
|
||||||
|
word sx
|
||||||
|
word sy
|
||||||
|
byte col
|
||||||
|
for i in 0 to len(xcoor)-1 {
|
||||||
|
sx = toscreenx(rotatedx[i], rotatedz[i])
|
||||||
|
sy = toscreeny(rotatedy[i], rotatedz[i])
|
||||||
|
col=i+2
|
||||||
|
_vm_gfx_pixel(sx-1, sy-1, col)
|
||||||
|
_vm_gfx_pixel(sx, sy-1, col)
|
||||||
|
_vm_gfx_pixel(sx+1, sy-1, col)
|
||||||
|
_vm_gfx_pixel(sx-1, sy, col)
|
||||||
|
_vm_gfx_pixel(sx, sy, col)
|
||||||
|
_vm_gfx_pixel(sx+1, sy, col)
|
||||||
|
_vm_gfx_pixel(sx-1, sy+1, col)
|
||||||
|
_vm_gfx_pixel(sx, sy+1, col)
|
||||||
|
_vm_gfx_pixel(sx+1, sy+1, col)
|
||||||
|
|
||||||
|
_vm_gfx_pixel(sx, sy-2, col)
|
||||||
|
_vm_gfx_pixel(sx+2, sy, col)
|
||||||
|
_vm_gfx_pixel(sx, sy+2, col)
|
||||||
|
_vm_gfx_pixel(sx-2, sy, col)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -7,7 +7,7 @@
|
|||||||
const word width = 320 // 2
|
const word width = 320 // 2
|
||||||
const word height = 256 // 2
|
const word height = 256 // 2
|
||||||
const word xoffset = 40
|
const word xoffset = 40
|
||||||
const word yoffset = 20
|
const word yoffset = 30
|
||||||
word pixelx
|
word pixelx
|
||||||
byte pixely
|
byte pixely
|
||||||
float xx
|
float xx
|
||||||
@ -21,7 +21,7 @@
|
|||||||
byte ploty
|
byte ploty
|
||||||
|
|
||||||
_vm_gfx_clearscr(11)
|
_vm_gfx_clearscr(11)
|
||||||
_vm_gfx_text(5, 5, 7, "Calculating Mandelbrot Fractal...")
|
_vm_gfx_text(2, 1, 7, "Calculating Mandelbrot Fractal...")
|
||||||
|
|
||||||
for pixely in yoffset to yoffset+height-1 {
|
for pixely in yoffset to yoffset+height-1 {
|
||||||
yy = flt((pixely-yoffset))/height/3.6+0.4
|
yy = flt((pixely-yoffset))/height/3.6+0.4
|
||||||
@ -46,13 +46,13 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_vm_gfx_text(110, 160, 7, "Finished!")
|
_vm_gfx_text(11, 21, 7, "Finished!")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
; ---- 60hz irq handling routine------
|
; ---- some weird testing 60hz irq handling routine------
|
||||||
|
|
||||||
~ irq {
|
~ irq {
|
||||||
|
|
||||||
|
@ -1,78 +0,0 @@
|
|||||||
%option enable_floats
|
|
||||||
|
|
||||||
~ irq {
|
|
||||||
word global_time
|
|
||||||
byte time_changed
|
|
||||||
|
|
||||||
sub irq() {
|
|
||||||
global_time++
|
|
||||||
time_changed = 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
~ main {
|
|
||||||
|
|
||||||
const word width = 320
|
|
||||||
const word height = 200
|
|
||||||
|
|
||||||
float[6] xcoor = [-1.0, 1.0, 1.0, 0.5, 0.2, -1.0]
|
|
||||||
float[6] ycoor = [0.2, 1.0, -1.0, -0.3, -0.6, -1.0]
|
|
||||||
|
|
||||||
float[len(xcoor)] rotatedx
|
|
||||||
float[len(ycoor)] rotatedy
|
|
||||||
|
|
||||||
sub start() {
|
|
||||||
byte i
|
|
||||||
|
|
||||||
while(1) {
|
|
||||||
if irq.time_changed {
|
|
||||||
irq.time_changed = 0
|
|
||||||
_vm_gfx_clearscr(0)
|
|
||||||
_vm_gfx_text(120, 40, 5, "Spin to Win !!!")
|
|
||||||
|
|
||||||
for i in 0 to width//10 {
|
|
||||||
_vm_gfx_line(i*2+100, 100, i*10, 199, 6)
|
|
||||||
}
|
|
||||||
|
|
||||||
rotate_points(flt(irq.global_time) / 30.0)
|
|
||||||
draw_lines()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub rotate_points(t: float) {
|
|
||||||
|
|
||||||
; rotate around origin (0,0) and zoom a bit
|
|
||||||
byte i
|
|
||||||
float zoom
|
|
||||||
zoom = (0.6 + sin(t*1.4)/2.2)
|
|
||||||
|
|
||||||
for i in 0 to len(xcoor)-1 {
|
|
||||||
rotatedx[i] = xcoor[i] * cos(t) - ycoor[i] * sin(t)
|
|
||||||
rotatedy[i] = xcoor[i] * sin(t) + ycoor[i] * cos(t)
|
|
||||||
rotatedx[i] *= zoom
|
|
||||||
rotatedy[i] *= zoom
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
sub draw_lines() {
|
|
||||||
byte i
|
|
||||||
|
|
||||||
sub toscreenx(x: float) -> word {
|
|
||||||
return floor(x * height/3 + width /2)
|
|
||||||
}
|
|
||||||
|
|
||||||
sub toscreeny(y: float) -> word {
|
|
||||||
return floor(y * height/3 + height /2)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i in 0 to len(xcoor)-2 {
|
|
||||||
_vm_gfx_line(toscreenx(rotatedx[i]), toscreeny(rotatedy[i]),
|
|
||||||
toscreenx(rotatedx[i+1]), toscreeny(rotatedy[i+1]), i+7)
|
|
||||||
}
|
|
||||||
_vm_gfx_line(toscreenx(rotatedx[len(xcoor)-1]), toscreeny(rotatedy[len(xcoor)-1]),
|
|
||||||
toscreenx(rotatedx[0]), toscreeny(rotatedy[0]), 14)
|
|
||||||
}
|
|
||||||
}
|
|
@ -8,7 +8,7 @@
|
|||||||
sub start() {
|
sub start() {
|
||||||
|
|
||||||
_vm_gfx_clearscr(0)
|
_vm_gfx_clearscr(0)
|
||||||
_vm_gfx_text(5, 5, 7, "Swirl !!!")
|
_vm_gfx_text(2, 2, 7, "Swirl !!!")
|
||||||
|
|
||||||
float x
|
float x
|
||||||
float y
|
float y
|
||||||
|
@ -134,7 +134,7 @@ enum class Syscall(val callNr: Short) {
|
|||||||
INPUT_STR(15), // user input a string onto the stack, with max length (truncated) given by value on stack
|
INPUT_STR(15), // user input a string onto the stack, with max length (truncated) given by value on stack
|
||||||
GFX_PIXEL(16), // plot a pixel at (x,y,color) pushed on stack in that order
|
GFX_PIXEL(16), // plot a pixel at (x,y,color) pushed on stack in that order
|
||||||
GFX_CLEARSCR(17), // clear the screen with color pushed on stack
|
GFX_CLEARSCR(17), // clear the screen with color pushed on stack
|
||||||
GFX_TEXT(18), // write text on screen at (x,y,color,text) pushed on stack in that order
|
GFX_TEXT(18), // write text on screen at cursor position (x,y,color,text) pushed on stack in that order (pixel pos= x*8, y*8)
|
||||||
GFX_LINE(19), // draw line on screen at (x1,y1,x2,y2,color) pushed on stack in that order
|
GFX_LINE(19), // draw line on screen at (x1,y1,x2,y2,color) pushed on stack in that order
|
||||||
|
|
||||||
FUNC_SIN(66),
|
FUNC_SIN(66),
|
||||||
@ -514,9 +514,9 @@ class StackVm(private var traceOutputFile: String?) {
|
|||||||
Syscall.GFX_TEXT -> {
|
Syscall.GFX_TEXT -> {
|
||||||
val textPtr = evalstack.pop()
|
val textPtr = evalstack.pop()
|
||||||
val color = evalstack.pop()
|
val color = evalstack.pop()
|
||||||
val (y, x) = evalstack.pop2()
|
val (cy, cx) = evalstack.pop2()
|
||||||
val text = heap.get(textPtr.heapId)
|
val text = heap.get(textPtr.heapId)
|
||||||
canvas?.writeText(x.integerValue(), y.integerValue(), text.str!!, color.integerValue())
|
canvas?.writeText(8*cx.integerValue(), 8*cy.integerValue(), text.str!!, color.integerValue())
|
||||||
}
|
}
|
||||||
Syscall.FUNC_RND -> evalstack.push(Value(DataType.BYTE, rnd.nextInt() and 255))
|
Syscall.FUNC_RND -> evalstack.push(Value(DataType.BYTE, rnd.nextInt() and 255))
|
||||||
Syscall.FUNC_RNDW -> evalstack.push(Value(DataType.WORD, rnd.nextInt() and 65535))
|
Syscall.FUNC_RNDW -> evalstack.push(Value(DataType.WORD, rnd.nextInt() and 65535))
|
||||||
|
@ -111,6 +111,13 @@ Usually it is omitted, and the compiler will automatically choose the location (
|
|||||||
the previous block in memory).
|
the previous block in memory).
|
||||||
The address must be >= ``$0200`` (because ``$00``--``$ff`` is the ZP and ``$100``--``$200`` is the cpu stack).
|
The address must be >= ``$0200`` (because ``$00``--``$ff`` is the ZP and ``$100``--``$200`` is the cpu stack).
|
||||||
|
|
||||||
|
.. sidebar::
|
||||||
|
Scoped access to symbols / "dotted names"
|
||||||
|
|
||||||
|
Every symbol is 'public' and can be accessed from elsewhere given its full "dotted name".
|
||||||
|
So, accessing a variable ``counter`` defined in subroutine ``worker`` in block ``main``,
|
||||||
|
can be done from anywhere by using ``main.worker.counter``.
|
||||||
|
|
||||||
A block is also a *scope* in your program so the symbols in the block don't clash with
|
A block is also a *scope* in your program so the symbols in the block don't clash with
|
||||||
symbols of the same name defined elsewhere in the same file or in another file.
|
symbols of the same name defined elsewhere in the same file or in another file.
|
||||||
You can refer to the symbols in a particular block by using a *dotted name*: ``blockname.symbolname``.
|
You can refer to the symbols in a particular block by using a *dotted name*: ``blockname.symbolname``.
|
||||||
@ -118,7 +125,6 @@ Labels inside a subroutine are appended again to that; ``blockname.subroutinenam
|
|||||||
A symbol name that's not a dotted name is searched for in the current scope, if it's not found there,
|
A symbol name that's not a dotted name is searched for in the current scope, if it's not found there,
|
||||||
one scope higher, and so on until it is found.
|
one scope higher, and so on until it is found.
|
||||||
|
|
||||||
Every symbol is 'public' and can be accessed from elsewhere given its dotted name.
|
|
||||||
|
|
||||||
|
|
||||||
**The special "ZP" ZeroPage block**
|
**The special "ZP" ZeroPage block**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user