2 * AA lines with texture mapped quads
18 static GLint WinWidth
= 300, WinHeight
= 300;
20 static GLfloat Width
= 8.;
23 * Quad strip for line from v0 to v1:
26 +---+---------------------+---+
30 +---+---------------------+---+
34 QuadLine(const GLfloat
*v0
, const GLfloat
*v1
, GLfloat width
)
36 GLfloat dx
= v1
[0] - v0
[0];
37 GLfloat dy
= v1
[1] - v0
[1];
38 GLfloat len
= sqrt(dx
*dx
+ dy
*dy
);
39 float dx0
, dx1
, dx2
, dx3
, dx4
, dx5
, dx6
, dx7
;
40 float dy0
, dy1
, dy2
, dy3
, dy4
, dy5
, dy6
, dy7
;
45 width
*= 0.5; /* half width */
46 dx
= dx
* (width
+ 0.0);
47 dy
= dy
* (width
+ 0.0);
49 dx0
= -dx
+dy
; dy0
= -dy
-dx
;
50 dx1
= -dx
-dy
; dy1
= -dy
+dx
;
52 dx2
= 0+dy
; dy2
= -dx
+0;
53 dx3
= 0-dy
; dy3
= +dx
+0;
55 dx4
= 0+dy
; dy4
= -dx
+0;
56 dx5
= 0-dy
; dy5
= +dx
+0;
58 dx6
= dx
+dy
; dy6
= dy
-dx
;
59 dx7
= dx
-dy
; dy7
= dy
+dx
;
62 printf("dx, dy = %g, %g\n", dx, dy);
63 printf(" dx0, dy0: %g, %g\n", dx0, dy0);
64 printf(" dx1, dy1: %g, %g\n", dx1, dy1);
65 printf(" dx2, dy2: %g, %g\n", dx2, dy2);
66 printf(" dx3, dy3: %g, %g\n", dx3, dy3);
69 glBegin(GL_QUAD_STRIP
);
71 glVertex2f(v0
[0] + dx0
, v0
[1] + dy0
);
73 glVertex2f(v0
[0] + dx1
, v0
[1] + dy1
);
76 glVertex2f(v0
[0] + dx2
, v0
[1] + dy2
);
78 glVertex2f(v0
[0] + dx3
, v0
[1] + dy3
);
81 glVertex2f(v1
[0] + dx2
, v1
[1] + dy2
);
83 glVertex2f(v1
[0] + dx3
, v1
[1] + dy3
);
86 glVertex2f(v1
[0] + dx6
, v1
[1] + dy6
);
88 glVertex2f(v1
[0] + dx7
, v1
[1] + dy7
);
93 static float Cos(float a
)
95 return cos(a
* M_PI
/ 180.);
98 static float Sin(float a
)
100 return sin(a
* M_PI
/ 180.);
106 float cx
= 0.5 * WinWidth
, cy
= 0.5 * WinHeight
;
107 float len
= 0.5 * WinWidth
- 20.0;
110 glClear(GL_COLOR_BUFFER_BIT
);
115 glEnable(GL_TEXTURE_2D
);
117 for (i
= 0; i
< 360; i
+=5) {
119 v0
[0] = cx
+ 40 * Cos(i
);
120 v0
[1] = cy
+ 40 * Sin(i
);
121 v1
[0] = cx
+ len
* Cos(i
);
122 v1
[1] = cy
+ len
* Sin(i
);
123 QuadLine(v0
, v1
, Width
);
127 float v0
[2], v1
[2], x
;
128 for (x
= 0; x
< 1.0; x
+= 0.2) {
130 v0
[1] = cy
+ x
* 40 - 20;
131 v1
[0] = cx
+ x
+ 5.0;
132 v1
[1] = cy
+ x
* 40 - 20;
133 QuadLine(v0
, v1
, Width
);
138 glDisable(GL_TEXTURE_2D
);
145 Reshape(int width
, int height
)
149 glViewport(0, 0, width
, height
);
150 glMatrixMode(GL_PROJECTION
);
152 glOrtho(0, width
, 0, height
, -1, 1);
153 glMatrixMode(GL_MODELVIEW
);
161 glutDestroyWindow(win
);
166 Key(unsigned char key
, int x
, int y
)
187 printf("Width = %g\n", Width
);
193 ramp4(GLint i
, GLint size
)
199 else if (i
>= size
- 5) {
200 d
= 1.0 - (i
- (size
- 5)) / 4.0;
209 ramp2(GLint i
, GLint size
)
215 else if (i
>= size
- 3) {
216 d
= 1.0 - (i
- (size
- 3)) / 2.0;
225 ramp1(GLint i
, GLint size
)
228 if (i
== 0 || i
== size
-1) {
239 * Make an alpha texture for antialiasing lines.
240 * Just a linear fall-off ramp for now.
241 * Should have a number of different textures for different line widths.
242 * Could try a bell-like-curve....
248 GLfloat tex
[SZ
][SZ
]; /* alpha tex */
250 for (i
= 0; i
< SZ
; i
++) {
251 for (j
= 0; j
< SZ
; j
++) {
253 float k
= (SZ
-1) / 2.0;
254 float dx
= fabs(i
- k
) / k
;
255 float dy
= fabs(j
- k
) / k
;
263 float d
= ramp1(i
, SZ
) * ramp1(j
, SZ
);
264 printf("%d, %d: %g\n", i
, j
, d
);
270 glTexImage2D(GL_TEXTURE_2D
, 0, GL_ALPHA
, SZ
, SZ
, 0, GL_ALPHA
, GL_FLOAT
, tex
);
271 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
);
272 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
);
273 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
274 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
275 glTexEnvi(GL_TEXTURE_ENV
, GL_TEXTURE_ENV_MODE
, GL_MODULATE
);
284 GLfloat tex
[SZ
][SZ
]; /* alpha tex */
287 glPixelStorei(GL_UNPACK_ROW_LENGTH
, SZ
);
288 for (level
= 0; level
< 7; level
++) {
289 int sz
= 1 << (6 - level
);
291 for (i
= 0; i
< sz
; i
++) {
292 for (j
= 0; j
< sz
; j
++) {
298 tex
[i
][j
] = ramp1(i
, sz
) * ramp1(j
, sz
);
302 glTexImage2D(GL_TEXTURE_2D
, level
, GL_ALPHA
,
303 sz
, sz
, 0, GL_ALPHA
, GL_FLOAT
, tex
);
306 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
);
307 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
);
308 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR_MIPMAP_LINEAR
);
309 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
310 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, 4);
311 ////glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 5);
313 glTexEnvi(GL_TEXTURE_ENV
, GL_TEXTURE_ENV_MODE
, GL_MODULATE
);
327 version
= (const char *) glGetString(GL_VERSION
);
328 if (version
[0] != '2' || version
[1] != '.') {
329 printf("This program requires OpenGL 2.x, found %s\n", version
);
333 glClearColor(0.3f
, 0.3f
, 0.3f
, 0.0f
);
335 printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER
));
337 glBlendFunc(GL_SRC_ALPHA
, GL_ONE_MINUS_SRC_ALPHA
);
339 glPolygonMode(GL_FRONT_AND_BACK
, GL_LINE
);
349 ParseOptions(int argc
, char *argv
[])
355 main(int argc
, char *argv
[])
357 glutInit(&argc
, argv
);
358 glutInitWindowSize(WinWidth
, WinHeight
);
359 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
);
360 win
= glutCreateWindow(argv
[0]);
362 glutReshapeFunc(Reshape
);
363 glutKeyboardFunc(Key
);
364 glutDisplayFunc(Redisplay
);
365 ParseOptions(argc
, argv
);