From a8609ccd901b1942e862c14205026d841e640add Mon Sep 17 00:00:00 2001 From: EliteTK Date: Thu, 10 Jul 2014 22:35:35 +0100 Subject: More stuff. --- lighthouse3dglex.c | 221 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 lighthouse3dglex.c (limited to 'lighthouse3dglex.c') diff --git a/lighthouse3dglex.c b/lighthouse3dglex.c new file mode 100644 index 0000000..08cff1a --- /dev/null +++ b/lighthouse3dglex.c @@ -0,0 +1,221 @@ + +/* + Simple Demo for GLSL + www.lighthouse3d.com + + tweaked a bit by andy +*/ + +#include "GL/glew.h" + +#ifdef __linux__ +#include +#endif + +#ifdef __APPLE__ +#include +#endif + +#ifdef _WIN32 +#include "glut.h" +#endif + +#include +#include +#include + +/////////////////////////////////////////////////////////////////////// + +char *textFileRead(char *fn) +{ + FILE *fp; + char *content = NULL; + + int count=0; + + if (fn != NULL) { + fp = fopen(fn,"rt"); + + if (fp != NULL) { + + fseek(fp, 0, SEEK_END); + count = ftell(fp); + rewind(fp); + + if (count > 0) { + content = (char *)malloc(sizeof(char) * (count+1)); + count = fread(content,sizeof(char),count,fp); + content[count] = '\0'; + } + fclose(fp); + } + } + + if (content == NULL) + { + fprintf(stderr, "ERROR: could not load in file %s\n", fn); + exit(1); + } + return content; +} + +/////////////////////////////////////////////////////////////////////// + +int textFileWrite(char *fn, char *s) +{ + FILE *fp; + int status = 0; + + if (fn != NULL) { + fp = fopen(fn,"w"); + + if (fp != NULL) { + + if (fwrite(s,sizeof(char),strlen(s),fp) == strlen(s)) + status = 1; + fclose(fp); + } + } + return(status); +} + +/////////////////////////////////////////////////////////////////////// + +GLuint v,f,p; +float lpos[4] = {1.0, 0.5, 1.0, 0.0}; + +/////////////////////////////////////////////////////////////////////// + +void changeSize(int w, int h) +{ + // Prevent a divide by zero, when window is too short + // (you cant make a window of zero width). + if(h == 0) + h = 1; + + float ratio = 1.0* w / h; + + // Reset the coordinate system before modifying + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + // Set the viewport to be the entire window + glViewport(0, 0, w, h); + + // Set the correct perspective. + gluPerspective(45, ratio, 1, 1000); + glMatrixMode(GL_MODELVIEW); +} + +/////////////////////////////////////////////////////////////////////// + +void renderScene(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glLoadIdentity(); + gluLookAt(0.0,0.0,5.0, + 0.0,0.0,-1.0, + 0.0f,1.0f,0.0f); + + glLightfv(GL_LIGHT0, GL_POSITION, lpos); + glutSolidTeapot(1); + + glutSwapBuffers(); +} + +/////////////////////////////////////////////////////////////////////// + +void processNormalKeys(unsigned char key, int x, int y) { + + if (key == 27) + exit(0); +} + +/////////////////////////////////////////////////////////////////////// + +void setShaders() +{ + char *vs,*fs; + + v = glCreateShader(GL_VERTEX_SHADER); + f = glCreateShader(GL_FRAGMENT_SHADER); + + // older syntax + //v = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); + //f = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); + + vs = textFileRead("./toon.vert"); + fs = textFileRead("./toon.frag"); + + const char * ff = fs; + const char * vv = vs; + + glShaderSource(v, 1, &vv,NULL); + glShaderSource(f, 1, &ff,NULL); + + // older syntax + //glShaderSourceARB(v, 1, &vv,NULL); + //glShaderSourceARB(f, 1, &ff,NULL); + + free(vs);free(fs); + + glCompileShader(v); + glCompileShader(f); + + // older syntax + //glCompileShaderARB(v); + //glCompileShaderARB(f); + + p = glCreateProgram(); + + // older syntax + //p = glCreateProgramObjectARB(); + + glAttachShader(p,f); + glAttachShader(p,v); + + // older syntax + //glAttachObjectARB(p,f); + //glAttachObjectARB(p,v); + + glLinkProgram(p); + + // comment out this line to not use the shader + glUseProgram(p); + + // older syntax + //glLinkProgramARB(p); + //glUseProgramObjectARB(p); +} + +/////////////////////////////////////////////////////////////////////// + +int main(int argc, char **argv) { + glutInit(&argc, argv); + glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); + glutInitWindowPosition(100,100); + glutInitWindowSize(320,320); + glutCreateWindow("GLSL"); + + glutDisplayFunc(renderScene); + glutIdleFunc(renderScene); + glutReshapeFunc(changeSize); + glutKeyboardFunc(processNormalKeys); + + glEnable(GL_DEPTH_TEST); + glClearColor(0.0,0.0,0.0,1.0); + + glewInit(); + if (GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader) + printf("Ready for GLSL\n"); + else { + printf("No GLSL support\n"); + exit(1); + } + + setShaders(); + + glutMainLoop(); + return 0; +} -- cgit v1.2.3-54-g00ecf