2 * AA lines with texture mapped quads
20 static GLint WinWidth
= 300, WinHeight
= 300;
22 static GLfloat Width
= 8.;
25 * Quad strip for line from v0 to v1:
28 +---+---------------------+---+
32 +---+---------------------+---+
36 QuadLine(const GLfloat
*v0
, const GLfloat
*v1
, GLfloat width
)
38 GLfloat dx
= v1
[0] - v0
[0];
39 GLfloat dy
= v1
[1] - v0
[1];
40 GLfloat len
= sqrt(dx
*dx
+ dy
*dy
);
41 float dx0
, dx1
, dx2
, dx3
, dx4
, dx5
, dx6
, dx7
;
42 float dy0
, dy1
, dy2
, dy3
, dy4
, dy5
, dy6
, dy7
;
47 width
*= 0.5; /* half width */
48 dx
= dx
* (width
+ 0.0);
49 dy
= dy
* (width
+ 0.0);
51 dx0
= -dx
+dy
; dy0
= -dy
-dx
;
52 dx1
= -dx
-dy
; dy1
= -dy
+dx
;
54 dx2
= 0+dy
; dy2
= -dx
+0;
55 dx3
= 0-dy
; dy3
= +dx
+0;
57 dx4
= 0+dy
; dy4
= -dx
+0;
58 dx5
= 0-dy
; dy5
= +dx
+0;
60 dx6
= dx
+dy
; dy6
= dy
-dx
;
61 dx7
= dx
-dy
; dy7
= dy
+dx
;
64 printf("dx, dy = %g, %g\n", dx, dy);
65 printf(" dx0, dy0: %g, %g\n", dx0, dy0);
66 printf(" dx1, dy1: %g, %g\n", dx1, dy1);
67 printf(" dx2, dy2: %g, %g\n", dx2, dy2);
68 printf(" dx3, dy3: %g, %g\n", dx3, dy3);
71 glBegin(GL_QUAD_STRIP
);
73 glVertex2f(v0
[0] + dx0
, v0
[1] + dy0
);
75 glVertex2f(v0
[0] + dx1
, v0
[1] + dy1
);
78 glVertex2f(v0
[0] + dx2
, v0
[1] + dy2
);
80 glVertex2f(v0
[0] + dx3
, v0
[1] + dy3
);
83 glVertex2f(v1
[0] + dx2
, v1
[1] + dy2
);
85 glVertex2f(v1
[0] + dx3
, v1
[1] + dy3
);
88 glVertex2f(v1
[0] + dx6
, v1
[1] + dy6
);
90 glVertex2f(v1
[0] + dx7
, v1
[1] + dy7
);
95 static float Cos(float a
)
97 return cos(a
* M_PI
/ 180.);
100 static float Sin(float a
)
102 return sin(a
* M_PI
/ 180.);
110 glClear(GL_COLOR_BUFFER_BIT
);
115 glEnable(GL_TEXTURE_2D
);
117 for (i
= 0; i
< 360; i
+=5) {
119 v0
[0] = 150 + 40 * Cos(i
);
120 v0
[1] = 150 + 40 * Sin(i
);
121 v1
[0] = 150 + 130 * Cos(i
);
122 v1
[1] = 150 + 130 * 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] = 150 + x
* 40 - 20;
131 v1
[0] = 150 + x
+ 5.0;
132 v1
[1] = 150 + x
* 40 - 20;
133 QuadLine(v0
, v1
, Width
);
138 glDisable(GL_TEXTURE_2D
);
145 Reshape(int width
, int height
)
147 glViewport(0, 0, width
, height
);
148 glMatrixMode(GL_PROJECTION
);
150 glOrtho(0, width
, 0, height
, -1, 1);
151 glMatrixMode(GL_MODELVIEW
);
159 glutDestroyWindow(win
);
164 Key(unsigned char key
, int x
, int y
)
185 printf("Width = %g\n", Width
);
191 ramp4(GLint i
, GLint size
)
197 else if (i
>= size
- 5) {
198 d
= 1.0 - (i
- (size
- 5)) / 4.0;
207 ramp2(GLint i
, GLint size
)
213 else if (i
>= size
- 3) {
214 d
= 1.0 - (i
- (size
- 3)) / 2.0;
223 ramp1(GLint i
, GLint size
)
226 if (i
== 0 || i
== size
-1) {
237 * Make an alpha texture for antialiasing lines.
238 * Just a linear fall-off ramp for now.
239 * Should have a number of different textures for different line widths.
240 * Could try a bell-like-curve....
246 GLfloat tex
[SZ
][SZ
]; /* alpha tex */
248 for (i
= 0; i
< SZ
; i
++) {
249 for (j
= 0; j
< SZ
; j
++) {
251 float k
= (SZ
-1) / 2.0;
252 float dx
= fabs(i
- k
) / k
;
253 float dy
= fabs(j
- k
) / k
;
261 float d
= ramp1(i
, SZ
) * ramp1(j
, SZ
);
262 printf("%d, %d: %g\n", i
, j
, d
);
268 glTexImage2D(GL_TEXTURE_2D
, 0, GL_ALPHA
, SZ
, SZ
, 0, GL_ALPHA
, GL_FLOAT
, tex
);
269 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
);
270 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
);
271 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
272 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
273 glTexEnvi(GL_TEXTURE_ENV
, GL_TEXTURE_ENV_MODE
, GL_MODULATE
);
282 GLfloat tex
[SZ
][SZ
]; /* alpha tex */
285 glPixelStorei(GL_UNPACK_ROW_LENGTH
, SZ
);
286 for (level
= 0; level
< 7; level
++) {
287 int sz
= 1 << (6 - level
);
289 for (i
= 0; i
< sz
; i
++) {
290 for (j
= 0; j
< sz
; j
++) {
296 tex
[i
][j
] = ramp1(i
, sz
) * ramp1(j
, sz
);
300 glTexImage2D(GL_TEXTURE_2D
, level
, GL_ALPHA
,
301 sz
, sz
, 0, GL_ALPHA
, GL_FLOAT
, tex
);
304 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
);
305 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
);
306 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR_MIPMAP_LINEAR
);
307 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
308 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, 4);
309 ////glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 5);
311 glTexEnvi(GL_TEXTURE_ENV
, GL_TEXTURE_ENV_MODE
, GL_MODULATE
);
325 version
= (const char *) glGetString(GL_VERSION
);
326 if (version
[0] != '2' || version
[1] != '.') {
327 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 glutInitWindowPosition( 0, 0);
359 glutInitWindowSize(WinWidth
, WinHeight
);
360 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
);
361 win
= glutCreateWindow(argv
[0]);
362 glutReshapeFunc(Reshape
);
363 glutKeyboardFunc(Key
);
364 glutDisplayFunc(Redisplay
);
365 ParseOptions(argc
, argv
);