![]() Having found Forth many years ago I was reading "Jim Blins Corner"[1] when he described a simple language to describe animation of his "blobby man". I thought gee that could almost be Forth so I decided to implement a Forth in C. Forth for me was a bit restrictive so I added floating point constants, 32 bit integers and double quoted strings ("...") just to make life easy.
I also added builtin transformation words (equivalent to Jim's) and basic
graphics words. Also predefined unit sphere, cube and pyramid. Here are some examples of Bogong:
[1] Jim Blinn's Corner
IEEE Computer Graphics and Applications October 1987 |
VARIABLE XLOOK
VARIABLE YLOOK
VARIABLE ZLOOK
VARIABLE ANGLE
: SCENE
60 DELAY FRAME
PUSH 7 COLOUR GRID POP
PUSH 0. 0. 1. TRAN 20. DEG 3 ROT 4 COLOUR CUBE POP
PUSH .3 .4 .5 SCAL -5. -3.8 1. TRAN 12 COLOUR CUBE POP
PUSH 0. 0. 3. TRAN 20. DEG 3 ROT 3 COLOUR SPHERE POP
PUSH
14 COLOUR 2. -2. 0. MOVE 1.5 -1.5 2. DRAW 1. -2. 0. DRAW
1. -1. 0. DRAW 1.5 -1.5 2. DRAW 2. -1. 0. DRAW 2. -2. 0. DRAW
1. -2. 0. DRAW DROP DROP 1. -1. 0. MOVE 2. -1. 0. DRAW DROP DROP
POP
ANGLE @ 1.0 f+ DEG DUP ANGLE ! DUP DUP 1 ROT 2 ROT 3 ROT
;
: MOVIE BEGIN SCENE 1 - DUP 0 = UNTIL ;
0. 0. 1.0 1.0 VIEWPORT
0. DEG ANGLE !
45. DEG 6.2 11.8 PERS 0. -1.41 9. TRAN -80. DEG 1 ROT 48. DEG 3 ROT
1. 1. -1. SCAL
1000 DELAY
360 MOVIE
2000 DELAY
FINISH
Here is Jim Blinns blobby man in Bogong.
: CHS 0. SWAP f- ;
VARIABLE RZM 0. DEG ,
VARIABLE FOV 45. DEG ,
VARIABLE ZN 5.17 ,
VARIABLE ZF 10.7 ,
VARIABLE XSCR -0.1 ,
VARIABLE YSCR -1.6 ,
VARIABLE ZSCR 7.9 ,
VARIABLE BACK -90. DEG ,
VARIABLE SPIN -30. DEG ,
VARIABLE TILT 0. DEG ,
VARIABLE XLOOK 0. ,
VARIABLE YLOOK 0. ,
VARIABLE ZLOOK 0. ,
VARIABLE XM 0. ,
VARIABLE YM 0. ,
VARIABLE ZM 1.75 ,
VARIABLE EXTEN 0. DEG ,
VARIABLE ROTAT 0. DEG ,
VARIABLE BTWIS 0. DEG ,
VARIABLE NOD 0. DEG ,
VARIABLE NECK 0. DEG ,
VARIABLE RHIP 0. DEG ,
VARIABLE LHIP 0. DEG ,
VARIABLE LSID 0. DEG ,
VARIABLE RSID 0. DEG ,
VARIABLE ROUT 0. DEG ,
VARIABLE LOUT 0. DEG ,
VARIABLE LSHOU 0. DEG ,
VARIABLE RSHOU 0. DEG ,
VARIABLE RTWIS 0. DEG ,
VARIABLE LTWIS 0. DEG ,
VARIABLE LATWIS 0. DEG ,
VARIABLE RATWIS 0. DEG ,
VARIABLE RKNEE 0. DEG ,
VARIABLE LKNEE 0. DEG ,
VARIABLE LELBO 0. DEG ,
VARIABLE RELBO 0. DEG ,
VARIABLE LANKL 0. DEG ,
VARIABLE RANKL 0. DEG ,
: HEAD PUSH 0. 0. 0.4 TRAN 0.2 0.23 0.3 SCAL SPHERE POP
PUSH 0. -0.255 0.42 TRAN 0.035 0.075 0.036 SCAL SPHERE POP
PUSH 0. 0. 0.07 TRAN 0.065 0.065 0.14 SCAL SPHERE POP
PUSH 0. -0.162 0.239 TRAN 0.0533 0.0508 0.0506 SCAL SPHERE POP
;
: UPARM PUSH 0. 0. -0.275 TRAN 0.09 0.09 0.275 SCAL SPHERE POP
;
: LOWARM PUSH 0. 0. -0.25 TRAN 0.08 0.08 0.25 SCAL SPHERE POP
;
: HAND PUSH 0. 0. -0.116 TRAN 0.052 0.091 0.155 SCAL SPHERE POP
;
: THIGH PUSH 0. 0. -0.425 TRAN 0.141 0.141 0.425 SCAL SPHERE POP
;
: CALF PUSH 0.05 0.05 0.05 SCAL SPHERE POP
PUSH 0. 0. -0.425 TRAN 0.1 0.1 0.425 SCAL SPHERE POP
;
: FOOT PUSH 0.05 0.04 0.04 SCAL SPHERE POP
PUSH 0. 0.05 -0.05 TRAN 0.04 0.04 0.04 SCAL SPHERE POP
PUSH 0. -0.15 -0.05 TRAN -10. DEG 1 ROT 0.08 0.19 0.05 SCAL
SPHERE POP
;
: LEFT_LEG PUSH THIGH 0. 0. -0.85 TRAN LKNEE @ 1 ROT CALF
0. 0. -0.84 TRAN LANKL @ 1 ROT FOOT POP
;
: RGHT_LEG PUSH THIGH 0. 0. -0.85 TRAN RKNEE @ 1 ROT CALF
0. 0. -0.84 TRAN RANKL @ 1 ROT FOOT POP
;
: LEFTARM PUSH UPARM 0. 0. -0.55 TRAN LELBO @ 1 ROT LOWARM
0. 0. -0.5 TRAN HAND POP
;
: RGHTARM PUSH UPARM 0. 0. -0.55 TRAN RELBO @ 1 ROT LOWARM
0. 0. -0.5 TRAN HAND POP
;
: SHOULDER PUSH 0.45 0.153 0.12 SCAL SPHERE POP
PUSH 0. 0. 0.153 TRAN NOD @ 1 ROT NECK @ 3 ROT HEAD POP
PUSH -0.45 0. 0. TRAN LSID @ 2 ROT LSHOU @ 1 ROT LATWIS @ 3 ROT
LEFTARM POP PUSH 0.45 0. 0. TRAN RSID @ 2 ROT RSHOU @ 1 ROT
RATWIS @ 3 ROT RGHTARM POP
;
: BODY PUSH 0. 0. 0.62 TRAN 0.306 0.21 0.5 SCAL SPHERE POP
PUSH 0. 0. 1. TRAN EXTEN @ 1 ROT BTWIS @ 2 ROT ROTAT @ 3 ROT
SHOULDER POP
;
: TORSO PUSH -0.178 0. 0. TRAN LEFT_LEG POP
PUSH 0.178 0. 0. TRAN RGHT_LEG POP
PUSH 0. 0. 0.08 TRAN 0.275 0.152 0.153 SCAL SPHERE POP
PUSH EXTEN @ 1 ROT BTWIS @ 2 ROT ROTAT @ 3 ROT BODY POP
;
: SCENE GRID PUSH XM @ YM @ ZM @ TRAN RZM @ 3 ROT TORSO POP
;
: WORLD FOV @ ZN @ ZF @ PERS XSCR @ YSCR @ ZSCR @ TRAN BACK @ 1 ROT
SPIN @ 3 ROT TILT @ 1 ROT XLOOK @ CHS YLOOK @ CHS ZLOOK @ CHS TRAN
1. 1. -1. SCAL SCENE
;
0. 0. 1. 1. VIEWPORT
: ASTEP
0. XM ! 0. YM !
0. DEG NOD ! 0. DEG NECK !
0. DEG RHIP ! 0. DEG ROUT ! 0. DEG RTWIS ! 0. DEG RKNEE !
0. DEG LSID ! 0. DEG LATWIS ! 0. DEG LELBO !
0. DEG RSID ! 0. DEG RSHOU ! 0. DEG RATWIS ! 0. DEG RELBO !
80 DELAY FRAME
PUSH WORLD POP
-25. DEG NOD ! 28. DEG NECK !
80 DELAY FRAME
PUSH WORLD POP
105. DEG RHIP ! 13. DEG ROUT ! -86. DEG RTWIS ! -53. DEG RKNEE !
80 DELAY FRAME
PUSH WORLD POP
-45. DEG LSID ! -90. DEG LATWIS ! 90. DEG LELBO !
80 DELAY FRAME
PUSH WORLD POP
112. DEG RSID ! 40. DEG RSHOU ! -102. DEG RATWIS ! 85. DEG RELBO !
80 DELAY FRAME
PUSH WORLD POP
;
: DANCE BEGIN ASTEP 1 - DUP 0 = UNTIL ;
14 COLOUR
2500 DANCE
FINISH