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) {