void motionfunc(int x, int y) { if (!bound && !menu) { int deltax = x - mousex; int deltay = mousey - y; mousex = x; mousey = y; vec3f direction; vec3f position; if (scene.active_camera_valid()) { if (scene.cameras[scene.active_camera]->type == "ortho") { position = canvas.unproject(canvas.to_window(vec2i(x, y))); direction = ror3(vec3f(0.0f, 0.0f, 1.0f), scene.cameras[scene.active_camera]->orientation); } else { position = scene.cameras[scene.active_camera]->position; direction = norm(canvas.unproject(canvas.to_window(vec2i(x, y)))); } } if (scene.active_object_valid() && scene.active_camera_valid()) { if (manipulator == manipulate::translate) { float d = mag(scene.objects[scene.active_object]->position - position); scene.objects[scene.active_object]->position = d*direction + position; } else if (manipulator == manipulate::rotate) scene.objects[scene.active_object]->orientation += vec3f(-(float)deltay/100.0, (float)deltax/100.0, 0.0); else if (manipulator == manipulate::scale) scene.objects[scene.active_object]->scale += (float)deltay/100.0; for (int i = 0; i < scene.cameras.size(); i++) if (scene.cameras[i]->model == scene.objects[scene.active_object]) { scene.cameras[i]->position = scene.objects[scene.active_object]->position; scene.cameras[i]->orientation = scene.objects[scene.active_object]->orientation; } } if (scene.active_camera_valid()) { if (manipulator == manipulate::fovy && scene.cameras[scene.active_camera]->type == "perspective") ((perspectivehdl*)scene.cameras[scene.active_camera])->fovy += (float)deltay/100.0; else if (manipulator == manipulate::aspect && scene.cameras[scene.active_camera]->type == "perspective") ((perspectivehdl*)scene.cameras[scene.active_camera])->aspect += (float)deltay/100.0; else if (manipulator == manipulate::width && scene.cameras[scene.active_camera]->type == "ortho") { ((orthohdl*)scene.cameras[scene.active_camera])->right += (float)deltay/200.0; ((orthohdl*)scene.cameras[scene.active_camera])->left -= (float)deltay/200.0; } else if (manipulator == manipulate::width && scene.cameras[scene.active_camera]->type == "frustum") { ((frustumhdl*)scene.cameras[scene.active_camera])->right += (float)deltay/200.0; ((frustumhdl*)scene.cameras[scene.active_camera])->left -= (float)deltay/200.0; } else if (manipulator == manipulate::height && scene.cameras[scene.active_camera]->type == "ortho") { ((orthohdl*)scene.cameras[scene.active_camera])->top += (float)deltay/200.0; ((orthohdl*)scene.cameras[scene.active_camera])->bottom -= (float)deltay/200.0; } else if (manipulator == manipulate::height && scene.cameras[scene.active_camera]->type == "frustum") { ((frustumhdl*)scene.cameras[scene.active_camera])->top += (float)deltay/200.0; ((frustumhdl*)scene.cameras[scene.active_camera])->bottom -= (float)deltay/200.0; } else if (manipulator == manipulate::front && scene.cameras[scene.active_camera]->type == "ortho") ((orthohdl*)scene.cameras[scene.active_camera])->front += (float)deltay/100.0; else if (manipulator == manipulate::front && scene.cameras[scene.active_camera]->type == "frustum") ((frustumhdl*)scene.cameras[scene.active_camera])->front += (float)deltay/100.0; else if (manipulator == manipulate::front && scene.cameras[scene.active_camera]->type == "perspective") ((perspectivehdl*)scene.cameras[scene.active_camera])->front += (float)deltay/100.0; else if (manipulator == manipulate::back && scene.cameras[scene.active_camera]->type == "ortho") ((orthohdl*)scene.cameras[scene.active_camera])->back += (float)deltay/100.0; else if (manipulator == manipulate::back && scene.cameras[scene.active_camera]->type == "frustum") ((frustumhdl*)scene.cameras[scene.active_camera])->back += (float)deltay/100.0; else if (manipulator == manipulate::back && scene.cameras[scene.active_camera]->type == "perspective") ((perspectivehdl*)scene.cameras[scene.active_camera])->back += (float)deltay/100.0; if (manipulator == manipulate::fovy || manipulator == manipulate::aspect || manipulator == manipulate::width || manipulator == manipulate::height || manipulator == manipulate::front || manipulator == manipulate::back) scene.cameras[scene.active_camera]->project(&canvas); } glutPostRedisplay(); } else if (!bound) { menu = false; pmotionfunc(x, y); } }
void motionfunc(int x, int y) { if (!bound && !menu) { int deltax = x - mousex; int deltay = mousey - y; mousex = x; mousey = y; vec3f direction; vec3f position; if (scene.active_camera_valid()) { if (scene.cameras[scene.active_camera]->type == "ortho") { GLdouble model[16]; GLdouble proj[16]; GLint view[4]; glGetDoublev(GL_MODELVIEW_MATRIX, model); glGetDoublev(GL_PROJECTION_MATRIX, proj); glGetIntegerv(GL_VIEWPORT, view); vec<double, 3> p; gluUnProject(x, height-y, 0.0, model, proj, view, &p[0], &p[1], &p[2]); position = p; direction = ror3(vec3f(0.0f, 0.0f, 1.0f), scene.cameras[scene.active_camera]->orientation); } else { GLdouble model[16]; GLdouble proj[16]; GLint view[4]; glGetDoublev(GL_MODELVIEW_MATRIX, model); glGetDoublev(GL_PROJECTION_MATRIX, proj); glGetIntegerv(GL_VIEWPORT, view); vec<double, 3> p; gluUnProject(x, height-y, 0.0, model, proj, view, &p[0], &p[1], &p[2]); position = scene.cameras[scene.active_camera]->position; direction = norm(p - position); } } if (scene.active_object_valid() && scene.active_camera_valid()) { if (manipulator == manipulate::translate) { float d = mag(scene.objects[scene.active_object]->position - position); scene.objects[scene.active_object]->position = d*direction + position; } else if (manipulator == manipulate::rotate) scene.objects[scene.active_object]->orientation += vec3f(-(float)deltay/100.0, (float)deltax/100.0, 0.0); else if (manipulator == manipulate::scale) scene.objects[scene.active_object]->scale += (float)deltay/100.0; else if (manipulator == manipulate::stepsize) { scene.objects[scene.active_object]->minstep += (float)deltay/100.0; if (scene.objects[scene.active_object]->minstep < 0.0) scene.objects[scene.active_object]->minstep = 0.0; } for (int i = 0; i < scene.cameras.size(); i++) if (scene.cameras[i]->model == scene.objects[scene.active_object]) { scene.cameras[i]->position = scene.objects[scene.active_object]->position; scene.cameras[i]->orientation = scene.objects[scene.active_object]->orientation; } } if (scene.active_camera_valid()) { if (manipulator == manipulate::fovy && scene.cameras[scene.active_camera]->type == "perspective") ((perspectivehdl*)scene.cameras[scene.active_camera])->fovy += (float)deltay/100.0; else if (manipulator == manipulate::aspect && scene.cameras[scene.active_camera]->type == "perspective") ((perspectivehdl*)scene.cameras[scene.active_camera])->aspect += (float)deltay/100.0; else if (manipulator == manipulate::width && scene.cameras[scene.active_camera]->type == "ortho") { ((orthohdl*)scene.cameras[scene.active_camera])->right += (float)deltay/200.0; ((orthohdl*)scene.cameras[scene.active_camera])->left -= (float)deltay/200.0; } else if (manipulator == manipulate::width && scene.cameras[scene.active_camera]->type == "frustum") { ((frustumhdl*)scene.cameras[scene.active_camera])->right += (float)deltay/200.0; ((frustumhdl*)scene.cameras[scene.active_camera])->left -= (float)deltay/200.0; } else if (manipulator == manipulate::height && scene.cameras[scene.active_camera]->type == "ortho") { ((orthohdl*)scene.cameras[scene.active_camera])->top += (float)deltay/200.0; ((orthohdl*)scene.cameras[scene.active_camera])->bottom -= (float)deltay/200.0; } else if (manipulator == manipulate::height && scene.cameras[scene.active_camera]->type == "frustum") { ((frustumhdl*)scene.cameras[scene.active_camera])->top += (float)deltay/200.0; ((frustumhdl*)scene.cameras[scene.active_camera])->bottom -= (float)deltay/200.0; } else if (manipulator == manipulate::front && scene.cameras[scene.active_camera]->type == "ortho") ((orthohdl*)scene.cameras[scene.active_camera])->front += (float)deltay/100.0; else if (manipulator == manipulate::front && scene.cameras[scene.active_camera]->type == "frustum") ((frustumhdl*)scene.cameras[scene.active_camera])->front += (float)deltay/100.0; else if (manipulator == manipulate::front && scene.cameras[scene.active_camera]->type == "perspective") ((perspectivehdl*)scene.cameras[scene.active_camera])->front += (float)deltay/100.0; else if (manipulator == manipulate::back && scene.cameras[scene.active_camera]->type == "ortho") ((orthohdl*)scene.cameras[scene.active_camera])->back += (float)deltay/100.0; else if (manipulator == manipulate::back && scene.cameras[scene.active_camera]->type == "frustum") ((frustumhdl*)scene.cameras[scene.active_camera])->back += (float)deltay/100.0; else if (manipulator == manipulate::back && scene.cameras[scene.active_camera]->type == "perspective") ((perspectivehdl*)scene.cameras[scene.active_camera])->back += (float)deltay/100.0; if (manipulator == manipulate::fovy || manipulator == manipulate::aspect || manipulator == manipulate::width || manipulator == manipulate::height || manipulator == manipulate::front || manipulator == manipulate::back) scene.cameras[scene.active_camera]->project(); } glutPostRedisplay(); } else if (!bound) { menu = false; pmotionfunc(x, y); } }