Camera::Camera(glm::vec3 const & position, glm::vec3 const & t, glm::vec3 const & up, float sensibility, float speed): m_phi(0), m_theta(0), m_position(position), m_target(t), m_up(up), m_orientation(), m_sideShift(), m_modelview(), m_sensibility(sensibility), m_speed(speed), m_mouseEnabled(true), m_needUpdateMV(true) { target(t); m_sideShift = glm::normalize(glm::cross(m_up, m_orientation)); updateMV(); }
int main(int argc, char *argv[]) { unsigned *cloud; int texcomps, texwid, texht; GLUquadricObj *sphere; /* start and end of particles */ static GLfloat begin[] = {0.f, -25.f, 0.f}; static GLfloat end[] = {0.f,-100.f, 0.f}; static GLfloat fogcolor[] = {.4f, .4f, .4f, 1.f}; glutInitWindowSize(winwid, winht); glutInit(&argc, argv); if(argc > 1) { char *args = argv[1]; int done = GL_FALSE; while(!done) { switch(*args) { case 's': /* single buffer */ printf("Single Buffered\n"); dblbuf = GL_FALSE; break; case '-': /* do nothing */ break; case 0: done = GL_TRUE; break; } args++; } } if(dblbuf) glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL|GLUT_DOUBLE); else glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL); (void)glutCreateWindow("snow demo"); glutDisplayFunc(redraw); glutReshapeFunc(reshape); glutMouseFunc(mouse); glutMotionFunc(motion); glutKeyboardFunc(key); glutIdleFunc(idle); glutCreateMenu(menu); glutAddMenuEntry("Toggle Overcast (o, O)", OVERCAST); glutAddMenuEntry("Toggle Fog (f, F)", FOG); glutAddMenuEntry("Toggle Snow (s, S)", SNOW); glutAddMenuEntry("Bigger Flakes (+)", BIGGER); glutAddMenuEntry("Smaller Flakes (-)", SMALLER); glutAddMenuEntry("Reset Flake Size to One (r, R)", RESETSIZE); glutAddMenuEntry("Toggle Point Antialiasing (a, A)", ANTIALIAS); glutAddMenuEntry("Snow Blending (b, B)", BLEND); glutAddMenuEntry("Exit Program", EXIT); glutAttachMenu(GLUT_RIGHT_BUTTON); printf("OpenGL Version %s\n", glGetString(GL_VERSION)); /* draw a perspective scene */ glMatrixMode(GL_PROJECTION); glFrustum(-5., 5., -5., 5., 10., 1000.); glMatrixMode(GL_MODELVIEW); updateMV(); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); /* turn on features */ glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); /* place light 0 in the right place */ glLightfv(GL_LIGHT0, GL_POSITION, lightpos); glClearColor(0.f, 0.f, 1.f, 1.f); glFogfv(GL_FOG_COLOR, fogcolor); glFogi(GL_FOG_MODE, GL_LINEAR); glFogf(GL_FOG_START, -200.f); glFogf(GL_FOG_END, 200.f); glHint(GL_FOG_HINT, GL_NICEST); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); /* makes texturing faster, and looks better than GL_LINEAR */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glNewList(LIGHT, GL_COMPILE); glDisable(GL_LIGHTING); sphere = gluNewQuadric(); glColor3f(.7f, .2f, .7f); gluSphere(sphere, 5.f, 10, 10); gluDeleteQuadric(sphere); glEnable(GL_LIGHTING); glEndList(); /* 10 X 20; vary size with transforms */ /* one corner of house on origin; bottom on xz plane */ glNewList(HOUSE, GL_COMPILE); glBegin(GL_QUADS); /* walls of house */ glColor3f(1.f, 1.f, 0.f); /* front */ glNormal3f( 0.f, 0.f, 1.f); glVertex3i( 0, 0, 0); glVertex3i(10, 0, 0); glVertex3i(10,10, 0); glVertex3i( 0,10, 0); /* back */ glNormal3f( 0.f, 0.f, -1.f); glVertex3i( 0, 0, -20); glVertex3i( 0,10, -20); glVertex3i(10,10, -20); glVertex3i(10, 0, -20); /* left */ glNormal3f(-1, 0.f, 0.f); glVertex3i( 0, 0, 0); glVertex3i( 0, 10, 0); glVertex3i( 0, 10, -20); glVertex3i( 0, 0, -20); /* right */ glNormal3f( 1.f, 0.f, 0.f); glVertex3i(10, 0, 0); glVertex3i(10, 0, -20); glVertex3i(10, 10, -20); glVertex3i(10, 10, 0); /* roof of house */ glColor3f(.8f, .1f, .1f); /* left top */ glNormal3f(-.707f, .707f, 0.f); glVertex3i( 0, 10, 0); glVertex3i( 5, 15, 0); glVertex3i( 5, 15, -20); glVertex3i( 0, 10, -20); /* right top */ glNormal3f( .707f, .707f, 0.f); glVertex3i(10, 10, 0); glVertex3i(10, 10, -20); glVertex3i( 5, 15, -20); glVertex3i( 5, 15, 0); glEnd(); glBegin(GL_TRIANGLES); /* front */ glNormal3f( 0.f, 0.f, 1.f); glVertex3i( 0, 10, 0); glVertex3i(10, 10, 0); glVertex3i( 5, 15, 0); /* back */ glNormal3f( 0.f, 0.f, -1.f); glVertex3i( 0, 10, -20); glVertex3i( 5, 15, -20); glVertex3i(10, 10, -20); glEnd(); glEndList(); glEnable(GL_CULL_FACE); /* load pattern for current 2d texture */ cloud = read_texture("../../data/clouds.bw", &texwid, &texht, &texcomps); gluBuild2DMipmaps(GL_TEXTURE_2D, GL_LUMINANCE, texwid, texht, GL_RGBA, GL_UNSIGNED_BYTE, cloud); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); free(cloud); initpart(&psys, begin, end, 200, 6000); updateptr = updatepart0; CHECK_ERROR("main()"); glutMainLoop(); return 0; }
glm::mat4 const & Camera::lookAt() { updateMV(); return m_modelview; }