diff --git a/Assets/BezierCurves/Scripts/BezierCurve.cs b/Assets/BezierCurves/Scripts/BezierCurve.cs index c136854..21c77e1 100755 --- a/Assets/BezierCurves/Scripts/BezierCurve.cs +++ b/Assets/BezierCurves/Scripts/BezierCurve.cs @@ -552,4 +552,45 @@ public class BezierCurve : MonoBehaviour { distance -= totalLength; return GetPoint(firstPoint, secondPoint, distance / curveLength); } + + public Vector3 GetUniformPointAtDistance(float distance) { + + if (distance <= 0) { + return points[0].position; + } else if (distance >= length) { + return points[points.Length - 1].position; + } + + float segmentLength = length / 2; + + float totalLength = 0; + for (int i = 0; i < points.Length - 1; i++) { + var p1 = points[i]; + var p2 = points[i + 1]; + + if (p1 == null) { + p1 = points[points.Length - 1]; + p2 = points[0]; + } + + var curveLength = ApproximateLength(p1, p2, resolution); + if (totalLength + curveLength < distance) { + totalLength += curveLength; + continue; + } else { + var curveDistance = distance - totalLength; + var segmentIndex = (float)Math.Floor(curveDistance / segmentLength); + var segmentStart = segmentIndex * segmentLength; + var segmentEnd = (segmentIndex + 1) * segmentLength; + var segmentDistance = curveDistance - segmentStart; + + Vector3 s1 = GetPoint(p1, p2, segmentStart / curveLength); + Vector3 s2 = GetPoint(p1, p2, segmentEnd / curveLength); + + return GetLinearPoint(s1, s2, segmentDistance / segmentLength); + } + } + + return Vector3.zero; + } } \ No newline at end of file diff --git a/Assets/Furniture Prefabs/Bed 1.prefab b/Assets/Furniture Prefabs/Bed 1.prefab index 2461a42..d699e2d 100755 Binary files a/Assets/Furniture Prefabs/Bed 1.prefab and b/Assets/Furniture Prefabs/Bed 1.prefab differ diff --git a/Assets/Furniture Prefabs/Bed 2.prefab b/Assets/Furniture Prefabs/Bed 2.prefab index def041c..be70164 100755 Binary files a/Assets/Furniture Prefabs/Bed 2.prefab and b/Assets/Furniture Prefabs/Bed 2.prefab differ diff --git a/Assets/Furniture Prefabs/Sofa 1.prefab b/Assets/Furniture Prefabs/Sofa 1.prefab index 7771aee..eeb9d5c 100755 Binary files a/Assets/Furniture Prefabs/Sofa 1.prefab and b/Assets/Furniture Prefabs/Sofa 1.prefab differ diff --git a/Assets/RightController.cs b/Assets/RightController.cs index 58ec443..3c581f1 100755 --- a/Assets/RightController.cs +++ b/Assets/RightController.cs @@ -5,7 +5,25 @@ public class RightController : MonoBehaviour { public GameObject banana; public GameObject viveController; - // Use this for initialization + SteamVR_TrackedController trackedController; + WarehouseColumn warehouse; + + WarehouseRow whRow = null; + Vector3? whScrollStartPos = null; + float whScrollDistance; + float whBaseOffset = 0.0f; + float whScrollOffset = 0.0f; + float whRowBaseOffset = 0.0f; + float whRowScrollOffset = 0.0f; + + void Awake() { + trackedController = GetComponent(); + trackedController.TriggerClicked += triggerClicked; + trackedController.TriggerUnclicked += triggerUnclicked; + + warehouse = GameObject.Find("Warehouse/Shelves/Column").GetComponent(); + } + void Start () { GetComponent().LeaveView += toggleBanana; } @@ -15,7 +33,51 @@ public class RightController : MonoBehaviour { viveController.SetActive(!viveController.activeSelf); } - // Update is called once per frame void Update () { + + // Warehouse scroll + if (whScrollStartPos != null) { + Vector3 curPos = transform.position + (transform.forward * whScrollDistance); + + whScrollOffset = (curPos - whScrollStartPos).Value.y; + whRowScrollOffset = (curPos - whScrollStartPos).Value.x; + + warehouse.Offset = whBaseOffset + (-whScrollOffset); + whRow.Offset = whRowBaseOffset + whRowScrollOffset; + } } + + RaycastHit raycast() { + var ray = new Ray(transform.position, transform.forward); + RaycastHit hit; + bool bHit = Physics.Raycast(ray, out hit); + return hit; + } + + void triggerClicked(object sender, ClickedEventArgs 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.GetComponent(); + if (!item) { + return; + } + + whScrollStartPos = result.point; + whScrollDistance = result.distance; + whRow = item.GetComponentInParent(); + whBaseOffset = warehouse.Offset; + whRowBaseOffset = whRow.Offset; + } + + void triggerUnclicked(object sender, ClickedEventArgs e) { + if (whScrollStartPos != null) { + whScrollStartPos = null; + } + } } diff --git a/Assets/Test.unity b/Assets/Test.unity index 83592ac..31c35fa 100755 Binary files a/Assets/Test.unity and b/Assets/Test.unity differ diff --git a/Assets/Warehouse Row.prefab b/Assets/Warehouse Row.prefab index 16a6097..d9e76d4 100755 Binary files a/Assets/Warehouse Row.prefab and b/Assets/Warehouse Row.prefab differ diff --git a/Assets/WarehouseColumn.cs b/Assets/WarehouseColumn.cs index 6b534b6..667b79d 100755 --- a/Assets/WarehouseColumn.cs +++ b/Assets/WarehouseColumn.cs @@ -8,7 +8,7 @@ public class WarehouseColumn : MonoBehaviour { private BezierCurve curve; private Transform rows; - private float offset = 0.0f; + public float Offset { get; set; } void Awake() { curve = transform.Find("Curve").GetComponent(); @@ -21,12 +21,12 @@ public class WarehouseColumn : MonoBehaviour { void Update() { if (Application.isPlaying) { - offset += Time.deltaTime; + //offset += Time.deltaTime; } foreach (Transform row in rows) { var i = row.GetSiblingIndex(); - var distance = (float)i / (rows.childCount) * curve.length + offset; + var distance = (float)i / (rows.childCount) * curve.length + Offset; distance = Mathf.Repeat(distance, curve.length); var pos = curve.GetPointAtDistance(distance); row.position = pos; diff --git a/Assets/WarehouseItem.cs b/Assets/WarehouseItem.cs new file mode 100755 index 0000000..ebe0a78 --- /dev/null +++ b/Assets/WarehouseItem.cs @@ -0,0 +1,15 @@ +using UnityEngine; +using System.Collections; + +public class WarehouseItem : MonoBehaviour { + + // Use this for initialization + void Start () { + + } + + // Update is called once per frame + void Update () { + + } +} diff --git a/Assets/WarehouseItem.cs.meta b/Assets/WarehouseItem.cs.meta new file mode 100755 index 0000000..e5c48f4 --- /dev/null +++ b/Assets/WarehouseItem.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 126df0f3c4fc8434386b7cb4484e88fb +timeCreated: 1464039271 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WarehouseRow.cs b/Assets/WarehouseRow.cs index ccd9eef..110a6e1 100755 --- a/Assets/WarehouseRow.cs +++ b/Assets/WarehouseRow.cs @@ -7,11 +7,11 @@ using UnityEditor; public class WarehouseRow : MonoBehaviour { public string Category; + public float Offset { get; set; } + BezierCurve curve; Transform furniture; - float offset = 0; - void Awake() { curve = transform.Find("Curve").GetComponent(); furniture = transform.Find("Furniture"); @@ -43,7 +43,7 @@ public class WarehouseRow : MonoBehaviour { foreach (Transform t in furniture) { var i = t.GetSiblingIndex(); - var distance = (float)i / (furniture.childCount) * curve.length + offset; + var distance = (float)i / (furniture.childCount) * curve.length + Offset; distance = Mathf.Repeat(distance, curve.length); var pos = curve.GetPointAtDistance(distance); t.position = pos;