home *** CD-ROM | disk | FTP | other *** search
/ The Best of Mecomp Multimedia 2 / MECOMP-CD-II.iso / amiga / tools / libs / graphics3d / src / example / 3dlibdemo.e < prev    next >
Encoding:
Text File  |  1998-04-21  |  6.5 KB  |  328 lines

  1.  
  2. /*** Routin of test for graphics3d.library **/
  3. /** SEE 3dlib.h also **/
  4.  
  5. PROC main()
  6. DEF a3d:LONG
  7. DEF g:LONG
  8. DEF w:LONG
  9. DEF i:LONG
  10. DEF in:LONG
  11. DEF out:LONG
  12. DEF ob:LONG
  13. DEF np:LONG
  14. DEF d:LONG
  15. DEF s:LONG
  16. DEF cb:LONG
  17. DEF mode:LONG
  18. DEF c1:rgbtype
  19. DEF c2:rgbtype
  20. DEF vdist:LONG
  21. DEF gcolor:LONG
  22. DEF x0:LONG
  23. DEF y0:LONG
  24. DEF pjt:LONG
  25. DEF id:LONG
  26. DEF px:LONG
  27. DEF py:LONG
  28. DEF ay:LONG
  29. DEF ax:LONG
  30. DEF lx:LONG
  31. DEF ly:LONG
  32. DEF lz:LONG
  33. DEF il:LONG
  34. DEF vx:LONG
  35. DEF sx:LONG
  36. DEF ds:LONG
  37. DEF sl:LONG
  38. DEF fa:LONG
  39. DEF fd:LONG
  40. DEF fm:LONG
  41. DEF buf[100]:STRING
  42.  
  43.  
  44. WriteF('INIZIALIZZAZIONE ...\n')
  45.  
  46. s:=OpenS(640,256,5,$8000,'TEST 3DLIBS VERS. IN E')
  47. IF s<=NIL THEN RETURN
  48.  
  49. g:=start_es(s)
  50. IF g<=NIL 
  51.     CloseS(s)
  52.     RETURN
  53. ENDIF
  54.  
  55. w:=gad_w(g,20,20,550,180,'prova 3dlib',13)
  56.  
  57. WriteF('window=\d\n',w)
  58.  
  59. /** set mode cursor for object and initial light position **/
  60. fm:=0
  61. sl:=16
  62. il:=1*FIXV
  63. lx:=0
  64. ly:=0
  65. lz:=sl*9
  66. /********************************/
  67.  
  68. /** OPEN AND INITIALIZE A NEW 3D SPACE **/
  69. a3d:=display3d(w,0,0,350,150,300)
  70. IF a3d=NIL THEN JUMP abort_b
  71. /***************************************/
  72.  
  73. /** TEST FUNCTION INTEGER <-> FIXPOINT ***/
  74. i:=12
  75. WriteF('i2f=\d\n',Gd_int2fix({i},{out}))
  76. WriteF('f2i=\d\n',Gd_fix2int({out},{in}))
  77. WriteF('orig=\d int=\d fix=\d \n',i,in,out)
  78. /****************************************/
  79.  
  80. /** DEFINE TWO SFUMATE COLOURS, FOR FLAT SHADING **/ 
  81. c1.r:=0
  82. c1.g:=0
  83. c1.b:=0
  84. c2.r:=15
  85. c2.g:=8
  86. c2.b:=0
  87. Gd_touchpalette(a3d,16,30,c1,c2)
  88. c1.r:=0
  89. c1.g:=0
  90. c1.b:=0
  91. c2.r:=0 
  92. c2.g:=8
  93. c2.b:=15
  94. Gd_touchpalette(a3d,1,15,c1,c2)
  95. /**************************************************/
  96.  
  97. /** SET DEFAULT SOLID SHADING **/
  98. cb:=1
  99. mode:=SOLID
  100. /*******************************/
  101.  
  102. /** DEFINE A NEW ASPECT RATIO FOR A 640x256 SCREEN **/
  103. Gd_aspectratio(a3d,FIXV/2)
  104. /****************************************************/
  105.  
  106. /** CREATE AND POSITION OF #1 OBJECT *****/
  107. WriteF('Leggo #1 oggetto...\n')
  108. i:=plgloadobject(a3d,'rad.plg',1*FIXV)
  109. IF i<>0 THEN Gd_positionobject(a3d,500*FIXV,0,560*FIXV)
  110.  
  111. /** CREATE AND POSITION OF 2# OBJECT *****/
  112. WriteF('Leggo #2 oggetto...\n')
  113. i:=plgloadobject(a3d,'sfera.plg',2*FIXV)
  114. IF i<>0 THEN Gd_positionobject(a3d,200*FIXV,10*FIXV,800*FIXV)
  115.  
  116. /** CREATE AND POSITION OF #3 OBJECT *****/
  117. WriteF('Leggo #3 oggetto...\n')
  118. i:=plgloadobject(a3d,'cube.plg',1*FIXV)
  119. IF i<>0 THEN Gd_positionobject(a3d,0,0,100*FIXV)
  120.  
  121. /** CREATE AND POSITION OF #4 OBJECT *****/
  122. WriteF('Leggo #4 oggetto...\n')
  123. plgloadobject(a3d,'pyramid.plg',2*FIXV)
  124. IF i<>0 THEN i:=Gd_positionobject(a3d,400*FIXV,0,750*FIXV)
  125. /*****************************************/
  126.  
  127. Gd_frustum(a3d,-500,16000)           /* CHANGE SOME SETTINGS */
  128. Gd_clipmode(a3d,ZPLANE)             /* EITHER #FRUSTUM OR #ZPLANE */
  129. Gd_createlightsource(a3d,lx,ly,lz)  /* PLACE THE LIGHT SOURCES */
  130. Gd_ambientlight(a3d,il)             /* SET THE INITIAL LIGHT INTENSITY */ 
  131. Gd_positioncamera(a3d,0,0,-800*FIXV)
  132.             /* CAMERA AT SOME HEIGHT OFF THE GROUND */
  133.  
  134. /** SET OFF ALL SCENE 3D PARAMETERS **/
  135. /** CHANGE COLOUR OF VISUALIZATION BOX **/
  136. gcolor:=4
  137. /** CHANGE OBSERVER DISTANCE **/
  138. vdist:=200
  139. /** CHANGE BOX ORIGIN **/
  140. x0:=10
  141. y0:=10
  142. /** CHANGE TYPE OF PROJECTION (experimental) **/
  143. pjt:=PARAL_P
  144.  
  145. WriteF('cp. esi=\d\n',Gd_cascene(a3d,[ CS_GCOLOR,gcolor,
  146.     CS_VDIST,vdist,
  147.     CS_NPX0,x0,
  148.     CS_NPY0,y0,
  149.     END_T,NIL]:tag3d))
  150. /*****************************************/
  151.  
  152. /*** RECALC THE VIEWING ***/
  153. Gd_newview(a3d)
  154. /*** REDRAW THE VIEWING ***/
  155. Gd_paintframe(a3d)
  156. /*** VISUALIZING THE VIEWING ***/ 
  157. Gd_switch_rp(a3d)
  158.  
  159. mouse_ON(g)
  160.  
  161. IF fm=0 THEN StringF(buf,'objects')
  162. IF fm=1 THEN StringF(buf,'lights ')
  163. TextF(380,60,'c_mode :\s',buf)
  164. TextF(380,70,'x=\d y=\d z=\d ',lx,ly,lz)
  165. TextF(380,80,'light int.:\d ',il)
  166.  
  167. ay:=0
  168. ax:=90
  169. vx:=0
  170. sx:=FIXV
  171. ds:=Shr(FIXV,4)
  172. d:=0
  173. ob:=-1
  174. WHILE (pause(g)=NIL)
  175.     fa:=0
  176.     d:=0
  177.     i:=inkey(g)
  178.     SELECT i
  179.         /** switch object-light mode cursor **/
  180.         CASE "l"
  181.             fm:=fm+1
  182.             IF fm>1 THEN fm:=0
  183.             fa:=1
  184.         /** SWITCH ON-OFF POLIGONS BORDER ***/ 
  185.         CASE "b"
  186.             IF cb=1 THEN cb:=-1 ELSE cb:=1
  187.             Gd_changeviewmode(a3d,mode,cb)
  188.         /** SET WIRE FRAME SHADING ***/
  189.         CASE "w"
  190.             mode:=WIREF    
  191.             Gd_changeviewmode(a3d,mode,cb)
  192.         /** SET SOLID SHADING **/
  193.         CASE "s"
  194.             mode:=SOLID    
  195.             Gd_changeviewmode(a3d,mode,cb)
  196.         /** SET FLAT SHADING **/
  197.         CASE "f"
  198.             mode:=FLAT     
  199.             Gd_changeviewmode(a3d,mode,cb)
  200.         CASE CDE
  201.             IF fm=NIL
  202.                 ay:=ay+2
  203.             ELSE
  204.                 lx:=lx-sl
  205.             ENDIF
  206.             fa:=1
  207.         CASE CSI
  208.             IF fm=NIL
  209.                 ay:=ay-2
  210.             ELSE
  211.                 lx:=lx+sl
  212.             ENDIF
  213.             fa:=1
  214.         CASE CSU
  215.             IF fm=NIL
  216.                 ax:=ax+2
  217.             ELSE
  218.                 ly:=ly+sl
  219.             ENDIF
  220.             fa:=1
  221.         CASE CGIU
  222.             IF fm=NIL
  223.                 ax:=ax-2
  224.             ELSE
  225.                 ly:=ly-sl
  226.             ENDIF
  227.             fa:=1
  228.         CASE "i"
  229.             IF fm=NIL
  230.                 sx:=sx+ds
  231.             ELSE
  232.                 il:=il+(FIXV/2)
  233.                 IF il>(14*FIXV) THEN il:=14*FIXV
  234.             ENDIF
  235.             fa:=1
  236.         CASE "o"
  237.             IF fm=NIL
  238.                 sx:=sx-ds
  239.                 IF sx<=0 THEN sx:=sx+ds ELSE fa:=1
  240.             ELSE
  241.                 il:=il-(FIXV/2)
  242.                 IF il<0 THEN il:=0
  243.                 fa:=1
  244.             ENDIF
  245.         CASE "8"
  246.         /** MOVE THE VIEWER TO THE SCREEN ***/
  247.             IF fm=0    
  248.                 d:=40*FIXV
  249.                 Gd_moveforward(a3d,d)
  250.             ELSE
  251.                 lz:=lz+sl
  252.                 fa:=1
  253.             ENDIF
  254.         CASE "2"
  255.         /** MOVE THE VIEWER FROM THE SCREEN ***/
  256.             IF fm=0
  257.                 d:=-40*FIXV        
  258.                 Gd_moveforward(a3d,d)
  259.             ELSE
  260.                 lz:=lz-sl
  261.                 fa:=1
  262.             ENDIF
  263.         CASE "4"
  264.         /** CHANGE THE ANGLE OF VIEW TO LEFT **/
  265.             vx:=vx+1
  266.             Gd_viewangle(a3d,0,vx,0)
  267.         CASE "6"
  268.         /** CHANGE THE ANGLE OF VIEW TO RIGHT **/
  269.             vx:=vx-1
  270.             Gd_viewangle(a3d,0,vx,0)
  271.     ENDSELECT    
  272.  
  273.     np:=mouse(g)
  274.     IF np=1
  275.         px:=mouseX(g)
  276.         py:=mouseY(g)
  277.         TextF(380,20,'oggetto id#   ',ob)
  278.         TextF(380,30,'poligono n#   ',np)
  279.         TextF(380,40,'Ax=\d Ay=\d sx=\d  ',ax,ay,sx)
  280.         TextF(380,50,'X=\d y=\d ',px,py)
  281.     /** TEST IF AT POINT(px,py) IS PRESENT A POLIGON AND AN OBJECT **/ 
  282.         ob:=Gd_pickobj(a3d,{np},px,py)
  283.         IF ob>NIL
  284.             TextF(380,20,'oggetto id#\d ',ob)
  285.             TextF(380,30,'poligono n#\d ',np)
  286.         ENDIF                    
  287.     ENDIF
  288.         
  289.     IF fa 
  290.         IF fm=0 THEN StringF(buf,'objects')
  291.         IF fm=1 THEN StringF(buf,'lights ')
  292.         TextF(380,60,'c_mode :\s',buf)
  293.         IF (fm=0) AND (ob>0)
  294.     /** SET THE TRASFORMATION TO THE EVENTUALLY PICKED OBJECT **/
  295.             TextF(380,40,'Ax=\d Ay=\d sx=\d  ',ax,ay,sx)
  296.             Gd_setobj(a3d,ob)
  297.             Gd_rotateobject(a3d,ax,0,ay)
  298.             Gd_scaleobject(a3d,sx,sx,sx)
  299.         ENDIF
  300.         IF fm 
  301.     /** CHANGE LIGHT POSITION **/
  302.             TextF(380,70,'x=\d y=\d z=\d ',lx,ly,lz)
  303.             Gd_createlightsource(a3d,lx,ly,lz)
  304.     /** CHANGE LIGHT INTENSITY **/
  305.             TextF(380,80,'light int.:\d ',il)
  306.             Gd_ambientlight(a3d,il)
  307.         ENDIF
  308.     ENDIF    
  309.     IF i>=NIL 
  310.     /*** RECALC THE VIEWING ***/
  311.         Gd_newview(a3d)
  312.     /*** REDRAW THE VIEWING ***/
  313.         Gd_paintframe(a3d)
  314.     /*** VISUALIZING THE VIEWING ***/ 
  315.         Gd_switch_rp(a3d)
  316.     ENDIF
  317. ENDWHILE
  318.  
  319. WriteF('termino.. \n')
  320. /** CLOSE AND DESTROY ALL DEFINITION CREATE BY display3d **/
  321. abort_b:
  322. close_display3d(a3d)
  323. gad_cw(g)
  324. end(g,1)
  325. CloseS(s)
  326.  
  327. ENDPROC    
  328.