trivial/tri-viewport.c - add guide lines, more triangles, make interactive
This is becoming more like a test than a trivial/ example.
diff --git a/progs/trivial/tri-viewport.c b/progs/trivial/tri-viewport.c
index 8e5f155..4cd64e0 100644
--- a/progs/trivial/tri-viewport.c
+++ b/progs/trivial/tri-viewport.c
@@ -29,6 +29,10 @@
GLenum doubleBuffer = 1;
int win;
+static float tx = 0;
+static float ty = 0;
+static float tw = 250;
+static float th = 250;
static void Init(void)
{
@@ -42,15 +46,11 @@
static void Reshape(int width, int height)
{
- glViewport(width / -2.0, height / -2.0, width, height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
+ tw = width;
+ th = height;
}
+
static void Key(unsigned char key, int x, int y)
{
switch (key) {
@@ -62,19 +62,91 @@
}
}
+
static void Draw(void)
{
+ int i;
+
+ fprintf(stderr, "%f %f\n", tx, ty);
+ fflush(stderr);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
+ glMatrixMode(GL_MODELVIEW);
+
glClear(GL_COLOR_BUFFER_BIT);
- glBegin(GL_TRIANGLES);
- glColor3f(.8,0,0);
- glVertex3f(-0.9, 0.9, -30.0);
- glColor3f(0,.9,0);
- glVertex3f( 0.9, 0.9, -30.0);
- glColor3f(0,0,.7);
- glVertex3f( 0.0, -0.9, -30.0);
+ glViewport(0, 0, tw, th);
+
+ glBegin(GL_LINES);
+ glColor3f(1,1,0);
+ glVertex3f(-1, 0, -30.0);
+ glVertex3f(1, 0, -30.0);
+
+ glVertex3f(0, -1, -30.0);
+ glVertex3f(0, 1, -30.0);
glEnd();
+
+ /*
+ */
+ glViewport(tx, ty, tw, th);
+
+
+ glBegin(GL_TRIANGLES);
+ glColor3f(1,0,0);
+ glVertex3f(-1, -1, -30.0);
+ glVertex3f(0, -1, -30.0);
+ glVertex3f(-.5, -.5, -30.0);
+
+ glColor3f(1,1,1);
+ glVertex3f(0, -1, -30.0);
+ glVertex3f(1, -1, -30.0);
+ glVertex3f(.5, -.5, -30.0);
+
+ glVertex3f(-.5, -.5, -30.0);
+ glVertex3f(.5, -.5, -30.0);
+ glVertex3f(0, 0, -30.0);
+
+
+ glColor3f(0,1,0);
+ glVertex3f(1, 1, -30.0);
+ glVertex3f(0, 1, -30.0);
+ glVertex3f(.5, .5, -30.0);
+
+ glColor3f(1,1,1);
+ glVertex3f(0, 1, -30.0);
+ glVertex3f(-1, 1, -30.0);
+ glVertex3f(-.5, .5, -30.0);
+
+ glVertex3f(.5, .5, -30.0);
+ glVertex3f(-.5, .5, -30.0);
+ glVertex3f( 0, 0, -30.0);
+
+ glEnd();
+
+
+ glViewport(0, 0, tw, th);
+
+ glBegin(GL_LINES);
+ glColor3f(.5,.5,0);
+ for (i = -10; i < 10; i++) {
+ float f = i / 10.0;
+
+ if (i == 0)
+ continue;
+
+ glVertex3f(-1, f, -30.0);
+ glVertex3f(1, f, -30.0);
+
+ glVertex3f(f, -1, -30.0);
+ glVertex3f(f, 1, -30.0);
+ }
+ glEnd();
+
+
+
glFlush();
if (doubleBuffer) {
@@ -86,6 +158,13 @@
{
GLint i;
+ if (getenv("VPX"))
+ tx = atof(getenv("VPX"));
+
+ if (getenv("VPY"))
+ ty = atof(getenv("VPY"));
+
+
for (i = 1; i < argc; i++) {
if (strcmp(argv[i], "-sb") == 0) {
doubleBuffer = GL_FALSE;
@@ -99,6 +178,30 @@
return GL_TRUE;
}
+
+static void
+special(int k, int x, int y)
+{
+ switch (k) {
+ case GLUT_KEY_UP:
+ ty += 1.0;
+ break;
+ case GLUT_KEY_DOWN:
+ ty -= 1.0;
+ break;
+ case GLUT_KEY_LEFT:
+ tx -= 1.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ tx += 1.0;
+ break;
+ default:
+ return;
+ }
+ glutPostRedisplay();
+}
+
+
int main(int argc, char **argv)
{
GLenum type;
@@ -123,7 +226,8 @@
Init();
glutReshapeFunc(Reshape);
- glutKeyboardFunc(Key);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(special);
glutDisplayFunc(Draw);
glutMainLoop();
return 0;