public void OnStart() { Input.SetMouseVisible(false); Input.SetMouseLock(true); playerScript = GetScript<FirstPersonPlayer>(Common.GetStealthPlayer()); rcCarScript = GetScript<RCCar>(Common.GetRCCarJoystick()); cameraCam = Common.GetSurveillancePlayerStaticCameraCam(); camScript = GetScript<CameraCam>(cameraCam); ocuCam = Common.GetSurveillancePlayerCam(); prevPickedInteractable = null; pickedInteractable = null; prevPickedObject = null; pickedObject = null; camInMapIndex = 0; camInMap = Common.GetCamsInMap(); mCurrMouseMovement = new Vector2(0.0f, 0.0f); mMousePositionFromOcuCam = new Vector3(0.0f, 0.0f, 1.3f); // Set the mouse cursor position to center of oculus screen gameObject.transform.SetPosition(ocuCam.transform.position + (Vector3)ocuCam.transform.GetForwardVector() * mMousePositionFromOcuCam.Z); // Calculate the limits for the mouse on the ocuScreen CCamera ocuCameraComp = ocuCam.RequireComponent<CCamera>(); mMouseLimits = new Vector2(); mMouseLimits.X = mMousePositionFromOcuCam.Z / ocuCameraComp.GetNearZ() * ocuCameraComp.GetNearWindowWidth() * 0.5f; mMouseLimits.Y = mMousePositionFromOcuCam.Z / ocuCameraComp.GetNearZ() * ocuCameraComp.GetNearWindowHeight() * 0.5f; ocuCameraScreen = Common.GetCameraScreen().RequireComponent<CCamera>(); }
bool isPaperHeld = false; // if true, locks the input to put it down on next L click public void OnStart() { Input.SetMouseVisible(false); Input.SetMouseLock(true); playerScript = GetScript <FirstPersonPlayer>(Common.GetStealthPlayer()); rcCarScript = GetScript <RCCar>(Common.GetRCCarJoystick()); cameraCam = Common.GetSurveillancePlayerStaticCameraCam(); camScript = GetScript <CameraCam>(cameraCam); ocuCam = Common.GetSurveillancePlayerCam(); prevPickedInteractable = null; pickedInteractable = null; prevPickedObject = null; pickedObject = null; camInMapIndex = 0; camInMap = Common.GetCamsInMap(); mCurrMouseMovement = new Vector2(0.0f, 0.0f); mMousePositionFromOcuCam = new Vector3(0.0f, 0.0f, 1.3f); // Set the mouse cursor position to center of oculus screen gameObject.transform.SetPosition(ocuCam.transform.position + (Vector3)ocuCam.transform.GetForwardVector() * mMousePositionFromOcuCam.Z); // Calculate the limits for the mouse on the ocuScreen CCamera ocuCameraComp = ocuCam.RequireComponent <CCamera>(); mMouseLimits = new Vector2(); mMouseLimits.X = mMousePositionFromOcuCam.Z / ocuCameraComp.GetNearZ() * ocuCameraComp.GetNearWindowWidth() * 0.5f; mMouseLimits.Y = mMousePositionFromOcuCam.Z / ocuCameraComp.GetNearZ() * ocuCameraComp.GetNearWindowHeight() * 0.5f; ocuCameraScreen = Common.GetCameraScreen().RequireComponent <CCamera>(); }
public void UpdateMouseInputs() { float dt = FrameController.DT(); UpdateMousePosition(); if (isPaperHeld || (rcCarScript != null && rcCarScript.isMouseHeld)) // Lock input until paper is put down { if (Input.GetTriggered(0, "MouseLClick") == 1.0f) { if (rcCarScript != null && rcCarScript.isMouseHeld) rcCarScript.isMouseHeld = false; else { pickedInteractable.OnTriggered(); isPaperHeld = false; } } } else { // Apply raycast of ocuPlayer's mouse to find any interactable object every frame (when mouse is not clicked) Vector3 ocuCamToMouse = (Vector3)gameObject.transform.position - (Vector3)ocuCam.transform.position; // Quick Hack to fix offset // Vector3 xAxis = ocuCam.transform.GetRightVector(); // Vector3 yAxis = ocuCam.transform.GetUpVector(); // ocuCamToMouse += xAxis * 0.055f; // ocuCamToMouse += yAxis * 0.12f; ocuCamToMouse.Normalize(); if (Input.GetHeld(0, "MouseLClick") == 0.0f) { pickedObject = PhysicEngine.getInstance().RayCast3DWithTag(ocuCam.transform.position, ocuCamToMouse, 10000.0f, Common.tagForInteractables); pickedInteractable = null; // Check if mouse is over a valid camInMap if (pickedObject != null) { pickedInteractable = GetScriptClass<InteractableObjectBaseClass>(pickedObject, false); if (pickedInteractable != null) { pickedInteractable.OnMouseOver(); // The logic for ray casting through the camera screen into world objects CameraScreen pickedScreen = pickedInteractable as CameraScreen; if (pickedScreen != null && camScript.gameObjectParentedTo != null && camScript.gameObjectParentedTo != Common.GetNoiseStatic()) { CTransform screenTrans = pickedScreen.gameObject.transform; Vector3 screenPos = screenTrans.position; Vector3 rightVect = screenTrans.GetRightVector(); Vector3 upVect = screenTrans.GetUpVector(); Vector3 normal = screenTrans.GetForwardVector(); Vector3 screenScale = screenTrans.GetScale(); Vector3 pointOnScreen = new Vector3(); MMath.RayToPlaneIntersection(normal, screenPos, ocuCamToMouse, ocuCam.transform.position, ref pointOnScreen); Vector3 screenToPoint = pointOnScreen - screenPos; float xAmt = -Vector3.Dot(screenToPoint, rightVect); // the camera screen's x is negative (to the left) float yAmt = Vector3.Dot(screenToPoint, upVect); float xScaleOfModel = screenScale.X*0.5f; // Reflect actual camera screen width in pixel units (quad is just nice 1 scale == 1 unit) float yScaleOfModel = screenScale.Y*0.5f; xAmt /= xScaleOfModel; // [-0.5, 0.5] yAmt /= yScaleOfModel; float nearZ = ocuCameraScreen.GetNearZ(); float screenWidth = ocuCameraScreen.GetNearWindowWidth(); float screenHeight = ocuCameraScreen.GetNearWindowHeight(); xAmt *= screenWidth; // [-0.5, 0.5] -> [-w/2, w/2] yAmt *= screenHeight; // Use the x, y and z values through the actual camera look at directions Vector3 innerCameraVect = xAmt * (Vector3)camScript.gameObjectParentedTo.transform.GetRightVector() + yAmt * (Vector3)camScript.gameObjectParentedTo.transform.GetUpVector() + nearZ * (Vector3)camScript.gameObjectParentedTo.transform.GetForwardVector(); innerCameraVect.Normalize(); Vector3 cameraPos = camScript.gameObjectParentedTo.transform.position + 0.5f * innerCameraVect; // Move in front, so it does not ray cast to the screen itself GameObject cameraInteractable = PhysicEngine.getInstance().RayCast3DWithTag(cameraPos, innerCameraVect, 10000.0f, "camInteract"); if (cameraInteractable != null) { // If there is an interactable objec through the screen, check if there is ANY object infront of it GameObject nearestObj = PhysicEngine.getInstance().RayCast3D(cameraPos, innerCameraVect, 10000.0f); if (nearestObj == cameraInteractable) { pickedInteractable = GetScriptClass<InteractableObjectBaseClass>(cameraInteractable, false); if (pickedInteractable != null) { pickedInteractable.OnMouseOver(); } } else // There is something blocking { Logger.Log("nearer Obj found: " + nearestObj.GetName()); } } } } } // If prev interactable changed or is lost, call it's mouseOverOff if (prevPickedInteractable != pickedInteractable) { if (prevPickedInteractable != null) { prevPickedInteractable.OnMouseOverOff(); if (Input.GetReleased(0, "MouseLClick") == 1.0f) { prevPickedInteractable.OnReleased(); } } prevPickedInteractable = pickedInteractable; } } // End of if not mouse held if (Input.GetTriggered(0, "MouseLClick") == 1.0f) { if (pickedInteractable != null) { pickedInteractable.OnTriggered(); // If picked up paper, lock the input Paper pickedPaper = pickedInteractable as Paper; if (pickedPaper != null) { if (pickedPaper.GetIsHeldUp()) isPaperHeld = true; } } } if (Input.GetHeld(0, "MouseLClick") == 1.0f) { if (pickedInteractable != null) { pickedInteractable.OnHeldMouse(mCurrMouseMovement.X, mCurrMouseMovement.Y); } } if (Input.GetReleased(0, "MouseLClick") == 1.0f) { if(pickedInteractable != null) pickedInteractable.OnReleased(); } } }
public void UpdateMouseInputs() { float dt = FrameController.DT(); UpdateMousePosition(); if (isPaperHeld || (rcCarScript != null && rcCarScript.isMouseHeld)) // Lock input until paper is put down { if (Input.GetTriggered(0, "MouseLClick") == 1.0f) { if (rcCarScript != null && rcCarScript.isMouseHeld) { rcCarScript.isMouseHeld = false; } else { pickedInteractable.OnTriggered(); isPaperHeld = false; } } } else { // Apply raycast of ocuPlayer's mouse to find any interactable object every frame (when mouse is not clicked) Vector3 ocuCamToMouse = (Vector3)gameObject.transform.position - (Vector3)ocuCam.transform.position; // Quick Hack to fix offset // Vector3 xAxis = ocuCam.transform.GetRightVector(); // Vector3 yAxis = ocuCam.transform.GetUpVector(); // ocuCamToMouse += xAxis * 0.055f; // ocuCamToMouse += yAxis * 0.12f; ocuCamToMouse.Normalize(); if (Input.GetHeld(0, "MouseLClick") == 0.0f) { pickedObject = PhysicEngine.getInstance().RayCast3DWithTag(ocuCam.transform.position, ocuCamToMouse, 10000.0f, Common.tagForInteractables); pickedInteractable = null; // Check if mouse is over a valid camInMap if (pickedObject != null) { pickedInteractable = GetScriptClass <InteractableObjectBaseClass>(pickedObject, false); if (pickedInteractable != null) { pickedInteractable.OnMouseOver(); // The logic for ray casting through the camera screen into world objects CameraScreen pickedScreen = pickedInteractable as CameraScreen; if (pickedScreen != null && camScript.gameObjectParentedTo != null && camScript.gameObjectParentedTo != Common.GetNoiseStatic()) { CTransform screenTrans = pickedScreen.gameObject.transform; Vector3 screenPos = screenTrans.position; Vector3 rightVect = screenTrans.GetRightVector(); Vector3 upVect = screenTrans.GetUpVector(); Vector3 normal = screenTrans.GetForwardVector(); Vector3 screenScale = screenTrans.GetScale(); Vector3 pointOnScreen = new Vector3(); MMath.RayToPlaneIntersection(normal, screenPos, ocuCamToMouse, ocuCam.transform.position, ref pointOnScreen); Vector3 screenToPoint = pointOnScreen - screenPos; float xAmt = -Vector3.Dot(screenToPoint, rightVect); // the camera screen's x is negative (to the left) float yAmt = Vector3.Dot(screenToPoint, upVect); float xScaleOfModel = screenScale.X * 0.5f; // Reflect actual camera screen width in pixel units (quad is just nice 1 scale == 1 unit) float yScaleOfModel = screenScale.Y * 0.5f; xAmt /= xScaleOfModel; // [-0.5, 0.5] yAmt /= yScaleOfModel; float nearZ = ocuCameraScreen.GetNearZ(); float screenWidth = ocuCameraScreen.GetNearWindowWidth(); float screenHeight = ocuCameraScreen.GetNearWindowHeight(); xAmt *= screenWidth; // [-0.5, 0.5] -> [-w/2, w/2] yAmt *= screenHeight; // Use the x, y and z values through the actual camera look at directions Vector3 innerCameraVect = xAmt * (Vector3)camScript.gameObjectParentedTo.transform.GetRightVector() + yAmt * (Vector3)camScript.gameObjectParentedTo.transform.GetUpVector() + nearZ * (Vector3)camScript.gameObjectParentedTo.transform.GetForwardVector(); innerCameraVect.Normalize(); Vector3 cameraPos = camScript.gameObjectParentedTo.transform.position + 0.5f * innerCameraVect; // Move in front, so it does not ray cast to the screen itself GameObject cameraInteractable = PhysicEngine.getInstance().RayCast3DWithTag(cameraPos, innerCameraVect, 10000.0f, "camInteract"); if (cameraInteractable != null) { // If there is an interactable objec through the screen, check if there is ANY object infront of it GameObject nearestObj = PhysicEngine.getInstance().RayCast3D(cameraPos, innerCameraVect, 10000.0f); if (nearestObj == cameraInteractable) { pickedInteractable = GetScriptClass <InteractableObjectBaseClass>(cameraInteractable, false); if (pickedInteractable != null) { pickedInteractable.OnMouseOver(); } } else // There is something blocking { Logger.Log("nearer Obj found: " + nearestObj.GetName()); } } } } } // If prev interactable changed or is lost, call it's mouseOverOff if (prevPickedInteractable != pickedInteractable) { if (prevPickedInteractable != null) { prevPickedInteractable.OnMouseOverOff(); if (Input.GetReleased(0, "MouseLClick") == 1.0f) { prevPickedInteractable.OnReleased(); } } prevPickedInteractable = pickedInteractable; } } // End of if not mouse held if (Input.GetTriggered(0, "MouseLClick") == 1.0f) { if (pickedInteractable != null) { pickedInteractable.OnTriggered(); // If picked up paper, lock the input Paper pickedPaper = pickedInteractable as Paper; if (pickedPaper != null) { if (pickedPaper.GetIsHeldUp()) { isPaperHeld = true; } } } } if (Input.GetHeld(0, "MouseLClick") == 1.0f) { if (pickedInteractable != null) { pickedInteractable.OnHeldMouse(mCurrMouseMovement.X, mCurrMouseMovement.Y); } } if (Input.GetReleased(0, "MouseLClick") == 1.0f) { if (pickedInteractable != null) { pickedInteractable.OnReleased(); } } } }