1 /*
2 
3  *****************************************************************************
4  * Author:                                                                   *
5  * ------                                                                    *
6  *  Anton Kokalj                                  Email: Tone.Kokalj@ijs.si  *
7  *  Department of Physical and Organic Chemistry  Phone: x 386 1 477 3523    *
8  *  Jozef Stefan Institute                          Fax: x 386 1 477 3811    *
9  *  Jamova 39, SI-1000 Ljubljana                                             *
10  *  SLOVENIA                                                                 *
11  *                                                                           *
12  * Source: $XCRYSDEN_TOPDIR/C/xcLabels.c
13  * ------                                                                    *
14  * Copyright (c) 1996-2003 by Anton Kokalj                                   *
15  *****************************************************************************
16 
17 */
18 
19 #include <stdio.h>
20 #include <string.h>
21 #include "struct.h"
22 #include "xcfunc.h"
23 
24 /* --- function prototypes --- */
25 void makeRasterFont(void);
26 void makeAtomLabels(void);
27 void makeXYZLabels(void);
28 static void arrow(void);
29 void makeCrdList(void);
30 void makeTemp3D2DList(void);
31 
32 extern GLubyte rasters[][13];
33 extern char *element[];
34 
35 /* extern GLuint xcGenLists( GLsizei i ); */
36 
37 GLuint fontOffset;
38 RasterFontSize rf = {8, 13, 0.0, 0.0, 0.0, 0.0};
39 
40 
41 void
makeRasterFont(void)42 makeRasterFont(void)
43 {
44     GLuint i;
45     glPixelStorei(GL_UNPACK_ALIGNMENT, 1); /* 1 for byte-alignment */
46 
47     fontOffset = xcGenLists (128);
48     for (i = 32; i < 127; i++) {
49 	glNewList(i+fontOffset, GL_COMPILE);
50 	  glBitmap(8, 13, 0.0, 2.0, 10.0, 0.0, rasters[i-32]);
51 	glEndList();
52     }
53 }
54 
55 
56 /*****************************************************************************/
57 /* make lists for atom labels (all elements)
58  */
59 void
makeAtomLabels(void)60 makeAtomLabels(void)
61 {
62   int i;
63 
64   atomlabelOffset = xcGenLists(MAXNAT + 1);
65   for(i=0; i < MAXNAT + 1; i++) {
66     glNewList(atomlabelOffset + i, GL_COMPILE);
67       glPushAttrib (GL_LIST_BIT);
68       glListBase(fontOffset);
69       glCallLists(strlen(element[i]), GL_UNSIGNED_BYTE, (GLubyte *) element[i]);
70       glPopAttrib ();
71     glEndList();
72   }
73 }
74 
75 
76 /* also make lists for x,y,z label that go with coordinate sistem, that will be
77  * displayed
78  */
79 void
makeXYZLabels(void)80 makeXYZLabels(void)
81 {
82   int i;
83   char *xyz[3] = { "x", "y", "z" };
84 
85   xyzlabelOffset = xcGenLists(3);
86   for(i=0; i < 3; i++) {
87     glNewList(xyzlabelOffset + i, GL_COMPILE);
88       glPushAttrib (GL_LIST_BIT);
89       glListBase(fontOffset);
90       glCallLists(1, GL_UNSIGNED_BYTE, (GLubyte *) xyz[i]);
91       glPopAttrib ();
92     glEndList();
93   }
94 }
95 
96 
97 #define T 0.8
98 #define S 0.0625
99 
100 GLuint arrowList = -1;
101 GLuint crdList = -1;
102 GLuint xyplaneList = -1;
103 
104 static void
arrow(void)105 arrow(void)
106 {
107   int i;
108   double arrow[18][3] = {
109     /* arrow for X axis */
110     { T, S, 0},
111     { T,-S, 0},
112     {1.0, 0.0, 0.0},
113     { T, 0,-S},
114     { T, 0, S},
115     {1.0, 0.0, 0.0},
116     /* arrow for Y axis */
117     {-S, T, 0},
118     { S, T, 0},
119     {0.0, 1.0, 0.0},
120     { 0, T, S},
121     { 0, T, -S},
122     {0.0, 1.0, 0.0},
123     /* arrow for Z axis */
124     { S, 0, T},
125     {-S, 0, T},
126     {0.0, 0.0, 1.0},
127     { 0,-S, T},
128     { 0, S, T},
129     {0.0, 0.0, 1.0}};
130 
131   arrowList = xcGenLists(1);
132 
133   glNewList( arrowList, GL_COMPILE );
134   /* X axis */
135     glBegin(GL_LINES);
136       glVertex3d( 0.0, 0.0, 0.0);
137       glVertex3d( 1.0, 0.0, 0.0);
138     glEnd();
139     glBegin(GL_TRIANGLES);
140       for(i=0; i<6; ) {
141         glVertex3dv( arrow[i++] );
142 	glVertex3dv( arrow[i++] );
143 	glVertex3dv( arrow[i++] );
144       }
145     glEnd();
146     /* Y axis */
147     glBegin(GL_LINES);
148       glVertex3d( 0.0, 0.0, 0.0);
149       glVertex3d( 0.0, 1.0, 0.0);
150     glEnd();
151     glBegin(GL_TRIANGLES);
152       for(; i<12; ) {
153         glVertex3dv( arrow[i++] );
154 	glVertex3dv( arrow[i++] );
155 	glVertex3dv( arrow[i++] );
156       }
157     glEnd();
158     /* Z axis */
159     glBegin(GL_LINES);
160       glVertex3d( 0.0, 0.0, 0.0);
161       glVertex3d( 0.0, 0.0, 1.0);
162     glEnd();
163     glBegin(GL_TRIANGLES);
164       for(; i<18; ) {
165         glVertex3dv( arrow[i++] );
166 	glVertex3dv( arrow[i++] );
167 	glVertex3dv( arrow[i++] );
168       }
169     glEnd();
170   glEndList();
171 }
172 
173 
174 void
makeCrdList(void)175 makeCrdList(void)
176 {
177   /* load arrowList */
178   arrow();
179 
180   crdList = xcGenLists(1);
181   printf("makeCrdList> crdList=%d\n", crdList);
182   fflush(stdout);
183   /* first make XYZ axes */
184   glNewList( crdList, GL_COMPILE );
185     glCallList(arrowList);
186     /* now X label */
187     glRasterPos3f( 1.1,-0.1, 0.0);
188     glCallList(xyzlabelOffset);
189     /* now Y label */
190     glRasterPos3f(-0.1, 1.1, 0.0);
191     glCallList(xyzlabelOffset + 1);
192     /* now Z label */
193     glRasterPos3f(-0.1,-0.1, 1.1);
194     glCallList(xyzlabelOffset + 2);
195   glEndList();
196 
197   xyplaneList = xcGenLists(1);
198   glNewList( xyplaneList, GL_COMPILE );
199     glBegin(GL_POLYGON);
200       glVertex3f(-.2, .2, 0.2);
201       glVertex3f( .2, .2, 0.2);
202       glVertex3f( .2,-.2, 0.2);
203       glVertex3f(-.2,-.2, 0.2);
204     glEnd();
205   glEndList();
206 }
207 
208 
209 GLuint tempDisable3Dlist, tempEnable3Dlist;
210 /* when we are displaying coor-sist, we are switching between modes; it's
211  * more efficient to "pack" this switching in displayLists
212  */
213 void
makeTemp3D2DList(void)214 makeTemp3D2DList(void)
215 {
216   /* when we are displaying coord-sist in 3D mode,
217    * we must Disable some things
218    */
219   tempDisable3Dlist = xcGenLists(1);
220   glNewList( tempDisable3Dlist, GL_COMPILE );
221     glDisable( GL_LIGHTING );
222     glDisable( GL_LIGHT0 );
223     glDisable( GL_DITHER );
224   glEndList();
225 
226   /* than we must go back */
227   tempEnable3Dlist = xcGenLists(1);
228   glNewList( tempEnable3Dlist, GL_COMPILE );
229     glEnable( GL_LIGHTING );
230     glEnable( GL_LIGHT0 );
231     glEnable( GL_DITHER );
232   glEndList();
233 }
234 
235 
236 
237