132001f49Smrg/**
232001f49Smrg * Test very basic glsl functionality (identity vertex and fragment shaders).
332001f49Smrg * Brian Paul & Stephane Marchesin
432001f49Smrg */
532001f49Smrg
632001f49Smrg
732001f49Smrg#include <assert.h>
832001f49Smrg#include <string.h>
932001f49Smrg#include <stdio.h>
1032001f49Smrg#include <stdlib.h>
1132001f49Smrg#include <math.h>
1232001f49Smrg#include <GL/glew.h>
1332001f49Smrg#include "glut_wrap.h"
1432001f49Smrg#include "shaderutil.h"
1532001f49Smrg
1632001f49Smrg
1732001f49Smrgstatic GLuint fragShader;
1832001f49Smrgstatic GLuint vertShader;
1932001f49Smrgstatic GLuint program;
2032001f49Smrgstatic GLint win = 0;
2132001f49Smrg
2232001f49Smrg
2332001f49Smrgstatic void
2432001f49SmrgRedisplay(void)
2532001f49Smrg{
2632001f49Smrg   glClear(GL_COLOR_BUFFER_BIT);
2732001f49Smrg
2832001f49Smrg   glBegin(GL_TRIANGLES);
2932001f49Smrg   glVertex3f(-0.9, -0.9, 0.0);
3032001f49Smrg   glVertex3f( 0.9, -0.9, 0.0);
3132001f49Smrg   glVertex3f( 0.0,  0.9, 0.0);
3232001f49Smrg   glEnd();
3332001f49Smrg
3432001f49Smrg   glutSwapBuffers();
3532001f49Smrg}
3632001f49Smrg
3732001f49Smrg
3832001f49Smrgstatic void
3932001f49SmrgReshape(int width, int height)
4032001f49Smrg{
4132001f49Smrg   glViewport(0, 0, width, height);
4232001f49Smrg   glMatrixMode(GL_PROJECTION);
4332001f49Smrg   glLoadIdentity();
4432001f49Smrg   glMatrixMode(GL_MODELVIEW);
4532001f49Smrg   glLoadIdentity();
4632001f49Smrg}
4732001f49Smrg
4832001f49Smrg
4932001f49Smrgstatic void
5032001f49SmrgCleanUp(void)
5132001f49Smrg{
5232001f49Smrg   glDeleteShader(fragShader);
5332001f49Smrg   glDeleteShader(vertShader);
5432001f49Smrg   glDeleteProgram(program);
5532001f49Smrg   glutDestroyWindow(win);
5632001f49Smrg}
5732001f49Smrg
5832001f49Smrg
5932001f49Smrgstatic void
6032001f49SmrgKey(unsigned char key, int x, int y)
6132001f49Smrg{
6232001f49Smrg   if (key == 27) {
6332001f49Smrg      CleanUp();
6432001f49Smrg      exit(0);
6532001f49Smrg   }
6632001f49Smrg   glutPostRedisplay();
6732001f49Smrg}
6832001f49Smrg
6932001f49Smrg
7032001f49Smrgstatic void
7132001f49SmrgInit(void)
7232001f49Smrg{
7332001f49Smrg   static const char *fragShaderText =
7432001f49Smrg      "void main() {\n"
7532001f49Smrg      "   gl_FragColor = vec4(1.0,0.0,0.0,1.0);\n"
7632001f49Smrg      "}\n";
7732001f49Smrg   static const char *vertShaderText =
7832001f49Smrg      "void main() {\n"
7932001f49Smrg      "   gl_Position = gl_Vertex;\n"
8032001f49Smrg      "}\n";
8132001f49Smrg
8232001f49Smrg   if (!ShadersSupported())
8332001f49Smrg      exit(1);
8432001f49Smrg
8532001f49Smrg   fragShader = CompileShaderText(GL_FRAGMENT_SHADER, fragShaderText);
8632001f49Smrg
8732001f49Smrg   vertShader = CompileShaderText(GL_VERTEX_SHADER, vertShaderText);
8832001f49Smrg
8932001f49Smrg   program = LinkShaders(vertShader, fragShader);
9032001f49Smrg
9132001f49Smrg   glUseProgram(program);
9232001f49Smrg
9332001f49Smrg   assert(glGetError() == 0);
9432001f49Smrg
9532001f49Smrg   glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
9632001f49Smrg
9732001f49Smrg   printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER));
9832001f49Smrg
9932001f49Smrg   assert(glIsProgram(program));
10032001f49Smrg   assert(glIsShader(fragShader));
10132001f49Smrg   assert(glIsShader(vertShader));
10232001f49Smrg
10332001f49Smrg   glColor3f(1, 0, 0);
10432001f49Smrg}
10532001f49Smrg
10632001f49Smrg
10732001f49Smrgint
10832001f49Smrgmain(int argc, char *argv[])
10932001f49Smrg{
11032001f49Smrg   glutInit(&argc, argv);
11132001f49Smrg   glutInitWindowSize(200, 200);
11232001f49Smrg   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
11332001f49Smrg   win = glutCreateWindow(argv[0]);
11432001f49Smrg   glewInit();
11532001f49Smrg   glutReshapeFunc(Reshape);
11632001f49Smrg   glutKeyboardFunc(Key);
11732001f49Smrg   glutDisplayFunc(Redisplay);
11832001f49Smrg   Init();
11932001f49Smrg   glutMainLoop();
12032001f49Smrg   return 0;
12132001f49Smrg}
122