-----------------------------------------------------------------------
-License for the platform-specific code and the Colinux
-modifications in this subdirectory.
-
Just this version applies: Version 2.
-Software is Copyright (c) The Cilux, Linux and Colinux Projects
+Software is Copyright (c) The Cilux Project 2001-2009
-----------------------------------------------------------------------
linux: COMPILEOPTIONS=-march=i386 -mtune=i586 -fPIC
linux: LINKOPTIONS=-Wl,-export-dynamic -Wl,-rpath,.
linux: LINKOPTIONS=-Wl,-export-dynamic
-linux: INCLUDES=-I/usr/local/include -I../include -I../../include -I.. -I../platform/linux -I../../platform/linux -I../platform
+linux: INCLUDES=-I/usr/local/include -I. -I../include -I../../include -I../../../include -I.. -I../platform/linux -I../../platform/linux -I../../../platform/linux
linux: LIBRARIES=-L/usr/local/lib -lnsl -ldl -lm -lX11 -lEGL -lGLESv2
linux: linux-all
$(STRIP) mod-np.so
@echo '--------------------'
-mod-mid.so: src/drivers/mid/mid.c src/include/kernelapi.h src/platform/linux/platform.h
- (cd src/drivers/mid; $(CC) $(CCOPTIONS) -c mid.c -o mid.o $(COMPILEOPTIONS) $(INCLUDES))
- $(CCLIB),mod-mid.so -o mod-mid.so src/drivers/mid/mid.o
+mod-mid.so: src/drivers/nt/mid/mid.c src/include/kernelapi.h src/platform/linux/platform.h
+ (cd src/drivers/nt/mid; $(CC) $(CCOPTIONS) -c mid.c -o mid.o $(COMPILEOPTIONS) $(INCLUDES))
+ $(CCLIB),mod-mid.so -o mod-mid.so src/drivers/nt/mid/mid.o
$(STRIP) mod-mid.so
@echo '--------------------'
+++ /dev/null
-
-/* -------------------------------------------------------------------------- */
-
-#include <kernelapi.h>
-#include <ni.h>
-
-/* -------------------------------------------------------------------------- */
-
-#define WINDOW_WIDTH 640
-#define WINDOW_HEIGHT 480
-
-#define POS_ARRAY 0
-#define NORMAL_ARRAY 1
-#define TEXCOORD_ARRAY 2
-
-#define TEX_SIZE 128
-
-/* -------------------------------------------------------------------------- */
-
-static GLfloat xco= 0;
-static GLfloat yco= 1;
-static GLfloat zco= -35;
-static GLfloat view_rotx=0.0, view_roty=0.0, view_rotz=0.0;
-static int shift=0;
-
-GLuint program;
-GLuint texture;
-GLuint vbo;
-unsigned int numberOfVertices;
-unsigned int posStep;
-unsigned int normStep;
-unsigned int tcStep;
-unsigned int stride;
-float angle=0.0;
-float viewAngle = 0.0;
-
-/* -------------------------------------------------------------------------- */
-
-static int handles_resource(char* name);
-static void sync_resource(ni_resource* res);
-static void init_gl(void);
-static void reshape(int width, int height);
-static void draw(void);
-static void key(unsigned char k, int down);
-
-static int useTheProgram();
-static int setUpTnL();
-static int drawStuff(int width, int height);
-
-/* -------------------------------------------------------------------------- */
-
-EXPORT int mid_module_loaded(void)
-{
- ni_register_driver("mid", handles_resource, sync_resource);
-
- init_gl();
-
- k_gl_register_reshape(reshape);
- k_gl_register_draw(draw);
- k_gl_register_key(key);
-
- k_log_out("MID Driver initialised");
-
- return 1;
-}
-
-EXPORT int mid_module_event(void* data)
-{
- k_log_out("MID got event: %p", data);
- ni_event* evt=data;
- ni_event_delete(evt);
- return 1;
-}
-
-EXPORT int mid_module_tick(void)
-{
- if(!drawStuff(WINDOW_WIDTH, WINDOW_HEIGHT)) k_gl_end();
- return 1;
-}
-
-/* -------------------------------------------------------------------------- */
-
-int handles_resource(char* name)
-{
- return 0;
-}
-
-void sync_resource(ni_resource* res)
-{
-}
-
-/* -------------------------------------------------------------------------- */
-
-void init_gl(void)
-{
- if(!useTheProgram()) k_gl_end();
- if(!setUpTnL()) k_gl_end();
-}
-
-void reshape(int width, int height)
-{
-}
-
-void draw(void)
-{
- if(!drawStuff(WINDOW_WIDTH, WINDOW_HEIGHT)) k_gl_end();
-}
-
-#define SHIFT 0
-void key(unsigned char k, int down)
-{
- if(k == 113) viewAngle += 0.1;
- if(k == 114) viewAngle -= 0.1;
-
- if(k==SHIFT && down){ shift=1; return; }
- if(k==SHIFT && !down){ shift=0; return; }
- if(!down) return;
-
- if(shift) k-=('a'-'A');
-
- float speed=0.25;
- switch (k) {
- case 'H':
- xco-=speed*(float)sin((view_roty-90)*3.14/180);
- zco+=speed*(float)cos((view_roty-90)*3.14/180);
- if(xco< -35) xco= -35;
- if(xco> 35) xco= 35;
- if(zco< -35) zco= -35;
- if(zco> 35) zco= 35;
- break;
- case 'L':
- xco+=speed*(float)sin((view_roty-90)*3.14/180);
- zco-=speed*(float)cos((view_roty-90)*3.14/180);
- if(xco< -35) xco= -35;
- if(xco> 35) xco= 35;
- if(zco< -35) zco= -35;
- if(zco> 35) zco= 35;
- break;
- case 'i':
- xco-=speed*(float)sin(view_roty*3.14/180);
- zco+=speed*(float)cos(view_roty*3.14/180);
- if(xco< -35) xco= -35;
- if(xco> 35) xco= 35;
- if(zco< -35) zco= -35;
- if(zco> 35) zco= 35;
- break;
- case 'o':
- xco+=speed*(float)sin(view_roty*3.14/180);
- zco-=speed*(float)cos(view_roty*3.14/180);
- if(xco< -35) xco= -35;
- if(xco> 35) xco= 35;
- if(zco< -35) zco= -35;
- if(zco> 35) zco= 35;
- break;
- case 'j':
- yco-=speed;
- if(yco< 0.2) yco= 0.2;
- break;
- case 'k':
- yco+=speed;
- break;
- case 'l':
- view_roty += speed*20;
- break;
- case 'h':
- view_roty -= speed*20;
- break;
- case 'J':
- view_rotx += 2.0;
- break;
- case 'K':
- view_rotx -= 2.0;
- break;
- case 'z':
- view_rotz += 2.0;
- break;
- case 'Z':
- view_rotz -= 2.0;
- break;
- default:
- return;
- }
- draw();
-}
-
-/* ------------------------------------------------------------- */
-
-GLuint isShaderError(GLuint thing)
-{
- GLint isShader = glIsShader(thing);
-
- GLint ok;
- if(isShader){
- glGetShaderiv(thing, GL_COMPILE_STATUS, &ok);
- }else{
- glGetProgramiv(thing, GL_LINK_STATUS, &ok);
- }
- if(ok) return 0;
-
- GLint infoLen=0;
- if(isShader){
- glGetShaderiv(thing, GL_INFO_LOG_LENGTH, &infoLen);
- }else{
- glGetProgramiv(thing, GL_INFO_LOG_LENGTH, &infoLen);
- }
- if(infoLen){
- char* infoLog = malloc(sizeof(char)*infoLen);
- if(isShader){
- glGetShaderInfoLog(thing, infoLen, NULL, infoLog);
- }else{
- glGetProgramInfoLog(thing, infoLen, NULL, infoLog);
- }
- printf("%s: %s\n", isShader? "Shader compile": "Program link", infoLog);
- free(infoLog);
- }
- return 1;
-}
-
-char* file2string(const char *path)
-{
- FILE *fd;
- long len, r;
- char *str;
-
- if(!(fd=fopen(path, "r"))) {
- fprintf(stderr, "Can't open file '%s' for reading\n", path);
- return NULL;
- }
-
- fseek(fd, 0, SEEK_END);
- len = ftell(fd);
- fseek(fd, 0, SEEK_SET);
-
- if(!(str=malloc(len*sizeof(char)))) {
- fprintf(stderr, "Can't malloc space for '%s'\n", path);
- return NULL;
- }
-
- r = fread(str, sizeof(char), len, fd);
-
- str[r-1] = '\0';
-
- fclose(fd);
-
- return str;
-}
-
-/* ------------------------------------------------------------- */
-
-int useTheProgram()
-{
- const char *vsSource = file2string("tnl.vert");
- const char *fsSource = file2string("tnl.frag");
-
- GLuint vs = glCreateShader(GL_VERTEX_SHADER);
- glShaderSource(vs, 1, &vsSource, NULL);
- glCompileShader(vs);
- if(isShaderError(vs)) return 0;
-
- GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
- glShaderSource(fs, 1, &fsSource, NULL);
- glCompileShader(fs);
- if(isShaderError(fs)) return 0;
-
- free((void*)vsSource);
- free((void*)fsSource);
-
- program = glCreateProgram();
- glAttachShader(program, vs);
- glAttachShader(program, fs);
-
- glBindAttribLocation(program, POS_ARRAY, "vertPos");
- glBindAttribLocation(program, NORMAL_ARRAY, "vertNormal");
- /* vertNormal and vertTexCoord don't need to be bound here.. ? */
- glBindAttribLocation(program, TEXCOORD_ARRAY, "vertTexCoord");
-
- glLinkProgram(program);
- if(isShaderError(program)) return 0;
-
- glUseProgram(program);
-
- glUniform3f(glGetUniformLocation(program, "frameLightDirection"), 1.0, 0.0, 1.0);
- glUniform1i(glGetUniformLocation(program, "texture"), 0); /* 0 ?? */
-
- return 1;
-}
-
-int setUpTnL()
-{
- glClearColor(1.0f, 1.0f, 0.0f, 0.0f);
-
- glGenTextures(1, &texture);
- glBindTexture(GL_TEXTURE_2D, texture);
-
- GLuint* td = malloc(sizeof(GLuint)*TEX_SIZE*TEX_SIZE);
- int i,j;
- for(i=0; i<TEX_SIZE; i++)
- for(j=0; j<TEX_SIZE; j++) {
- GLuint col = (255L<<24) + ((255L-j*2)<<16) + ((255L-i)<<8) + (255L-i*2);
- if ( ((i*j)/8) % 2 ) col = (GLuint) (255L<<24) + (255L<<16) + (0L<<8) + (255L);
- td[j*TEX_SIZE+i] = col;
- }
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_SIZE, TEX_SIZE, 0, GL_RGBA, GL_UNSIGNED_BYTE, td);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
- free(td);
-
- GLfloat trivertices[] = {
- -0.4f,-0.4f,0.4f, // Pos
- 0.0f,0.0f,1.0f, // Normal
- 0.0f,0.0f, // TexCoord
-
- 0.4f,-0.0f,0.0f, // Pos
- 0.0f,0.0f,1.0f, // Normal
- 1.0f,0.0f, // TexCoord
-
- 0.0f,0.4f,0.4f, // Pos
- 0.5f,0.5f,0.5f, // Normal
- 0.5f,1.0f, // TexCoord
-
- 0.4f,0.0f,0.4f, // Pos
- 0.5f,0.5f,0.5f, // Normal
- 0.5f,0.0f, // TexCoord
-
- 0.4f,0.4f,0.4f, // Pos
- 0.0f,0.0f,1.0f, // Normal
- 0.0f,0.0f, // TexCoord
-
- };
-
- numberOfVertices = 4;
- posStep = 3 * sizeof(GLfloat);
- normStep = 3 * sizeof(GLfloat);
- tcStep = 2 * sizeof(GLfloat);
- stride = posStep + normStep + tcStep;
-
- glGenBuffers(1, &vbo);
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, numberOfVertices * stride, trivertices, GL_STATIC_DRAW);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
-
- return 1;
-}
-
-int drawStuff(int width, int height)
-{
- glViewport(0, 0, width, height);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- float TransRotScaleVerticeMatrix[] = {
- cos(angle), 0, sin(angle), 0,
- 0, 1, 0, 0,
- -sin(angle), 0, cos(angle), 0,
- 0, 0, 0, 1
- };
-
- float ModelViewProjectionMatrix[] = {
- cos(viewAngle), 0, sin(viewAngle), 0,
- 0, 1, 0, 0,
- -sin(viewAngle), 0, cos(viewAngle), 0,
- 0, 0, 0, 1
- };
-
- float TransRotScaleNormalMatrix[] = {
- cos(angle), 0, sin(angle),
- 0, 1, 0,
- -sin(angle), 0, cos(angle)
- };
-
- glUniformMatrix4fv(glGetUniformLocation(program, "frameTRSV"), 1, GL_FALSE, TransRotScaleVerticeMatrix);
- glUniformMatrix4fv(glGetUniformLocation(program, "frameMVP"), 1, GL_FALSE, ModelViewProjectionMatrix);
- glUniformMatrix3fv(glGetUniformLocation(program, "frameTRSN"), 1, GL_FALSE, TransRotScaleNormalMatrix);
-
-
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
-
- glEnableVertexAttribArray(POS_ARRAY);
- glVertexAttribPointer(POS_ARRAY, 3, GL_FLOAT, GL_FALSE, stride, 0);
-
- glEnableVertexAttribArray(NORMAL_ARRAY);
- glVertexAttribPointer(NORMAL_ARRAY, 3, GL_FLOAT, GL_FALSE, stride, (void*)posStep );
-
- glEnableVertexAttribArray(TEXCOORD_ARRAY);
- glVertexAttribPointer(TEXCOORD_ARRAY, 2, GL_FLOAT, GL_FALSE, stride, (void*)(posStep + normStep) );
-
- glDrawArrays(GL_TRIANGLE_STRIP, 0, numberOfVertices);
-
- glBindBuffer(GL_ARRAY_BUFFER, 0);
-
- k_gl_swap_buffers();
-
- angle += .007f;
-
- return 1;
-}
-
-void deleteStuff(){
- glDeleteTextures(1, &texture);
- glDeleteBuffers(1, &vbo);
- glDeleteProgram(program);
-/* glDeleteShader();
- glDeleteShader();*/
-}
-
-/* ------------------------------------------------------------- */
-
-
-
--- /dev/null
+
+/* -------------------------------------------------------------------------- */
+
+#include <kernelapi.h>
+#include <ni.h>
+
+/* -------------------------------------------------------------------------- */
+
+#define WINDOW_WIDTH 640
+#define WINDOW_HEIGHT 480
+
+#define POS_ARRAY 0
+#define NORMAL_ARRAY 1
+#define TEXCOORD_ARRAY 2
+
+#define TEX_SIZE 128
+
+/* -------------------------------------------------------------------------- */
+
+static GLfloat xco= 0;
+static GLfloat yco= 1;
+static GLfloat zco= -35;
+static GLfloat view_rotx=0.0, view_roty=0.0, view_rotz=0.0;
+static int shift=0;
+
+GLuint program;
+GLuint texture;
+GLuint vbo;
+unsigned int numberOfVertices;
+unsigned int posStep;
+unsigned int normStep;
+unsigned int tcStep;
+unsigned int stride;
+float angle=0.0;
+float viewAngle = 0.0;
+
+/* -------------------------------------------------------------------------- */
+
+static int handles_resource(char* name);
+static void sync_resource(ni_resource* res);
+static void init_gl(void);
+static void reshape(int width, int height);
+static void draw(void);
+static void key(unsigned char k, int down);
+
+static int useTheProgram();
+static int setUpTnL();
+static int drawStuff(int width, int height);
+
+/* -------------------------------------------------------------------------- */
+
+EXPORT int mid_module_loaded(void)
+{
+ ni_register_driver("mid", handles_resource, sync_resource);
+
+ init_gl();
+
+ k_gl_register_reshape(reshape);
+ k_gl_register_draw(draw);
+ k_gl_register_key(key);
+
+ k_log_out("MID Driver initialised");
+
+ return 1;
+}
+
+EXPORT int mid_module_event(void* data)
+{
+ k_log_out("MID got event: %p", data);
+ ni_event* evt=data;
+ ni_event_delete(evt);
+ return 1;
+}
+
+EXPORT int mid_module_tick(void)
+{
+ if(!drawStuff(WINDOW_WIDTH, WINDOW_HEIGHT)) k_gl_end();
+ return 1;
+}
+
+/* -------------------------------------------------------------------------- */
+
+int handles_resource(char* name)
+{
+ return 0;
+}
+
+void sync_resource(ni_resource* res)
+{
+}
+
+/* -------------------------------------------------------------------------- */
+
+void init_gl(void)
+{
+ if(!useTheProgram()) k_gl_end();
+ if(!setUpTnL()) k_gl_end();
+}
+
+void reshape(int width, int height)
+{
+}
+
+void draw(void)
+{
+ if(!drawStuff(WINDOW_WIDTH, WINDOW_HEIGHT)) k_gl_end();
+}
+
+#define SHIFT 0
+void key(unsigned char k, int down)
+{
+ if(k == 113) viewAngle += 0.1;
+ if(k == 114) viewAngle -= 0.1;
+
+ if(k==SHIFT && down){ shift=1; return; }
+ if(k==SHIFT && !down){ shift=0; return; }
+ if(!down) return;
+
+ if(shift) k-=('a'-'A');
+
+ float speed=0.25;
+ switch (k) {
+ case 'H':
+ xco-=speed*(float)sin((view_roty-90)*3.14/180);
+ zco+=speed*(float)cos((view_roty-90)*3.14/180);
+ if(xco< -35) xco= -35;
+ if(xco> 35) xco= 35;
+ if(zco< -35) zco= -35;
+ if(zco> 35) zco= 35;
+ break;
+ case 'L':
+ xco+=speed*(float)sin((view_roty-90)*3.14/180);
+ zco-=speed*(float)cos((view_roty-90)*3.14/180);
+ if(xco< -35) xco= -35;
+ if(xco> 35) xco= 35;
+ if(zco< -35) zco= -35;
+ if(zco> 35) zco= 35;
+ break;
+ case 'i':
+ xco-=speed*(float)sin(view_roty*3.14/180);
+ zco+=speed*(float)cos(view_roty*3.14/180);
+ if(xco< -35) xco= -35;
+ if(xco> 35) xco= 35;
+ if(zco< -35) zco= -35;
+ if(zco> 35) zco= 35;
+ break;
+ case 'o':
+ xco+=speed*(float)sin(view_roty*3.14/180);
+ zco-=speed*(float)cos(view_roty*3.14/180);
+ if(xco< -35) xco= -35;
+ if(xco> 35) xco= 35;
+ if(zco< -35) zco= -35;
+ if(zco> 35) zco= 35;
+ break;
+ case 'j':
+ yco-=speed;
+ if(yco< 0.2) yco= 0.2;
+ break;
+ case 'k':
+ yco+=speed;
+ break;
+ case 'l':
+ view_roty += speed*20;
+ break;
+ case 'h':
+ view_roty -= speed*20;
+ break;
+ case 'J':
+ view_rotx += 2.0;
+ break;
+ case 'K':
+ view_rotx -= 2.0;
+ break;
+ case 'z':
+ view_rotz += 2.0;
+ break;
+ case 'Z':
+ view_rotz -= 2.0;
+ break;
+ default:
+ return;
+ }
+ draw();
+}
+
+/* ------------------------------------------------------------- */
+
+GLuint isShaderError(GLuint thing)
+{
+ GLint isShader = glIsShader(thing);
+
+ GLint ok;
+ if(isShader){
+ glGetShaderiv(thing, GL_COMPILE_STATUS, &ok);
+ }else{
+ glGetProgramiv(thing, GL_LINK_STATUS, &ok);
+ }
+ if(ok) return 0;
+
+ GLint infoLen=0;
+ if(isShader){
+ glGetShaderiv(thing, GL_INFO_LOG_LENGTH, &infoLen);
+ }else{
+ glGetProgramiv(thing, GL_INFO_LOG_LENGTH, &infoLen);
+ }
+ if(infoLen){
+ char* infoLog = malloc(sizeof(char)*infoLen);
+ if(isShader){
+ glGetShaderInfoLog(thing, infoLen, NULL, infoLog);
+ }else{
+ glGetProgramInfoLog(thing, infoLen, NULL, infoLog);
+ }
+ printf("%s: %s\n", isShader? "Shader compile": "Program link", infoLog);
+ free(infoLog);
+ }
+ return 1;
+}
+
+char* file2string(const char *path)
+{
+ FILE *fd;
+ long len, r;
+ char *str;
+
+ if(!(fd=fopen(path, "r"))) {
+ fprintf(stderr, "Can't open file '%s' for reading\n", path);
+ return NULL;
+ }
+
+ fseek(fd, 0, SEEK_END);
+ len = ftell(fd);
+ fseek(fd, 0, SEEK_SET);
+
+ if(!(str=malloc(len*sizeof(char)))) {
+ fprintf(stderr, "Can't malloc space for '%s'\n", path);
+ return NULL;
+ }
+
+ r = fread(str, sizeof(char), len, fd);
+
+ str[r-1] = '\0';
+
+ fclose(fd);
+
+ return str;
+}
+
+/* ------------------------------------------------------------- */
+
+int useTheProgram()
+{
+ const char *vsSource = file2string("tnl.vert");
+ const char *fsSource = file2string("tnl.frag");
+
+ GLuint vs = glCreateShader(GL_VERTEX_SHADER);
+ glShaderSource(vs, 1, &vsSource, NULL);
+ glCompileShader(vs);
+ if(isShaderError(vs)) return 0;
+
+ GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
+ glShaderSource(fs, 1, &fsSource, NULL);
+ glCompileShader(fs);
+ if(isShaderError(fs)) return 0;
+
+ free((void*)vsSource);
+ free((void*)fsSource);
+
+ program = glCreateProgram();
+ glAttachShader(program, vs);
+ glAttachShader(program, fs);
+
+ glBindAttribLocation(program, POS_ARRAY, "vertPos");
+ glBindAttribLocation(program, NORMAL_ARRAY, "vertNormal");
+ /* vertNormal and vertTexCoord don't need to be bound here.. ? */
+ glBindAttribLocation(program, TEXCOORD_ARRAY, "vertTexCoord");
+
+ glLinkProgram(program);
+ if(isShaderError(program)) return 0;
+
+ glUseProgram(program);
+
+ glUniform3f(glGetUniformLocation(program, "frameLightDirection"), 1.0, 0.0, 1.0);
+ glUniform1i(glGetUniformLocation(program, "texture"), 0); /* 0 ?? */
+
+ return 1;
+}
+
+int setUpTnL()
+{
+ glClearColor(1.0f, 1.0f, 0.0f, 0.0f);
+
+ glGenTextures(1, &texture);
+ glBindTexture(GL_TEXTURE_2D, texture);
+
+ GLuint* td = malloc(sizeof(GLuint)*TEX_SIZE*TEX_SIZE);
+ int i,j;
+ for(i=0; i<TEX_SIZE; i++)
+ for(j=0; j<TEX_SIZE; j++) {
+ GLuint col = (255L<<24) + ((255L-j*2)<<16) + ((255L-i)<<8) + (255L-i*2);
+ if ( ((i*j)/8) % 2 ) col = (GLuint) (255L<<24) + (255L<<16) + (0L<<8) + (255L);
+ td[j*TEX_SIZE+i] = col;
+ }
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_SIZE, TEX_SIZE, 0, GL_RGBA, GL_UNSIGNED_BYTE, td);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ free(td);
+
+ GLfloat trivertices[] = {
+ -0.4f,-0.4f,0.4f, // Pos
+ 0.0f,0.0f,1.0f, // Normal
+ 0.0f,0.0f, // TexCoord
+
+ 0.4f,-0.0f,0.0f, // Pos
+ 0.0f,0.0f,1.0f, // Normal
+ 1.0f,0.0f, // TexCoord
+
+ 0.0f,0.4f,0.4f, // Pos
+ 0.5f,0.5f,0.5f, // Normal
+ 0.5f,1.0f, // TexCoord
+
+ 0.4f,0.0f,0.4f, // Pos
+ 0.5f,0.5f,0.5f, // Normal
+ 0.5f,0.0f, // TexCoord
+
+ 0.4f,0.4f,0.4f, // Pos
+ 0.0f,0.0f,1.0f, // Normal
+ 0.0f,0.0f, // TexCoord
+
+ };
+
+ numberOfVertices = 4;
+ posStep = 3 * sizeof(GLfloat);
+ normStep = 3 * sizeof(GLfloat);
+ tcStep = 2 * sizeof(GLfloat);
+ stride = posStep + normStep + tcStep;
+
+ glGenBuffers(1, &vbo);
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, numberOfVertices * stride, trivertices, GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+ return 1;
+}
+
+int drawStuff(int width, int height)
+{
+ glViewport(0, 0, width, height);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ float TransRotScaleVerticeMatrix[] = {
+ cos(angle), 0, sin(angle), 0,
+ 0, 1, 0, 0,
+ -sin(angle), 0, cos(angle), 0,
+ 0, 0, 0, 1
+ };
+
+ float ModelViewProjectionMatrix[] = {
+ cos(viewAngle), 0, sin(viewAngle), 0,
+ 0, 1, 0, 0,
+ -sin(viewAngle), 0, cos(viewAngle), 0,
+ 0, 0, 0, 1
+ };
+
+ float TransRotScaleNormalMatrix[] = {
+ cos(angle), 0, sin(angle),
+ 0, 1, 0,
+ -sin(angle), 0, cos(angle)
+ };
+
+ glUniformMatrix4fv(glGetUniformLocation(program, "frameTRSV"), 1, GL_FALSE, TransRotScaleVerticeMatrix);
+ glUniformMatrix4fv(glGetUniformLocation(program, "frameMVP"), 1, GL_FALSE, ModelViewProjectionMatrix);
+ glUniformMatrix3fv(glGetUniformLocation(program, "frameTRSN"), 1, GL_FALSE, TransRotScaleNormalMatrix);
+
+
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+
+ glEnableVertexAttribArray(POS_ARRAY);
+ glVertexAttribPointer(POS_ARRAY, 3, GL_FLOAT, GL_FALSE, stride, 0);
+
+ glEnableVertexAttribArray(NORMAL_ARRAY);
+ glVertexAttribPointer(NORMAL_ARRAY, 3, GL_FLOAT, GL_FALSE, stride, (void*)posStep );
+
+ glEnableVertexAttribArray(TEXCOORD_ARRAY);
+ glVertexAttribPointer(TEXCOORD_ARRAY, 2, GL_FLOAT, GL_FALSE, stride, (void*)(posStep + normStep) );
+
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, numberOfVertices);
+
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+ k_gl_swap_buffers();
+
+ angle += .007f;
+
+ return 1;
+}
+
+void deleteStuff(){
+ glDeleteTextures(1, &texture);
+ glDeleteBuffers(1, &vbo);
+ glDeleteProgram(program);
+/* glDeleteShader();
+ glDeleteShader();*/
+}
+
+/* ------------------------------------------------------------- */
+
+
+