nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #ifdef __APPLE__ nuclear@0: #include nuclear@0: #else nuclear@0: #include nuclear@0: #endif nuclear@0: #include "object.h" nuclear@0: #include "cloth.h" nuclear@0: nuclear@0: bool init(); nuclear@0: void cleanup(); nuclear@0: void display(); nuclear@0: void idle(); nuclear@0: void reshape(int x, int y); nuclear@0: void keyboard(unsigned char key, int x, int y); nuclear@0: void mouse(int bn, int st, int x, int y); nuclear@0: void motion(int x, int y); nuclear@0: nuclear@1: float cam_theta, cam_phi = 25, cam_dist = 10; nuclear@0: nuclear@0: Cloth cloth; nuclear@0: nuclear@0: int main(int argc, char **argv) nuclear@0: { nuclear@0: glutInit(&argc, argv); nuclear@0: glutInitWindowSize(800, 600); nuclear@0: glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); nuclear@0: glutCreateWindow("foo"); nuclear@0: nuclear@0: glutDisplayFunc(display); nuclear@0: glutIdleFunc(idle); nuclear@0: glutReshapeFunc(reshape); nuclear@0: glutKeyboardFunc(keyboard); nuclear@0: glutMouseFunc(mouse); nuclear@0: glutMotionFunc(motion); nuclear@0: nuclear@0: if(!init()) { nuclear@0: return 1; nuclear@0: } nuclear@0: atexit(cleanup); nuclear@0: nuclear@0: glutMainLoop(); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: bool init() nuclear@0: { nuclear@0: glewInit(); nuclear@0: nuclear@0: glEnable(GL_DEPTH_TEST); nuclear@0: glEnable(GL_CULL_FACE); nuclear@0: //glEnable(GL_LIGHTING); nuclear@0: glEnable(GL_LIGHT0); nuclear@0: nuclear@1: cloth.create_rect(4, 4, 10, 10); nuclear@0: nuclear@0: Matrix4x4 xform = Matrix4x4(1, 0, 0, 0, nuclear@0: 0, 1, 0, 0, nuclear@0: 0, 0, 1, 0, nuclear@1: 0, 1, 1, 1); nuclear@0: cloth.transform(xform); nuclear@1: cloth.set_mass(0.1); nuclear@1: cloth.set_spring_constant(0.1); nuclear@1: cloth.set_gravity(Vector3(0, -0.1, 0)); nuclear@1: cloth.set_damping(0.1); nuclear@0: nuclear@0: nuclear@0: return true; nuclear@0: } nuclear@0: nuclear@0: void cleanup() nuclear@0: { nuclear@0: } nuclear@0: nuclear@0: void display() nuclear@0: { nuclear@1: static unsigned int prev_upd; nuclear@1: unsigned int msec = glutGet(GLUT_ELAPSED_TIME); nuclear@1: nuclear@1: if(!prev_upd) prev_upd = msec; nuclear@1: float dt = (msec - prev_upd) / 1000.0f; nuclear@1: nuclear@1: cloth.step(dt); nuclear@1: nuclear@0: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); nuclear@0: nuclear@0: glMatrixMode(GL_MODELVIEW); nuclear@0: glLoadIdentity(); nuclear@0: glTranslatef(0, 0, -cam_dist); nuclear@0: glRotatef(cam_phi, 1, 0, 0); nuclear@0: glRotatef(cam_theta, 0, 1, 0); nuclear@0: nuclear@0: cloth.draw(); nuclear@0: nuclear@0: glutSwapBuffers(); nuclear@0: assert(glGetError() == GL_NO_ERROR); nuclear@0: } nuclear@0: nuclear@0: void idle() nuclear@0: { nuclear@0: glutPostRedisplay(); nuclear@0: } nuclear@0: nuclear@0: void reshape(int x, int y) nuclear@0: { nuclear@0: glViewport(0, 0, x, y); nuclear@0: nuclear@0: glMatrixMode(GL_PROJECTION); nuclear@0: glLoadIdentity(); nuclear@0: gluPerspective(50.0, (float)x / (float)y, 0.5, 500.0); nuclear@0: } nuclear@0: nuclear@0: void keyboard(unsigned char key, int x, int y) nuclear@0: { nuclear@0: switch(key) { nuclear@0: case 27: nuclear@0: exit(0); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: static bool bnstate[16]; nuclear@0: static int prev_x, prev_y; nuclear@0: nuclear@0: void mouse(int bn, int st, int x, int y) nuclear@0: { nuclear@0: prev_x = x; nuclear@0: prev_y = y; nuclear@0: bnstate[bn - GLUT_LEFT_BUTTON] = st == GLUT_DOWN; nuclear@0: } nuclear@0: nuclear@0: void motion(int x, int y) nuclear@0: { nuclear@0: int dx = x - prev_x; nuclear@0: int dy = y - prev_y; nuclear@0: prev_x = x; nuclear@0: prev_y = y; nuclear@0: nuclear@0: if(!dx && !dy) return; nuclear@0: nuclear@0: if(bnstate[0]) { nuclear@0: cam_theta += dx * 0.5; nuclear@0: cam_phi += dy * 0.5; nuclear@0: nuclear@0: if(cam_phi < -90) cam_phi = -90; nuclear@0: if(cam_phi > 90) cam_phi = 90; nuclear@0: } nuclear@0: if(bnstate[2]) { nuclear@0: cam_dist += dy * 0.1; nuclear@0: if(cam_dist < 0.0) cam_dist = 0.0; nuclear@0: } nuclear@0: }