13using System.Collections;
22 [RequireComponent(typeof(Camera))]
42 Debug.LogWarning(
"No pb_SceneCamera found, but someone is trying to subscribe to events!");
58 private Texture2D currentCursor;
60 const int CURSOR_ICON_SIZE = 64;
62 const string INPUT_MOUSE_SCROLLWHEEL =
"Mouse ScrollWheel";
63 const string INPUT_MOUSE_X =
"Mouse X";
64 const string INPUT_MOUSE_Y =
"Mouse Y";
66 const int LEFT_MOUSE = 0;
67 const int RIGHT_MOUSE = 1;
68 const int MIDDLE_MOUSE = 2;
70 const float MIN_CAM_DISTANCE = 0.02f;
71 const float MAX_CAM_DISTANCE = 100f;
87 private bool eatMouse =
false;
91 private Vector3 pivot = Vector3.zero;
93 private float distanceToCamera = 10f;
95 private Vector3 prev_mousePosition = Vector3.zero;
97 private Rect mouseCursorRect =
new Rect(0,0,CURSOR_ICON_SIZE,CURSOR_ICON_SIZE);
98 private Rect screenCenterRect =
new Rect(0,0,CURSOR_ICON_SIZE,CURSOR_ICON_SIZE);
100 private bool currentActionValid =
true;
104 return transform.position + transform.forward * distanceToCamera;
115 pb_InputManager.AddKeyInUseDelegate(
IsUsingKey );
118 cam = GetComponent<Camera>();
119 distanceToCamera =
Vector3.Distance(pivot, Camera.main.transform.position);
126 float screenHeight = Screen.height;
128 mouseCursorRect.x = Input.mousePosition.x - 16;
129 mouseCursorRect.y = (screenHeight - Input.mousePosition.y) - 16;
131 screenCenterRect.x = Screen.width/2-32;
132 screenCenterRect.y = screenHeight/2-32;
142 cam.orthographic =
false;
149 cam.orthographic =
false;
153 cam.orthographic =
false;
169 return Input.GetKey(KeyCode.LeftAlt);
172 bool CheckMouseOverGUI()
174 return EventSystem.current ==
null || !EventSystem.current.IsPointerOverGameObject();
179 cam.orthographic =
true;
180 cam.transform.eulerAngles = Vector3.zero;
188 Focus(Vector3.zero, 2);
189 cam.orthographicSize = 2.0f;
195 cam.orthographic =
true;
196 cam.transform.eulerAngles = Vector3.right * 90;
197 cam.transform.eulerAngles += Vector3.up * 270;
205 Focus(Vector3.zero, 2);
206 cam.orthographicSize = 2.0f;
212 cam.orthographic =
true;
213 cam.transform.eulerAngles = Vector3.up * 270;
221 Focus(Vector3.zero, 2);
222 cam.orthographicSize = 2.0f;
229 if(Input.GetMouseButtonUp(0) || Input.GetMouseButtonUp(1) || Input.GetMouseButtonUp(2))
234 currentActionValid =
true;
238 if(Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1) || Input.GetMouseButtonDown(2))
240 currentActionValid = CheckMouseOverGUI();
247 transform.hasChanged =
false;
258 transform.position =
Vector3.Lerp(previousPosition, targetPosition, (zoomProgress += Time.deltaTime)/
zoomSpeed);
259 if(
Vector3.Distance(transform.position, targetPosition) < .1f) zooming =
false;
262 if( (Input.GetAxis(INPUT_MOUSE_SCROLLWHEEL) != 0f || (Input.GetMouseButton(RIGHT_MOUSE) && Input.GetKey(KeyCode.LeftAlt))) && CheckMouseOverGUI())
264 var view = cam.ScreenToViewportPoint(Input.mousePosition);
265 var isOutside = view.x < 0 || view.x > 1 || view.y < 0 || view.y > 1;
270 float delta = Input.GetAxis(INPUT_MOUSE_SCROLLWHEEL);
272 if( Mathf.Approximately(delta, 0f) )
275 delta = pb_HandleUtility.CalcSignedMouseDelta(Input.mousePosition, prev_mousePosition);
278 if (cam.orthographic)
280 cam.orthographicSize -= delta;
281 cam.orthographicSize = Mathf.Clamp(cam.orthographicSize, MIN_CAM_DISTANCE, MAX_CAM_DISTANCE);
285 distanceToCamera -= delta * (distanceToCamera / MAX_CAM_DISTANCE) *
scrollModifier;
286 distanceToCamera = Mathf.Clamp(distanceToCamera, MIN_CAM_DISTANCE, MAX_CAM_DISTANCE);
287 transform.position = transform.localRotation * (
Vector3.forward * -distanceToCamera) + pivot;
296 if( !currentActionValid || (viewTool
298 && !Input.GetMouseButton(LEFT_MOUSE)
299 && !Input.GetMouseButton(RIGHT_MOUSE)
300 && !Input.GetMouseButton(MIDDLE_MOUSE)
301 && !Input.GetKey(KeyCode.LeftAlt)
305 Rect screen =
new Rect(0,0,Screen.width,Screen.height);
307 if(screen.Contains(Input.mousePosition))
308 prev_mousePosition = Input.mousePosition;
316 if( Input.GetMouseButton(RIGHT_MOUSE) && !Input.GetKey(KeyCode.LeftAlt) )
323 float rot_x = Input.GetAxis(INPUT_MOUSE_X);
324 float rot_y = Input.GetAxis(INPUT_MOUSE_Y);
326 Vector3 eulerRotation = transform.localRotation.eulerAngles;
329 eulerRotation.x -= rot_y *
lookSpeed * Time.deltaTime;
330 eulerRotation.y += rot_x *
lookSpeed * Time.deltaTime;
335 eulerRotation.z = 0f;
336 transform.localRotation =
Quaternion.Euler(eulerRotation);
339 float speed =
moveSpeed * Time.deltaTime;
341 transform.position += transform.forward * speed * Input.GetAxis(
"Vertical");
342 transform.position += transform.right * speed * Input.GetAxis(
"Horizontal");
344 transform.position += transform.up * speed * Input.GetAxis(
"CameraUp");
346 Debug.LogWarning(
"CameraUp input is not configured. Open \"Edit/Project Settings/Input\" and add an input named \"CameraUp\", mapping q and e to Negative and Positive buttons.");
349 pivot = transform.position + transform.forward * distanceToCamera;
355 if((
ModelViewerCamOnly || Input.GetKey(KeyCode.LeftAlt)) && Input.GetMouseButton(LEFT_MOUSE))
361 float rot_x = Input.GetAxis(INPUT_MOUSE_X);
362 float rot_y = -Input.GetAxis(INPUT_MOUSE_Y);
364 Vector3 eulerRotation = transform.localRotation.eulerAngles;
366 if( (Mathf.Approximately(eulerRotation.x, 90f) && rot_y > 0f) ||
367 (Mathf.Approximately(eulerRotation.x, 270f) && rot_y < 0f) )
371 eulerRotation.x += rot_y *
orbitSpeed * Time.deltaTime;
372 eulerRotation.y += rot_x *
orbitSpeed * Time.deltaTime;
378 eulerRotation.z = 0f;
380 transform.localRotation =
Quaternion.Euler( eulerRotation );
381 transform.position = CalculateCameraPosition(pivot);
387 if(Input.GetMouseButton(MIDDLE_MOUSE) || (Input.GetMouseButton(LEFT_MOUSE) && viewTool ) )
391 Vector2 delta = Input.mousePosition - prev_mousePosition;
393 delta.x = ScreenToWorldDistance(delta.x, distanceToCamera);
394 delta.y = ScreenToWorldDistance(delta.y, distanceToCamera);
396 transform.position -= transform.right * delta.x;
397 transform.position -= transform.up * delta.y;
399 pivot = transform.position + transform.forward * distanceToCamera;
402 prev_mousePosition = Input.mousePosition;
405 Vector3 CalculateCameraPosition(Vector3 target)
407 return transform.localRotation * (
Vector3.forward * -distanceToCamera) + target;
410 bool zooming =
false;
411 float zoomProgress = 0f;
417 public static void Focus(Vector3 target)
419 instance.ZoomInternal(target, 10f);
422 public static void Focus(Vector3 target,
float distance)
424 instance.ZoomInternal(target, distance);
427 public static void Focus(GameObject target)
429 instance.ZoomInternal(target);
432 private void ZoomInternal( Vector3 target,
float distance )
435 distanceToCamera = distance;
436 previousPosition = transform.position;
437 targetPosition = CalculateCameraPosition( pivot );
445 private void ZoomInternal( GameObject target )
447 Vector3 center = target.transform.position;
448 Renderer renderer = target.GetComponent<Renderer>();
449 Bounds bounds = renderer !=
null ? renderer.bounds :
new Bounds(center, Vector3.one * 10f);
451 distanceToCamera = pb_ObjectUtility.CalcMinDistanceToBounds(cam, bounds);
452 distanceToCamera += distanceToCamera;
453 center = bounds.center;
455 ZoomInternal( center, distanceToCamera );
458 private float ScreenToWorldDistance(
float screenDistance,
float distanceFromCamera)
460 Vector3 start = cam.ScreenToWorldPoint(
Vector3.forward * distanceFromCamera);
461 Vector3 end = cam.ScreenToWorldPoint(
new Vector3(screenDistance, 0f, distanceFromCamera));
462 return CopySign(
Vector3.Distance(start, end), screenDistance);
468 private float CopySign(
float x,
float y)
470 if(x < 0f && y < 0f || x > 0f && y > 0f || x == 0f || y == 0f)
static void AddOnCameraMoveDelegate(OnCameraMoveEvent del)
float orbitSpeed
How fast the camera rotation adjusts.
OnCameraFinishMoveEvent OnCameraFinishMove
static void Focus(Vector3 target, float distance)
float scrollModifier
How fast the mouse scroll wheel affects distance from pivot.
delegate void OnCameraFinishMoveEvent(pb_SceneCamera cam)
bool IsUsingMouse(Vector2 mousePosition)
float moveSpeed
How fast the camera position moves.
OnCameraMoveEvent OnCameraMove
delegate void OnCameraMoveEvent(pb_SceneCamera cam)
float lookSpeed
How fast the camera rotation adjusts.
static void Focus(GameObject target)
static void Focus(Vector3 target)
virtual bool EnableCameraControls()
static GameObject activeGameObject