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