diff --git a/LinearAlgebra/Spherical.cs b/LinearAlgebra/Spherical.cs index 111a637..e9c2b5b 100644 --- a/LinearAlgebra/Spherical.cs +++ b/LinearAlgebra/Spherical.cs @@ -1,4 +1,4 @@ -using Vector3 = UnityEngine.Vector3; +using UnityEngine; namespace Passer.LinearAlgebra { public class Spherical { @@ -6,6 +6,7 @@ namespace Passer.LinearAlgebra { public Direction direction; public static Spherical zero = new(0, 0, 0); + public static Spherical forward = new(1, 0, 0); public Spherical(float distance, float horizontal, float vertical) { this.distance = distance; @@ -16,6 +17,17 @@ namespace Passer.LinearAlgebra { this.direction = direction; } + public static Spherical FromVector3(Vector3 v) { + float distance = v.magnitude; + if (distance == 0.0f) + return new Spherical(distance, 0, 0); + else { + float verticalAngle = (Mathf.PI / 2 - Mathf.Acos(v.y / distance)) * Mathf.Rad2Deg; + float horizontalAngle = Mathf.Atan2(v.x, v.z) * Mathf.Rad2Deg; + return new Spherical(distance, horizontalAngle, verticalAngle); + } + } + public Vector3 ToVector3() { float verticalRad = (UnityEngine.Mathf.PI / 2) - this.direction.vertical * UnityEngine.Mathf.Deg2Rad; float horizontalRad = this.direction.horizontal * UnityEngine.Mathf.Deg2Rad; @@ -30,7 +42,6 @@ namespace Passer.LinearAlgebra { Vector3 v = new Vector3(x, y, z); return v; - } } } \ No newline at end of file diff --git a/Participant.cs b/Participant.cs index ffecf5d..d95d39c 100644 --- a/Participant.cs +++ b/Participant.cs @@ -134,8 +134,10 @@ namespace Passer.Control.Core { this.nextPublishMe = currentTimeMS + this.publishInterval; } - foreach (Thing thing in this.things) { - if (thing != null && thing.parent == null) // update only root things + int n = this.things.Count; + for (int ix = 0; ix < n; ix++) { + Thing thing = this.things[ix]; + if (thing != null) // && thing.parent == null) // update only root things thing.Update(currentTimeMS); } } diff --git a/RemoteParticipant.cs b/RemoteParticipant.cs index 500bc41..15415a7 100644 --- a/RemoteParticipant.cs +++ b/RemoteParticipant.cs @@ -27,17 +27,22 @@ namespace Passer.Control.Core { } public void Add(Thing thing, bool invokeEvent = true) { - //Console.WriteLine($"added thing [{thing.networkId}/{thing.id}]"); + Console.WriteLine($"added thing [{thing.networkId}/{thing.id}]"); Thing foundThing = Get(thing.networkId, thing.id); if (foundThing == null) { - // if (thing.id == 0) - // thing.id = (byte)(things.Count + 1); things.Add(thing); if (invokeEvent) Thing.InvokeNewThing(thing); // Console.Write($"Add thing {ipAddress}:{port}[{networkId}/{thing.id}]"); + } else { + if (thing != foundThing) { + // should be: find first non-existing id... + thing.id = (byte)this.things.Count; + things.Add(thing); + Console.Write($"Add thing, updated thing id to [{thing.networkId}/{thing.id}]"); + } } } diff --git a/Thing.cs b/Thing.cs index 74fd51c..c78851a 100644 --- a/Thing.cs +++ b/Thing.cs @@ -7,6 +7,7 @@ namespace Passer.Control.Core { /// /// A thing is the basic building block /// + [Serializable] public class Thing { #region Types @@ -126,6 +127,7 @@ namespace Passer.Control.Core { public Spherical angularVelocity; #if UNITY_5_3_OR_NEWER + [NonSerialized] public Unity.Thing component; #endif diff --git a/Unity/DistanceSensor.cs b/Unity/DistanceSensor.cs index 1b7c9c4..6dc1fdf 100644 --- a/Unity/DistanceSensor.cs +++ b/Unity/DistanceSensor.cs @@ -7,7 +7,7 @@ namespace Passer.Control.Unity { public class DistanceSensor : Thing { public new Core.DistanceSensor core { - get => (Core.DistanceSensor)base.core; + get => (Core.DistanceSensor)base.core; set => base.core = value; } @@ -22,19 +22,23 @@ namespace Passer.Control.Unity { GameObject distanceObj = new("Distance sensor"); DistanceSensor component = distanceObj.AddComponent(); if (parent != null && parent.component != null) - distanceObj.transform.SetParent(parent.component.transform); + distanceObj.transform.SetParent(parent.component.transform, false); return component; } IEnumerator MeasureDistance() { while (Application.isPlaying) { - if (Physics.Raycast(this.transform.position, this.transform.forward, out RaycastHit hitInfo, 10.0f)) { - core.distance = hitInfo.distance; - - // send distance to... - yield return new WaitForSeconds(1); + if (Physics.Raycast(this.transform.position, this.transform.forward, out RaycastHit hitInfo, 2.0f)) { + Thing thing = hitInfo.transform.GetComponentInParent(); + if (thing == null) { + Debug.Log($"collision {hitInfo.transform.name} {hitInfo.distance}"); + core.distance = hitInfo.distance; + } + else + core.distance = 0; } + yield return new WaitForSeconds(0.1f); } } diff --git a/Unity/SiteServer.cs b/Unity/SiteServer.cs index 628ab09..6431eb3 100644 --- a/Unity/SiteServer.cs +++ b/Unity/SiteServer.cs @@ -22,6 +22,7 @@ namespace Passer.Control.Unity { } public void HandleNewThing(Core.Thing thing) { + site.Add(thing, false); thingQueue.Enqueue(thing); } @@ -31,7 +32,6 @@ namespace Passer.Control.Unity { thing.CreateComponent(); } } - } } diff --git a/Unity/Thing.cs b/Unity/Thing.cs index 2687f52..a280ca2 100644 --- a/Unity/Thing.cs +++ b/Unity/Thing.cs @@ -5,6 +5,7 @@ namespace Passer.Control.Unity { public class Thing : MonoBehaviour { + [field: SerializeField] public Core.Thing core {get; set; } protected void SetCoreThing(Core.Thing thing) {