#include <Fl/Fl.h>
#include <FL/Gl.h>
#include <GL/Glu.h>
#include "MyWindow.h"
#include <stdio.h>
MyWindow::MyWindow(int width, int height, char* title) : Fl_Gl_Window(width, height, title)
{
mode(FL_RGB | FL_ALPHA | FL_DEPTH | FL_DOUBLE);
}
MyWindow::~MyWindow()
{}
void MyWindow::InitializeGL()
{
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-30.0,30.0,-30.0,30.0,-30.0,30.0);
glMatrixMode(GL_MODELVIEW);
glClearColor(1.0,1.0,1.0,1.0);
glColor3f(0.0,0.0,0.0);
aspect=0;
near1=10.0;
far1=30.0;
}
void MyWindow::draw()
{
static bool firstTime = true;
if (firstTime)
{
InitializeGL();
firstTime = false;
}// if
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
gluPerspective(0.0,1.0,0.0,20.0);
DrawCube();
}
void MyWindow::DrawCube()
{
FILE *fp;
int trianglenum=0;
int verticenum=0;
GLfloat vertice[10000][3];
int triangle[10000][3];
char buf[30];
int mk;
fp=fopen("dog.obj","r");
while(fgets(buf,30,fp)!=NULL)
{
if(buf[0]=='v')
{
sscanf(buf+1," %f %f %f",&vertice[verticenum][0],&vertice[verticenum][1],&vertice[verticenum][2]);
verticenum++;
}
if(buf[0]=='f')
{
sscanf(buf+1," %d %d %d",&triangle[trianglenum][0],&triangle[trianglenum][1],&triangle[trianglenum][2]);
trianglenum++;
}
}
fclose(fp);
for(mk=0;mk<verticenum;mk++)
{
glBegin(GL_LINE_STRIP);
glVertex3fv(vertice[(triangle[mk][0]-1)]);
glVertex3fv(vertice[(triangle[mk][1]-1)]);
glVertex3fv(vertice[(triangle[mk][2]-1)]);
glVertex3fv(vertice[(triangle[mk][0]-1)]);
glEnd();
}
glFlush();
}
int MyWindow::handle(int event)
{
int mouse_key;
switch (event)
{
case FL_FOCUS:
case FL_UNFOCUS:
return 1;
case FL_PUSH:
return 1;
case FL_RELEASE:
mouse_key=Fl::event_button();
switch(mouse_key)
{
case FL_LEFT_MOUSE:
aspect+=10;
gluPerspective(0.0,1.0+aspect,0.0,30.0);
return 1;
case FL_RIGHT_MOUSE:
aspect-=10;
gluPerspective(0.0,1.0+aspect,0.0,30.0);
return 1;
}
case FL_KEYBOARD:
int key = Fl::event_key();
switch (key)
{
case 'q':
glTranslatef(3.0,0.0,0.0);
redraw();
return 1;
case 'a':
glTranslatef(-3.0,0.0,0.0);
redraw();
return 1;
case 'w':
glTranslatef(0.0,3.0,0.0);
redraw();
return 1;
case 's':
glTranslatef(0.0,-3.0,0.0);
redraw();
return 1;
case 'e':
glTranslatef(0.0,0.0,3.0);
redraw();
return 1;
case 'd':
glTranslatef(0.0,0.0,-3.0);
redraw();
return 1;
case 'r':
glRotatef(10.0,1.0,0.0,0.0);
redraw();
return 1;
case 't':
glRotatef(10.0,0.0,1.0,0.0);
redraw();
return 1;
case 'y':
glRotatef(10.0,0.0,0.0,1.0);
redraw();
return 1;
case 'g':
glScalef(2.0,2.0,2.0);
redraw();
return 1;
case 'h':
glScalef(0.5,0.5,0.5);
redraw();
return 1;
case 'u':
aspect+=0.5;
gluPerspective(0.0,1.0-aspect,near1,far1);
redraw();
return 1;
case 'j':
aspect-=0.5;
gluPerspective(0.0,1.0-aspect,near1,far1);
redraw();
return 1;
case 'i':
near1+=0.5;
far1+=0.5;
gluPerspective(0.0,1.0-aspect,near1,far1);
redraw();
return 1;
case 'k':
near1-=0.5;
far1-=0.5;
gluPerspective(0.0,1.0-aspect,near1,far1);
redraw();
return 1;
}
}
return Fl_Gl_Window::handle(event);
}