Raster Cube
Posted: Wed Mar 18, 2015 6:43 am
Code: Select all
rem raster cube
rem iPhone 6 Plus / 8.3 b3
rem Enjoy...
'Example Of Fast Cube Rasterisation.
'THIS ROUTINE RENDERS EACH FACE WITH A CUSTOM FILL ROUTINE
'Res=1 (best quality but slowest) bigger numbers for res
'will increase speed at the expense of image quality.
res=10
gosub initialize
loop:
refresh off
graphics clear 0,0,0
fill color 1,1,1
fill rect 0,0 to sw,20
gosub rotate
gosub construct
draw text "Raster Cube" at 0,0
refresh on
goto loop
'Draw The Object
construct:
for a=1 to faces
gosub draw
next a
return
customfill:
'Pass four points of rectangle to renderer
cfx(1)=tx(f1(a))
cfx(2)=tx(f2(a))
cfx(3)=tx(f3(a))
cfx(4)=tx(f4(a))
cfy(1)=ty(f1(a))
cfy(2)=ty(f2(a))
cfy(3)=ty(f3(a))
cfy(4)=ty(f4(a))
'Calculate Approximate Center
xc=(cfx(1)+cfx(3))/2
yc=(cfy(1)+cfy(3))/2
cfx(5)=xc
cfy(5)=yc
'Pass Points into render engine variables
ctx(1)=cfx(1) ! ctx(2)=cfx(2) ! ctx(3)=cfx(5)
cty(1)=cfy(1) ! cty(2)=cfy(2) ! cty(3)=cfy(5)
gosub cft
ctx(1)=cfx(2) ! ctx(2)=cfx(3) ! ctx(3)=cfx(5)
cty(1)=cfy(2) ! cty(2)=cfy(3) ! cty(3)=cfy(5)
gosub cft
ctx(1)=cfx(3) ! ctx(2)=cfx(4) ! ctx(3)=cfx(5)
cty(1)=cfy(3) ! cty(2)=cfy(4) ! cty(3)=cfy(5)
gosub cft
ctx(1)=cfx(4) ! ctx(2)=cfx(1) ! ctx(3)=cfx(5)
cty(1)=cfy(4) ! cty(2)=cfy(1) ! cty(3)=cfy(5)
gosub cft
return
cft:
'Triangle Rasteriser
'Sort Triangle Y
for b=1 to 2
for m=1 to 2
if cty(m)>cty(m+1) then
tmx=ctx(m)
tmy=cty(m)
ctx(m)=ctx(m+1)
cty(m)=cty(m+1)
ctx(m+1)=tmx
cty(m+1)=tmy
end if
next m
next b
lx=ctx(1)
rx=ctx(1)
la=(ctx(1)-ctx(2))/(cty(1)-cty(2))*res
ra=(ctx(1)-ctx(3))/(cty(1)-cty(3))*res
for cy=cty(1) to cty(2) step res
fill rect lx,cy-res to rx,cy+res
lx=lx+la
rx=rx+ra
next cy
lx=ctx(2)
la=(ctx(2)-ctx(3))/(cty(2)-cty(3))*res
for cy=cty(2) to cty(3)-res step res
fill rect lx,cy-res to rx,cy+res
lx=lx+la
rx=rx+ra
next cy
return
'Draw A Face Of The Object
draw:
vx1= tx(f1(a))-tx(f2(a))
vy1= ty(f1(a))-ty(f2(a))
vx2= tx(f3(a))-tx(f2(a))
vy2= ty(f3(a))-ty(f2(a))
n= vx1*vy2-vx2*vy1
if n<0 then
n=-(n/500)
fill color (cr(a)+n)/255,(cg(a)+n)/255,(cb(a)+n)/255
draw color (cr(a)+n)/255,(cg(a)+n)/255,(cb(a)+n)/255
gosub customfill
' fill triangle tx(f1(a)),ty(f1(a)) to tx(f2(a)),ty(f2(a)) to tx(f3(a)),ty(f3(a))
' fill triangle tx(f1(a)),ty(f1(a)) to tx(f4(a)),ty(f4(a)) to tx(f3(a)),ty(f3(a))
if cls(a)=1 then
draw color 0,150/255,150/255
draw line tx(f1(a)),ty(f1(a)) to tx(f2(a)),ty(f2(a))
draw line tx(f2(a)),ty(f2(a)) to tx(f3(a)),ty(f3(a))
draw line tx(f3(a)),ty(f3(a)) to tx(f4(a)),ty(f4(a))
draw line tx(f4(a)),ty(f4(a)) to tx(f1(a)),ty(f1(a))
end if
end if
return
rotate:
'Rotate And Scale Each Point Store Result
for a=1 to points
x1=x(a)
y1=y(a)
z1=z(a)
'X,Y,Z rotations
xx=x1
yy=y1*cs(xr)+z1*sn(xr)
zz=z1*cs(xr)-y1*sn(xr)
y1=yy
x1=xx*cs(yr)-zz*sn(yr)
z1=xx*sn(yr)+zz*cs(yr)
zz=z1
xx=x1*cs(zr)-y1*sn(zr)
yy=x1*sn(zr)+y1*cs(zr)
'Apply Perspective
dv=(zz/30)+1
xx=size*(xx/dv)+sw/2
yy=size*(yy/dv)+sh/2
tx(a)=xx
ty(a)=yy
tz(a)=zz
next a
xr=xr+4
yr=yr+3
zr=zr+1
if xr>720 then xr=xr-720
if yr>720 then yr=yr-720
if zr>720 then zr=zr-720
return
initialize:
'Open Gfx Screen
graphics
sw=screen_width()
sh=screen_height()
'Define the necessary variables
pi=3.1415
size=8 ' how big do you want it?
points=8 ' The amount of points in the object
faces=6 ' The Amount of faces in the object
dim cfx(6),cfy(6)
dim ctx(4),cty(4)
dim x(points+1) 'Original X co-ordinate store
dim y(points+1) 'Original Y co-ordinate store
dim z(points+1) 'Original Z co-ordinate store
dim tx(points+1) 'Transformed X co-ordinate store
dim ty(points+1) 'Transformed Y co-ordinate store
dim tz(points+1) 'Transformed Z co-ordinate store
dim f1(faces+1) 'Connections definition
dim f2(faces+1) 'Connections definition
dim f3(faces+1) 'Connections definition
dim f4(faces+1) 'Connections definition
dim cr(faces+1) 'Red Component
dim cg(faces+1) 'Green Component
dim cb(faces+1) 'Blue Component
dim cls(faces+1) 'Cell Shade Face?
'Define Sine Tables for faster matrix calculations;
dim cs(721)
dim sn(721)
for ang=1 to 720
cs(ang)=cos(ang*(pi/360))
sn(ang)=sin(ang*(pi/360))
next ang
'Read in the object's points;
for a=1 to points
read x(a),y(a),z(a)
next a
'Read In Connections and face parameters;
for a=1 to faces
read f1(a)
read f2(a)
read f3(a)
read f4(a)
read cr(a),cg(a),cb(a),cls(a)
next a
'The Object Description As Data
'Points definition
'Below are the points of the object defined as x,y,z
data -10,10,10,10,10,10,10,-10,10,-10,-10,10
data -10,10,-10,10,10,-10,10,-10,-10,-10,-10,-10
'Connection definition;
'Below are the faces of the object defined as vertice
'numbers, specified in clockwise order. These are followed
'by r,g,b values for the face and finally cell shaded
'parameter (0)=off (1)=on.
data 1,2,3,4,30,0,0,0
data 5,8,7,6,30,0,0,0
data 6,2,1,5,0,30,0,0
data 8,4,3,7,0,30,0,0
data 2,6,7,3,0,0,30,0
data 8,5,1,4,0,0,30,0
return