diff --git a/Assets/Monolith.cs b/Assets/Monolith.cs index cbb017b..0a18904 100644 --- a/Assets/Monolith.cs +++ b/Assets/Monolith.cs @@ -61,10 +61,12 @@ public class Monolith : MonoBehaviour simulate.Step(this); } - InputDevice headset; + InputDevice headset, offCon, mainCon; void Start() { headset = InputDevices.GetDeviceAtXRNode(XRNode.Head); + offCon = InputDevices.GetDeviceAtXRNode(XRNode.LeftHand); + mainCon = InputDevices.GetDeviceAtXRNode(XRNode.RightHand); testPos = piece.pos + Vector3.forward * 0.4f; testVel = Vector3.down; @@ -90,7 +92,7 @@ public class Monolith : MonoBehaviour } Vector3 testPos; - Vector3Int voxelPos(Vector3 pos) + Vector3Int VoxelPos(Vector3 pos) { return new Vector3Int(Mathf.RoundToInt(pos.x), Mathf.RoundToInt(pos.y), Mathf.RoundToInt(pos.z)); } @@ -106,7 +108,7 @@ public class Monolith : MonoBehaviour { Vector3 d = (Vector3)allDirs[i] * 0.2f; d[axis] = 0; - Vector3 vPos = Voxelcast(voxelPos(pos + d), step); + Vector3 vPos = Voxelcast(VoxelPos(pos + d), step); float dist = Mathf.Abs(vPos[axis] - pos[axis]); if (dist < closest) { @@ -141,6 +143,8 @@ public class Monolith : MonoBehaviour float delay; [ReadOnly] public bool movePiece; + [ReadOnly] + public Vector3 voxelCenter; void Update() { Vector3 mousePos = Input.mousePosition; @@ -153,20 +157,64 @@ public class Monolith : MonoBehaviour { camForm.rotation = headsetRot; } - camForm.position = camForm.rotation * Vector3.back * 10; + camForm.position = voxelCenter + (camForm.rotation * Vector3.back * 10); + // cursor + Quaternion mainRot = Quaternion.identity; + mainCon.TryGetFeatureValue(CommonUsages.deviceRotation, out mainRot); - InputDevice mainCon = InputDevices.GetDeviceAtXRNode(XRNode.RightHand); - Vector2 wasd = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")); - Vector2 joystick = Vector2.zero; - mainCon.TryGetFeatureValue(CommonUsages.primary2DAxis, out joystick); + Vector2 mainStick = Vector2.zero; + mainCon.TryGetFeatureValue(CommonUsages.primary2DAxis, out mainStick); + Vector3 mainDir = new Vector3(mainStick.x, 0, mainStick.y); + if (mainDir.sqrMagnitude > 0) + { + mainRot *= Quaternion.LookRotation(mainDir); + } - Vector2 input = wasd + joystick; + Vector3 mainCursor = testPos + (mainRot * Vector3.forward); + Vector3Int cvPos = VoxelPos(mainCursor); - testVel.x += input.x * 6 * Time.deltaTime; - testVel.z += input.y * 6 * Time.deltaTime; + bool mainTrigger = false; + mainCon.TryGetFeatureValue(CommonUsages.triggerButton, out mainTrigger); + if (mainTrigger) + { + if (!InVoxel(cvPos)) + { + voxels[vIndex].pos = cvPos; + vIndex++; + if (vIndex == voxels.Length) { vIndex = 0; } - if (input.sqrMagnitude == 0) + simulate.Step(this); + } + } + + Graphics.DrawMesh(render.meshPieceDebug, + mainCursor, Quaternion.identity, + render.matPieceDebug, 0 + ); + + if (!InVoxel(cvPos)) + Graphics.DrawMesh(render.meshPieceDebug, + cvPos, Quaternion.identity, + render.matPieceDebug, 0 + ); + + // Movement + Quaternion offRot = Quaternion.identity; + offCon.TryGetFeatureValue(CommonUsages.deviceRotation, out offRot); + + Vector2 offStick = Vector2.zero; + offCon.TryGetFeatureValue(CommonUsages.primary2DAxis, out offStick); + offStick += new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")); + Vector3 offDir = new Vector3(offStick.x, 0, offStick.y); + if (offDir.sqrMagnitude > 0) + { + offRot *= Quaternion.LookRotation(offDir); + } + + testVel += offRot * Vector3.forward * offStick.magnitude * 6 * Time.deltaTime; + + if (offStick.sqrMagnitude == 0) { testVel.x *= 1 - (60 * Time.deltaTime); testVel.z *= 1 - (60 * Time.deltaTime); diff --git a/Assets/Simulate.cs b/Assets/Simulate.cs index 64d2ac7..66cde42 100644 --- a/Assets/Simulate.cs +++ b/Assets/Simulate.cs @@ -9,6 +9,14 @@ public class Simulate public void Step(Monolith mono) { generate.Step(mono); + + Vector3 center = Vector3.zero; + for (int i = 0; i < mono.voxels.Length; i++) + { + center += mono.voxels[i].pos; + } + + mono.voxelCenter = center / mono.voxels.Length; } }