home *** CD-ROM | disk | FTP | other *** search
/ The Best of Mecomp Multimedia 2 / MECOMP-CD-II.iso / amiga / tools / libs / graphics3d / src / example / 3dlib.h < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-13  |  10.1 KB  |  398 lines

  1. /*******************************************************
  2.  ** Libreria di routin grafiche per la visualizzazione
  3.  ** in 3d .
  4.  ** Traslata in E V2.1b dalla libreria :
  5.  ** 2B3D Blitz Basic II 3D Graphics Engine Version 0.9 Beta
  6.  ** di Maciej R. Gorny
  7.  **
  8.  ** Autore del porting :
  9.  ** 1997 Patrizio Biancalani
  10.  ** NOTA: 
  11.  ** Nel porting tutte le variabili float sono state mutate
  12.  ** in variabili LONG intese pero' col formato 
  13.  ** a virgola fissa :val.float*FIXV
  14.  ** Questo per 2 motivi:
  15.  ** - E' piu' veloce anche su macchine senza coprocessore
  16.  ** - IL compilatore E V2.1B non tratta direttamente i numeri float
  17.  ** RICORDARSI SEMPRE :
  18.  ** in questa versione dell'E il simbolo
  19.  ** * significa prodotto tra 16bit*16bit=32bit
  20.  ** / significa divisione tra 32bit/16bit=16bit
  21.  ** quindi prestare MOLTA attenzione ai valori che possono
  22.  ** assumere in numeri in virgola fissa quando si usano 
  23.  ** questi valori
  24.  *******************************************************/
  25. #ifdef M68020
  26. /* inserito per usare funzioni ottimizzate con codice per 68020 */
  27. MODULE '3dlib-020'
  28. #endif
  29.  
  30. #ifndef M68020
  31. /* se si genera codice per 68000 allora uso Div() e Mul() dell'E */
  32.     #define div(a,b) Div(a,b)
  33.     #define mul(a,b) Mul(a,b)
  34. #endif
  35.  
  36. MODULE 'graphics','graphics/rastport','graphics/clip','layers'
  37. MODULE 'graphics/regions','graphics/gfx','graphics/layers'
  38.  
  39. /** 
  40.    moduli per poter usare la nuova libreria graphics3D.library al posto della
  41.    gfx.h
  42. **/
  43. MODULE 'graphics3D','graphics3D_lib'
  44.  
  45. /*** INIZIO CODICI ESEGUIBILI ***/
  46.  
  47. /*** ROUTIN DI USO ANCHE ESTERNO ***/
  48.  
  49. /************************************************
  50.  * apertura e inizializzazione dell'ambiente 3D * 
  51.  * restituisce puntatore ad area generale da    *
  52.  * indicare sempre al richiamo delle altre      *
  53.  * routin.                    *
  54.  ************************************************
  55.  *** INPUT :                    *
  56.  * win  -> puntatore a finestra su cui si vuol  *
  57.  *         operare.                *
  58.  * x0   -> coord. X origine finestra di vis.    *
  59.  * y0   -> coord. Y origine finestra di vis.    *
  60.  * scrw -> larghezza finestra per mondo 3D.     *
  61.  * scrh -> altezza finestra per mondo 3D.       *
  62.  * vdist-> distanza tra osservatore e piano di  *
  63.  *         proiezione.                    *
  64.  *** OUTPUT:                    *
  65.  * puntatore a struttura ambient3d da usarsi in *
  66.  * ingresso di quasi tutte le altre funzioni.   *
  67.  * > 0 allora tutto ok.                *
  68.  * =0 allora errore, operazione fallita.        * 
  69.  ************************************************/
  70. PROC display3d(win:PTR TO window,x0:LONG,y0:LONG,
  71.         scrw:LONG,scrh:LONG,vdist:LONG)
  72. DEF     ris:LONG 
  73.  
  74. ris:=NIL
  75. graphics3dbase:=NIL
  76. IF ((graphics3dbase:=OpenLibrary('graphics3D.library',11))<=NIL) THEN RETURN 0
  77.  
  78. ris:=Gd_display3d(win,x0,y0,scrw,scrh,vdist)
  79.  
  80. WriteF('ris=\d\n',ris)
  81.  
  82. ENDPROC ris
  83.  
  84. /************************************************
  85.  * chiusura ed eliminazione dell'ambiente 3D    * 
  86.  ************************************************
  87.  *** INPUT :                    *
  88.  * in -> valore >0 restituito da display3d.     *
  89.  *** OUTPUT:                    *
  90.  * nessuno.                    *
  91.  ************************************************/
  92. PROC close_display3d(in:LONG)
  93. DEF i:LONG
  94.  
  95. IF in<>NIL THEN Gd_close_display3d(in)
  96.  
  97. IF graphics3dbase>NIL 
  98.     CloseLibrary(graphics3dbase)
  99.     RETURN
  100. ENDIF
  101.  
  102. ENDPROC
  103.  
  104. /************************************************
  105.  ** legge i dati di un oggetto da un file .PLG **
  106.  ** e li inserisce nel mondo 3d come un nuovo  **
  107.  ** oggetto.                       ** 
  108.  ************************************************
  109.  *** INPUT :                        * 
  110.  * in -> valore > 0 restituito da display3d.    *
  111.  * fname -> puntatore a stringa con nome file.  *
  112.  * scalar-> fattore di scala per oggetto.       *
  113.  *          (valore in FIXPOINT).        *
  114.  *** OUTPUT:                    *
  115.  * >0 tutto ok, oggetto letto.            *
  116.  * =0 operazione fallita.            *
  117.  ************************************************/
  118. PROC plgloadobject(in:LONG,fname:PTR TO CHAR,scalar:LONG)
  119. DEF total_vertices:LONG,
  120.     total_polys:LONG,
  121.     num_vertices:LONG,
  122.     color_des:LONG,
  123.     logical_color:LONG,
  124.     shading:LONG,
  125.     index:LONG,
  126.     ln:LONG,
  127.     tempword:LONG,
  128.     p1:LONG,
  129.     p2:LONG,
  130.     p3:LONG,
  131.     p4:LONG,    
  132.     tempbyte:LONG,
  133.     t:LONG,
  134.     k:LONG,
  135.     v:vertex,
  136.     vl:PTR TO LONG,
  137.     temp[500]:ARRAY,
  138.     sbuffer[100]:ARRAY,
  139.     name[50]:ARRAY,
  140.     tempstr[50]:ARRAY,
  141.     file:LONG,
  142.     col:LONG,
  143.     cl:LONG,
  144.     cc:LONG,
  145.     cs:LONG,
  146.     i:LONG,
  147.    esi:LONG
  148.  
  149. esi:=0
  150. file:=Open(fname,OLDFILE)
  151. IF file=NIL THEN RETURN 0
  152. ln:=0
  153. cs:=0
  154. WHILE ((cl:=Read(file,temp,495))>NIL)
  155.     cc:=0
  156.     WHILE (cc<cl)
  157.         sbuffer[cs++]:=temp[cc++]
  158.         IF (sbuffer[cs-1]=$0D) OR (sbuffer[cs-1]=$0A) 
  159.             sbuffer[cs]:=0
  160. /** mettere qui codici di lettura dati da file **/
  161.     plggetline(sbuffer)
  162.     IF StrLen(sbuffer)>3    /* test se linea non vuota */
  163.         INC ln
  164.         IF ln=1        
  165.             tempbyte:=lstr(sbuffer,name,0)        
  166.             tempbyte:=lstr(sbuffer,tempstr,tempbyte)
  167.             total_vertices:=Val(tempstr,{i})
  168.             lstr(sbuffer,tempstr,tempbyte)
  169.             total_polys:=Val(tempstr,{i})
  170.             t:=Gd_newobj(in,name,total_polys,total_vertices)
  171.             IF t=NIL THEN JUMP abort
  172.         /** valori fix point **/
  173.         ELSEIF (ln>=2) AND ((total_vertices+1)>=ln)
  174.             tempbyte:=lstr(sbuffer,tempstr,0)
  175.             v.x:=Val(tempstr,{i})
  176.             tempbyte:=lstr(sbuffer,tempstr,tempbyte)
  177.             v.y:=Val(tempstr,{i})
  178.             lstr(sbuffer,tempstr,tempbyte)
  179.             v.z:=Val(tempstr,{i})
  180.             v.x:=mul(v.x,scalar)
  181.             v.y:=mul(v.y,scalar)
  182.             v.z:=mul(v.z,scalar)
  183.             Gd_addobjvertex(in,ln-2,v.x,v.y,v.z)
  184.         ELSEIF (total_vertices+2<=ln) AND 
  185.             (total_polys+total_vertices+1>=ln)
  186.             tempbyte:=lstr(sbuffer,tempstr,0)
  187.     /** implementati dec. hex($,0x) e binary(%) **/
  188.             IF (tempstr[0]="0") AND (tempstr[1]="x") 
  189.                 tempstr[0]:=" "
  190.                 tempstr[1]:="$"
  191.             ENDIF
  192.             color_des:=Val(tempstr,{i})
  193.             tempbyte:=lstr(sbuffer,tempstr,tempbyte)
  194.             tempword:=total_vertices+2
  195.             num_vertices:=Val(tempstr,{i})
  196.             index:=ln-tempword
  197.             
  198.             p2:=-1
  199.             p3:=-1
  200.             p4:=-1    
  201.             IF num_vertices>0
  202.                 tempbyte:=lstr(sbuffer,tempstr,tempbyte)
  203.                 p1:=Val(tempstr,{i})
  204.             ENDIF
  205.             IF num_vertices>1
  206.                 tempbyte:=lstr(sbuffer,tempstr,tempbyte)
  207.                 p2:=Val(tempstr,{i})
  208.             ENDIF
  209.             IF num_vertices>2
  210.                 tempbyte:=lstr(sbuffer,tempstr,tempbyte)
  211.                 p3:=Val(tempstr,{i})
  212.             ENDIF
  213.             IF num_vertices>3
  214.                 tempbyte:=lstr(sbuffer,tempstr,tempbyte)
  215.                 p4:=Val(tempstr,{i})
  216.             ENDIF
  217.  
  218.             Gd_addobjpoly(in,index,p1,p2,p3,p4)
  219.             col:=And($FF,color_des)
  220.             IF col<16 THEN col:=1
  221.             IF col>16 THEN col:=16
  222.             Gd_cattpoly(in,index,col,Shr(color_des,12))
  223.         ENDIF
  224.     ENDIF
  225. /****************************************/
  226.             cs:=0
  227.         ENDIF
  228.     ENDWHILE
  229. ENDWHILE
  230. Gd_recalcobj(in)
  231. esi:=1
  232.  
  233. abort:
  234. Close(file)
  235.  
  236. ENDPROC esi
  237.  
  238. /*** ROUTIN DI USO SOLO INTERNO ***/
  239.  
  240. /******************************************************/
  241. /** elimina i commenti da una stringa di un file PLG **/
  242. /******************************************************/
  243. PROC plggetline(strl:PTR TO CHAR)
  244. DEF i:LONG
  245. DEF a:LONG
  246. DEF f:LONG
  247. DEF lens:LONG
  248.  
  249. f:=0
  250. a:=0
  251. lens:=StrLen(strl)
  252. FOR i:=0 TO lens
  253.     IF (strl[i]<>32) THEN f:=1
  254.     IF f<>NIL
  255.         IF (strl[i]="#") OR (strl[i]=";") 
  256.             i:=lens
  257.         ELSE
  258.             strl[a]:=strl[i]
  259.             INC a
  260.         ENDIF
  261.     ENDIF
  262. ENDFOR
  263.  
  264. strl[a]:=0
  265.  
  266. ENDPROC
  267.  
  268. /*************************************************/
  269. /** in str mette la prima sequenza di caratteri **/
  270. /** diversi da spazio che trova in s a partire  **/
  271. /** da start, str deve essere lunga a sufficenza**/
  272. /** ritorno prima pos. dopo sequenza.        **/
  273. /*************************************************/
  274. PROC lstr(s:PTR TO CHAR,str:PTR TO CHAR,start:LONG)
  275. DEF esi:LONG
  276. DEF f:LONG
  277. DEF ls:LONG
  278. DEF esif:LONG
  279. esi:=0
  280. f:=start
  281. ls:=StrLen(s)
  282.  
  283. /** elimino eventuali spazi precedenti **/
  284. WHILE ((f<ls) AND ((s[f]=" ") OR (s[f]=$0A) OR (s[f]=$0D))) DO INC f
  285. /** calcolo lunghezza sequenza caratteri <> " " **/
  286. esif:=esi+f
  287. WHILE (((esif)<ls) AND (s[esif]<>" ") AND
  288.     (s[esif]<>$0A) AND (s[esif]<>$0D))
  289.     str[esi]:=s[esif] 
  290.     INC esi
  291.     INC esif
  292. ENDWHILE
  293. str[esi]:=0
  294.  
  295. ENDPROC esi+f
  296.  
  297. /**** FINE ROUTIN ***/
  298.  
  299. /*** ROUTIN DI USO SOLO PER TEST **/
  300.  
  301.  
  302. /*************************************************/
  303. /** stampa contenuto delle strutture polytemp   **/
  304. /*************************************************/
  305. /*
  306. PROC printpolyt(in:LONG)
  307. DEF i:LONG
  308. DEF pt:PTR TO polytemp
  309.  
  310.  
  311. pt:=in.worldpolys
  312. FOR i:=0 TO in.total_polys
  313.     WriteF('pol#\d\n',i)
  314.     WriteF('seg#1 X=\d Y=\d\n',pt[i].x1,pt[i].y1)
  315.     WriteF('seg#2 X=\d Y=\d\n',pt[i].x2,pt[i].y2)
  316.     WriteF('seg#3 X=\d Y=\d\n',pt[i].x3,pt[i].y3)
  317.     WriteF('seg#4 X=\d Y=\d\n',pt[i].x4,pt[i].y4)
  318.     WriteF('seg#5 X=\d Y=\d\n',pt[i].x5,pt[i].y5)
  319.  
  320.     WriteF('n#segmenti=\d col=\d\n',pt[i].numpoints,pt[i].shade)
  321.  
  322.     WriteF('vmode=\d\n',pt[i].vmode)
  323.  
  324. ENDFOR
  325.  
  326. ENDPROC
  327. */
  328.  
  329. /*************************************************/
  330. /** stampa contenuto delle strutture objectnode **/
  331. /*************************************************/
  332. /*
  333. PROC objectprint(in:LONG)
  334. DEF id:LONG
  335. DEF io:PTR TO LONG
  336. DEF i:LONG
  337. DEF k:LONG
  338. DEF vo:PTR TO vertex
  339. DEF vl:PTR TO vertex
  340. DEF vg:PTR TO vertex
  341. DEF vc:PTR TO vertex
  342. DEF obj:PTR TO objectnode
  343. DEF pol:PTR TO polygon
  344.  
  345. WriteF('indici oggetti:\n')
  346. io:=in.iobjects
  347. FOR id:=0 TO in.total_objects-1
  348.     WriteF('#\d oggetto id:\d\n',id,io[id])
  349. ENDFOR
  350. FOR id:=0 TO in.total_objects-1
  351.     in.attuale:=id
  352.     obj:=pobj(in)
  353.     vo:=obj.vorig
  354.     vl:=obj.vlocal
  355.     vc:=obj.vcamera
  356.     pol:=obj.polys
  357.     WriteF('id:\d Name:\s\n',obj.id,obj.name)
  358.     WriteF('num. of vert.:\d\n',obj.numverts)
  359.     WriteF('num. of poly.:\d\n',obj.numpolys)
  360.     WriteF('view_mode:\d\n',obj.shade)
  361.     WriteF('state:\d\n',obj.state)
  362.     WriteF('world pos.: X=\d Y=\d Z=\d\n',
  363.         obj.worldposx/FIXV,obj.worldposy/FIXV,obj.worldposz/FIXV)
  364.     WriteF('bounding box:\n max x:\d y:\d z:\d\n min x:\d y:\d z:\d\n',
  365.         obj.xmax,obj.ymax,obj.zmax,obj.xmin,obj.ymin,obj.zmin)
  366.     WriteF('original vertices:\n')
  367.     FOR k:=0 TO obj.numverts-1
  368.         WriteF('\d \d \d\n',vl[k].x/FIXV,
  369.             vl[k].y/FIXV,vl[k].z/FIXV)
  370.     ENDFOR
  371.     WriteF('local vertices:\n')
  372.     FOR k:=0 TO obj.numverts-1
  373.         WriteF('\d \d \d\n',vl[k].x/FIXV,
  374.             vl[k].y/FIXV,vl[k].z/FIXV)
  375.     ENDFOR
  376.     WriteF('camera vertices:\n')
  377.     FOR k:=0 TO obj.numverts-1
  378.         WriteF('\d \d \d\n',vc[k].x/FIXV,
  379.             vc[k].y/FIXV,vc[k].z/FIXV)
  380.     ENDFOR
  381.     WriteF('poligon list:\n')
  382.     FOR i:=0 TO obj.numpolys-1
  383.         WriteF('poligon #\d\n',i)
  384.         WriteF('\d,',pol[i].vertexlist0)
  385.         WriteF('\d,',pol[i].vertexlist1)
  386.         WriteF('\d,',pol[i].vertexlist2)
  387.         WriteF('\d,',pol[i].vertexlist3)
  388.         WriteF('color:\d shade:\d 2-sided:\d\n',
  389.             pol[i].color,pol[i].shade,pol[i].twosided)
  390.         WriteF('visible:\d clipped:\d active:\d\n',
  391.             pol[i].visible,pol[i].clipped,pol[i].active)
  392.     ENDFOR    
  393. ENDFOR
  394.  
  395. ENDPROC
  396. */
  397.  
  398.