private void MoveSelectedModel(Vector3 touch) { if (camera == null || SelectedModel == null) { return; } // Create ray from camera starting at touch Ray ray = camera.ScreenPointToRay(touch); // Get intersection point of ray and offset plane float distance = 0f; if (offset_plane.Raycast(ray, out distance)) { Vector3 point = ray.GetPoint(distance); // Reset flag resets point offset's x and z coordinates // to the difference of the selected model's position and // intersection point. if (reset_offset) { Vector3 dif = SelectedModel.position - point; point_offset.x = dif.x; point_offset.z = dif.z; reset_offset = false; } //model position Vector3 position = point + point_offset * SelectedModel.size; if (Vector3.Distance(ARScene.Origin.position, position) < 10) { //Start ewa if (drag_start) { drag_start = false; dragEWA = position; } else { dragEWA = dragEWA * (EWAlambda) + (1 - EWAlambda) * position; } float bp = SelectedModel.binPercent; SelectedModel.binPercent = binPercent(touch); if (bp < DeleteThreshold && SelectedModel.binPercent > DeleteThreshold) { NativeAid.HapticEvent(HEvent.Delete); } SelectedModel.position = dragEWA; } } }
void Awake() { if (IconClickBox != null) { IconClickBox.AddEventListener("onclick", () => { if (Mode == CenterIcon.Screenshot) { Flash.hold = true; Flash.Start(); NativeAid.SavePhoto(capture); NativeAid.HapticEvent(HEvent.Success); Flash.hold = false; } }); } }
public void Click(Vector2 start, Vector2 end) { StartPos = start; EndPos = end; Debug.Log($"{gameObject.name}'s clickbox clicked."); if (Haptic) { NativeAid.HapticEvent(HEvent.Click); } RunEvent("onclick"); if (OnClick != null) { OnClick(); } }
void Update() { if (locked) { return; } //One touch detected if (Input.touchCount == 1) { Touch touch = Input.GetTouch(0); Vector2 point = touch.position; //normalise touch phase Canceled = Ended, Stationary = Moved TouchPhase phase = touch.phase; if (phase == TouchPhase.Canceled) { phase = TouchPhase.Ended; } if (phase == TouchPhase.Stationary) { phase = TouchPhase.Moved; } if (phase == TouchPhase.Began) { //If the touch isn't on any ui click boxes, select a model //and set the drag offset, otherwise drag not started. if (isInClickBox(point)) { Debug.Log("in click box"); Mode = GMode.None; } else { if (SelectModel(point)) { NativeAid.HapticEvent(HEvent.Select); SelectedModel.Held = true; Mode = GMode.Drag; Icon.Mode = CenterIcon.Bin; } else { Mode = GMode.None; } } } else if (phase == TouchPhase.Moved && Mode == GMode.Drag) { MoveSelectedModel(point); } else if (phase == TouchPhase.Ended && Mode == GMode.Drag) { if (SelectedModel != null) { SelectedModel.Held = false; if (SelectedModel.binPercent > DeleteThreshold) { ARScene.Remove(SelectedModel); NativeAid.HapticEvent(HEvent.Deleted); } else { SelectedModel.goalBinPercent = 0; if (SelectedModel.binPercent > 0) { NativeAid.HapticEvent(HEvent.Warning); } } } Icon.Mode = CenterIcon.Screenshot; Mode = GMode.None; } //Two or more touch's detected } else if (Input.touchCount > 1) { Touch a = Input.GetTouch(0); Touch b = Input.GetTouch(1); Vector2 av = a.position; Vector2 bv = b.position; //nomalise touch phases Canceled = Ended TouchPhase phaseA = a.phase; TouchPhase phaseB = b.phase; if (phaseA == TouchPhase.Canceled) { phaseA = TouchPhase.Ended; } if (phaseB == TouchPhase.Canceled) { phaseB = TouchPhase.Ended; } // Either touch has just began, set the initial rotation vector if (phaseA == TouchPhase.Began || phaseB == TouchPhase.Began) { RotateStart(av, bv); Mode = GMode.Rotate; // Either touches have ended } else if (phaseA == TouchPhase.Ended || phaseB == TouchPhase.Ended) { // Both touches have ended, mode set to none if (phaseA == TouchPhase.Ended && phaseB == TouchPhase.Ended) { Mode = GMode.None; Icon.Mode = CenterIcon.Screenshot; // One touch has ended, mode reverts to drag with offset set to point // that has not ended. } else { reset_offset = true; Mode = GMode.Drag; } // Neither touch has began or ended } else if (Mode == GMode.Rotate) { RotateSelectedModel(av, bv); } } }