rts_glutRenderWindow.h 3.14 KB
#include <GL/glew.h>
#include <GL/glut.h>
#include "rtsQuaternion.h"
#include "rtsCamera.h"

float d_angle = 0.05;

rtsCamera rts_glut_camera;
unsigned int mouse_x;
unsigned int mouse_y;
int mouse_button;


//user display function pointer
void (*UserDisplay)(void);



/*void KeyboardFunction(unsigned char key, int x, int y)
{
	if(key == 27)
		exit(0);

}*/

/*void SpecialKeys(int key, int x, int y)
{
	rtsQuaternion<float> new_rotation;

	if(key == GLUT_KEY_UP)
		rts_glut_camera.OrbitFocus(0, d_angle);
	if(key == GLUT_KEY_DOWN)
		rts_glut_camera.OrbitFocus(0, -d_angle);
	if(key == GLUT_KEY_LEFT)
		rts_glut_camera.OrbitFocus(d_angle, 0.0);
	if(key == GLUT_KEY_RIGHT)
		rts_glut_camera.OrbitFocus(-d_angle, 0.0);
}*/

void MouseDrag(int x, int y)
{
	int dx = x - mouse_x;
	int dy = y - mouse_y;

	if(mouse_button == GLUT_LEFT_BUTTON)
		rts_glut_camera.OrbitFocus(-dx*0.01, dy*0.01);
	else if(mouse_button == GLUT_MIDDLE_BUTTON)
		rts_glut_camera.Zoom(dy*rts_glut_camera.getFOV()/60.0);

	mouse_x = x;
	mouse_y = y;

}

void MouseMove(int x, int y)
{
	mouse_x = x;
	mouse_y = y;
}

void MouseClick(int button, int state, int x, int y)
{
	if(state == GLUT_DOWN)
		mouse_button = button;


}

void IdleFunction()
{
	glutPostRedisplay();
}

void RenderCamera()
{
	//set viewport
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glViewport(0, 0, glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));

	//compute the aspect ratio
	float aspect_ratio = (float)glutGet(GLUT_WINDOW_WIDTH)/(float)glutGet(GLUT_WINDOW_HEIGHT);
	gluPerspective(rts_glut_camera.getFOV(), aspect_ratio, 0.01, 10.0);

	//render the camera
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	point3D<float> camera_position = rts_glut_camera.getPosition();
	vector3D<float> camera_up = rts_glut_camera.getUp();
	gluLookAt(camera_position.x,
			  camera_position.y,
			  camera_position.z,
			  0.0, 0.0, 0.0,
			  camera_up.x,
			  camera_up.y,
			  camera_up.z);
}

void rts_glutInitialize(const char* WindowName, int width = 1024, int height = 768)
{
	char *myargv [1];
	int myargc=1;
	myargv [0]=strdup ("AppName");
	glutInit(&myargc, myargv);

	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
	glutInitWindowSize(width, height);
	glutInitWindowPosition(200,0);
	glutCreateWindow(WindowName);

	//initialize GLEW
	GLenum err = glewInit();
	if(err != GLEW_OK)
		fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
	if (!glewIsSupported("GL_VERSION_2_0"))
	{
		printf("OpenGL 2.0 not supported\n");
		//exit(1);
	}
	glEnable(GL_DEPTH_TEST);

	glClearColor(1.0, 1.0, 1.0, 0.0);

	rts_glut_camera.setPosition(0.0, 0.0, -1.0);
	rts_glut_camera.setFOV(60);
	rts_glut_camera.LookAt(0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}

void DisplayFunction()
{
	RenderCamera();
	UserDisplay();
	glutSwapBuffers();
}

void rts_glutStart(void (*display_func)(void))
{
	//glutSpecialFunc(SpecialKeys);
	//glutKeyboardFunc(KeyboardFunction);
	glutDisplayFunc(DisplayFunction);
	glutMotionFunc(MouseDrag);
	glutMouseFunc(MouseClick);
	glutPassiveMotionFunc(MouseMove);
	UserDisplay = display_func;
	glutIdleFunc(IdleFunction);



	//glutReshapeFunc(ReshapeFunction);
	//glutMouseFunc(MouseFunction);
	//glutMotionFunc(MotionFunction);
	glutMainLoop();

}