rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@0
|
2 #include <stdlib.h>
|
nuclear@0
|
3 #include <GL/glew.h>
|
nuclear@0
|
4 #include <GL/glut.h>
|
nuclear@0
|
5 #include "sdr.h"
|
nuclear@0
|
6
|
nuclear@0
|
7 void disp(void);
|
nuclear@0
|
8 void set_material(float dr, float dg, float db, float sr, float sg, float sb, float shin);
|
nuclear@0
|
9 void reshape(int x, int y);
|
nuclear@0
|
10 void keyb(unsigned char key, int x, int y);
|
nuclear@0
|
11 void mouse(int bn, int state, int x, int y);
|
nuclear@0
|
12 void motion(int x, int y);
|
nuclear@0
|
13
|
nuclear@0
|
14 static float cam_theta, cam_phi = 25;
|
nuclear@0
|
15 static float cam_dist = 8.0;
|
nuclear@0
|
16
|
nuclear@0
|
17 static unsigned int prog;
|
nuclear@0
|
18
|
nuclear@0
|
19 int main(int argc, char **argv)
|
nuclear@0
|
20 {
|
nuclear@0
|
21 int max_tess_level;
|
nuclear@0
|
22
|
nuclear@0
|
23 glutInit(&argc, argv);
|
nuclear@0
|
24 glutInitWindowSize(1280, 800);
|
nuclear@0
|
25 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
|
nuclear@0
|
26 glutCreateWindow("tesselation shaders test");
|
nuclear@0
|
27
|
nuclear@0
|
28 glutDisplayFunc(disp);
|
nuclear@0
|
29 glutReshapeFunc(reshape);
|
nuclear@0
|
30 glutKeyboardFunc(keyb);
|
nuclear@0
|
31 glutMouseFunc(mouse);
|
nuclear@0
|
32 glutMotionFunc(motion);
|
nuclear@0
|
33
|
nuclear@0
|
34 glewInit();
|
nuclear@0
|
35
|
nuclear@0
|
36 glClearColor(0.07, 0.07, 0.07, 1);
|
nuclear@0
|
37
|
nuclear@0
|
38 glEnable(GL_CULL_FACE);
|
nuclear@0
|
39
|
nuclear@0
|
40 if(!GLEW_ARB_tessellation_shader) {
|
nuclear@0
|
41 fprintf(stderr, "your OpenGL implementation does not support tesselation shaders\n");
|
nuclear@0
|
42 return 1;
|
nuclear@0
|
43 }
|
nuclear@0
|
44 glGetIntegerv(GL_MAX_TESS_GEN_LEVEL, &max_tess_level);
|
nuclear@0
|
45 printf("maximum tesselation levels: %d\n", max_tess_level);
|
nuclear@0
|
46
|
nuclear@0
|
47 glPatchParameteri(GL_PATCH_VERTICES, 16);
|
nuclear@0
|
48
|
nuclear@0
|
49 {
|
nuclear@0
|
50 unsigned int vsdr, tcsdr, tesdr, psdr;
|
nuclear@0
|
51
|
nuclear@0
|
52 if(!(vsdr = load_vertex_shader("sdr/bezier.v.glsl"))) {
|
nuclear@0
|
53 return 1;
|
nuclear@0
|
54 }
|
nuclear@0
|
55 if(!(tcsdr = load_tessctl_shader("sdr/bezier.tc.glsl"))) {
|
nuclear@0
|
56 return 1;
|
nuclear@0
|
57 }
|
nuclear@0
|
58 if(!(tesdr = load_tesseval_shader("sdr/bezier.te.glsl"))) {
|
nuclear@0
|
59 return 1;
|
nuclear@0
|
60 }
|
nuclear@0
|
61 if(!(psdr = load_pixel_shader("sdr/bezier.p.glsl"))) {
|
nuclear@0
|
62 return 1;
|
nuclear@0
|
63 }
|
nuclear@0
|
64
|
nuclear@0
|
65 if(!(prog = create_program_link(vsdr, tcsdr, tesdr, psdr, 0))) {
|
nuclear@0
|
66 return 1;
|
nuclear@0
|
67 }
|
nuclear@0
|
68 }
|
nuclear@0
|
69 set_uniform_int(prog, "tess_level", 1);
|
nuclear@0
|
70
|
nuclear@0
|
71 glutMainLoop();
|
nuclear@0
|
72 return 0;
|
nuclear@0
|
73 }
|
nuclear@0
|
74
|
nuclear@0
|
75
|
nuclear@0
|
76 void disp(void)
|
nuclear@0
|
77 {
|
nuclear@0
|
78 float lpos[] = {-5, 10, 4, 1};
|
nuclear@0
|
79
|
nuclear@0
|
80 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
nuclear@0
|
81
|
nuclear@0
|
82 glMatrixMode(GL_MODELVIEW);
|
nuclear@0
|
83 glLoadIdentity();
|
nuclear@0
|
84 glTranslatef(0, 0, -cam_dist);
|
nuclear@0
|
85 glRotatef(cam_phi, 1, 0, 0);
|
nuclear@0
|
86 glRotatef(cam_theta, 0, 1, 0);
|
nuclear@0
|
87
|
nuclear@0
|
88 glLightfv(GL_LIGHT0, GL_POSITION, lpos);
|
nuclear@0
|
89
|
nuclear@0
|
90 set_material(0.2, 0.35, 1.0, 1.0, 1.0, 1.0, 60.0);
|
nuclear@0
|
91
|
nuclear@0
|
92 glUseProgram(prog);
|
nuclear@0
|
93
|
nuclear@0
|
94 glBegin(GL_PATCHES);
|
nuclear@0
|
95 glVertex3f(-1, -0.8, 1);
|
nuclear@0
|
96 glVertex3f(-0.25, -1, 1);
|
nuclear@0
|
97 glVertex3f(0.25, -1, 1);
|
nuclear@0
|
98 glVertex3f(1, 0, 1);
|
nuclear@0
|
99
|
nuclear@0
|
100 glVertex3f(-1, -0.4, 0.25);
|
nuclear@0
|
101 glVertex3f(-0.25, 0, 0.25);
|
nuclear@0
|
102 glVertex3f(0.25, 0, 0.25);
|
nuclear@0
|
103 glVertex3f(1, -0.4, 0.25);
|
nuclear@0
|
104
|
nuclear@0
|
105 glVertex3f(-1, -0.4, -0.25);
|
nuclear@0
|
106 glVertex3f(-0.25, 0.6, -0.25);
|
nuclear@0
|
107 glVertex3f(0.25, 0.3, -0.25);
|
nuclear@0
|
108 glVertex3f(1, -0.4, -0.25);
|
nuclear@0
|
109
|
nuclear@0
|
110 glVertex3f(-1, 0, -1);
|
nuclear@0
|
111 glVertex3f(-0.25, 0.2, -1);
|
nuclear@0
|
112 glVertex3f(0.25, 0.2, -1);
|
nuclear@0
|
113 glVertex3f(1, 0, -1);
|
nuclear@0
|
114 glEnd();
|
nuclear@0
|
115
|
nuclear@0
|
116 glUseProgram(0);
|
nuclear@0
|
117
|
nuclear@0
|
118 glutSwapBuffers();
|
nuclear@0
|
119 }
|
nuclear@0
|
120
|
nuclear@0
|
121 void set_material(float dr, float dg, float db, float sr, float sg, float sb, float shin)
|
nuclear@0
|
122 {
|
nuclear@0
|
123 float dcol[4], scol[4];
|
nuclear@0
|
124
|
nuclear@0
|
125 dcol[0] = dr;
|
nuclear@0
|
126 dcol[1] = dg;
|
nuclear@0
|
127 dcol[2] = db;
|
nuclear@0
|
128 dcol[3] = 1.0;
|
nuclear@0
|
129
|
nuclear@0
|
130 scol[0] = sr;
|
nuclear@0
|
131 scol[1] = sg;
|
nuclear@0
|
132 scol[2] = sb;
|
nuclear@0
|
133 scol[3] = 1.0;
|
nuclear@0
|
134
|
nuclear@0
|
135 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, dcol);
|
nuclear@0
|
136 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, scol);
|
nuclear@0
|
137 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shin);
|
nuclear@0
|
138 }
|
nuclear@0
|
139
|
nuclear@0
|
140 void reshape(int x, int y)
|
nuclear@0
|
141 {
|
nuclear@0
|
142 glViewport(0, 0, x, y);
|
nuclear@0
|
143 glMatrixMode(GL_PROJECTION);
|
nuclear@0
|
144 glLoadIdentity();
|
nuclear@0
|
145 gluPerspective(50.0, (float)x / (float)y, 0.5, 500.0);
|
nuclear@0
|
146 }
|
nuclear@0
|
147
|
nuclear@0
|
148 void keyb(unsigned char key, int x, int y)
|
nuclear@0
|
149 {
|
nuclear@0
|
150 switch(key) {
|
nuclear@0
|
151 case 27:
|
nuclear@0
|
152 exit(0);
|
nuclear@0
|
153
|
nuclear@0
|
154 case 'w':
|
nuclear@0
|
155 {
|
nuclear@0
|
156 static int wire;
|
nuclear@0
|
157 wire = !wire;
|
nuclear@0
|
158 if(wire) {
|
nuclear@0
|
159 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
nuclear@0
|
160 } else {
|
nuclear@0
|
161 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
nuclear@0
|
162 }
|
nuclear@0
|
163 }
|
nuclear@0
|
164 glutPostRedisplay();
|
nuclear@0
|
165 break;
|
nuclear@0
|
166 }
|
nuclear@0
|
167
|
nuclear@0
|
168 if(key >= '1' && key <= '9') {
|
nuclear@0
|
169 int tess_level = key - '0';
|
nuclear@0
|
170 set_uniform_int(prog, "tess_level", tess_level);
|
nuclear@0
|
171
|
nuclear@0
|
172 glutPostRedisplay();
|
nuclear@0
|
173 }
|
nuclear@0
|
174 }
|
nuclear@0
|
175
|
nuclear@0
|
176 static int bnstate[16];
|
nuclear@0
|
177 static int prev_x, prev_y;
|
nuclear@0
|
178
|
nuclear@0
|
179 void mouse(int bn, int state, int x, int y)
|
nuclear@0
|
180 {
|
nuclear@0
|
181 int idx = bn - GLUT_LEFT_BUTTON;
|
nuclear@0
|
182
|
nuclear@0
|
183 if(idx < sizeof bnstate / sizeof *bnstate) {
|
nuclear@0
|
184 bnstate[idx] = state == GLUT_DOWN;
|
nuclear@0
|
185 }
|
nuclear@0
|
186 prev_x = x;
|
nuclear@0
|
187 prev_y = y;
|
nuclear@0
|
188 }
|
nuclear@0
|
189
|
nuclear@0
|
190 void motion(int x, int y)
|
nuclear@0
|
191 {
|
nuclear@0
|
192 int dx = x - prev_x;
|
nuclear@0
|
193 int dy = y - prev_y;
|
nuclear@0
|
194 prev_x = x;
|
nuclear@0
|
195 prev_y = y;
|
nuclear@0
|
196
|
nuclear@0
|
197 if(bnstate[0]) {
|
nuclear@0
|
198 cam_theta += dx * 0.5;
|
nuclear@0
|
199 cam_phi += dy * 0.5;
|
nuclear@0
|
200 if(cam_phi < -90) cam_phi = -90;
|
nuclear@0
|
201 if(cam_phi > 90) cam_phi = 90;
|
nuclear@0
|
202 glutPostRedisplay();
|
nuclear@0
|
203 }
|
nuclear@0
|
204
|
nuclear@0
|
205 if(bnstate[2]) {
|
nuclear@0
|
206 cam_dist += dy * 0.1;
|
nuclear@0
|
207 glutPostRedisplay();
|
nuclear@0
|
208 }
|
nuclear@0
|
209 }
|