示例#1
0
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);
    }
}
示例#2
0
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);
	}
}