11
#include <fontconfig.h>
16
#include "functions.h"
17
#include "xfunctions.h"
23
int DrawAxis(float size) {
24
float r[] = {1,0,0,0};
25
float g[] = {0,1,0,0};
26
float b[] = {0,0,1,0};
29
glMaterialfv(GL_FRONT, GL_EMISSION, b);
33
glMaterialfv(GL_FRONT, GL_EMISSION, g);
37
glMaterialfv(GL_FRONT, GL_EMISSION, r);
50
GLfloat color[] = {0.05, 0.05, 0.05, 0};
53
glHint (GL_FOG_HINT, GL_NICEST);
54
glFogi (GL_FOG_MODE, GL_LINEAR);
55
glFogf (GL_FOG_START, 1);
56
glFogf (GL_FOG_END, 2.8);
58
glFogfv (GL_FOG_COLOR, color);
62
GLfloat LightPos[] = {0.7, 0.5, 0.7, 1}; /* within object */
63
GLfloat Direction[] = {-1,0,-1};
65
GLfloat zero[] = { 0, 0, 0, 1.0 };
67
GLfloat fone[] = { 0.1, 0.1, 0.1, 0 };
69
GLfloat ambient[] = {0, 0, 0, 0};
70
GLfloat diffuse[] = {0.5, 0.5, 0.5, 1};
71
GLfloat specular[] = {0.1, 0.1, 0.1, 1};
73
GLfloat src_emit[] = { 1, 1, 1, 1.0 };
75
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
76
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, fone);
78
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, zero);
79
glMaterialfv(GL_FRONT, GL_SPECULAR, zero);
80
glMaterialfv(GL_FRONT, GL_EMISSION, src_emit);
84
glVertex4fv(LightPos);
87
glLightfv(GL_LIGHT0, GL_POSITION, LightPos);
88
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, Direction);
89
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 30);
90
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 25);
92
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
93
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
94
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
95
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.003);
99
void SetObjectsLight() {
100
GLfloat zero[] = { 0, 0, 0, 1 };
101
GLfloat mat_specular[] = { 1, 1, 1, 1 };
103
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
104
glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, zero);
107
void SetAxisLight() {
108
GLfloat zero[] = { 0, 0, 0, 1.0 };
109
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, zero);
110
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, zero);
114
void SetView(float angle) {
115
// glViewport(0,0,800,600);
116
glMatrixMode(GL_PROJECTION);
118
// glOrtho(-2,2,-2,2,-10,10);
119
gluPerspective(90,800/600,1.05,10);
121
glMatrixMode(GL_MODELVIEW);
130
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
139
GLfloat zero[] = { 0, 0, 0, 0.3 };
140
GLfloat color[] = { 0.1, 0.3, 0.3, 0.3 };
141
GLfloat sky[] = { 0.0, 0.0, 0.8, 0.3 };
146
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
148
glDepthMask(GL_FALSE);
152
glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, color);
153
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, zero);
166
glEnable(GL_TEXTURE_2D);
169
glTexCoord2f(0.0, 0.0);glVertex3f(0,0,0);
170
glTexCoord2f(0.0, 1.0);glVertex3f(0,0,3);
171
glTexCoord2f(1.0, 1.0);glVertex3f(3,0,3);
172
glTexCoord2f(1.0, 0.0);glVertex3f(3,0,0);
175
glDisable(GL_TEXTURE_2D);
182
glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, sky);
183
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, zero);
184
glVertex3f(-3,1.2,-3);
185
glVertex3f(3,1.2,-3);
187
glVertex3f(-3,1.2,3);
191
glDepthMask(GL_TRUE);
196
GLubyte tex[TEXTURE_WIDTH*TEXTURE_HEIGHT*3];
197
generateTexture(tex, TEXTURE_WIDTH, TEXTURE_HEIGHT);
198
glTexImage2D(GL_TEXTURE_2D,
200
TEXTURE_WIDTH, TEXTURE_WIDTH,
201
0, GL_RGB, GL_UNSIGNED_BYTE,
204
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
205
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
206
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
207
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
208
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
209
// glEnable(GL_TEXTURE_2D);
213
FTGLfont *LoadFont() {
223
pat = FcNameParse("arial");
224
FcConfigSubstitute (NULL, pat, FcMatchPattern);
225
FcDefaultSubstitute (pat);
227
match = FcFontMatch(0, pat, &res);
228
FcPatternDestroy(pat);
230
FcPatternGetString(match, FC_FILE, 0, &file);
232
font = ftglCreatePolygonFont(file);
233
// font = ftglCreateBitmapFont(file);
235
FcPatternDestroy(match);
238
// ftglSetFontDepth(font, 5);
239
// ftglSetFontOutset(font, 0, 3);
240
ftglSetFontCharMap(font, ft_encoding_unicode);
246
void DrawFPS(FTGLfont *font, float num) {
248
GLfloat color[] = {1, 0, 0, 1};
250
sprintf(stmp, "FPS: %.2lf", num);
252
glMatrixMode(GL_PROJECTION);
254
gluPerspective(90,800/600,1.05,1000);
257
glMatrixMode(GL_MODELVIEW);
265
glRotatef(90, 0, 1, 0);
266
glTranslatef(-190,2,0);
269
ftglSetFontFaceSize(font, 8, 72);
272
glMaterialfv(GL_FRONT, GL_EMISSION, color);
275
ftglRenderFont(font, stmp, FTGL_RENDER_ALL);
279
void Draw(Display *dpy, Window win, FTGLfont *font, long iter) {
280
static double fps = 0;
283
struct timeval tv1, tv2;
286
gettimeofday(&tv1, NULL);
291
if (iter) glRotatef(iter, 0, 1, 0);
295
if (ENABLE_ANTIALIASING) {
297
// glDepthMask(GL_FALSE);
300
glScalef(0.5,0.5,0.5);
301
glTranslatef(1,0.5,1);
302
glCallList(SPHERE_LIST);
305
if (ENABLE_ANTIALIASING) {
306
// glDepthMask(GL_TRUE);
312
gettimeofday(&tv2, NULL);
314
cfps = 1000000. / ((tv2.tv_sec - tv1.tv_sec)*1000000 + (tv2.tv_usec - tv1.tv_usec));
316
fps = (fps * n + cfps) / (n + 1);
321
glXSwapBuffers(dpy,win);
326
main(int argc, char *argv[]) {
335
OpenGLWindow(&dpy, &cx, &win, 800, 600);
339
// Enable depth calculation to hide extra stuff
340
glEnable(GL_DEPTH_TEST);
342
glEnable(GL_LIGHTING);
345
glEnable(GL_AUTO_NORMAL);
346
glEnable(GL_NORMALIZE);
348
if (ENABLE_ANTIALIASING) {
349
glEnable(GL_POINT_SMOOTH);
350
if (!DRAW_SKELETON) {
351
glEnable(GL_LINE_SMOOTH);
353
glEnable(GL_POLYGON_SMOOTH);
355
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
356
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
357
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
365
glNewList(SPHERE_LIST, GL_COMPILE);
366
DrawPolyhedron(DETAILS, DRAW_SKELETON);
369
Draw(dpy, win, font, 0);
371
for (i=0;i<360;i++) {
372
Draw(dpy, win, font, i);