// per-frame mouse input; called from Update unsafe void ProcessMouse() { // get modifiers bool alt = Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt); bool shift = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift); bool control = Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl); // get button pressed, swap left-right on alt int buttonpressed = 0; if (Input.GetMouseButton(0)) // left { buttonpressed = (alt ? 2 : 1); } if (Input.GetMouseButton(1)) // right { buttonpressed = (alt ? 1 : 2); } if (Input.GetMouseButton(2)) // middle { buttonpressed = 3; } // get button click, swap left-right on alt int buttonclick = 0; if (Input.GetMouseButtonDown(0)) // left { buttonclick = (alt ? 2 : 1); } if (Input.GetMouseButtonDown(1)) // right { buttonclick = (alt ? 1 : 2); } if (Input.GetMouseButtonDown(2)) // middle { buttonclick = 3; } // click if (buttonclick > 0) { // set perturbation state int newstate = 0; if (control) { // determine new perturbation state if (buttonclick == 1) { newstate = 2; // rotate } else if (buttonclick == 2) { newstate = 1; // move } // get old perturbation state MJP.TPerturb current; MJP.GetPerturb(¤t); // syncronize if starting perturbation now if (newstate > 0 && current.active == 0) { MJP.PerturbSynchronize(); } } MJP.PerturbActive(newstate); // process double-click if (buttonclick == lastbutton && Time.fixedUnscaledTime - lasttime < 0.25) { // relative screen position and aspect ratio float relx = Input.mousePosition.x / Screen.width; float rely = Input.mousePosition.y / Screen.height; float aspect = (float)Screen.width / (float)Screen.height; // left: select body if (buttonclick == 1) { MJP.PerturbSelect(relx, rely, aspect); } // right: set lookat else if (buttonclick == 2) { MJP.CameraLookAt(relx, rely, aspect); } } // save mouse state lastx = Input.mousePosition.x; lasty = Input.mousePosition.y; lasttime = Time.fixedUnscaledTime; lastbutton = buttonclick; } // left or right drag: manipulate camera or perturb if (buttonpressed == 1 || buttonpressed == 2) { // compute relative displacement and modifier float reldx = (Input.mousePosition.x - lastx) / Screen.height; float reldy = (Input.mousePosition.y - lasty) / Screen.height; int modifier = (shift ? 1 : 0); // perturb if (control) { if (buttonpressed == 1) { MJP.PerturbRotate(reldx, -reldy, modifier); } else { MJP.PerturbMove(reldx, -reldy, modifier); } } // camera else { if (buttonpressed == 1) { MJP.CameraRotate(reldx, -reldy); } else { MJP.CameraMove(reldx, -reldy, modifier); } } } // middle drag: zoom camera if (buttonpressed == 3) { float reldy = (Input.mousePosition.y - lasty) / Screen.height; MJP.CameraZoom(-reldy); } // scroll: zoom camera if (Input.mouseScrollDelta.y != 0) { MJP.CameraZoom(-0.05f * Input.mouseScrollDelta.y); } // save position lastx = Input.mousePosition.x; lasty = Input.mousePosition.y; // release left or right: stop perturb if (Input.GetMouseButtonUp(0) || Input.GetMouseButtonUp(1)) { MJP.PerturbActive(0); } }