aUCBLogo Demos and Tests / cylindertest
be cylindertest
Level1=0.5
Level2=0.8
texx=0
texxd=1
texx2=0
texx2d=-0.1
texxmax=100
mode=1
rings=true
blocking=false
Cyl1=[]
Cyl2=[]
s=(Slider [][Level1] 0 Level1*100 100
[ Level1=SliderValue/100
genRings
drawScene Level1 Level2
] wxsl_inverse+wxsl_vertical+wxsl_labels
[0 0][60 150])
s2=(Slider [][Level2] 0 Level2*100 100
[ Level2=SliderValue/100
genRings
drawScene Level1 Level2
] wxsl_inverse+wxsl_vertical+wxsl_labels
[70 0][60 150])
srot=(Slider [][Rotation] -5 0 5
[ rotateScene4::dphi=SliderValue/5
] wxsl_labels
[0 180][150 50])
sflow=(Slider [][Flow] -100 0 100
[ texxd=SliderValue/50
] wxsl_labels
[0 240][150 50])
rb1=(RadioButton [][Mode1]
[ mode=1
drawScene Level1 Level2
] wxrb_group [0 300])
rb2=(RadioButton [][Mode2]
[ mode=2
drawScene Level1 Level2
] 0 [0 320])
cb_rings=(CheckBox [][Rings]
[ rings=not rings
pr rings
genRings
] 0 [80 300])
CheckBoxSet cb_rings rings
bStop=(Button [][Stop]
[ rotateScene4::stoppingflag="stopping
OnMouseLeftDown []
OnMouseLeftUp []
OnMouseMotion []
redraw
updateGraph
ConsoleSetFocus
] 0 [0 350])
setUpdateGraph false
unperspective
clearScreen
bm=loadImage "water.jpg
tex=Texture bm
setFC "White
PenUp
for [x 0 1]
[ for [y 0 1]
[ setXY x*100 y*100
fillRect [0 0][100 100]
]
]
tex=(Array texxmax 0)
repeat texxmax
[ i=repcount-1
setXY 0 i
tex.i=Texture BitCopy 100 100
]
clearScreen
perspective
hideTurtle
genRings
setEye {0 0 500}{0 0 0}{0 1 0}
drawScene Level1 Level2
; rotatescene
rotatescene4
erase [[][s s2 srot sflow rb1 rb2 cb_rings bStop]]
redraw
updateGraph
be genRings
if blocking [stop]
blocking=true
Cyl1=Graphic
[ enableTexture
setPC HSBA 120 1 1 0.4
RingCylinder Level2*200 80 50
PenUp
forward Level2*200
PenDown
disableTexture
setPC HSBA 120 0.2 1 0.1
RingCylinder (1-Level2)*200 80 50
pu back Level2*200 pd
]
Cyl2=Graphic
[ enableTexture
setPC HSBA 240 1 1 0.4
RingCylinder Level1*200 110 80
PenUp
forward Level1*200
PenDown
disableTexture
setPC HSBA 240 0.2 1 0.1
RingCylinder (1-Level1)*200 110 80
pu back Level1*200 pd
]
blocking=false
end
be RingCylinder l ra ri
if l == 0 [stop]
Cylinder l ra
if rings == true
[ ;disableTexture
down 90
PenDown
Tesselation
[ Circle ra
TessContour
Circle ri
]
up 90
PenUp forward l PenDown
down 90
Tesselation
[ Circle ra
TessContour
Circle ri
]
up 90
PenUp back l PenDown
]
end
be drawScene L1 L2
clearScreen
setPC "black
axes
disableLighting
disableDepthTest
Texture tex.Int texx2
drawGraphic Cyl1
drawGraphic Cyl2
enableLighting
enableDepthTest
Texture tex.Int texx
enableTexture
setPC HSBA 0 1 1 1
Cylinder 200 50
if mode==2
[ Texture tex.Int texx2
drawGraphic Cyl1
drawGraphic Cyl2
]
end
be rotateScene4 [dphi 0][singleshot false][phi 0]
local [eye r dr ddphi theta dtheta center upvector
p p0 phi0 theta0 x y]
stoppingflag="running
eye=array 3
light=array 3
r=500
dr=1.1
theta=30
dtheta=5
center={0 0 0}
upvector={0 1 0}
ddphi=dphi/3
mouseActive=false
; pr [left, right changes rotation speed, up down set pitch, ESC exits]
dispatchMessages
OnMouseLeftDown
[ if not rotatescene4::mouseActive
[ p0=MousePos
phi0=rotatescene4::phi
theta0=rotatescene4::theta
mouseActive=true
]
]
OnMouseMotion
[ if rotateScene4::mouseActive
[ p=MousePos-p0
x= ((p.1*(cos phi)-p.3*sin phi)*cos theta)
+(p.1*(cos phi)-p.2*sin phi)*sin theta
y=p.2
theta=theta0-y/5
phi=phi0-x/5
]
]
OnMouseLeftUp
[ p=MousePos-p0
x= ((p.1*(cos phi)-p.3*sin phi)*cos theta)
+(p.1*(cos phi)-p.2*sin phi)*sin theta
y=p.2
theta=theta0-y/5
phi=phi0-x/5
rotateScene4::mouseActive=false
]
forever
[ eye.1=r*(cos theta)*sin phi
eye.2=r* sin theta
eye.3=r*(cos theta)*cos phi
setEye eye center upvector
light.1=1000*(cos 45)*sin phi+45
light.2=1000* sin 45
light.3=1000*(cos 45)*cos phi+45
setLightPos light
drawscene Level1 Level2
redraw
if singleshot [break]
phi=phi+dphi
texx=mod texx+texxd texxmax
texx2=mod texx2+texx2d texxmax
if key?
[ ;dispatchMessages
local [ch]
ch=readChar
ifelse ch==char 255
[ ch=readCharExt
if ch==WXK_RIGHT [dphi=dphi+ddphi]
if ch==WXK_LEFT [dphi=dphi-ddphi]
if ch==WXK_UP [theta=theta+dtheta]
if ch==WXK_DOWN [theta=theta-dtheta]
if ch==WXK_PRIOR [r=r/dr]
if ch==WXK_NEXT [r=r*dr]
][
if ch==char 27
[ OnMouseLeftDown []
OnMouseLeftUp []
OnMouseMotion []
stop
]
if ch=="+ [r=r-dr]
if ch=="- [r=r+dr]
]
]
if stoppingflag=="stopping [break]
]
end
end