2 /* -------------------------------------------------------------------------- */
7 /* -------------------------------------------------------------------------- */
9 #define WINDOW_WIDTH 640
10 #define WINDOW_HEIGHT 480
13 #define NORMAL_ARRAY 1
14 #define TEXCOORD_ARRAY 2
18 /* -------------------------------------------------------------------------- */
20 static GLfloat xco= 0;
21 static GLfloat yco= 1;
22 static GLfloat zco= -35;
23 static GLfloat view_rotx=0.0, view_roty=0.0, view_rotz=0.0;
29 unsigned int numberOfVertices;
31 unsigned int normStep;
35 float viewAngle = 0.0;
37 /* -------------------------------------------------------------------------- */
39 static int handles_resource(char* name);
40 static void sync_resource(ni_resource* res);
41 static void init_gl(void);
42 static void reshape(int width, int height);
43 static void draw(void);
44 static void key(unsigned char k, int down);
46 static int useTheProgram();
47 static int setUpTnL();
48 static int drawStuff(int width, int height);
50 /* -------------------------------------------------------------------------- */
52 EXPORT int mid_module_loaded(void)
54 ni_register_driver("mid", handles_resource, sync_resource);
58 k_gl_register_reshape(reshape);
59 k_gl_register_draw(draw);
60 k_gl_register_key(key);
62 k_log_out("MID Driver initialised");
67 EXPORT int mid_module_event(void* data)
69 k_log_out("MID got event: %p", data);
75 EXPORT int mid_module_tick(void)
77 if(!drawStuff(WINDOW_WIDTH, WINDOW_HEIGHT)) k_gl_end();
81 /* -------------------------------------------------------------------------- */
83 int handles_resource(char* name)
88 void sync_resource(ni_resource* res)
92 /* -------------------------------------------------------------------------- */
96 if(!useTheProgram()) k_gl_end();
97 if(!setUpTnL()) k_gl_end();
100 void reshape(int width, int height)
106 if(!drawStuff(WINDOW_WIDTH, WINDOW_HEIGHT)) k_gl_end();
110 void key(unsigned char k, int down)
112 if(k == 113) viewAngle += 0.1;
113 if(k == 114) viewAngle -= 0.1;
115 if(k==SHIFT && down){ shift=1; return; }
116 if(k==SHIFT && !down){ shift=0; return; }
119 if(shift) k-=('a'-'A');
124 xco-=speed*(float)sin((view_roty-90)*3.14/180);
125 zco+=speed*(float)cos((view_roty-90)*3.14/180);
126 if(xco< -35) xco= -35;
128 if(zco< -35) zco= -35;
132 xco+=speed*(float)sin((view_roty-90)*3.14/180);
133 zco-=speed*(float)cos((view_roty-90)*3.14/180);
134 if(xco< -35) xco= -35;
136 if(zco< -35) zco= -35;
140 xco-=speed*(float)sin(view_roty*3.14/180);
141 zco+=speed*(float)cos(view_roty*3.14/180);
142 if(xco< -35) xco= -35;
144 if(zco< -35) zco= -35;
148 xco+=speed*(float)sin(view_roty*3.14/180);
149 zco-=speed*(float)cos(view_roty*3.14/180);
150 if(xco< -35) xco= -35;
152 if(zco< -35) zco= -35;
157 if(yco< 0.2) yco= 0.2;
163 view_roty += speed*20;
166 view_roty -= speed*20;
186 /* ------------------------------------------------------------- */
188 GLuint isShaderError(GLuint thing)
190 GLint isShader = glIsShader(thing);
194 glGetShaderiv(thing, GL_COMPILE_STATUS, &ok);
196 glGetProgramiv(thing, GL_LINK_STATUS, &ok);
202 glGetShaderiv(thing, GL_INFO_LOG_LENGTH, &infoLen);
204 glGetProgramiv(thing, GL_INFO_LOG_LENGTH, &infoLen);
207 char* infoLog = malloc(sizeof(char)*infoLen);
209 glGetShaderInfoLog(thing, infoLen, NULL, infoLog);
211 glGetProgramInfoLog(thing, infoLen, NULL, infoLog);
213 printf("%s: %s\n", isShader? "Shader compile": "Program link", infoLog);
219 char* file2string(const char *path)
225 if(!(fd=fopen(path, "r"))) {
226 fprintf(stderr, "Can't open file '%s' for reading\n", path);
230 fseek(fd, 0, SEEK_END);
232 fseek(fd, 0, SEEK_SET);
234 if(!(str=malloc(len*sizeof(char)))) {
235 fprintf(stderr, "Can't malloc space for '%s'\n", path);
239 r = fread(str, sizeof(char), len, fd);
248 /* ------------------------------------------------------------- */
252 const char *vsSource = file2string("tnl.vert");
253 const char *fsSource = file2string("tnl.frag");
255 GLuint vs = glCreateShader(GL_VERTEX_SHADER);
256 glShaderSource(vs, 1, &vsSource, NULL);
258 if(isShaderError(vs)) return 0;
260 GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
261 glShaderSource(fs, 1, &fsSource, NULL);
263 if(isShaderError(fs)) return 0;
265 free((void*)vsSource);
266 free((void*)fsSource);
268 program = glCreateProgram();
269 glAttachShader(program, vs);
270 glAttachShader(program, fs);
272 glBindAttribLocation(program, POS_ARRAY, "vertPos");
273 glBindAttribLocation(program, NORMAL_ARRAY, "vertNormal");
274 /* vertNormal and vertTexCoord don't need to be bound here.. ? */
275 glBindAttribLocation(program, TEXCOORD_ARRAY, "vertTexCoord");
277 glLinkProgram(program);
278 if(isShaderError(program)) return 0;
280 glUseProgram(program);
282 glUniform3f(glGetUniformLocation(program, "frameLightDirection"), 1.0, 0.0, 1.0);
283 glUniform1i(glGetUniformLocation(program, "texture"), 0); /* 0 ?? */
290 glClearColor(1.0f, 1.0f, 0.0f, 0.0f);
292 glGenTextures(1, &texture);
293 glBindTexture(GL_TEXTURE_2D, texture);
295 GLuint* td = malloc(sizeof(GLuint)*TEX_SIZE*TEX_SIZE);
297 for(i=0; i<TEX_SIZE; i++)
298 for(j=0; j<TEX_SIZE; j++) {
299 GLuint col = (255L<<24) + ((255L-j*2)<<16) + ((255L-i)<<8) + (255L-i*2);
300 if ( ((i*j)/8) % 2 ) col = (GLuint) (255L<<24) + (255L<<16) + (0L<<8) + (255L);
301 td[j*TEX_SIZE+i] = col;
303 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_SIZE, TEX_SIZE, 0, GL_RGBA, GL_UNSIGNED_BYTE, td);
304 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
305 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
308 GLfloat trivertices[] = {
309 -0.4f,-0.4f,0.4f, // Pos
310 0.0f,0.0f,1.0f, // Normal
311 0.0f,0.0f, // TexCoord
313 0.4f,-0.0f,0.0f, // Pos
314 0.0f,0.0f,1.0f, // Normal
315 1.0f,0.0f, // TexCoord
317 0.0f,0.4f,0.4f, // Pos
318 0.5f,0.5f,0.5f, // Normal
319 0.5f,1.0f, // TexCoord
321 0.4f,0.0f,0.4f, // Pos
322 0.5f,0.5f,0.5f, // Normal
323 0.5f,0.0f, // TexCoord
325 0.4f,0.4f,0.4f, // Pos
326 0.0f,0.0f,1.0f, // Normal
327 0.0f,0.0f, // TexCoord
331 numberOfVertices = 4;
332 posStep = 3 * sizeof(GLfloat);
333 normStep = 3 * sizeof(GLfloat);
334 tcStep = 2 * sizeof(GLfloat);
335 stride = posStep + normStep + tcStep;
337 glGenBuffers(1, &vbo);
338 glBindBuffer(GL_ARRAY_BUFFER, vbo);
339 glBufferData(GL_ARRAY_BUFFER, numberOfVertices * stride, trivertices, GL_STATIC_DRAW);
340 glBindBuffer(GL_ARRAY_BUFFER, 0);
345 int drawStuff(int width, int height)
347 glViewport(0, 0, width, height);
348 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
350 float TransRotScaleVerticeMatrix[] = {
351 cos(angle), 0, sin(angle), 0,
353 -sin(angle), 0, cos(angle), 0,
357 float ModelViewProjectionMatrix[] = {
358 cos(viewAngle), 0, sin(viewAngle), 0,
360 -sin(viewAngle), 0, cos(viewAngle), 0,
364 float TransRotScaleNormalMatrix[] = {
365 cos(angle), 0, sin(angle),
367 -sin(angle), 0, cos(angle)
370 glUniformMatrix4fv(glGetUniformLocation(program, "frameTRSV"), 1, GL_FALSE, TransRotScaleVerticeMatrix);
371 glUniformMatrix4fv(glGetUniformLocation(program, "frameMVP"), 1, GL_FALSE, ModelViewProjectionMatrix);
372 glUniformMatrix3fv(glGetUniformLocation(program, "frameTRSN"), 1, GL_FALSE, TransRotScaleNormalMatrix);
375 glBindBuffer(GL_ARRAY_BUFFER, vbo);
377 glEnableVertexAttribArray(POS_ARRAY);
378 glVertexAttribPointer(POS_ARRAY, 3, GL_FLOAT, GL_FALSE, stride, 0);
380 glEnableVertexAttribArray(NORMAL_ARRAY);
381 glVertexAttribPointer(NORMAL_ARRAY, 3, GL_FLOAT, GL_FALSE, stride, (void*)posStep );
383 glEnableVertexAttribArray(TEXCOORD_ARRAY);
384 glVertexAttribPointer(TEXCOORD_ARRAY, 2, GL_FLOAT, GL_FALSE, stride, (void*)(posStep + normStep) );
386 glDrawArrays(GL_TRIANGLE_STRIP, 0, numberOfVertices);
388 glBindBuffer(GL_ARRAY_BUFFER, 0);
398 glDeleteTextures(1, &texture);
399 glDeleteBuffers(1, &vbo);
400 glDeleteProgram(program);
405 /* ------------------------------------------------------------- */