Toolbox-2/source/3dmulti/3dmulti.spin

229 lines
7.5 KiB
Plaintext

{
Multi core transform sample
derived from "3D Graphics DEMO" by Beau Schwabe (Parallax)
}
CON
' enable multi core transform calculation
MultiCoreTranform = true
ZX = 180
ZY = 240
MaxPoints = 50
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
_stack = ($3000 + $3000 + 100) >> 2
x_tiles = 16
y_tiles = 12
paramcount = 14
bitmap_base = $2000
display_base = $5000
VAR
long tv_status '0/1/2 = off/visible/invisible read-only
long tv_enable '0/? = off/on write-only
long tv_pins '%ppmmm = pins write-only
long tv_mode '%ccinp = chroma,interlace,ntsc/pal,swap write-only
long tv_screen 'pointer to screen (words) write-only
long tv_colors 'pointer to colors (longs) write-only
long tv_hc 'horizontal cells write-only
long tv_vc 'vertical cells write-only
long tv_hx 'horizontal cell expansion write-only
long tv_vx 'vertical cell expansion write-only
long tv_ho 'horizontal offset write-only
long tv_vo 'vertical offset write-only
long tv_broadcast 'broadcast frequency (Hz) write-only
long tv_auralcog 'aural fm cog write-only
word screen[x_tiles * y_tiles]
long colors[64]
long cogStack[40 * 5]
long pointData[MaxPoints * 5]
byte frame
OBJ
tv : "bel-tv"
gr : "pf_graphics"
PUB start | i,dx,dy
'start tv
longmove(@tv_status, @tvparams, paramcount)
tv_screen := @screen
tv_colors := @colors
tv.start(@tv_status)
'init colors
repeat i from 0 to 63
colors[i] := $ad02ad06
'init tile screen
i := 0
repeat dy from 0 to tv_vc - 1
repeat dx from 0 to tv_hc - 1
screen[i++] := display_base >> 6 + dy + dx * tv_vc + (dy << 10)
'start and setup graphics
gr.start
gr.setup(tv_hc, tv_vc, tv_hc<<3, tv_vc<<3, bitmap_base)
'Start transform routines (per object)
if MultiCoreTranform
repeat i from 0 to 4
cognew( Polyobj(@pointData[ MaxPoints * i ], @PostureData + i * 20), @cogStack[i * 40] )
MainLoop
PRI MainLoop | i, n, t
n := 0
t := cnt & |<27
repeat
gr.clear
gr.width(0)
repeat i from 0 to n
if !MultiCoreTranform
TranslatePoints( @pointData[ MaxPoints * i ], @PostureData + i * 20, @PointSrc, constant((@PointSrc_End - @PointSrc)/3) )
repeat until ( word[ @PostureData + i * 20 + 18] == frame )
gr.lineseq( @pointData[MaxPoints * i], @SeqData)
gr.copy(display_base)
frame++
if ( t <> cnt & |<27 )
t := cnt & |<27
n := (n + 1) <# 4
'wait Vsync
repeat until ( tv_status == 1 )
PRI PolyObj(destAddr, postureAddr)
repeat
repeat while word[ postureAddr + 18 ] == frame
TranslatePoints( destAddr, postureAddr, @PointSrc, constant((@PointSrc_End - @PointSrc)/3) )
PRI TranslatePoints( destAddr, postureAddr, pointAddr, numPoints ) | i,dst,px,py,pz,tx,ty,tz,dx,dy,dz,S1,S2,S3,C1,C2,C3,x,y,z
tx := ( word[ postureAddr + 6 ] += word[ postureAddr + 12 ] )
ty := ( word[ postureAddr + 8 ] += word[ postureAddr + 14 ] )
tz := ( word[ postureAddr + 10 ] += word[ postureAddr + 16 ] )
S1 := Sin(tx)
S2 := Sin(ty)
S3 := Sin(tz)
C1 := Cos(tx)
C2 := Cos(ty)
C3 := Cos(tz)
x := ~word[ postureAddr + 0 ]
y := ~word[ postureAddr + 2 ]
z := word[ postureAddr + 4 ] + (C1 ~> 9) ' add C1~>9 for test
repeat i from 0 to numPoints
px := ~byte[pointAddr++]
py := ~byte[pointAddr++]
pz := ~byte[pointAddr++]
tx := ( px * C2 - pz * S2 ) ~> 16
tz := ( px * S2 + pz * C2 ) ~> 16
ty := ( tz * S1 + py * C1 ) ~> 16
dx := ( tx * C3 + ty * S3 ) ~> 16 + x
dy := ( ty * C3 - tx * S3 ) ~> 16 + y
dz := ( tz * C1 - py * S1 ) ~> 16 + z
word[destAddr ] := dx * ZX / dz
word[destAddr+2] := dy * ZY / dz
destAddr += 4
word[ postureAddr + 18 ] := frame
pri cos(angle) : x
x := sin(angle + $800)
pri sin(angle) : y
'' Get sine of angle (0-8191)
y := angle << 1 & $FFE ' address
if angle & $800
y := word[$F000 - y]
else
y := word[$E000 + y]
if angle & $1000
-y
DAT
PostureData
' trans rot rotspeed sync
word 0, 0, 400, 0, 0, 0, 0, 0, 200, 0
word -120, -80, 400, 0, 0, 0, 50, 30, 40, 0
word -120, 80, 400, 0, 0, 0, 40, 50, 30, 0
word 120, -80, 400, 0, 0, 0, 30, 50, 40, 0
word 120, 80, 400, 0, 0, 0, 50, 40, 30, 0
PointSrc
byte -20,-20,-20
byte -20,-20, 20
byte -20, 20, 20
byte -20, 20,-20
byte 20,-20,-20
byte 20,-20, 20
byte 20, 20, 20
byte 20, 20,-20
byte -40,-40,-40
byte -40,-40, 40
byte -40, 40, 40
byte -40, 40,-40
byte 40,-40,-40
byte 40,-40, 40
byte 40, 40, 40
byte 40, 40,-40
byte -70, 0, 0
byte 70, 0, 0
PointSrc_End
SeqData
' orange thing
byte 13, 1, 16, 0, 4, 17, 5, 1, 16, 2, 6, 17, 7, 3, 16
byte 5, 1, 0, 1, 2, 3, 0
byte 5, 1, 4, 5, 6, 7, 4
' black cube
byte 10, 2, 8, 9,10,11, 8,12,13,14,15,12
byte 2, 2, 9,13
byte 2, 2,10,14
byte 2, 2,11,15
byte 0
tvparams long 0 'status
long 1 'enable
'long %011_0000 'pins Old Board
long %010_0101 'pins New Board
long %0000 'mode
long 0 'screen
long 0 'colors
long x_tiles 'hc
long y_tiles 'vc
long 10 'hx
long 1 'vx
long 0 'ho
long 0 'vo
long 60_000_000 '_xinfreq<<4 'broadcast
long 0 'auralcog