From c2e8ef71e7b6a2afe1277c29483d63fba28644c0 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 26 May 2016 16:11:13 +0200 Subject: [PATCH] WIP furniture picking --- Assets/Controller Left.prefab | Bin 9724 -> 20156 bytes Assets/Controller Right.prefab | Bin 14060 -> 18836 bytes Assets/Furniture Prefabs/Bed 1.prefab | Bin 7668 -> 8420 bytes Assets/Furniture Prefabs/Bed 2.prefab | Bin 8116 -> 8852 bytes Assets/Furniture Prefabs/Sofa 1.prefab | Bin 7556 -> 7556 bytes Assets/FurnitureMiniature.cs | 39 ++ Assets/FurnitureMiniature.cs.meta | 12 + Assets/FurnitureObject.cs | 7 + Assets/FurnitureObject.cs.meta | 12 + Assets/LeftController.cs | 40 +- Assets/RightController.cs | 68 +++- Assets/SteamVR_Unity_Toolkit.meta | 9 + Assets/SteamVR_Unity_Toolkit/Prefabs.meta | 9 + .../Prefabs/FramesPerSecondCanvas.prefab | Bin 0 -> 12532 bytes .../Prefabs/FramesPerSecondCanvas.prefab.meta | 8 + .../Prefabs/[CameraRig].prefab | Bin 0 -> 35028 bytes .../Prefabs/[CameraRig].prefab.meta | 8 + Assets/SteamVR_Unity_Toolkit/Scripts.meta | 9 + .../Scripts/Abstractions.meta | 9 + .../Abstractions/SteamVR_WorldPointer.cs | 358 ++++++++++++++++++ .../Abstractions/SteamVR_WorldPointer.cs.meta | 12 + .../SteamVR_Unity_Toolkit/Scripts/Helper.meta | 9 + .../Scripts/Helper/CurveGenerator.cs | 319 ++++++++++++++++ .../Scripts/Helper/CurveGenerator.cs.meta | 12 + .../Scripts/Helper/FramsPerSecondViewer.cs | 66 ++++ .../Helper/FramsPerSecondViewer.cs.meta | 12 + .../Scripts/Shaders.meta | 9 + .../Shaders/Unlit_TransparentColor.shader | 31 ++ .../Unlit_TransparentColor.shader.meta | 9 + .../Scripts/SteamVR_BasicTeleport.cs | 121 ++++++ .../Scripts/SteamVR_BasicTeleport.cs.meta | 12 + .../Scripts/SteamVR_BezierPointer.cs | 250 ++++++++++++ .../Scripts/SteamVR_BezierPointer.cs.meta | 12 + .../Scripts/SteamVR_ControllerActions.cs | 55 +++ .../Scripts/SteamVR_ControllerActions.cs.meta | 12 + .../Scripts/SteamVR_ControllerEvents.cs | 356 +++++++++++++++++ .../Scripts/SteamVR_ControllerEvents.cs.meta | 12 + .../Scripts/SteamVR_HeadsetCollisionFade.cs | 59 +++ .../SteamVR_HeadsetCollisionFade.cs.meta | 12 + .../Scripts/SteamVR_HeightAdjustTeleport.cs | 100 +++++ .../SteamVR_HeightAdjustTeleport.cs.meta | 12 + .../Scripts/SteamVR_InteractGrab.cs | 293 ++++++++++++++ .../Scripts/SteamVR_InteractGrab.cs.meta | 12 + .../Scripts/SteamVR_InteractTouch.cs | 121 ++++++ .../Scripts/SteamVR_InteractTouch.cs.meta | 12 + .../Scripts/SteamVR_InteractUse.cs | 154 ++++++++ .../Scripts/SteamVR_InteractUse.cs.meta | 12 + .../Scripts/SteamVR_InteractableObject.cs | 345 +++++++++++++++++ .../SteamVR_InteractableObject.cs.meta | 12 + .../Scripts/SteamVR_TouchpadWalking.cs | 208 ++++++++++ .../Scripts/SteamVR_TouchpadWalking.cs.meta | 12 + Assets/Test.unity | Bin 118316 -> 131328 bytes Assets/WarehouseItem.cs | 36 +- Assets/WarehouseMiniatureAnim.cs | 42 ++ Assets/WarehouseMiniatureAnim.cs.meta | 12 + 55 files changed, 3306 insertions(+), 45 deletions(-) create mode 100755 Assets/FurnitureMiniature.cs create mode 100755 Assets/FurnitureMiniature.cs.meta create mode 100755 Assets/FurnitureObject.cs create mode 100755 Assets/FurnitureObject.cs.meta create mode 100755 Assets/SteamVR_Unity_Toolkit.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Prefabs.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Prefabs/FramesPerSecondCanvas.prefab create mode 100755 Assets/SteamVR_Unity_Toolkit/Prefabs/FramesPerSecondCanvas.prefab.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Prefabs/[CameraRig].prefab create mode 100755 Assets/SteamVR_Unity_Toolkit/Prefabs/[CameraRig].prefab.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/Abstractions.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/Abstractions/SteamVR_WorldPointer.cs create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/Abstractions/SteamVR_WorldPointer.cs.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/Helper.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/Helper/CurveGenerator.cs create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/Helper/CurveGenerator.cs.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/Helper/FramsPerSecondViewer.cs create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/Helper/FramsPerSecondViewer.cs.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/Shaders.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/Shaders/Unlit_TransparentColor.shader create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/Shaders/Unlit_TransparentColor.shader.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_BasicTeleport.cs create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_BasicTeleport.cs.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_BezierPointer.cs create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_BezierPointer.cs.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_ControllerActions.cs create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_ControllerActions.cs.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_ControllerEvents.cs create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_ControllerEvents.cs.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_HeadsetCollisionFade.cs create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_HeadsetCollisionFade.cs.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_HeightAdjustTeleport.cs create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_HeightAdjustTeleport.cs.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractGrab.cs create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractGrab.cs.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractTouch.cs create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractTouch.cs.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractUse.cs create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractUse.cs.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractableObject.cs create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractableObject.cs.meta create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_TouchpadWalking.cs create mode 100755 Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_TouchpadWalking.cs.meta create mode 100755 Assets/WarehouseMiniatureAnim.cs create mode 100755 Assets/WarehouseMiniatureAnim.cs.meta diff --git a/Assets/Controller Left.prefab b/Assets/Controller Left.prefab index 94fdb6ded84e296f66d11dac0960568455652c28..2ce84bcef3b9ea65bc7a9cfcbae68893a4673199 100755 GIT binary patch literal 20156 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 delta 1161 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 literal 14060 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 diff --git a/Assets/Furniture Prefabs/Bed 1.prefab b/Assets/Furniture Prefabs/Bed 1.prefab index d699e2dcce28e65001fbeaf57c58456dc14d5df6..04424682b43eb133f1290fc54bb3a5b5459e2270 100755 GIT binary patch delta 818 zcmZuvO=uHA6n>LLyNL;!DCDn!SUgyj)So0OYTc!QB36l(g5aU7$r=~ZjV7zoQ|h7M zF*+A16)P%w5K)R3vDk~CP^ovtQx4v&AfCkdz0F37_?BY1?%ub|R%mm82jDnJ zG;jIr z-N$$KgLCIi02{bF>xW%E_>Zo-dT5fdczkpLO*JGRIl7VwNw|%G2_Sf46Z;Z!~CXvQXD6NSal-TGi_=n`juL zb^V%YPos3AaniJmDcv?p%q-ieU#?Yk+W;G>Sq;0co0iSJMrzfn*)VHX!LW^zjltrj zu+|rGHs|Sc{GS^)P2MDL3iHQ$ugJd+<$5dx1Tw+C#V%L!sYAK zaWs$PA+aW3#+$O0P~?0<$-&@kJllWy`Zy7sPV~C)ia2^JRpgn(xY!^c;jKu2ay6*k tDXJe|#g0;Werd6t+$Q95G7wT#p7mj6?3fTFSNq>XRpeUACm*JYe*m$1o*4iD delta 312 zcmaFj_{Ca@fkBF!fkE~Q0|Ns;kgWiu8BFzz^-R(X8UFqM|DTb4qmsMe=I6o=>>gYo zNd|^B8yF!BAejinARZ&b|NkICrXNfoiXj7t*8(xJoW)T#kQ9T&$QnDP(3=9E40Y@-~Xt<%h4y+_% zvZ0JLa6wy-CsIW~T#E67gIe9QEUF#-gTiR9I1A;Le zO*F&7G#c@wH-Dgsi4gt)IB+x?_27Y%#*5ypGuy2p%w~4p_s#ca=Dppw!%L$vfao89 z*b)F71nB9c2!n}JiRASG_}gqYh4eZ$7CfFJI@wtNBrT?XPlW@Y2cP~-bP?Ae_mH!l z23Q!T_)tG8WYlC;=_BML_mT_e@j${03vnFs_KQBWykQZ?Rk?q@t@M*Jvr|b}BA5U3 z0-jNylZ3hQesUIYb>`D9AK1lfF5j_(A1D0;VF7^OLqYvYYt8rI7}s2;X-$`R?nZ0% z`a*ke6VEdQoxJAE!2F`ihbXdLG7Dz@S}9-0S^qKPqF$}S%+-;KUZ9Y%3O9>-#YIz9 zW2~azGVMC0&Q~v(mNBE-<}@SAHY(*(QMV03*^*VYE4pdfTq|2D7R{9F@T?k$x96=mn*iF| zxdB_dv4kJhvV148_U-ZWGXPsFx#&9&o`}jFn#Q`#jq!6r0De7GCsx8&y*|wMPW}Vm CuARjI delta 367 zcmbQ@y2W0Jfk7&sfkA!?0|Ns;klg^J8BFzz^-R(X8UFqM|DTb4qmsMe=I6o=>^i(4 zNd|@)`xzk&AUPL^K|Dr=|NlXPYX2c}3nm9jOS5VKIf;`CrNtR1OzxDHmStdKU`PR~ zVgX}_jwSopKpGh`CLffRX1p=^E|AQa{1d492QveM2~b86j3KJMT8%-984M;H$_P8! z)q+d|>IE7Y0Hhtk7^3o&?Rt&iL{!qmX@GfXa&t!HGI{82Vo6y!IcabU2?72iT#b5r85S(JW@xyu a`Lo39Or3F1b~n2`It>#31nNI~$lT0+S33 hAT`!fk&G;pr%D-bz9ALBGzAP2WG+97~XR?WG0000$7c>9> diff --git a/Assets/FurnitureMiniature.cs b/Assets/FurnitureMiniature.cs new file mode 100755 index 0000000..92aedeb --- /dev/null +++ b/Assets/FurnitureMiniature.cs @@ -0,0 +1,39 @@ +using UnityEngine; +using System.Collections; + +public class FurnitureMiniature : FurnitureObject { + public override void Grab(Transform attachment) { + transform.parent = null; + foreach (var collider in GetComponentsInChildren()) { + collider.enabled = false; + } + GetComponent().isKinematic = true; + + var mini = gameObject.AddComponent(); + mini.DestinationAttachment = attachment; + mini.Duration = 0.33f; + } + + public override void Release() { + var mini = gameObject.GetComponent(); + if (mini) { + mini.End(); + } + + transform.parent = null; + foreach (var collider in GetComponentsInChildren()) { + collider.enabled = true; + } + GetComponent().isKinematic = false; + } + + // Use this for initialization + void Start () { + + } + + // Update is called once per frame + void Update () { + + } +} diff --git a/Assets/FurnitureMiniature.cs.meta b/Assets/FurnitureMiniature.cs.meta new file mode 100755 index 0000000..02ed23a --- /dev/null +++ b/Assets/FurnitureMiniature.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cc866a4108edf754a94b112e005156e7 +timeCreated: 1464235042 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FurnitureObject.cs b/Assets/FurnitureObject.cs new file mode 100755 index 0000000..531d03b --- /dev/null +++ b/Assets/FurnitureObject.cs @@ -0,0 +1,7 @@ +using UnityEngine; +using System.Collections; + +public class FurnitureObject : MonoBehaviour { + public virtual void Grab(Transform attachment) { } + public virtual void Release() { } +} diff --git a/Assets/FurnitureObject.cs.meta b/Assets/FurnitureObject.cs.meta new file mode 100755 index 0000000..d2be5e1 --- /dev/null +++ b/Assets/FurnitureObject.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 44b6e16155f118a40b4c700c55978f9d +timeCreated: 1464233125 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeftController.cs b/Assets/LeftController.cs index ee75828..d08bbc1 100755 --- a/Assets/LeftController.cs +++ b/Assets/LeftController.cs @@ -5,26 +5,25 @@ public class LeftController : MonoBehaviour { public bool AlwaysCenter = false; + Transform controllerRig; + SteamVR_ControllerEvents controllerEvents; - private Transform controllerRig; - private SteamVR_TrackedController trackedController; + GameObject mainCamera; + GameObject warehouseCamera; - private GameObject mainCamera; - private GameObject warehouseCamera; + CameraFade cameraFade; + SteamVR_Camera mainSteamVRCamera; - private CameraFade cameraFade; - private SteamVR_Camera mainSteamVRCamera; + bool inWarehouse = false; - private bool inWarehouse = false; - - // Use this for initialization - void Start () { + void Awake() { controllerRig = this.transform.parent; - trackedController = GetComponent(); - trackedController.TriggerClicked += TriggerClicked; - trackedController.Gripped += Gripped; + controllerEvents = GetComponent(); + controllerEvents.TriggerAxisChanged += triggerAxisChanged; + } + void Start () { mainCamera = GameObject.Find("Main Camera (origin)"); warehouseCamera = GameObject.Find("Warehouse Camera (origin)"); @@ -32,9 +31,8 @@ public class LeftController : MonoBehaviour { mainSteamVRCamera = mainCamera.GetComponentInChildren(); } - // Update is called once per frame - void Update () { - float alpha = SteamVR_Controller.Input((int)trackedController.controllerIndex).GetAxis(Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger).x; + void triggerAxisChanged(object sender, ControllerClickedEventArgs e) { + float alpha = e.buttonPressure; if (alpha > 0.05) { cameraFade.SetFade(alpha); if (!inWarehouse) { @@ -51,15 +49,5 @@ public class LeftController : MonoBehaviour { inWarehouse = false; } } - } - - void TriggerClicked(object sender, ClickedEventArgs e) { - //var warehouseCamera = GameObject.FindWithTag("WarehouseCamera").GetComponent(); - //warehouseCamera.enabled = true; - Debug.Log("awd"); - } - - void Gripped(object sender, ClickedEventArgs e) { - } } diff --git a/Assets/RightController.cs b/Assets/RightController.cs index 3c581f1..f154bf9 100755 --- a/Assets/RightController.cs +++ b/Assets/RightController.cs @@ -1,13 +1,16 @@ using UnityEngine; using System.Collections; +using System; public class RightController : MonoBehaviour { - public GameObject banana; - public GameObject viveController; + public Transform MiniatureAttachmentPoint; - SteamVR_TrackedController trackedController; + SteamVR_LaserPointer laserPointer; + SteamVR_ControllerEvents controllerEvents; WarehouseColumn warehouse; + FurnitureObject heldItem; + WarehouseRow whRow = null; Vector3? whScrollStartPos = null; float whScrollDistance; @@ -17,24 +20,22 @@ public class RightController : MonoBehaviour { float whRowScrollOffset = 0.0f; void Awake() { - trackedController = GetComponent(); - trackedController.TriggerClicked += triggerClicked; - trackedController.TriggerUnclicked += triggerUnclicked; + laserPointer = GetComponent(); + + controllerEvents = GetComponent(); + controllerEvents.TriggerClicked += triggerClicked; + controllerEvents.TriggerUnclicked += triggerUnclicked; + controllerEvents.TouchpadClicked += touchpadClicked; + controllerEvents.TouchpadUnclicked += touchpadUnclicked; warehouse = GameObject.Find("Warehouse/Shelves/Column").GetComponent(); } - void Start () { - GetComponent().LeaveView += toggleBanana; + void Start () { + laserPointer.pointer.layer = 9; } - void toggleBanana() { - banana.SetActive(!banana.activeSelf); - viveController.SetActive(!viveController.activeSelf); - } - void Update () { - // Warehouse scroll if (whScrollStartPos != null) { Vector3 curPos = transform.position + (transform.forward * whScrollDistance); @@ -54,7 +55,12 @@ public class RightController : MonoBehaviour { return hit; } - void triggerClicked(object sender, ClickedEventArgs e) { + // Furniture picking + void triggerClicked(object sender, ControllerClickedEventArgs e) { + if (heldItem != null) { + return; + } + var ray = new Ray(transform.position, transform.forward); RaycastHit result; bool hit = Physics.Raycast(ray, out result); @@ -63,7 +69,34 @@ public class RightController : MonoBehaviour { return; } - var item = result.transform.GetComponent(); + var item = result.transform.GetComponentInParent(); + if (!item) { + return; + } + + item.Grab(MiniatureAttachmentPoint); + heldItem = item; + } + void triggerUnclicked(object sender, ControllerClickedEventArgs e) { + if (heldItem == null) { + return; + } + + heldItem.Release(); + heldItem = null; + } + + // Furniture scrolling by drag + void touchpadClicked(object sender, ControllerClickedEventArgs e) { + var ray = new Ray(transform.position, transform.forward); + RaycastHit result; + bool hit = Physics.Raycast(ray, out result); + + if (!hit) { + return; + } + + var item = result.transform.GetComponentInParent(); if (!item) { return; } @@ -74,8 +107,7 @@ public class RightController : MonoBehaviour { whBaseOffset = warehouse.Offset; whRowBaseOffset = whRow.Offset; } - - void triggerUnclicked(object sender, ClickedEventArgs e) { + void touchpadUnclicked(object sender, ControllerClickedEventArgs e) { if (whScrollStartPos != null) { whScrollStartPos = null; } diff --git a/Assets/SteamVR_Unity_Toolkit.meta b/Assets/SteamVR_Unity_Toolkit.meta new file mode 100755 index 0000000..6467f1f --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5348ca62989d6bc4b9aa25a5b1fd76f6 +folderAsset: yes +timeCreated: 1464192738 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Prefabs.meta b/Assets/SteamVR_Unity_Toolkit/Prefabs.meta new file mode 100755 index 0000000..352c58e --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Prefabs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 721907082a166594bb4946c03c4e712f +folderAsset: yes +timeCreated: 1461528015 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Prefabs/FramesPerSecondCanvas.prefab b/Assets/SteamVR_Unity_Toolkit/Prefabs/FramesPerSecondCanvas.prefab new file mode 100755 index 0000000000000000000000000000000000000000..bf8ceec766dbfe023f7f1f64d68c3451b6fe391c GIT binary patch literal 12532 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 AoB#j- literal 0 HcmV?d00001 diff --git a/Assets/SteamVR_Unity_Toolkit/Prefabs/FramesPerSecondCanvas.prefab.meta b/Assets/SteamVR_Unity_Toolkit/Prefabs/FramesPerSecondCanvas.prefab.meta new file mode 100755 index 0000000..f3499b5 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Prefabs/FramesPerSecondCanvas.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 39aa6e3f7c442a04d997c9ed23f46981 +timeCreated: 1462698525 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Prefabs/[CameraRig].prefab b/Assets/SteamVR_Unity_Toolkit/Prefabs/[CameraRig].prefab new file mode 100755 index 0000000000000000000000000000000000000000..cfeb39d8762bc8d1093801b8de427fc18a3b706e GIT binary patch literal 35028 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 z().IsActive() && !collider.name.Contains("PlayerObject_")) + { + parent.GetComponent().setPlayAreaCursorCollision(true); + } + } + + void OnTriggerExit(Collider collider) + { + if (! collider.name.Contains("PlayerObject_")) { + parent.GetComponent().setPlayAreaCursorCollision(false); + } + } +} + +public abstract class SteamVR_WorldPointer : MonoBehaviour { + public Color pointerHitColor = new Color(0f, 0.5f, 0f, 1f); + public Color pointerMissColor = new Color(0.8f, 0f, 0f, 1f); + public bool showPlayAreaCursor = false; + public Vector2 playAreaCursorDimensions = Vector2.zero; + public bool handlePlayAreaCursorCollisions = false; + public bool enableTeleport = true; + public bool beamAlwaysOn = false; + public float activateDelay = 0f; + + protected Vector3 destinationPosition; + protected float pointerContactDistance = 0f; + protected Transform pointerContactTarget = null; + protected uint controllerIndex; + + protected Material pointerMaterial; + protected bool playAreaCursorCollided = false; + + private SteamVR_PlayArea playArea; + private GameObject playAreaCursor; + private GameObject[] playAreaCursorBoundaries; + private bool isActive; + + private float activateDelayTimer = 0f; + private float updatesPerSecond = 60f; + + public event WorldPointerEventHandler WorldPointerIn; + public event WorldPointerEventHandler WorldPointerOut; + public event WorldPointerEventHandler WorldPointerDestinationSet; + + public virtual void OnWorldPointerIn(WorldPointerEventArgs e) + { + if (WorldPointerIn != null) + WorldPointerIn(this, e); + } + + public virtual void OnWorldPointerOut(WorldPointerEventArgs e) + { + if (WorldPointerOut != null) + WorldPointerOut(this, e); + } + + public virtual void OnWorldPointerDestinationSet(WorldPointerEventArgs e) + { + if (WorldPointerDestinationSet != null) + WorldPointerDestinationSet(this, e); + } + + public virtual void setPlayAreaCursorCollision(bool state) + { + if (handlePlayAreaCursorCollisions) + { + playAreaCursorCollided = state; + } + } + + public virtual bool IsActive() + { + return isActive; + } + + public virtual bool CanActivate() + { + return (activateDelayTimer <= 0); + } + + protected WorldPointerEventArgs SetPointerEvent(uint controllerIndex, float distance, Transform target, Vector3 position) + { + WorldPointerEventArgs e; + e.controllerIndex = controllerIndex; + e.distance = distance; + e.target = target; + e.destinationPosition = position; + e.enableTeleport = enableTeleport; + return e; + } + + protected virtual void Start() + { + if (GetComponent() == null) + { + Debug.LogError("SteamVR_WorldPointer is required to be attached to a SteamVR Controller that has the SteamVR_ControllerEvents script attached to it"); + return; + } + + this.name = "PlayerObject_" + this.name; + + //Setup controller event listeners + GetComponent().AliasPointerOn += new ControllerClickedEventHandler(EnablePointerBeam); + GetComponent().AliasPointerOff += new ControllerClickedEventHandler(DisablePointerBeam); + + playArea = GameObject.FindObjectOfType(); + playAreaCursorBoundaries = new GameObject[4]; + + pointerMaterial = new Material(Shader.Find("Unlit/TransparentColor")); + pointerMaterial.color = pointerMissColor; + } + + protected virtual void Update() + { + if (activateDelayTimer > 0) + { + activateDelayTimer--; + } + } + + protected virtual void InitPointer() + { + InitPlayAreaCursor(); + } + + protected virtual void SetPlayAreaCursorTransform(Vector3 destination) + { + playAreaCursor.transform.position = destination; + } + + protected virtual void EnablePointerBeam(object sender, ControllerClickedEventArgs e) + { + if (!isActive && activateDelayTimer <= 0) + { + setPlayAreaCursorCollision(false); + controllerIndex = e.controllerIndex; + TogglePointer(true); + isActive = true; + } + } + + protected virtual void DisablePointerBeam(object sender, ControllerClickedEventArgs e) + { + if (isActive && activateDelayTimer <= 0) + { + activateDelayTimer = activateDelay * updatesPerSecond; + controllerIndex = e.controllerIndex; + TogglePointer(false); + isActive = false; + } + } + + protected virtual void PointerIn() + { + if (!pointerContactTarget) + { + return; + } + + OnWorldPointerIn(SetPointerEvent(controllerIndex, pointerContactDistance, pointerContactTarget, destinationPosition)); + + SteamVR_InteractableObject interactableObject = pointerContactTarget.GetComponent(); + if (interactableObject && interactableObject.pointerActivatesUseAction && interactableObject.holdButtonToUse) + { + interactableObject.StartUsing(this.gameObject); + } + } + + protected virtual void PointerOut() + { + if (!pointerContactTarget) + { + return; + } + + OnWorldPointerOut(SetPointerEvent(controllerIndex, pointerContactDistance, pointerContactTarget, destinationPosition)); + + SteamVR_InteractableObject interactableObject = pointerContactTarget.GetComponent(); + if (interactableObject && interactableObject.pointerActivatesUseAction && interactableObject.holdButtonToUse) + { + interactableObject.StopUsing(this.gameObject); + } + } + + protected virtual void PointerSet() + { + if (!isActive || !pointerContactTarget) + { + return; + } + + SteamVR_InteractableObject interactableObject = pointerContactTarget.GetComponent(); + if (interactableObject && interactableObject.pointerActivatesUseAction) + { + if (interactableObject.IsUsing()) + { + interactableObject.StopUsing(this.gameObject); + } else if (!interactableObject.holdButtonToUse) + { + interactableObject.StartUsing(this.gameObject); + } + } + + if (!playAreaCursorCollided && (interactableObject == null || !interactableObject.pointerActivatesUseAction)) + { + OnWorldPointerDestinationSet(SetPointerEvent(controllerIndex, pointerContactDistance, pointerContactTarget, destinationPosition)); + } + } + + protected virtual void TogglePointer(bool state) + { + bool playAreaState = (showPlayAreaCursor ? state: false); + playAreaCursor.gameObject.SetActive(playAreaState); + } + + protected virtual void SetPointerMaterial() + { + foreach(GameObject playAreaCursorBoundary in playAreaCursorBoundaries) + { + playAreaCursorBoundary.GetComponent().material = pointerMaterial; + } + } + + protected void UpdatePointerMaterial(Color color) + { + if (playAreaCursorCollided) + { + color = pointerMissColor; + } + pointerMaterial.color = color; + SetPointerMaterial(); + } + + private void DrawPlayAreaCursorBoundary(int index, float left, float right, float top, float bottom, float thickness, Vector3 localPosition) + { + + GameObject playAreaCursorBoundary = GameObject.CreatePrimitive(PrimitiveType.Cube); + playAreaCursorBoundary.name = string.Format("[{0}]PlayerObject_WorldPointer_PlayAreaCursorBoundary_" + index, this.gameObject.name); + + float width = (right - left) / 1.065f; + float length = (top - bottom) / 1.08f; + float height = thickness; + + playAreaCursorBoundary.transform.localScale = new Vector3(width, height, length); + Destroy(playAreaCursorBoundary.GetComponent()); + playAreaCursorBoundary.layer = 2; + + playAreaCursorBoundary.transform.parent = playAreaCursor.transform; + playAreaCursorBoundary.transform.localPosition = localPosition; + + playAreaCursorBoundaries[index] = playAreaCursorBoundary; + } + + private void InitPlayAreaCursor() + { + int btmRightInner = 0; + int btmLeftInner = 1; + int topLeftInner = 2; + int topRightInner = 3; + + int btmRightOuter = 4; + int btmLeftOuter = 5; + int topLeftOuter = 6; + int topRightOuter = 7; + + Vector3[] cursorDrawVertices = playArea.vertices; + + if (playAreaCursorDimensions != Vector2.zero) + { + float customAreaPadding = playArea.borderThickness; + + cursorDrawVertices[btmRightOuter] = new Vector3(playAreaCursorDimensions.x / 2, 0f, (playAreaCursorDimensions.y / 2) * -1); + cursorDrawVertices[btmLeftOuter] = new Vector3((playAreaCursorDimensions.x / 2) * -1, 0f, (playAreaCursorDimensions.y / 2) * -1); + cursorDrawVertices[topLeftOuter] = new Vector3((playAreaCursorDimensions.x / 2) * -1, 0f, playAreaCursorDimensions.y / 2); + cursorDrawVertices[topRightOuter] = new Vector3(playAreaCursorDimensions.x / 2, 0f, playAreaCursorDimensions.y / 2); + + cursorDrawVertices[btmRightInner] = cursorDrawVertices[btmRightOuter] + new Vector3(-customAreaPadding, 0f, customAreaPadding); + cursorDrawVertices[btmLeftInner] = cursorDrawVertices[btmLeftOuter] + new Vector3(customAreaPadding, 0f, customAreaPadding); + cursorDrawVertices[topLeftInner] = cursorDrawVertices[topLeftOuter] + new Vector3(customAreaPadding, 0f, -customAreaPadding); + cursorDrawVertices[topRightInner] = cursorDrawVertices[topRightOuter] + new Vector3(-customAreaPadding, 0f, -customAreaPadding); + } + + float width = cursorDrawVertices[btmRightOuter].x - cursorDrawVertices[topLeftOuter].x; + float length = cursorDrawVertices[topLeftOuter].z - cursorDrawVertices[btmRightOuter].z; + float height = 0.01f; + + playAreaCursor = GameObject.CreatePrimitive(PrimitiveType.Cube); + playAreaCursor.name = string.Format("[{0}]PlayerObject_WorldPointer_PlayAreaCursor", this.gameObject.name); + playAreaCursor.transform.parent = null; + playAreaCursor.transform.localScale = new Vector3(width, height, length); + playAreaCursor.SetActive(false); + + playAreaCursor.GetComponent().enabled = false; + + BoxCollider playAreaCursorCollider = playAreaCursor.GetComponent(); + playAreaCursorCollider.isTrigger = true; + playAreaCursorCollider.center = new Vector3(0f, 65f, 0f); + playAreaCursorCollider.size = new Vector3(1f, 100f, 1f); + playAreaCursor.AddComponent().isKinematic = true; + SteamVR_PlayAreaCollider playAreaCursorScript = playAreaCursor.AddComponent(); + playAreaCursorScript.SetParent(this.gameObject); + playAreaCursor.layer = 2; + + float playAreaBoundaryX = playArea.transform.localScale.x / 2; + float playAreaBoundaryZ = playArea.transform.localScale.z / 2; + float heightOffset = 0f; + + DrawPlayAreaCursorBoundary(0, cursorDrawVertices[btmLeftOuter].x, cursorDrawVertices[btmRightOuter].x, cursorDrawVertices[btmRightInner].z, cursorDrawVertices[btmRightOuter].z, height, new Vector3(0f, heightOffset, playAreaBoundaryZ)); + DrawPlayAreaCursorBoundary(1, cursorDrawVertices[btmLeftOuter].x, cursorDrawVertices[btmLeftInner].x, cursorDrawVertices[topLeftOuter].z, cursorDrawVertices[btmLeftOuter].z, height, new Vector3(playAreaBoundaryX, heightOffset, 0f)); + DrawPlayAreaCursorBoundary(2, cursorDrawVertices[btmLeftOuter].x, cursorDrawVertices[btmRightOuter].x, cursorDrawVertices[btmRightInner].z, cursorDrawVertices[btmRightOuter].z, height, new Vector3(0f, heightOffset, -playAreaBoundaryZ)); + DrawPlayAreaCursorBoundary(3, cursorDrawVertices[btmLeftOuter].x, cursorDrawVertices[btmLeftInner].x, cursorDrawVertices[topLeftOuter].z, cursorDrawVertices[btmLeftOuter].z, height, new Vector3(-playAreaBoundaryX, heightOffset, 0f)); + } +} \ No newline at end of file diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/Abstractions/SteamVR_WorldPointer.cs.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/Abstractions/SteamVR_WorldPointer.cs.meta new file mode 100755 index 0000000..7819909 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/Abstractions/SteamVR_WorldPointer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f2527c033c62a9d489bc580ce4ddda27 +timeCreated: 1461571032 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/Helper.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/Helper.meta new file mode 100755 index 0000000..4e3dd9b --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/Helper.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c1c260a84c4ca2a4b9445da0a4c9291b +folderAsset: yes +timeCreated: 1461778923 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/Helper/CurveGenerator.cs b/Assets/SteamVR_Unity_Toolkit/Scripts/Helper/CurveGenerator.cs new file mode 100755 index 0000000..11b9368 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/Helper/CurveGenerator.cs @@ -0,0 +1,319 @@ +//==================================================================================== +// +// Purpose: To generate a bezier curve between at least 4 points in space and draw +// a number of spheres across the generated curve +// +// This script is heavily based on the tutorial at: +// http://catlikecoding.com/unity/tutorials/curves-and-splines/ +// +//==================================================================================== + +using UnityEngine; +using System.Collections; +using System; + +public static class Bezier +{ + + public static Vector3 GetPoint(Vector3 p0, Vector3 p1, Vector3 p2, float t) + { + t = Mathf.Clamp01(t); + float oneMinusT = 1f - t; + return + oneMinusT * oneMinusT * p0 + + 2f * oneMinusT * t * p1 + + t * t * p2; + } + + public static Vector3 GetFirstDerivative(Vector3 p0, Vector3 p1, Vector3 p2, float t) + { + return + 2f * (1f - t) * (p1 - p0) + + 2f * t * (p2 - p1); + } + + public static Vector3 GetPoint(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t) + { + t = Mathf.Clamp01(t); + float OneMinusT = 1f - t; + return + OneMinusT * OneMinusT * OneMinusT * p0 + + 3f * OneMinusT * OneMinusT * t * p1 + + 3f * OneMinusT * t * t * p2 + + t * t * t * p3; + } + + public static Vector3 GetFirstDerivative(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t) + { + t = Mathf.Clamp01(t); + float oneMinusT = 1f - t; + return + 3f * oneMinusT * oneMinusT * (p1 - p0) + + 6f * oneMinusT * t * (p2 - p1) + + 3f * t * t * (p3 - p2); + } +} + +public class CurveGenerator : MonoBehaviour +{ + private enum BezierControlPointMode + { + Free, + Aligned, + Mirrored + } + + private Vector3[] points; + private GameObject[] items; + private BezierControlPointMode[] modes; + private bool loop; + private int frequency; + private bool customTracer; + + public void Create(int setFrequency, float radius, GameObject tracer) + { + float circleSize = radius / 8; + + frequency = setFrequency; + items = new GameObject[frequency]; + for (int f = 0; f < items.Length; f++) + { + customTracer = true; + items[f] = (tracer ? Instantiate(tracer) : CreateSphere()); + items[f].transform.parent = this.transform; + items[f].layer = 2; + items[f].transform.localScale = new Vector3(circleSize, circleSize, circleSize); + } + } + + public void SetPoints(Vector3[] controlPoints, Material material) + { + points = controlPoints; + modes = new BezierControlPointMode[] { + BezierControlPointMode.Free, + BezierControlPointMode.Free + }; + + SetObjects(material); + } + + public void TogglePoints(bool state) + { + this.gameObject.SetActive(state); + } + + private GameObject CreateSphere() + { + customTracer = false; + GameObject item = GameObject.CreatePrimitive(PrimitiveType.Sphere); + Destroy(item.GetComponent()); + item.GetComponent().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; + item.GetComponent().receiveShadows = false; + + return item; + } + + private bool Loop + { + get + { + return loop; + } + set + { + loop = value; + if (value == true) + { + modes[modes.Length - 1] = modes[0]; + SetControlPoint(0, points[0]); + } + } + } + + private int ControlPointCount + { + get + { + return points.Length; + } + } + + private Vector3 GetControlPoint(int index) + { + return points[index]; + } + + private void SetControlPoint(int index, Vector3 point) + { + if (index % 3 == 0) + { + Vector3 delta = point - points[index]; + if (loop) + { + if (index == 0) + { + points[1] += delta; + points[points.Length - 2] += delta; + points[points.Length - 1] = point; + } + else if (index == points.Length - 1) + { + points[0] = point; + points[1] += delta; + points[index - 1] += delta; + } + else + { + points[index - 1] += delta; + points[index + 1] += delta; + } + } + else + { + if (index > 0) + { + points[index - 1] += delta; + } + if (index + 1 < points.Length) + { + points[index + 1] += delta; + } + } + } + points[index] = point; + EnforceMode(index); + } + + private void EnforceMode(int index) + { + int modeIndex = (index + 1) / 3; + BezierControlPointMode mode = modes[modeIndex]; + if (mode == BezierControlPointMode.Free || !loop && (modeIndex == 0 || modeIndex == modes.Length - 1)) + { + return; + } + + int middleIndex = modeIndex * 3; + int fixedIndex, enforcedIndex; + if (index <= middleIndex) + { + fixedIndex = middleIndex - 1; + if (fixedIndex < 0) + { + fixedIndex = points.Length - 2; + } + enforcedIndex = middleIndex + 1; + if (enforcedIndex >= points.Length) + { + enforcedIndex = 1; + } + } + else + { + fixedIndex = middleIndex + 1; + if (fixedIndex >= points.Length) + { + fixedIndex = 1; + } + enforcedIndex = middleIndex - 1; + if (enforcedIndex < 0) + { + enforcedIndex = points.Length - 2; + } + } + + Vector3 middle = points[middleIndex]; + Vector3 enforcedTangent = middle - points[fixedIndex]; + if (mode == BezierControlPointMode.Aligned) + { + enforcedTangent = enforcedTangent.normalized * Vector3.Distance(middle, points[enforcedIndex]); + } + points[enforcedIndex] = middle + enforcedTangent; + } + + private int CurveCount + { + get + { + return (points.Length - 1) / 3; + } + } + + private Vector3 GetPoint(float t) + { + int i; + if (t >= 1f) + { + t = 1f; + i = points.Length - 4; + } + else + { + t = Mathf.Clamp01(t) * CurveCount; + i = (int)t; + t -= i; + i *= 3; + } + return transform.TransformPoint(Bezier.GetPoint(points[i], points[i + 1], points[i + 2], points[i + 3], t)); + } + + private void SetObjects(Material material) + { + float stepSize = frequency * 1; + if (this.Loop || stepSize == 1) + { + stepSize = 1f / stepSize; + } + else + { + stepSize = 1f / (stepSize - 1); + } + + for (int f = 0; f < frequency; f++) + { + if (customTracer && (f == 0 || f == (frequency - 1))) + { + items[f].SetActive(false); + continue; + } + setMeshMaterial(items[f], material); + setSkinnedMeshMaterial(items[f], material); + + Vector3 position = this.GetPoint(f * stepSize); + items[f].transform.position = position; + + Vector3 nextPosition = this.GetPoint((f + 1) * stepSize); + Vector3 lookPosition = (nextPosition - position).normalized; + if (lookPosition != Vector3.zero) + { + items[f].transform.rotation = Quaternion.LookRotation(lookPosition); + } + } + } + + private void setMeshMaterial(GameObject item, Material material) + { + if (item.GetComponent()) + { + item.GetComponent().material = material; + } + + foreach (MeshRenderer mr in item.GetComponentsInChildren()) + { + mr.material = material; + } + } + + private void setSkinnedMeshMaterial(GameObject item, Material material) + { + if (item.GetComponent()) + { + item.GetComponent().material = material; + } + + foreach (SkinnedMeshRenderer mr in item.GetComponentsInChildren()) + { + mr.material = material; + } + } +} diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/Helper/CurveGenerator.cs.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/Helper/CurveGenerator.cs.meta new file mode 100755 index 0000000..879d32d --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/Helper/CurveGenerator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4a821bc6f26954b429adf294ef162c1d +timeCreated: 1461778933 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/Helper/FramsPerSecondViewer.cs b/Assets/SteamVR_Unity_Toolkit/Scripts/Helper/FramsPerSecondViewer.cs new file mode 100755 index 0000000..3e2e641 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/Helper/FramsPerSecondViewer.cs @@ -0,0 +1,66 @@ +//==================================================================================== +// +// Purpose: Provide GUI view of the current frames per second in the game +// +// This script must be attached to a Text element within a Canvas that has the +// Render Mode set to "Screen Space - Camera" and the Render Camera set to the +// [CameraRig]-> Camera (head) -> Camera (eye) object with a plane distance of 0.1. +// +// This script is pretty much a copy and paste from the script at: +// http://talesfromtherift.com/vr-fps-counter/ +// +// So all credit to Peter Koch for his work. Twitter: @peterept +// +//==================================================================================== + +using UnityEngine; +using UnityEngine.UI; + +public class FramsPerSecondViewer : MonoBehaviour { + public bool displayFPS = true; + public int targetFPS = 90; + public int fontSize = 32; + public Vector3 position = Vector3.zero; + public Color goodColor = Color.green; + public Color warnColor = Color.yellow; + public Color badColor = Color.red; + + private const float updateInterval = 0.5f; + private int framesCount; + private float framesTime; + private Text text; + + void Start() + { + text = this.GetComponent(); + text.fontSize = fontSize; + text.transform.localPosition = position; + } + + void Update() + { + framesCount++; + framesTime += Time.unscaledDeltaTime; + + if (framesTime > updateInterval) + { + if (text != null) + { + if (displayFPS) + { + float fps = framesCount / framesTime; + text.text = System.String.Format("{0:F2} FPS", fps); + text.color = (fps > (targetFPS - 5) ? goodColor : + (fps > (targetFPS - 30) ? warnColor : + badColor)); + } + else + { + text.text = ""; + } + } + framesCount = 0; + framesTime = 0; + } + } +} diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/Helper/FramsPerSecondViewer.cs.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/Helper/FramsPerSecondViewer.cs.meta new file mode 100755 index 0000000..4accc24 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/Helper/FramsPerSecondViewer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c05937b3f7f046f4ba4de4f8f7b39f2f +timeCreated: 1462697634 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/Shaders.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/Shaders.meta new file mode 100755 index 0000000..ad977a6 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/Shaders.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8888fe9d9528bf443a7af10a0062e480 +folderAsset: yes +timeCreated: 1462087292 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/Shaders/Unlit_TransparentColor.shader b/Assets/SteamVR_Unity_Toolkit/Scripts/Shaders/Unlit_TransparentColor.shader new file mode 100755 index 0000000..5ce4b4c --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/Shaders/Unlit_TransparentColor.shader @@ -0,0 +1,31 @@ +Shader "Unlit/TransparentColor" +{ + Properties + { + _Color("Color Tint", Color) = (1,1,1,1) + _MainTex("Base (RGB) Alpha (A)", 2D) = "white" + } + + Category + { + Lighting Off + ZWrite Off + //ZWrite On // uncomment if you have problems like the sprite disappear in some rotations. + Cull back + Blend SrcAlpha OneMinusSrcAlpha + //AlphaTest Greater 0.001 // uncomment if you have problems like the sprites or 3d text have white quads instead of alpha pixels. + Tags{ Queue = Transparent } + + SubShader + { + Pass + { + SetTexture[_MainTex] + { + ConstantColor[_Color] + Combine Texture * constant + } + } + } + } +} \ No newline at end of file diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/Shaders/Unlit_TransparentColor.shader.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/Shaders/Unlit_TransparentColor.shader.meta new file mode 100755 index 0000000..83cae98 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/Shaders/Unlit_TransparentColor.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4c84081e4523a5646919b30697cfccb8 +timeCreated: 1462087316 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_BasicTeleport.cs b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_BasicTeleport.cs new file mode 100755 index 0000000..64b610e --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_BasicTeleport.cs @@ -0,0 +1,121 @@ +//==================================================================================== +// +// Purpose: Provide basic teleportation of VR CameraRig +// +// This script must be attached to the [CameraRig] Prefab +// +// A GameObject must have the SteamVR_WorldPointer attached to it to listen for the +// updated world position to teleport to. +// +//==================================================================================== + +using UnityEngine; +using System.Collections; + +public class SteamVR_BasicTeleport : MonoBehaviour { + public float blinkTransitionSpeed = 0.6f; + [Range(0f,32f)] + public float distanceBlinkDelay = 0f; + public bool headsetPositionCompensation = true; + + protected int listenerInitTries = 5; + protected Transform eyeCamera; + protected bool adjustYForTerrain = false; + + private float blinkPause = 0f; + private float fadeInTime = 0f; + private float maxBlinkTransitionSpeed = 1.5f; + private float maxBlinkDistance = 33f; + + protected virtual void Start() + { + adjustYForTerrain = false; + InitPointerListeners(); + eyeCamera = GameObject.FindObjectOfType().GetComponent(); + } + + protected virtual void Blink(float transitionSpeed) + { + fadeInTime = transitionSpeed; + SteamVR_Fade.Start(Color.black, 0); + Invoke("ReleaseBlink", blinkPause); + } + + protected virtual void DoTeleport(object sender, WorldPointerEventArgs e) + { + if (e.target && e.enableTeleport) + { + Vector3 newPosition = GetNewPosition(e.destinationPosition, e.target); + CalculateBlinkDelay(blinkTransitionSpeed, newPosition); + Blink(blinkTransitionSpeed); + SetNewPosition(newPosition, e.target); + } + } + + protected virtual void SetNewPosition(Vector3 position, Transform target) + { + this.transform.position = CheckTerrainCollision(position, target); + } + + protected virtual Vector3 GetNewPosition(Vector3 tipPosition, Transform target) + { + float newX = (headsetPositionCompensation ? (tipPosition.x - (eyeCamera.position.x - this.transform.position.x)) : tipPosition.x); + float newY = this.transform.position.y; + float newZ = (headsetPositionCompensation ? (tipPosition.z - (eyeCamera.position.z - this.transform.position.z)) : tipPosition.z); + + return new Vector3(newX, newY, newZ); + } + + protected Vector3 CheckTerrainCollision(Vector3 position, Transform target) + { + if(adjustYForTerrain && target.GetComponent()) + { + position.y = Terrain.activeTerrain.SampleHeight(position); + } + return position; + } + + private void CalculateBlinkDelay(float blinkSpeed, Vector3 newPosition) + { + blinkPause = 0f; + if (distanceBlinkDelay > 0f) + { + float distance = Vector3.Distance(this.transform.position, newPosition); + blinkPause = Mathf.Clamp((distance * blinkTransitionSpeed) / (maxBlinkDistance - distanceBlinkDelay), 0, maxBlinkTransitionSpeed); + blinkPause = (blinkSpeed <= 0.25 ? 0f : blinkPause); + } + } + + private void ReleaseBlink() + { + SteamVR_Fade.Start(Color.clear, fadeInTime); + fadeInTime = 0f; + } + + private void InitPointerListeners() + { + SteamVR_WorldPointer[] worldPointers = GameObject.FindObjectsOfType(); + + // If the WorldPointer Object isn't initialised yet then retry in a quarter of a second + // Because the Controller is a child of the CameraRig (and the WorldPointer is usually attached + // to the Controller) then it is likely the WorldPointer object isn't available at start. + if (worldPointers.Length == 0) + { + if (listenerInitTries > 0) + { + listenerInitTries--; + Invoke("InitPointerListeners", 0.25f); + } + else + { + Debug.LogError("A GameObject must exist with a SteamVR_WorldPointer script attached to it"); + return; + } + } + + foreach (SteamVR_WorldPointer worldPointer in worldPointers) + { + worldPointer.WorldPointerDestinationSet += new WorldPointerEventHandler(DoTeleport); + } + } +} diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_BasicTeleport.cs.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_BasicTeleport.cs.meta new file mode 100755 index 0000000..ca6ca6e --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_BasicTeleport.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ef7e6bfad51b1f24f8bba548c8dcecb8 +timeCreated: 1461573022 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_BezierPointer.cs b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_BezierPointer.cs new file mode 100755 index 0000000..6fde278 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_BezierPointer.cs @@ -0,0 +1,250 @@ +//==================================================================================== +// +// Purpose: Provide curved laser pointer at the ground to VR Controller +// +// This script must be attached to a Controller within the [CameraRig] Prefab +// +// The SteamVR_ControllerEvents script must also be attached to the Controller +// +// Press the default 'Grip' button on the controller to activate the beam +// Released the default 'Grip' button on the controller to deactivate the beam +// +// This script is an implementation of the SteamVR_WorldPointer. +// +//==================================================================================== + +using UnityEngine; +using System.Collections; + +public class SteamVR_BezierPointer : SteamVR_WorldPointer +{ + public float pointerLength = 10f; + public int pointerDensity = 10; + public bool showPointerCursor = true; + public float pointerCursorRadius = 0.5f; + public float beamCurveOffset = 1f; + public GameObject customPointerTracer; + public GameObject customPointerCursor; + + private Transform projectedBeamContainer; + private Transform projectedBeamForward; + private Transform projectedBeamJoint; + private Transform projectedBeamDown; + + private GameObject pointerCursor; + private CurveGenerator curvedBeam; + + // Use this for initialization + protected override void Start() + { + base.Start(); + InitProjectedBeams(); + InitPointer(); + TogglePointer(false); + } + + protected override void Update() + { + base.Update(); + if (projectedBeamForward.gameObject.activeSelf) + { + ProjectForwardBeam(); + ProjectDownBeam(); + DisplayCurvedBeam(); + SetPointerCursor(); + } + } + + protected override void InitPointer() + { + pointerCursor = (customPointerCursor ? Instantiate(customPointerCursor) : CreateCursor()); + + pointerCursor.name = string.Format("[{0}]PlayerObject_WorldPointer_BezierPointer_PointerCursor", this.gameObject.name); + pointerCursor.layer = 2; + pointerCursor.SetActive(false); + + GameObject global = new GameObject(string.Format("[{0}]PlayerObject_WorldPointer_BezierPointer_CurvedBeamContainer", this.gameObject.name)); + global.SetActive(false); + curvedBeam = global.gameObject.AddComponent(); + curvedBeam.transform.parent = null; + curvedBeam.Create(pointerDensity, pointerCursorRadius, customPointerTracer); + base.InitPointer(); + } + + private GameObject CreateCursor() + { + float cursorYOffset = 0.02f; + GameObject cursor = GameObject.CreatePrimitive(PrimitiveType.Cylinder); + cursor.GetComponent().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; + cursor.GetComponent().receiveShadows = false; + cursor.transform.localScale = new Vector3(pointerCursorRadius, cursorYOffset, pointerCursorRadius); + Destroy(cursor.GetComponent()); + return cursor; + } + + protected override void SetPointerMaterial() + { + if (pointerCursor.GetComponent()) + { + pointerCursor.GetComponent().material = pointerMaterial; + } + + foreach(MeshRenderer mr in pointerCursor.GetComponentsInChildren()) + { + mr.material = pointerMaterial; + } + + if (pointerCursor.GetComponent()) + { + pointerCursor.GetComponent().material = pointerMaterial; + } + + foreach (SkinnedMeshRenderer mr in pointerCursor.GetComponentsInChildren()) + { + mr.material = pointerMaterial; + } + + base.SetPointerMaterial(); + } + + protected override void TogglePointer(bool state) + { + state = (beamAlwaysOn ? true : state); + + projectedBeamForward.gameObject.SetActive(state); + projectedBeamJoint.gameObject.SetActive(state); + projectedBeamDown.gameObject.SetActive(state); + } + + protected override void DisablePointerBeam(object sender, ControllerClickedEventArgs e) + { + base.PointerSet(); + base.DisablePointerBeam(sender, e); + TogglePointerCursor(false); + curvedBeam.TogglePoints(false); + } + + private void TogglePointerCursor(bool state) + { + state = (beamAlwaysOn ? true : state); + + bool pointerCursorState = (showPointerCursor && state ? showPointerCursor : false); + bool playAreaCursorState = (showPlayAreaCursor && state ? showPlayAreaCursor : false); + pointerCursor.gameObject.SetActive(pointerCursorState); + base.TogglePointer(playAreaCursorState); + } + + private void InitProjectedBeams() + { + projectedBeamContainer = new GameObject(string.Format("[{0}]PlayerObject_WorldPointer_BezierPointer_ProjectedBeamContainer", this.gameObject.name)).transform; + projectedBeamContainer.transform.parent = this.transform; + projectedBeamContainer.transform.localPosition = Vector3.zero; + + projectedBeamForward = new GameObject(string.Format("[{0}]PlayerObject_WorldPointer_BezierPointer_ProjectedBeamForward", this.gameObject.name)).transform; + projectedBeamForward.transform.parent = projectedBeamContainer.transform; + + projectedBeamJoint = new GameObject(string.Format("[{0}]PlayerObject_WorldPointer_BezierPointer_ProjectedBeamJoint", this.gameObject.name)).transform; + projectedBeamJoint.transform.parent = projectedBeamContainer.transform; + projectedBeamJoint.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f); + + projectedBeamDown = new GameObject(string.Format("[{0}]PlayerObject_WorldPointer_BezierPointer_ProjectedBeamDown", this.gameObject.name)).transform; + } + + private float GetForwardBeamLength() + { + float actualLength = pointerLength; + Ray pointerRaycast = new Ray(transform.position, transform.forward); + RaycastHit collidedWith; + bool hasRayHit = Physics.Raycast(pointerRaycast, out collidedWith); + + //reset if beam not hitting or hitting new target + if (!hasRayHit || (pointerContactTarget && pointerContactTarget != collidedWith.transform)) + { + pointerContactDistance = 0f; + } + + //check if beam has hit a new target + if (hasRayHit) + { + pointerContactDistance = collidedWith.distance; + } + + //adjust beam length if something is blocking it + if (hasRayHit && pointerContactDistance < pointerLength) + { + actualLength = pointerContactDistance; + } + + return actualLength; + } + + private void ProjectForwardBeam() + { + float setThicknes = 0.01f; + float setLength = GetForwardBeamLength(); + //if the additional decimal isn't added then the beam position glitches + float beamPosition = setLength / (2 + 0.00001f); + + projectedBeamForward.transform.localScale = new Vector3(setThicknes, setThicknes, setLength); + projectedBeamForward.transform.localPosition = new Vector3(0f, 0f, beamPosition); + projectedBeamJoint.transform.localPosition = new Vector3(0f, 0f, setLength - (projectedBeamJoint.transform.localScale.z / 2)); + projectedBeamContainer.transform.localRotation = Quaternion.identity; + } + + private void ProjectDownBeam() + { + projectedBeamDown.transform.position = new Vector3(projectedBeamJoint.transform.position.x, projectedBeamJoint.transform.position.y, projectedBeamJoint.transform.position.z); + + Ray projectedBeamDownRaycast = new Ray(projectedBeamDown.transform.position, Vector3.down); + RaycastHit collidedWith; + bool downRayHit = Physics.Raycast(projectedBeamDownRaycast, out collidedWith); + + if (!downRayHit || (pointerContactTarget && pointerContactTarget != collidedWith.transform)) + { + if (pointerContactTarget != null) + { + base.PointerOut(); + } + pointerContactTarget = null; + destinationPosition = Vector3.zero; + } + + if (downRayHit) + { + projectedBeamDown.transform.position = new Vector3(projectedBeamJoint.transform.position.x, projectedBeamJoint.transform.position.y - collidedWith.distance, projectedBeamJoint.transform.position.z); + projectedBeamDown.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f); + pointerContactTarget = collidedWith.transform; + destinationPosition = projectedBeamDown.transform.position; + + base.PointerIn(); + } + } + + private void SetPointerCursor() + { + if (pointerContactTarget != null) + { + TogglePointerCursor(true); + pointerCursor.transform.position = projectedBeamDown.transform.position; + base.SetPlayAreaCursorTransform(pointerCursor.transform.position); + UpdatePointerMaterial(pointerHitColor); + } else + { + TogglePointerCursor(false); + UpdatePointerMaterial(pointerMissColor); + } + } + + private void DisplayCurvedBeam() + { + Vector3[] beamPoints = new Vector3[] + { + this.transform.position, + projectedBeamJoint.transform.position + new Vector3(0f, beamCurveOffset, 0f), + projectedBeamDown.transform.position, + projectedBeamDown.transform.position, + }; + curvedBeam.SetPoints(beamPoints, pointerMaterial); + curvedBeam.TogglePoints(true); + } +} \ No newline at end of file diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_BezierPointer.cs.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_BezierPointer.cs.meta new file mode 100755 index 0000000..1a2b346 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_BezierPointer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2f0ad608ee982c348aaa6aea32a3db61 +timeCreated: 1461759912 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_ControllerActions.cs b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_ControllerActions.cs new file mode 100755 index 0000000..a1baff7 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_ControllerActions.cs @@ -0,0 +1,55 @@ +using UnityEngine; +using System.Collections; + +public class SteamVR_ControllerActions : MonoBehaviour { + private bool controllerVisible = true; + private ushort hapticPulseStrength; + private int hapticPulseCountdown; + + private uint controllerIndex; + private SteamVR_TrackedObject trackedController; + private SteamVR_Controller.Device device; + private ushort maxHapticVibration = 3999; + + public bool IsControllerVisible() + { + return controllerVisible; + } + + public void ToggleControllerModel(bool on) + { + foreach (MeshRenderer renderer in this.GetComponentsInChildren()) + { + renderer.enabled = on; + } + + foreach (SkinnedMeshRenderer renderer in this.GetComponentsInChildren()) + { + renderer.enabled = on; + } + controllerVisible = on; + } + + public void TriggerHapticPulse(int duration, ushort strength) + { + hapticPulseCountdown = duration; + hapticPulseStrength = (strength <= maxHapticVibration ? strength : maxHapticVibration); + } + + private void Awake() + { + trackedController = GetComponent(); + } + + private void Update() + { + controllerIndex = (uint)trackedController.index; + device = SteamVR_Controller.Input((int)controllerIndex); + + if (hapticPulseCountdown > 0) + { + device.TriggerHapticPulse(hapticPulseStrength); + hapticPulseCountdown -= 1; + } + } +} diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_ControllerActions.cs.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_ControllerActions.cs.meta new file mode 100755 index 0000000..58339a2 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_ControllerActions.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d45c8d32f1d960d4498790bb3961fc52 +timeCreated: 1462549415 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_ControllerEvents.cs b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_ControllerEvents.cs new file mode 100755 index 0000000..cb7a07c --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_ControllerEvents.cs @@ -0,0 +1,356 @@ +using UnityEngine; +using System.Collections; + +public struct ControllerClickedEventArgs +{ + public uint controllerIndex; + public float buttonPressure; + public Vector2 touchpadAxis; +} + +public delegate void ControllerClickedEventHandler(object sender, ControllerClickedEventArgs e); + +public class SteamVR_ControllerEvents : MonoBehaviour { + public enum ButtonAlias + { + Trigger, + Grip, + Touchpad_Touch, + Touchpad_Press, + Application_Menu + } + + public ButtonAlias pointerToggleButton = ButtonAlias.Grip; + public ButtonAlias grabToggleButton = ButtonAlias.Trigger; + public ButtonAlias useToggleButton = ButtonAlias.Trigger; + public ButtonAlias menuToggleButton = ButtonAlias.Application_Menu; + + public int axisFidelity = 1; + + public bool triggerPressed = false; + public bool triggerAxisChanged = false; + public bool applicationMenuPressed = false; + public bool touchpadPressed = false; + public bool touchpadTouched = false; + public bool touchpadAxisChanged = false; + public bool gripPressed = false; + + public event ControllerClickedEventHandler TriggerClicked; + public event ControllerClickedEventHandler TriggerUnclicked; + + public event ControllerClickedEventHandler TriggerAxisChanged; + + public event ControllerClickedEventHandler ApplicationMenuClicked; + public event ControllerClickedEventHandler ApplicationMenuUnclicked; + + public event ControllerClickedEventHandler GripClicked; + public event ControllerClickedEventHandler GripUnclicked; + + public event ControllerClickedEventHandler TouchpadClicked; + public event ControllerClickedEventHandler TouchpadUnclicked; + + public event ControllerClickedEventHandler TouchpadTouched; + public event ControllerClickedEventHandler TouchpadUntouched; + + public event ControllerClickedEventHandler TouchpadAxisChanged; + + public event ControllerClickedEventHandler AliasPointerOn; + public event ControllerClickedEventHandler AliasPointerOff; + + public event ControllerClickedEventHandler AliasGrabOn; + public event ControllerClickedEventHandler AliasGrabOff; + + public event ControllerClickedEventHandler AliasUseOn; + public event ControllerClickedEventHandler AliasUseOff; + + public event ControllerClickedEventHandler AliasMenuOn; + public event ControllerClickedEventHandler AliasMenuOff; + + private uint controllerIndex; + private SteamVR_TrackedObject trackedController; + private SteamVR_Controller.Device device; + + private Vector2 touchpadAxis = Vector2.zero; + private Vector2 triggerAxis = Vector2.zero; + + public virtual void OnTriggerClicked(ControllerClickedEventArgs e) + { + if (TriggerClicked != null) + TriggerClicked(this, e); + } + + public virtual void OnTriggerUnclicked(ControllerClickedEventArgs e) + { + if (TriggerUnclicked != null) + TriggerUnclicked(this, e); + } + + public virtual void OnTriggerAxisChanged(ControllerClickedEventArgs e) + { + if (TriggerAxisChanged != null) + TriggerAxisChanged(this, e); + } + + public virtual void OnApplicationMenuClicked(ControllerClickedEventArgs e) + { + if (ApplicationMenuClicked != null) + ApplicationMenuClicked(this, e); + } + + public virtual void OnApplicationMenuUnclicked(ControllerClickedEventArgs e) + { + if (ApplicationMenuUnclicked != null) + ApplicationMenuUnclicked(this, e); + } + + public virtual void OnGripClicked(ControllerClickedEventArgs e) + { + if (GripClicked != null) + GripClicked(this, e); + } + + public virtual void OnGripUnclicked(ControllerClickedEventArgs e) + { + if (GripUnclicked != null) + GripUnclicked(this, e); + } + + public virtual void OnTouchpadClicked(ControllerClickedEventArgs e) + { + if (TouchpadClicked != null) + TouchpadClicked(this, e); + } + + public virtual void OnTouchpadUnclicked(ControllerClickedEventArgs e) + { + if (TouchpadUnclicked != null) + TouchpadUnclicked(this, e); + } + + public virtual void OnTouchpadTouched(ControllerClickedEventArgs e) + { + if (TouchpadTouched != null) + TouchpadTouched(this, e); + } + + public virtual void OnTouchpadUntouched(ControllerClickedEventArgs e) + { + if (TouchpadUntouched != null) + TouchpadUntouched(this, e); + } + + public virtual void OnTouchpadAxisChanged(ControllerClickedEventArgs e) + { + if (TouchpadAxisChanged != null) + TouchpadAxisChanged(this, e); + } + + public virtual void OnAliasPointerOn(ControllerClickedEventArgs e) + { + if (AliasPointerOn != null) + AliasPointerOn(this, e); + } + + public virtual void OnAliasPointerOff(ControllerClickedEventArgs e) + { + if (AliasPointerOff != null) + AliasPointerOff(this, e); + } + + public virtual void OnAliasGrabOn(ControllerClickedEventArgs e) + { + if (AliasGrabOn != null) + AliasGrabOn(this, e); + } + + public virtual void OnAliasGrabOff(ControllerClickedEventArgs e) + { + if (AliasGrabOff != null) + AliasGrabOff(this, e); + } + + public virtual void OnAliasUseOn(ControllerClickedEventArgs e) + { + if (AliasUseOn != null) + AliasUseOn(this, e); + } + + public virtual void OnAliasUseOff(ControllerClickedEventArgs e) + { + if (AliasUseOff != null) + AliasUseOff(this, e); + } + + public virtual void OnAliasMenuOn(ControllerClickedEventArgs e) + { + if (AliasMenuOn != null) + AliasMenuOn(this, e); + } + + public virtual void OnAliasMenuOff(ControllerClickedEventArgs e) + { + if (AliasMenuOff != null) + AliasMenuOff(this, e); + } + + ControllerClickedEventArgs SetButtonEvent(ref bool buttonBool, bool value, float buttonPressure) + { + buttonBool = value; + ControllerClickedEventArgs e; + e.controllerIndex = controllerIndex; + e.buttonPressure = buttonPressure; + e.touchpadAxis = device.GetAxis(); + return e; + } + + void Awake() + { + trackedController = GetComponent(); + } + + void EmitAlias(ButtonAlias type, bool touchDown, float buttonPressure, ref bool buttonBool) + { + if (pointerToggleButton == type) + { + if (touchDown) + { + OnAliasPointerOn(SetButtonEvent(ref buttonBool, true, buttonPressure)); + } else + { + OnAliasPointerOff(SetButtonEvent(ref buttonBool, false, buttonPressure)); + } + } + + if (grabToggleButton == type) + { + if (touchDown) + { + OnAliasGrabOn(SetButtonEvent(ref buttonBool, true, buttonPressure)); + } + else + { + OnAliasGrabOff(SetButtonEvent(ref buttonBool, false, buttonPressure)); + } + } + + if (useToggleButton == type) + { + if (touchDown) + { + OnAliasUseOn(SetButtonEvent(ref buttonBool, true, buttonPressure)); + } + else + { + OnAliasUseOff(SetButtonEvent(ref buttonBool, false, buttonPressure)); + } + } + + if (menuToggleButton == type) + { + if (touchDown) + { + OnAliasMenuOn(SetButtonEvent(ref buttonBool, true, buttonPressure)); + } + else + { + OnAliasMenuOff(SetButtonEvent(ref buttonBool, false, buttonPressure)); + } + } + } + + bool Vector2ShallowEquals(Vector2 vectorA, Vector2 vectorB) + { + return (vectorA.x.ToString("F" + axisFidelity) == vectorB.x.ToString("F" + axisFidelity) && + vectorA.y.ToString("F" + axisFidelity) == vectorB.y.ToString("F" + axisFidelity)); + } + + void Update() + { + controllerIndex = (uint)trackedController.index; + device = SteamVR_Controller.Input((int)controllerIndex); + + Vector2 currentTriggerAxis = device.GetAxis(Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger); + Vector2 currentTouchpadAxis = device.GetAxis(); + + if (Vector2ShallowEquals(triggerAxis, currentTriggerAxis)) + { + triggerAxisChanged = false; + } else + { + OnTriggerAxisChanged(SetButtonEvent(ref triggerPressed, true, currentTriggerAxis.x)); + triggerAxisChanged = true; + } + + if(Vector2ShallowEquals(touchpadAxis, currentTouchpadAxis)) + { + touchpadAxisChanged = false; + } else + { + OnTouchpadAxisChanged(SetButtonEvent(ref touchpadTouched, true, 1f)); + touchpadAxisChanged = true; + } + + touchpadAxis = new Vector2(currentTouchpadAxis.x, currentTouchpadAxis.y); + triggerAxis = new Vector2(currentTriggerAxis.x, currentTriggerAxis.y); + + //Trigger + if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger)) + { + OnTriggerClicked(SetButtonEvent(ref triggerPressed, true, currentTriggerAxis.x)); + EmitAlias(ButtonAlias.Trigger, true, currentTriggerAxis.x, ref triggerPressed); + } else if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger)) + { + OnTriggerUnclicked(SetButtonEvent(ref triggerPressed, false, 0f)); + EmitAlias(ButtonAlias.Trigger, false, 0f, ref triggerPressed); + } + + //ApplicationMenu + if (device.GetTouchDown(SteamVR_Controller.ButtonMask.ApplicationMenu)) + { + OnApplicationMenuClicked(SetButtonEvent(ref applicationMenuPressed, true, 1f)); + EmitAlias(ButtonAlias.Application_Menu, true, 1f, ref applicationMenuPressed); + } + else if (device.GetTouchUp(SteamVR_Controller.ButtonMask.ApplicationMenu)) + { + + OnApplicationMenuUnclicked(SetButtonEvent(ref applicationMenuPressed, false, 0f)); + EmitAlias(ButtonAlias.Application_Menu, false, 0f, ref applicationMenuPressed); + } + + //Grip + if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Grip)) + { + OnGripClicked(SetButtonEvent(ref gripPressed, true, 1f)); + EmitAlias(ButtonAlias.Grip, true, 1f, ref gripPressed); + } + else if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Grip)) + { + OnGripUnclicked(SetButtonEvent(ref gripPressed, false, 0f)); + EmitAlias(ButtonAlias.Grip, false, 0f, ref gripPressed); + } + + //Touchpad Clicked + if (device.GetPressDown(SteamVR_Controller.ButtonMask.Touchpad)) + { + OnTouchpadClicked(SetButtonEvent(ref touchpadPressed, true, 1f)); + EmitAlias(ButtonAlias.Touchpad_Press, true, 1f, ref touchpadPressed); + } + else if (device.GetPressUp(SteamVR_Controller.ButtonMask.Touchpad)) + { + OnTouchpadUnclicked(SetButtonEvent(ref touchpadPressed, false, 0f)); + EmitAlias(ButtonAlias.Touchpad_Press, false, 0f, ref touchpadPressed); + } + + //Touchpad Touched + if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Touchpad)) + { + OnTouchpadTouched(SetButtonEvent(ref touchpadTouched, true, 1f)); + EmitAlias(ButtonAlias.Touchpad_Touch, true, 1f, ref touchpadTouched); + } + else if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Touchpad)) + { + OnTouchpadUntouched(SetButtonEvent(ref touchpadTouched, false, 0f)); + EmitAlias(ButtonAlias.Touchpad_Touch, false, 0f, ref touchpadTouched); + } + } +} diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_ControllerEvents.cs.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_ControllerEvents.cs.meta new file mode 100755 index 0000000..23981e2 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_ControllerEvents.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: eba3cd5456cd79e49948f5ceb58544b4 +timeCreated: 1461529683 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_HeadsetCollisionFade.cs b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_HeadsetCollisionFade.cs new file mode 100755 index 0000000..70d214f --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_HeadsetCollisionFade.cs @@ -0,0 +1,59 @@ +using UnityEngine; +using System.Collections; + +public struct HeadsetCollisionEventArgs +{ + public Collider collider; + public Transform currentTransform; +} + +public delegate void HeadsetCollisionEventHandler(object sender, HeadsetCollisionEventArgs e); + +public class SteamVR_HeadsetCollisionFade : MonoBehaviour { + public float blinkTransitionSpeed = 0.1f; + public Color fadeColor = Color.black; + + public event HeadsetCollisionEventHandler HeadsetCollisionDetect; + + public virtual void OnHeadsetCollisionDetect(HeadsetCollisionEventArgs e) + { + if (HeadsetCollisionDetect != null) + HeadsetCollisionDetect(this, e); + } + + protected HeadsetCollisionEventArgs SetHeadsetCollisionEvent(Collider collider, Transform currentTransform) + { + HeadsetCollisionEventArgs e; + e.collider = collider; + e.currentTransform = currentTransform; + return e; + } + + protected void Start () { + this.name = "PlayerObject_" + this.name; + BoxCollider collider = this.gameObject.AddComponent(); + collider.isTrigger = true; + collider.size = new Vector3(0.1f, 0.1f, 0.1f); + + Rigidbody rb = this.gameObject.AddComponent(); + rb.isKinematic = true; + rb.useGravity = false; + } + + protected void OnTriggerStay(Collider collider) + { + if (!collider.name.Contains("PlayerObject_")) + { + OnHeadsetCollisionDetect(SetHeadsetCollisionEvent(collider, this.transform)); + SteamVR_Fade.Start(fadeColor, blinkTransitionSpeed); + } + } + + protected void OnTriggerExit(Collider collider) + { + if (!collider.name.Contains("PlayerObject_")) + { + SteamVR_Fade.Start(Color.clear, blinkTransitionSpeed); + } + } +} diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_HeadsetCollisionFade.cs.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_HeadsetCollisionFade.cs.meta new file mode 100755 index 0000000..367d907 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_HeadsetCollisionFade.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 21b4bc319f4966f4faedb4f429f7c9c9 +timeCreated: 1461927173 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_HeightAdjustTeleport.cs b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_HeightAdjustTeleport.cs new file mode 100755 index 0000000..f1f67fb --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_HeightAdjustTeleport.cs @@ -0,0 +1,100 @@ +//==================================================================================== +// +// Purpose: Provide basic teleportation of VR CameraRig +// +// This script must be attached to the [CameraRig] Prefab +// +// A GameObject must have the SteamVR_WorldPointer attached to it to listen for the +// updated world position to teleport to. +// +//==================================================================================== + +using UnityEngine; +using System.Collections; + +public class SteamVR_HeightAdjustTeleport : SteamVR_BasicTeleport { + public bool playSpaceFalling = true; + private float currentRayDownY = 0f; + + GameObject currentFloor = null; + + protected override void Start() + { + base.Start(); + adjustYForTerrain = true; + } + + protected override void DoTeleport(object sender, WorldPointerEventArgs e) + { + base.DoTeleport(sender, e); + if (e.enableTeleport) + { + DropToNearestFloor(false); + } + } + + protected override Vector3 GetNewPosition(Vector3 tipPosition, Transform target) + { + Vector3 basePosition = base.GetNewPosition(tipPosition, target); + basePosition.y = GetTeleportY(target, tipPosition); + return basePosition; + } + + private float GetTeleportY(Transform target, Vector3 tipPosition) + { + float newY = this.transform.position.y; + //Check to see if the tip is on top of an object + if (target && (tipPosition.y + 0.5f) > (target.position.y + (target.localScale.y / 2))) + { + newY = tipPosition.y; + } + + return newY; + } + + private bool CurrentFloorChanged(RaycastHit collidedObj) + { + return (currentFloor != collidedObj.transform.gameObject); + } + + private bool MeshYChanged(RaycastHit collidedObj, float floorY) + { + return (collidedObj.transform.GetComponent() && floorY != currentRayDownY); + } + + private bool FloorIsGrabbedObject(RaycastHit collidedObj) + { + return (collidedObj.transform.GetComponent() && collidedObj.transform.GetComponent().IsGrabbed()); + } + + private void DropToNearestFloor(bool withBlink) + { + //send a ray down to find the closest object to stand on + Ray ray = new Ray(eyeCamera.transform.position, -transform.up); + RaycastHit rayCollidedWith; + bool rayHit = Physics.Raycast(ray, out rayCollidedWith); + float floorY = eyeCamera.transform.position.y - rayCollidedWith.distance; + + if (rayHit && ! FloorIsGrabbedObject(rayCollidedWith) && ( MeshYChanged(rayCollidedWith, floorY) || CurrentFloorChanged(rayCollidedWith) ) ) + { + currentFloor = rayCollidedWith.transform.gameObject; + currentRayDownY = floorY; + + if (withBlink && !rayCollidedWith.transform.GetComponent()) + { + Blink(blinkTransitionSpeed); + } + + Vector3 newPosition = new Vector3(this.transform.position.x, floorY, this.transform.position.z); + SetNewPosition(newPosition, currentFloor.transform); + } + } + + private void Update() + { + if (playSpaceFalling) + { + DropToNearestFloor(true); + } + } +} diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_HeightAdjustTeleport.cs.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_HeightAdjustTeleport.cs.meta new file mode 100755 index 0000000..95a730f --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_HeightAdjustTeleport.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 377ced3493c4e1842a5b1c23f56519db +timeCreated: 1461687851 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractGrab.cs b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractGrab.cs new file mode 100755 index 0000000..5c8c95c --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractGrab.cs @@ -0,0 +1,293 @@ +//==================================================================================== +// +// Purpose: Provide ability to grab an interactable object when it is being touched +// +// This script must be attached to a Controller within the [CameraRig] Prefab +// +// The SteamVR_ControllerEvents and SteamVR_InteractTouch scripts must also be +// attached to the Controller +// +// Press the default 'Trigger' button on the controller to grab an object +// Released the default 'Trigger' button on the controller to drop an object +// +//==================================================================================== + +using UnityEngine; +using System.Collections; + +public class SteamVR_InteractGrab : MonoBehaviour +{ + public Rigidbody controllerAttachPoint = null; + public bool hideControllerOnGrab = false; + public float hideControllerDelay = 0f; + + public event ObjectInteractEventHandler ControllerGrabInteractableObject; + public event ObjectInteractEventHandler ControllerUngrabInteractableObject; + + Joint controllerAttachJoint; + GameObject grabbedObject = null; + + SteamVR_InteractTouch interactTouch; + SteamVR_TrackedObject trackedController; + SteamVR_ControllerActions controllerActions; + + private int grabEnabledState = 0; + + public virtual void OnControllerGrabInteractableObject(ObjectInteractEventArgs e) + { + if (ControllerGrabInteractableObject != null) + ControllerGrabInteractableObject(this, e); + } + + public virtual void OnControllerUngrabInteractableObject(ObjectInteractEventArgs e) + { + if (ControllerUngrabInteractableObject != null) + ControllerUngrabInteractableObject(this, e); + } + + public void ForceRelease() + { + if (grabbedObject.GetComponent().AttatchIsTrackObject()) + { + UngrabTrackedObject(); + } + else + { + ReleaseObject((uint)trackedController.index, false); + } + } + + private void Awake() + { + if (GetComponent() == null) + { + Debug.LogError("SteamVR_InteractGrab is required to be attached to a SteamVR Controller that has the SteamVR_InteractTouch script attached to it"); + return; + } + + interactTouch = GetComponent(); + trackedController = GetComponent(); + controllerActions = GetComponent(); + } + + private void Start() + { + //If no attach point has been specified then just use the tip of the controller + if (controllerAttachPoint == null) + { + controllerAttachPoint = transform.GetChild(0).Find("tip").GetChild(0).GetComponent(); + } + + if (GetComponent() == null) + { + Debug.LogError("SteamVR_InteractGrab is required to be attached to a SteamVR Controller that has the SteamVR_ControllerEvents script attached to it"); + return; + } + + GetComponent().AliasGrabOn += new ControllerClickedEventHandler(DoGrabObject); + GetComponent().AliasGrabOff += new ControllerClickedEventHandler(DoReleaseObject); + } + + private bool IsObjectGrabbable(GameObject obj) + { + return (interactTouch.IsObjectInteractable(obj) && obj.GetComponent().isGrabbable); + } + + private bool IsObjectHoldOnGrab(GameObject obj) + { + return (obj && obj.GetComponent() && obj.GetComponent().holdButtonToGrab); + } + + private void SnapObjectToGrabToController(GameObject obj) + { + //Pause collisions (if allowed on object) for a moment whilst sorting out position to prevent clipping issues + obj.GetComponent().PauseCollisions(0.2f); + + SteamVR_InteractableObject.GrabSnapType grabType = obj.GetComponent().grabSnapType; + + if (grabType == SteamVR_InteractableObject.GrabSnapType.Rotation_Snap) + { + // Identity Controller Rotation + this.transform.eulerAngles = new Vector3(0f, 270f, 0f); + obj.transform.eulerAngles = obj.GetComponent().snapToRotation; + } + + if (grabType != SteamVR_InteractableObject.GrabSnapType.Precision_Snap) + { + obj.transform.position = controllerAttachPoint.transform.position + obj.GetComponent().snapToPosition; + } + + CreateJoint(obj); + } + + private void CreateJoint(GameObject obj) + { + + if (obj.GetComponent().grabAttatchMechanic == SteamVR_InteractableObject.GrabAttatchType.Fixed_Joint) + { + controllerAttachJoint = obj.AddComponent(); + } + else if (obj.GetComponent().grabAttatchMechanic == SteamVR_InteractableObject.GrabAttatchType.Spring_Joint) + { + SpringJoint tempSpringJoint = obj.AddComponent(); + tempSpringJoint.spring = obj.GetComponent().springJointStrength; + tempSpringJoint.damper = obj.GetComponent().springJointDamper; + controllerAttachJoint = tempSpringJoint; + } + controllerAttachJoint.breakForce = obj.GetComponent().detatchThreshold; + controllerAttachJoint.connectedBody = controllerAttachPoint; + } + + private Rigidbody ReleaseGrabbedObjectFromController(bool withThrow) + { + var jointGameObject = controllerAttachJoint.gameObject; + var rigidbody = jointGameObject.GetComponent(); + if (withThrow) + { + Object.DestroyImmediate(controllerAttachJoint); + } else + { + Object.Destroy(controllerAttachJoint); + } + controllerAttachJoint = null; + + return rigidbody; + } + + private void ThrowReleasedObject(Rigidbody rb, uint controllerIndex) + { + var origin = trackedController.origin ? trackedController.origin : trackedController.transform.parent; + var device = SteamVR_Controller.Input((int)controllerIndex); + if (origin != null) + { + rb.velocity = origin.TransformVector(device.velocity); + rb.angularVelocity = origin.TransformVector(device.angularVelocity); + } + else + { + rb.velocity = device.velocity; + rb.angularVelocity = device.angularVelocity; + } + rb.maxAngularVelocity = rb.angularVelocity.magnitude; + } + + private void GrabInteractedObject() + { + if (controllerAttachJoint == null && grabbedObject == null && IsObjectGrabbable(interactTouch.GetTouchedObject())) + { + InitGrabbedObject(); + SnapObjectToGrabToController(grabbedObject); + } + } + + private void GrabTrackedObject() + { + if (grabbedObject == null && IsObjectGrabbable(interactTouch.GetTouchedObject())) { + InitGrabbedObject(); + } + } + + private void InitGrabbedObject() + { + grabbedObject = interactTouch.GetTouchedObject(); + OnControllerGrabInteractableObject(interactTouch.SetControllerInteractEvent(grabbedObject)); + grabbedObject.GetComponent().Grabbed(this.gameObject); + if (grabbedObject) + { + grabbedObject.GetComponent().ToggleHighlight(false); + } + if (hideControllerOnGrab) + { + Invoke("HideController", hideControllerDelay); + } + } + + private void HideController() + { + if(grabbedObject != null) + { + controllerActions.ToggleControllerModel(false); + } + } + + private void UngrabInteractedObject(uint controllerIndex, bool withThrow) + { + if (grabbedObject != null && controllerAttachJoint != null) + { + Rigidbody releasedObjectRigidBody = ReleaseGrabbedObjectFromController(withThrow); + if (withThrow) + { + ThrowReleasedObject(releasedObjectRigidBody, controllerIndex); + } + InitUngrabbedObject(); + } + } + + private void UngrabTrackedObject() + { + if (grabbedObject != null) + { + InitUngrabbedObject(); + } + } + + private void InitUngrabbedObject() + { + OnControllerUngrabInteractableObject(interactTouch.SetControllerInteractEvent(grabbedObject)); + grabbedObject.GetComponent().Ungrabbed(this.gameObject); + + if (hideControllerOnGrab) + { + controllerActions.ToggleControllerModel(true); + } + + grabbedObject.GetComponent().ToggleHighlight(false); + grabbedObject = null; + } + + private void ReleaseObject(uint controllerIndex, bool withThrow) + { + UngrabInteractedObject(controllerIndex, withThrow); + grabEnabledState = 0; + } + + private bool IsValidGrab() + { + GameObject obj = interactTouch.GetTouchedObject(); + return (obj != null && interactTouch.IsObjectInteractable(obj)); + } + + private void DoGrabObject(object sender, ControllerClickedEventArgs e) + { + if (IsValidGrab()) + { + if (interactTouch.GetTouchedObject().GetComponent().AttatchIsTrackObject()) + { + GrabTrackedObject(); + } else + { + GrabInteractedObject(); + } + + if(!IsObjectHoldOnGrab(interactTouch.GetTouchedObject())) + { + grabEnabledState++; + } + } + } + + private void DoReleaseObject(object sender, ControllerClickedEventArgs e) + { + if (IsObjectHoldOnGrab(grabbedObject) || grabEnabledState >= 2) + { + if (grabbedObject.GetComponent().AttatchIsTrackObject()) + { + UngrabTrackedObject(); + } + else + { + ReleaseObject(e.controllerIndex, true); + } + } + } +} diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractGrab.cs.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractGrab.cs.meta new file mode 100755 index 0000000..326857d --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractGrab.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 947b27445602ed640b885db7e667dfc1 +timeCreated: 1461746152 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractTouch.cs b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractTouch.cs new file mode 100755 index 0000000..40e9075 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractTouch.cs @@ -0,0 +1,121 @@ +//==================================================================================== +// +// Purpose: Provide basic touch detection of controller to interactable objects +// +// This script must be attached to a Controller within the [CameraRig] Prefab +// +//==================================================================================== + +using UnityEngine; +using System.Collections; + +public struct ObjectInteractEventArgs +{ + public uint controllerIndex; + public GameObject target; +} + +public delegate void ObjectInteractEventHandler(object sender, ObjectInteractEventArgs e); + +public class SteamVR_InteractTouch : MonoBehaviour { + + public bool hideControllerOnTouch = false; + public float hideControllerDelay = 0f; + public Color globalTouchHighlightColor = Color.clear; + + public event ObjectInteractEventHandler ControllerTouchInteractableObject; + public event ObjectInteractEventHandler ControllerUntouchInteractableObject; + + GameObject touchedObject = null; + SteamVR_TrackedObject trackedController; + SteamVR_ControllerActions controllerActions; + + public virtual void OnControllerTouchInteractableObject(ObjectInteractEventArgs e) + { + if (ControllerTouchInteractableObject != null) + ControllerTouchInteractableObject(this, e); + } + + public virtual void OnControllerUntouchInteractableObject(ObjectInteractEventArgs e) + { + if (ControllerUntouchInteractableObject != null) + ControllerUntouchInteractableObject(this, e); + } + + public ObjectInteractEventArgs SetControllerInteractEvent(GameObject target) + { + ObjectInteractEventArgs e; + e.controllerIndex = (uint)trackedController.index; + e.target = target; + return e; + } + + public GameObject GetTouchedObject() + { + return touchedObject; + } + + public bool IsObjectInteractable(GameObject obj) + { + return (obj && obj.GetComponent()); + } + + private void Awake() + { + trackedController = GetComponent(); + controllerActions = GetComponent(); + } + + private void Start() + { + if (GetComponent() == null) + { + Debug.LogError("SteamVR_InteractTouch is required to be attached to a SteamVR Controller that has the SteamVR_ControllerActions script attached to it"); + return; + } + + //Create trigger box collider for controller + SphereCollider collider = this.gameObject.AddComponent(); + collider.radius = 0.05f; + collider.center = new Vector3(0f, -0.035f, -0.01f); + collider.isTrigger = true; + } + + private void OnTriggerStay(Collider collider) + { + if (touchedObject == null && IsObjectInteractable(collider.gameObject)) + { + touchedObject = collider.gameObject; + OnControllerTouchInteractableObject(SetControllerInteractEvent(touchedObject)); + touchedObject.GetComponent().ToggleHighlight(true, globalTouchHighlightColor); + touchedObject.GetComponent().StartTouching(this.gameObject); + if (controllerActions.IsControllerVisible() && hideControllerOnTouch) + { + Invoke("HideController", hideControllerDelay); + } + } + } + + private void OnTriggerExit(Collider collider) + { + if (IsObjectInteractable(collider.gameObject)) + { + OnControllerUntouchInteractableObject(SetControllerInteractEvent(collider.gameObject)); + collider.GetComponent().ToggleHighlight(false); + collider.GetComponent().StopTouching(this.gameObject); + } + touchedObject = null; + if (hideControllerOnTouch) + { + controllerActions.ToggleControllerModel(true); + } + } + + private void HideController() + { + if (touchedObject != null) + { + controllerActions.ToggleControllerModel(false); + } + } +} diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractTouch.cs.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractTouch.cs.meta new file mode 100755 index 0000000..2d62886 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractTouch.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 64e104da36bd3b04b90c6ae969ac66dc +timeCreated: 1461745433 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractUse.cs b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractUse.cs new file mode 100755 index 0000000..5d47596 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractUse.cs @@ -0,0 +1,154 @@ +//==================================================================================== +// +// Purpose: Provide ability to use an interactable object when it is being touched +// +// This script must be attached to a Controller within the [CameraRig] Prefab +// +// The SteamVR_ControllerEvents and SteamVR_InteractTouch scripts must also be +// attached to the Controller +// +// Press the default 'Trigger' button on the controller to use an object +// Released the default 'Trigger' button on the controller to stop using an object +// +//==================================================================================== + +using UnityEngine; +using System.Collections; + +public class SteamVR_InteractUse : MonoBehaviour +{ + public bool hideControllerOnUse = false; + public float hideControllerDelay = 0f; + + public event ObjectInteractEventHandler ControllerUseInteractableObject; + public event ObjectInteractEventHandler ControllerUnuseInteractableObject; + + GameObject usingObject = null; + SteamVR_InteractTouch interactTouch; + SteamVR_TrackedObject trackedController; + SteamVR_ControllerActions controllerActions; + + public virtual void OnControllerUseInteractableObject(ObjectInteractEventArgs e) + { + if (ControllerUseInteractableObject != null) + ControllerUseInteractableObject(this, e); + } + + public virtual void OnControllerUnuseInteractableObject(ObjectInteractEventArgs e) + { + if (ControllerUnuseInteractableObject != null) + ControllerUnuseInteractableObject(this, e); + } + + private void Awake() + { + if (GetComponent() == null) + { + Debug.LogError("SteamVR_InteractUse is required to be attached to a SteamVR Controller that has the SteamVR_InteractTouch script attached to it"); + return; + } + + interactTouch = GetComponent(); + trackedController = GetComponent(); + controllerActions = GetComponent(); + } + + private void Start() + { + if (GetComponent() == null) + { + Debug.LogError("SteamVR_InteractUse is required to be attached to a SteamVR Controller that has the SteamVR_ControllerEvents script attached to it"); + return; + } + + GetComponent().AliasUseOn += new ControllerClickedEventHandler(DoStartUseObject); + GetComponent().AliasUseOff += new ControllerClickedEventHandler(DoStopUseObject); + } + + private bool IsObjectUsable(GameObject obj) + { + return (interactTouch.IsObjectInteractable(obj) && obj.GetComponent().isUsable); + } + + private bool IsObjectHoldOnUse(GameObject obj) + { + return (obj && obj.GetComponent() && obj.GetComponent().holdButtonToUse); + } + + private int GetObjectUsingState(GameObject obj) + { + if (obj && obj.GetComponent()) + { + return obj.GetComponent().UsingState; + } + return 0; + } + + private void SetObjectUsingState(GameObject obj, int value) + { + if (obj && obj.GetComponent()) + { + obj.GetComponent().UsingState = value; + } + } + + private void UseInteractedObject(GameObject touchedObject) + { + if ((usingObject == null || usingObject != touchedObject) && IsObjectUsable(touchedObject)) + { + usingObject = touchedObject; + OnControllerUseInteractableObject(interactTouch.SetControllerInteractEvent(usingObject)); + usingObject.GetComponent().StartUsing(this.gameObject); + if (hideControllerOnUse) + { + Invoke("HideController", hideControllerDelay); + } + usingObject.GetComponent().ToggleHighlight(false); + } + } + + private void HideController() + { + if(usingObject != null) + { + controllerActions.ToggleControllerModel(false); + } + } + + private void UnuseInteractedObject() + { + if (usingObject != null) + { + OnControllerUnuseInteractableObject(interactTouch.SetControllerInteractEvent(usingObject)); + usingObject.GetComponent().StopUsing(this.gameObject); + if (hideControllerOnUse) + { + controllerActions.ToggleControllerModel(true); + } + usingObject.GetComponent().ToggleHighlight(false); + usingObject = null; + } + } + + private void DoStartUseObject(object sender, ControllerClickedEventArgs e) + { + GameObject touchedObject = interactTouch.GetTouchedObject(); + if (touchedObject != null && interactTouch.IsObjectInteractable(touchedObject)) + { + UseInteractedObject(touchedObject); + if (!IsObjectHoldOnUse(usingObject)) + { + SetObjectUsingState(usingObject, GetObjectUsingState(usingObject) + 1); + } + } + } + + private void DoStopUseObject(object sender, ControllerClickedEventArgs e) + { + if (IsObjectHoldOnUse(usingObject) || GetObjectUsingState(usingObject) >= 2) + { + SetObjectUsingState(usingObject, 0); + UnuseInteractedObject(); + } + } +} diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractUse.cs.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractUse.cs.meta new file mode 100755 index 0000000..079e2d1 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractUse.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 65eb64f0f2fd6d64faddbcf5d7d3bdbb +timeCreated: 1461746619 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractableObject.cs b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractableObject.cs new file mode 100755 index 0000000..b76fb35 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractableObject.cs @@ -0,0 +1,345 @@ +//===================================================================================== +// +// Purpose: Provide a mechanism for determining if a game world object is interactable +// +// This script should be attached to any object that needs touch, use or grab +// +// An optional highlight color can be set to change the object's appearance if it is +// invoked. +// +//===================================================================================== + +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + +public class SteamVR_InteractableObject : MonoBehaviour +{ + public enum GrabSnapType + { + Simple_Snap, + Rotation_Snap, + Precision_Snap + } + + public enum GrabAttatchType + { + Fixed_Joint, + Spring_Joint, + Track_Object + } + + [Header("Touch Interactions", order = 1)] + public bool highlightOnTouch = false; + public Color touchHighlightColor = Color.clear; + + [Header("Grab Interactions", order = 2)] + public bool isGrabbable = false; + public bool holdButtonToGrab = true; + public bool pauseCollisionsOnGrab = true; + public GrabSnapType grabSnapType = GrabSnapType.Simple_Snap; + public Vector3 snapToRotation = Vector3.zero; + public Vector3 snapToPosition = Vector3.zero; + + [Header("Grab Mechanics", order = 3)] + public GrabAttatchType grabAttatchMechanic = GrabAttatchType.Fixed_Joint; + public float detatchThreshold = 500f; + public float springJointStrength = 500f; + public float springJointDamper = 50f; + + [Header("Use Interactions", order = 4)] + public bool isUsable = false; + public bool holdButtonToUse = true; + public bool pointerActivatesUseAction = false; + + protected Rigidbody rb; + protected GameObject grabbingObject = null; + + private bool isTouched = false; + private bool isUsing = false; + private int usingState = 0; + private Color[] originalObjectColours = null; + + private Transform trackPoint; + private bool customTrackPoint = false; + + public bool IsTouched() + { + return isTouched; + } + + public bool IsGrabbed() + { + return (grabbingObject != null); + } + + public bool IsUsing() + { + return isUsing; + } + + public virtual void StartTouching(GameObject touchingObject) + { + isTouched = true; + } + + public virtual void StopTouching(GameObject previousTouchingObject) + { + isTouched = false; + } + + public virtual void Grabbed(GameObject currentGrabbingObject) + { + ForceReleaseGrab(); + RemoveTrackPoint(); + grabbingObject = currentGrabbingObject; + SetTrackPoint(grabbingObject); + } + + public virtual void Ungrabbed(GameObject previousGrabbingObject) + { + RemoveTrackPoint(); + grabbingObject = null; + } + + public virtual void StartUsing(GameObject usingObject) + { + isUsing = true; + } + + public virtual void StopUsing(GameObject previousUsingObject) + { + isUsing = false; + } + + public virtual void ToggleHighlight(bool toggle) + { + ToggleHighlight(toggle, Color.clear); + } + + public virtual void ToggleHighlight(bool toggle, Color globalHighlightColor) + { + if (highlightOnTouch) + { + if (toggle && !IsGrabbed() && !isUsing) + { + Color color = (touchHighlightColor != Color.clear ? touchHighlightColor : globalHighlightColor); + if (color != Color.clear) + { + var colorArray = BuildHighlightColorArray(color); + ChangeColor(colorArray); + } + } + else + { + if(originalObjectColours == null) + { + Debug.LogError("SteamVR_InteractableObject has not had the Start() method called, if you are inheriting this class then call base.Start() in your Start() method. [Error raised on line 78 of SteamVR_InteractableObject.cs]"); + return; + } + ChangeColor(originalObjectColours); + } + } + } + + public int UsingState + { + get { return usingState; } + set{ usingState = value; } + } + + public void PauseCollisions(float pauseTime) + { + if (pauseCollisionsOnGrab) + { + if (this.GetComponent()) + { + this.GetComponent().detectCollisions = false; + } + foreach (Rigidbody rb in this.GetComponentsInChildren()) + { + rb.detectCollisions = false; + } + Invoke("UnpauseCollisions", pauseTime); + } + } + + public bool AttatchIsTrackObject() + { + return (grabAttatchMechanic == GrabAttatchType.Track_Object); + } + + protected virtual void Awake() + { + rb = this.GetComponent(); + } + + protected virtual void Start() + { + originalObjectColours = StoreOriginalColors(); + } + + protected virtual void Update() + { + if (grabAttatchMechanic == GrabAttatchType.Track_Object) + { + CheckBreakDistance(); + } + } + + protected virtual void FixedUpdate() + { + if (grabAttatchMechanic == GrabAttatchType.Track_Object) + { + FixedUpdateTrackedObject(); + } + } + + protected virtual void OnJointBreak(float force) + { + ForceReleaseGrab(); + } + + private void ForceReleaseGrab() + { + if (grabbingObject) + { + grabbingObject.GetComponent().ForceRelease(); + } + } + + private void UnpauseCollisions() + { + if (this.GetComponent()) + { + this.GetComponent().detectCollisions = true; + } + foreach (Rigidbody rb in this.GetComponentsInChildren()) + { + rb.detectCollisions = true; + } + } + + private Renderer[] GetRendererArray() + { + return (GetComponents().Length > 0 ? GetComponents() : GetComponentsInChildren()); + } + + private Color[] StoreOriginalColors() + { + Renderer[] rendererArray = GetRendererArray(); + int length = rendererArray.Length; + Color[] colors = new Color[length]; + + for (int i = 0; i < length; i++) + { + var renderer = rendererArray[i]; + if (renderer.material.HasProperty("_Color")) + { + colors[i] = renderer.material.color; + } + } + return colors; + } + + private Color[] BuildHighlightColorArray(Color color) + { + Renderer[] rendererArray = GetRendererArray(); + int length = rendererArray.Length; + Color[] colors = new Color[length]; + + for (int i = 0; i < length; i++) + { + colors[i] = color; + } + return colors; + } + + private void ChangeColor(Color[] colors) + { + Renderer[] rendererArray = GetRendererArray(); + int i = 0; + foreach (Renderer renderer in rendererArray) + { + if (renderer.material.HasProperty("_Color")) + { + renderer.material.color = colors[i]; + } + i++; + } + } + + private void CheckBreakDistance() + { + if(trackPoint) + { + float distance = Vector3.Distance(trackPoint.position, this.transform.position); + if (distance > (detatchThreshold / 1000)) + { + ForceReleaseGrab(); + } + } + } + + private void SetTrackPoint(GameObject point) + { + Transform controllerPoint = point.transform; + + if (point.GetComponent() && point.GetComponent().controllerAttachPoint) + { + controllerPoint = point.GetComponent().controllerAttachPoint.transform; + } + + if (grabAttatchMechanic == GrabAttatchType.Track_Object && grabSnapType == GrabSnapType.Precision_Snap) + { + trackPoint = new GameObject(string.Format("[{0}]TrackObject_PrecisionSnap_AttatchPoint", this.gameObject.name)).transform; + trackPoint.parent = point.transform; + trackPoint.position = this.transform.position; + trackPoint.rotation = this.transform.rotation; + customTrackPoint = true; + } else + { + trackPoint = controllerPoint; + customTrackPoint = false; + } + } + + private void RemoveTrackPoint() + { + if (customTrackPoint && trackPoint) + { + Destroy(trackPoint.gameObject); + } + else + { + trackPoint = null; + } + } + + private void FixedUpdateTrackedObject() + { + if (trackPoint) + { + float rotationMultiplier = 20f; + float positionMultiplier = 3000f; + float maxDistanceDelta = 10f; + + Quaternion rotationDelta = trackPoint.rotation * Quaternion.Inverse(this.transform.rotation); + Vector3 positionDelta = (trackPoint.position - this.transform.position); + + float angle; + Vector3 axis; + rotationDelta.ToAngleAxis(out angle, out axis); + angle = (angle > 180 ? angle -= 360 : angle); + + if (angle != 0) + { + Vector3 AngularTarget = (Time.fixedDeltaTime * angle * axis) * rotationMultiplier; + rb.angularVelocity = Vector3.MoveTowards(rb.angularVelocity, AngularTarget, maxDistanceDelta); + } + + Vector3 VelocityTarget = positionDelta * positionMultiplier * Time.fixedDeltaTime; + rb.velocity = Vector3.MoveTowards(rb.velocity, VelocityTarget, maxDistanceDelta); + } + } +} \ No newline at end of file diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractableObject.cs.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractableObject.cs.meta new file mode 100755 index 0000000..cd9ae6e --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_InteractableObject.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a3abaf4521bf2344ea21ed3020b98eb2 +timeCreated: 1461583046 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_TouchpadWalking.cs b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_TouchpadWalking.cs new file mode 100755 index 0000000..7369252 --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_TouchpadWalking.cs @@ -0,0 +1,208 @@ +using UnityEngine; +using System.Collections; + +public class SteamVR_TouchpadWalking : MonoBehaviour { + public float maxWalkSpeed = 3f; + public float deceleration = 0.1f; + public float headsetYOffset = 0.2f; + public bool ignoreGrabbedCollisions = true; + + private float movementSpeed = 0f; + private float strafeSpeed = 0f; + private int listenerInitTries = 5; + + private Transform headset; + private Vector2 touchAxis; + + private Rigidbody rb; + private BoxCollider bc; + + private GameObject floorTouching; + private Vector3 lastGoodPosition; + private bool lastGoodPositionSet = false; + private float highestHeadsetY = 0f; + private float crouchMargin = 0.5f; + private float lastPlayAreaY = 0f; + + private void Start () { + this.name = "PlayerObject_" + this.name; + lastGoodPositionSet = false; + headset = GetHeadset(); + CreateCollider(); + InitListeners(); + } + + private Transform GetHeadset() + { +#if (UNITY_5_4_OR_NEWER) + return GameObject.FindObjectOfType().GetComponent(); +#endif + return GameObject.FindObjectOfType().GetComponent(); + } + + private void InitListeners() + { + SteamVR_ControllerEvents[] controllers = GameObject.FindObjectsOfType(); + if (controllers.Length == 0) + { + if (listenerInitTries > 0) + { + listenerInitTries--; + Invoke("InitListeners", 0.25f); + } + else + { + Debug.LogError("A GameObject must exist with a SteamVR_ControllerEvents script attached to it"); + return; + } + } + + foreach (SteamVR_ControllerEvents controller in controllers) + { + controller.TouchpadAxisChanged += new ControllerClickedEventHandler(DoTouchpadAxisChanged); + controller.TouchpadUntouched += new ControllerClickedEventHandler(DoTouchpadUntouched); + + if (ignoreGrabbedCollisions && controller.GetComponent()) + { + SteamVR_InteractGrab grabbingController = controller.GetComponent(); + grabbingController.ControllerGrabInteractableObject += new ObjectInteractEventHandler(OnGrabObject); + grabbingController.ControllerUngrabInteractableObject += new ObjectInteractEventHandler(OnUngrabObject); + } + } + + if (headset.GetComponent()) + { + headset.GetComponent().HeadsetCollisionDetect += new HeadsetCollisionEventHandler(OnHeadsetCollision); + } + } + + private void OnGrabObject(object sender, ObjectInteractEventArgs e) + { + Physics.IgnoreCollision(this.GetComponent(), e.target.GetComponent(), true); + } + + private void OnUngrabObject(object sender, ObjectInteractEventArgs e) + { + Physics.IgnoreCollision(this.GetComponent(), e.target.GetComponent(), false); + } + + private void OnHeadsetCollision(object sender, HeadsetCollisionEventArgs e) + { + if (lastGoodPositionSet) { + SteamVR_Fade.Start(Color.black, 0f); + this.transform.position = lastGoodPosition; + } + } + + private void CreateCollider() + { + rb = this.gameObject.AddComponent(); + rb.mass = 100; + rb.freezeRotation = true; + + bc = this.gameObject.AddComponent(); + bc.center = new Vector3(0f, 1f, 0f); + bc.size = new Vector3(0.25f, 1f, 0.25f); + + this.gameObject.layer = 2; + } + + private void DoTouchpadAxisChanged(object sender, ControllerClickedEventArgs e) + { + touchAxis = e.touchpadAxis; + } + + private void DoTouchpadUntouched(object sender, ControllerClickedEventArgs e) + { + touchAxis = Vector2.zero; + } + + private void CalculateSpeed(ref float speed, float inputValue) + { + if (inputValue != 0f) + { + speed = (maxWalkSpeed * inputValue); + } + else + { + Decelerate(ref speed); + } + } + + private void Decelerate(ref float speed) + { + if (speed > 0) + { + speed -= Mathf.Lerp(deceleration, maxWalkSpeed, 0f); + } + else if (speed < 0) + { + speed += Mathf.Lerp(deceleration, -maxWalkSpeed, 0f); + } + else + { + speed = 0; + } + + float deadzone = 0.1f; + if (speed < deadzone && speed > -deadzone) + { + speed = 0; + } + } + + private void Move() + { + Vector3 movement = headset.transform.forward * movementSpeed * Time.deltaTime; + Vector3 strafe = headset.transform.right * strafeSpeed * Time.deltaTime; + float fixY = this.transform.position.y; + this.transform.position += (movement + strafe); + this.transform.position = new Vector3(this.transform.position.x, fixY, this.transform.position.z); + } + + private void UpdateCollider() + { + float playAreaHeightAdjustment = 0.009f; + float newBCYSize = (headset.transform.position.y - headsetYOffset) - this.transform.position.y; + float newBCYCenter = (newBCYSize != 0 ? (newBCYSize / 2) + playAreaHeightAdjustment: 0); + + bc.size = new Vector3(bc.size.x, newBCYSize, bc.size.z); + bc.center = new Vector3(headset.localPosition.x, newBCYCenter, headset.localPosition.z); + } + + private void SetHeadsetY() + { + //if the play area height has changed then always recalc headset height + float floorVariant = 0.005f; + if (this.transform.position.y > lastPlayAreaY + floorVariant || this.transform.position.y < lastPlayAreaY - floorVariant) + { + highestHeadsetY = 0f; + } + + if (headset.transform.position.y > highestHeadsetY) + { + highestHeadsetY = headset.transform.position.y; + } + + if (headset.transform.position.y > highestHeadsetY - crouchMargin) + { + lastGoodPositionSet = true; + lastGoodPosition = this.transform.position; + } + + lastPlayAreaY = this.transform.position.y; + } + + private void Update() + { + SetHeadsetY(); + UpdateCollider(); + } + + private void FixedUpdate() + { + CalculateSpeed(ref movementSpeed, touchAxis.y); + CalculateSpeed(ref strafeSpeed, touchAxis.x); + Move(); + } +} \ No newline at end of file diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_TouchpadWalking.cs.meta b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_TouchpadWalking.cs.meta new file mode 100755 index 0000000..09a868b --- /dev/null +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/SteamVR_TouchpadWalking.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b0a3634ed0880214bb405386bdad8e93 +timeCreated: 1462638636 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Test.unity b/Assets/Test.unity index 56656ed350d6ef42a4ddb3d25951d85f2e0e77e3..d8fa2c1a9933161f0882cd599d7b5026477e7dec 100755 GIT binary patch delta 15165 zcmcgz3w%shx8G}Kl1wCFB9BQX5fc%Dgh>c_2&2{3=kZBDRiU)e@-=)#DC$*7TfOy2 z2^(8cqAgOd4x=Vjk3^NAk0>gwmT2jvw-=r@wcl9)5G4_g!d!YtEM%-_XHz=eR&$1N`os8gfMsH=O?pe@gG1*8EtYb8u3q z9_~1Elg)alb@op51Lqql4-a&9Ej;bxta&@c0DWoWcP8guTj?dFn1X+2`w$X>?S_!r zS}xH1iroSuzJwI|)x~Dp`{_ANVK5=q075R}+eN)nFM3wEfn$znLQJ~4SPO}j#t;%l zNFFv-TWi3-yrpdkv7%xnf@|@ee*-CuQ)2n3nGyJ%6Y_faAloH&0kJ3WoojFc2k`n( zV)j@<3h>=5Zl&Ii1ls;x@3abpGVyZ{aVwBZR~B9$G&UP zk=AtXyOw5!t+kYelCqo*Ul)|ONWR(P6ftiLF?lBmp%R;oSTB6Hi(6^0>!po2GK5qh zwgjK;Gm>3eqxX1CRL-Yzi*VxFB}`(l+4<^p2FJcL;%v0m*6 z$wkb4jCu|9`(0ElK`@J!y=V3^wI`&6e*d01uiS>#=V2+Yt=xb%hr)FvWQGU!`Pwu7 z9IHqcR)phn&xlMqKeR_eE+94%pYGZUlvrlxI@)R~tSIZ~!p6K}34#vVZ>@Q7PAVb8 zJy^_bc1TcFAm-V}%DKaEHsj!>X~p{T;E1Li%R(%R?p|xoaCFrQm@w~aK^2xk$bO`D z*WmJHc{te!sY1*_1J{|o3hkU%!a8%>g@?4J@$_pU+}KI}!*x0<`udE-E<8+UuCwT- z^rXwzSq7K))QyLZ=itzRT(K>BEzXZ1SKj6-34=(P0_sYo#b-`r~tkrej6gv>(hmY8cO zKVDBsth_J%VtoYkqd%{Y=-Q8vg@|zt2g`Y0V%^@H(^nxj%cJX0$L#TH$47Cnqytb=i6k@BVxn|F+m z6OwWYV%RJ4hrql9_O-;y2h*tcExPO>H0^y$UilEMjkY-Kjc$aHl&7?|9V4+K#5`?# z$bW^3dZwY;;n=k}L11x+)nMmjFrcpY1JbNdYw5SWdk9?;%7EA;e7ftyDKW>>^v?Sh zu+cRegJ}E)W8Si7w2FPT{j2euk@Z=;MFhGRh2Bg{NZ^$pdu6%r$(wX<(bemiuM zsHxF;S`YbrP@!A=gF0m5C>X?8DEA-55 zBPzyWaLuB(H<;7%Cu&Ex-8&B_arVm)^AxMm>Hz|)nN0t_(Gp!WO@@<$St)v!z+q0z%%ySF{DZ6*0F<5<=H( z3u=_#>T^*cr;uLSY|&X4(neb>PtHcK=jk9{la!`KIOfRjPvL2Be&IDsVp)jcbSF0i zCL%j|U1BAR=(H`Cv`kt@17ZUG8XAM)i^qMfCiWf47g*e4`o$KDu5>Z|8M(wQ(T>fh zlClJ`Oyt%>+)AepNX)pDcKg7hvoEDXKCq+}EyL0G&~BrXXS#D)E-cq-ccK24z{m=^ z1-UF+K@TGrvQjI{Vo6zun5QgDBv!SOMma2AVQ-@=q8SeJlgn0P4EGS{+1X1mQlpsf z5K@L%J1n=8Be`@w;{!oVYqg>peN7mf35i=v=Q}JJg-GIQV_i3XB}m9RE$eL;dq2vn zmlyL$23yTu`5Q6R(`H-EX>nV$&Gj*?7W8(+;yt?XA2)UiEZ0HDZnfx)Tj|`bmbBch zTCL5Ilw_Ntwb>}aY}whl63g61Pa~Jv+vv@$mJH%VNtI2vTW&bg^`Qy z*=EtDl+bUHOG$}VH4j~B%Yy=`Kx{ZZ-NVYm5=;4rws%^*i$5Y{qK^LE8Jc0;g~7{1 zk;zj}3r_YuTC;8O{;vX?U5c}ju5p^ZO`i}FsiS+Gp?S7XwT89pJ3q`|FpoK?6>GP| zdX;OfX5D*H{dv6-#9qgzdw14L%zmhj!X6VEE0$m}f}XDPeTh{e=IL^4tdm89xrb@n z?UuBx&oO!RP)uy~I6lcp<(GtDh^iw~D~V-R(3#sUPgYhap6$9A=SI91DX0nl2Y+TC z)sEiz>`$NI*c8M(yZe*G$XE2zc8f0OE86HoOJ31e+CJQ>Z84B@u^mH`^br2G#HO6k zwjTKVTv4wOG0%EUC02Q|PQ4~#(Y)^uhp1S6l1}^3l95%3_J{4ePm`DW`#;HLiu(p9 zn}9x8i%*3cd1SP}&82n}l`U2Y>L7O)-;2EuOA3_+spbNUZ!c z?Y6_B%RNJf>_Ep^rKM~d)F+E`$w7>d=`}G$RMEr8CHt&)<}TcO zNpPt^Yy{SH@Au*J$%8q!lpko6%i>k^10kDehRd9m`J;BZbot>9LpbpT#5@^QODyvo zo$s>fs?O03E=!v2yw<#boI7eL=aPe1u}|I1z&PkFOnA|W|4Q$;EUCr667m_o{wDhE z&k@o{l1#azW$h<1bY^>lp7xh-_RCsve~aDz4ChvinCAw}HHnp6sbfpRl=?+<%jWee zuF%sZ=;^M}n%SeH5U}zC}lWWXY?zrQLKGbk@X&i`Z@xvKXK4VkUOIHIifHh^@sZ z_5yDub|gtG_l{P99VJ$Y821TsLrJtlI!Vxmz4i29$r39?jN5b%aVrgWmY4}e=!D;+ z#jRj4f6G7d71tC%_kI+fSBx~d`0n1Boij=WO&9>_>oJQj`Pg!J{Tw~;Z8hxTy$z8$ zPj(SlK4NPSb63J#iNzVf-RNoh&H#O(0cf9{;pvr#aV5BKSG_6g*>LyJQwQ@UR_XpQ~`2%hDad<{Pnxm%% zcSzb2#P~S5Ywm}{xEFXE)&Ri0h*v%~>vNj`UGZ^v`m#W6t7TtDjN#O_rdm$>B(|(6 z(90-MTo6#dUE%3dg0vE)zGxoH`8W_ehe~(fB3;*X?KqAt3jzAfF6>z-(CNr$S*TW@ z?@QV^GfIzjdWc)Gn++11Vg~xHcG5l6wnWlj{~1ac8BNL zn`@=tB54Z|^Bm8pUaMc^@{}XC#-okq63ew}N60F%O2m3$J-fJTM+nyxEkSFv)}&iV zYzktYCLJR&V+*aIUuSNfh;0yi3!u&SgzHQ3nZ5@V7Xu_4zh4#ZJ%E#tcK;Z_V<{;@ z%u{jk5=&_bbOG`y!so_4;d!=Lt>QXJ+I+-36?dW5`z78+31Xx0={`6YB^K8TNC{%@ zlVnwgRa1GrD#YBDCe&{)x`H-9Bld=;$F6W&fo#R6yWF2i%+Uep8RTQN0sV7tcwVLrG}~lfO4?$?`XV3q zZL$ir4a62A7A$UMDou$f73~)$YR6`(#Nv|b^xq_mYMNRx34M1d3fB?nsnYQD+>YA8 z34UY4bZnCpBj#xUAriB90@|T0Twj6DK4sw<)?_W8FiD$*n5VbsVXloi1M;cFvL#k6uqFaKATbAGBI3}* zeL-pE>YH2qIV35o5VK=lzBkiZ2I0dJvv#F3_hGi!l`h|BNi$|>d$nrPdoy{%xrlk1 z*=mWAZuAmz$?QfOePU@kyBiw0y9YGU&Yv8B*3@_ZD(CL~?SaC9&_M6bQOU!u`t;rN z=%+vYKD%>&JzaG$BCv98;Hm7*zK=MsZ73O4vM*jw;|@G#`qQiBfL*_LdvxK6c^f7c zMSMU<9VnvB4~Ej=2Opxz`26S~gFyOtc?>kAlgdxgq8q`^O-H5}AkZ0G(L}FHGdi~% znP_m8HimLN+J7MXwJCIgAl5GkBA7i0{2|zd0a>9gBBSz9!jtBX0itI(+boHTd*4GajHM1qA@+(Eux%=lH zSu>hjYlup)wYMcE+xS&iaKVoL{m9%hAv>(kANHj9@*O_^@7I9n>qEV;uc9Bypz$%W*)$q^s298Q7PLshakX{9K~3zeY`zNC z_=ihE>eZ?kxSSYnM%+G(5lNzzPIat^vp^a#bP={rICLq=sXXl6y*Ne1VpU$DcbnvN zmj(+88P|KPrBgDp>5}9Q3;c^n)LN7`cXGD&Y(XCgj}YIx9jI?Ogtl%jsndF*GAMlV z-o1G1H<$RZ{`=7a6T2WqN?jWl?G&}GuN|SQXV>2ycA=@d9C#DYu2+UVwKF!5sx^xl zKi1cP=tz7F`(iZ2M%+(-LO>+I0Y`%R2BJ}mI;!ZHDg;fws|PG_IUBW*6CgPe&8A}= zZy*TTmOjuvYgWi+jF$S0re=i@wL`t4Uj5^NO*DR8=pxeAu^wGFeqHt<6|E_?uGNY@ z^yWW@@y_C1*JTN1SEm0(1C{A&1NDq%)(iEGrZAUAV|o2%?&h2+1UolRaqc{H_Zu~K z)bNRuCXDPcapLgja>k4tJ27+IsIele<-)7Kn)6ZXyhy3%h2>FWM~s|;M;E$Z4KZ^} z4HzC6Ej(_35c6_FoCQND18-=}hAQRpb1^!Gvglax zIIFys4HIvV&w~z#y@HRHp~$c3`5U}paq;(ji?@8kr8b^Ap$l(V*{zP?@3bGA2oT7I zt%Mmg@x&l#$`ap(b^@cNCrS+b*B!Q|7lzJJZQvQ2{k2gc>A;KBb~1%k8Nr0XJ&YEf zY>Cl(cN}ySSoO(Zg|s!DamhbbJ)99O1yRpc^pNlB84R<0R}X9$*_9PAsE2y)gQM3C z$$Rq%pXltX(ka@Yj&cL7IB#6^Z3#4@TYqZjJooK);KLy?>B1iqoT1QD%iv;LrBAf|mF-jAe#_5&WFdXZ&>3 zT4m7dY6QzzhO1UdW;<&|ipS5^Lj4rM%sv4OrcM+$+T_JIN%%;s@>^8n=Zy_vP~*e_E~`1!u*Pw&9XH6KD7%Sv(;!O| zl`h=!$B{s9LuVZFrOj?*u8nW$tjY!kX7GlVY*Q`-E3f-=p{FR(Yqz^9g-&xbr4T^-Ce`QiL2#LPd=8-iWG_<;$S)xyO% zj^7%CiRJW1{`o$T4d5kg$&Z~~0P(I^UwEKok<99ci;rmGlQEsQied~a^urEEbDtc; zDwJ|rE|#;s#dqPDvC^HGrK8Y!M=M$~`3MjlbaPg;28E1f0Rhm(i@U*m_I)gBa72J0 zpBez^h~guXjcJ93bt(Wt@WT}(=MtQ44t_4wY`sq4o>qIR=QemN{8EoqsLoYAf+2RU z5Lb_D*f}v?{AdR&XbnTX#OV<36WH=4DAVx-2sRwSpAuNbBCh}AMgymyznlz{p+mg0 zm2s#xB^X4i2Ta_ZE^mY%sk|3jd{wfh42l8!N*_NP?|MB9&eUf`)OI#Zneyn9Te}<< zICq~p$nC-9hy8KXxRs01dieC?03F8@Hu*NO z0IaMK-;i!=0dx^0=WNhP6k5J13r{4;yt| z))Ca9D>VsL1MT@uOBZG^1|1mbnv+3w-Ks0PGdOihUNfC#rh@9~S!pUxZ7KdQsc594 z9K&pBI8P(l_yTNiVw&v8_5vy4UkRT(4;_yxJS$0;Z$f%!l$5^H*+?`H?i*bLyYepF z-#MaLn_R|j&{vIAtfIS+A6*Yl3(g?HHQ5ed)yIJQfk-7fxW+$(hSR|CfH|D2=n*K^ zL8xnCPuQ!MJfi!cu{My$-MHj>ydU>e4GB!>6J4YF!*snmUfBa6%d06G{%JNo4#(q# zB=BEfJpcfF*_9`70{PRxpW|JR4CH>iAuWV4`yeR7d3SaYL;$+%+gb38fhRRAd$2Im zse@5kKTO@?U2BK%v1t%nK3`e(P@bmE!3j_}6eDNuTudlFI26FjadNO*bHKWEm{KtF zJt&S_sl6(URn3LMr5HE)7Xyob8sdFovCmdND?7Co9X?Mc8)hz;9I}P|(JIzu!?zE# z3RV>b$*vR6Vh>qn1Q_&n^Vhqhhx%>j+CKumYoH>yBdVkY$Ag(e4+d(hG`3U^MW`W1 zJ?o%`Bz`V}6^z9YBaT*x5HorXL>aharS@;)xN=SEu?y}7`N18wraQ!is9#lI%%4r! z+vDIl9=eUJ=y@>wW&Adx!Suh3-YmKp+PSumhRXT|$%Rwb4y<@O z8q&Ej&=Y4yo3ZdBpv%VIjZ-o=7M}~ghQ#)rlh{!k1kp~naS`@^NZ&f}^v#RCJ`dM@ zGLbXTqN@hha{@%xS*D7_@&BuNll!8Tp9pbZ%DD0;pdV+BPr%>>uAf#-DyJ%<(bg-9NU96q)mO#Vx`#Mr?EZO+EaedM5R3 zLJ!UlFZCRQ>dDkI4{GwP9*{6H*aw5W#5oJ@&gji!QNC)L=*`nH1IK9J<8cQ5tF7Y8 z)MFXkhk0yC2x@gpLZ!R6CBdpGIM^=}FagRuqt8W|d8N|boS{A>Bs4x7-5Vb6R4G}NZhvWHEUufCFnwLX3?NwzGA8uWC`@lm7 zQZd^ET;oK#)+~nSxYrV!Nw%eEC#}TJ5W})RTf7ts5L6NxR}c2!0gIGdB(Cvq@kFGa zk!-IdY0{+SeA~vx9HYVD@-G4_&q5O31eQg zwgHsM*pNARZX+mjFnE(v2yovxjC4J|36m|w|HZggZU$VeqpR8?B)+>%*i$`$pw1ul zfPgw*)WZbod{GY`*wNzo#ZM_Hi%oIPL0xPrnE;<8@dggKuQB<%vc^=*N)WKFZJ@wc zJuA_am3;uUzILpGZC`pU~8oe;D*~*N$@>aJsR6TKV)a;0t)iYwe zto}}h@iGrXG`BiTro^v1F(vlq``CZE@5uMVTty!$R=9ZwA5+&W zF8C5$rdXH(uFrPDb{!{Tj=iul;sJZE?DGL#{ZjoByOdVB)oSkc?K zAQC%=?Cffcde=VTDNw^x>|zY__**sKBk$W4?J?>Ago<~uDPv$m58xQKzPmGHU@Mgm zBD1SJfGfM!^a}2(haD6}+@fJwqIh>F%bTq_$aylpQNy!xEaETx{pf!s=1ZGSkQV*eWP&>HaKAjaF Uxwo$4+s5&(&8hAGDM-w+}6ssI20 delta 12506 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 LJfL;Tc0~U_N<^18 diff --git a/Assets/WarehouseItem.cs b/Assets/WarehouseItem.cs index ebe0a78..29289a4 100755 --- a/Assets/WarehouseItem.cs +++ b/Assets/WarehouseItem.cs @@ -1,7 +1,41 @@ using UnityEngine; using System.Collections; -public class WarehouseItem : MonoBehaviour { +public class WarehouseItem : FurnitureObject { + + public override void Grab(Transform attachment) { + var replacement = GameObject.Instantiate(this); + replacement.transform.parent = transform.parent; + replacement.transform.SetSiblingIndex(transform.GetSiblingIndex()); + + transform.parent = null; + foreach (var collider in GetComponentsInChildren()) { + collider.enabled = false; + } + GetComponent().isKinematic = true; + + var mini = gameObject.AddComponent(); + mini.OriginItem = replacement; + mini.DestinationAttachment = attachment; + mini.Duration = 0.33f; + mini.GoalScale = new Vector3(0.05f, 0.05f, 0.05f); + } + + public override void Release() { + var mini = gameObject.GetComponent(); + if (mini) { + mini.End(); + } + + transform.parent = null; + foreach (var collider in GetComponentsInChildren()) { + collider.enabled = true; + } + GetComponent().isKinematic = false; + + gameObject.AddComponent(); + Destroy(this); + } // Use this for initialization void Start () { diff --git a/Assets/WarehouseMiniatureAnim.cs b/Assets/WarehouseMiniatureAnim.cs new file mode 100755 index 0000000..a01eba2 --- /dev/null +++ b/Assets/WarehouseMiniatureAnim.cs @@ -0,0 +1,42 @@ +using UnityEngine; +using System.Collections; + +public class WarehouseMiniatureAnim : MonoBehaviour { + + public WarehouseItem OriginItem; + public Transform DestinationAttachment; + public Vector3 GoalScale = Vector3.one; + public float Duration = 1.0f; + + Vector3 originalPos; + Vector3 originalScale; + float alpha = 0.0f; + + void Start () { + originalPos = transform.position; + originalScale = Vector3.Scale(transform.localScale, GoalScale); + } + + void Update () { + alpha += Time.deltaTime / Duration; + + if (alpha > 1) { + End(); + return; + } + + var t2 = DestinationAttachment.transform; + var startPos = OriginItem ? OriginItem.transform.position : originalPos; + transform.position = Vector3.Lerp(startPos, t2.position, alpha); + //transform.rotation = Quaternion.Slerp(transform.rotation, t2.rotation, alpha); + var startScale = OriginItem ? OriginItem.transform.localScale : originalScale; + transform.localScale = Vector3.Lerp(startScale, Vector3.Scale(originalScale, t2.lossyScale), alpha); + } + + public void End() { + transform.SetParent(DestinationAttachment, false); + transform.localPosition = Vector3.zero; + transform.localScale = originalScale; + Destroy(this); + } +} diff --git a/Assets/WarehouseMiniatureAnim.cs.meta b/Assets/WarehouseMiniatureAnim.cs.meta new file mode 100755 index 0000000..b4bf7c3 --- /dev/null +++ b/Assets/WarehouseMiniatureAnim.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 466a12fccfe5d204ab533593ac72ee96 +timeCreated: 1464215897 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: