use tksdl;
use tkopengl;

int numframesrendered;

float t;

function test() {
   
}

// (note) strange source layout (multiple "" is due to emacs syntax highlighting..)
String vert_src = "
void main()
{
   //gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
   gl_Position = ftransform();
   //gl_FrontColor = gl_Color;
}
";

String frag_src = "
#version 130

uniform float viewport_sx;
uniform float viewport_sy;

// (note) gl_FragColor / gl_FragData are deprecated since v1.30
out vec4 fragColor;

void main()
{
   //fragColor = vec4(1.0, 0.0, 0.0, 1.0);
	//fragColor = gl_Color;
	fragColor = vec4(gl_FragCoord.x/viewport_sx, gl_FragCoord.y/viewport_sy, 0, 1);
}
";

int program;
int vert;
int frag;
int uni_viewport_sx;
int uni_viewport_sy;

function onDraw() {
   float dt=FPS.precision;
   // trace "xxx dt="+dt;
   glClearColor(0,0,0.2,1);
   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
   if( !(++numframesrendered&127) )
      trace "FPS.real="+FPS.real;

   zglInitOrtho(-1*2,1*2);

   t += dt*0.05;
   wrap t 0 2PI;

   glUseProgram(program);

   glTranslatef(0, sin(t), 0);

   glColor3f(0.6,0.7,0.9);
   glBegin(GL_QUADS);
   glVertex2f(-1,-1);
   glVertex2f( 1,-1);
   glVertex2f( 1, 1);
   glVertex2f(-1, 1);
   glEnd();

   glUseProgram(0);

   // frot+=dt;
   // wrap frot 0 360;
}

function onMouse(int _x, int _y, int _cbs, int _nbs) {
   //print "x="+_x+" y="+_y+" cbs="+_cbs+" nbs="+_nbs;
}

function onKeyboard(Key _k) {
   switch(_k.pressed)
   {
      case VKEY_ESCAPE:
         SDL.exitEventLoop();
         break;
   }
}

function onReopen() {
   String log;

   program = glCreateProgram();

   vert = glCreateShader(GL_VERTEX_SHADER);
   zglShaderSource(vert, vert_src);
   glCompileShader(vert);
   glGetShaderInfoLog(vert, log);
   trace "[...] vertex shader log=\""+log+"\".";
   glAttachShader(program, vert);

   frag = glCreateShader(GL_FRAGMENT_SHADER);
   zglShaderSource(frag, frag_src);
   glCompileShader(frag);
   glGetShaderInfoLog(frag, log);
   trace "[...] fragment shader log=\""+log+"\".";
   glAttachShader(program, frag);

   glBindFragDataLocation(program, 0, "fragColor");

   glLinkProgram(program);

   glGetProgramInfoLog(program, log);
   trace "[...] program log=\""+log+"\".";

   glUseProgram(program);
   uni_viewport_sx = glGetUniformLocation(program, "viewport_sx");
   uni_viewport_sy = glGetUniformLocation(program, "viewport_sy");
   glUniform1f(uni_viewport_sx, Viewport.width);
   glUniform1f(uni_viewport_sy, Viewport.height);
}

function main() {
   Viewport.openWindow(640, 480);
   //Viewport.enableGLError = true;

   trace "[...]                   GL_VENDOR = \"" + glGetString(GL_VENDOR) + "\"";
   trace "[...]                  GL_VERSION = \"" + glGetString(GL_VERSION) + "\"";
   trace "[...] GL_SHADING_LANGUAGE_VERSION = \"" + glGetString(GL_SHADING_LANGUAGE_VERSION) + "\"";

   use callbacks;

   Configuration.debugLevel = 1;

   zglLoadExtensions();

   FPS.tickInterval=16;
   FPS.limit=60;

   onReopen();

   Viewport.swapInterval(1);

   trace "xxx entering eventloop";
   SDL.eventLoop();
}