diff --git a/Assets/NanoBrain/Neuroid.cs b/Assets/NanoBrain/Neuroid.cs index e1f382a..ed9f88a 100644 --- a/Assets/NanoBrain/Neuroid.cs +++ b/Assets/NanoBrain/Neuroid.cs @@ -81,21 +81,24 @@ public class Neuroid : Nucleus { if (synapse.nucleus.isSleeping) continue; - Spherical outputValue = synapse.nucleus.outputValue; + Vector3 outputValue = synapse.nucleus.outputValue; float weight = synapse.weight; float activatedValue = curve.Evaluate(outputValue.magnitude); float magnitude = weight * activatedValue; - Spherical sVector = new(magnitude, outputValue.direction); + //Spherical sVector = new(magnitude, outputValue.direction); - sum += sVector.ToVector3(); + sum += magnitude * outputValue.normalized;//sVector.ToVector3(); n++; } - Spherical result; + //Spherical result; + Vector3 result; if (average) - result = Spherical.FromVector3(sum / n); + //result = Spherical.FromVector3(sum / n); + result = sum / n; else - result = Spherical.FromVector3(sum); + //result = Spherical.FromVector3(sum); + result = sum; UpdateResult(result); } diff --git a/Assets/NanoBrain/Nucleus.cs b/Assets/NanoBrain/Nucleus.cs index d29bdc3..dbdb6ab 100644 --- a/Assets/NanoBrain/Nucleus.cs +++ b/Assets/NanoBrain/Nucleus.cs @@ -64,8 +64,8 @@ public class Nucleus { public NanoBrainObj brain { get; set; } - private Spherical _outputValue; - public Spherical outputValue //{ get; set; } + private Vector3 _outputValue; + public Vector3 outputValue //{ get; set; } { get { return _outputValue; } set { @@ -83,7 +83,7 @@ public class Nucleus { this.stale++; this.isSleeping = this.stale > 2; if (isSleeping) - _outputValue = Spherical.zero; + _outputValue = Vector3.zero; } [System.NonSerialized] public int layerIx; @@ -153,7 +153,7 @@ public class Nucleus { public virtual void UpdateState() { } - public void UpdateResult(Spherical result) { + public void UpdateResult(Vector3 result) { // float d = Spherical.Distance(result, this.outputValue); // if (d < 0.1f) { // //Debug.Log($"insignificant update: {d}"); diff --git a/Assets/NanoBrain/Perceptoid.cs b/Assets/NanoBrain/Perceptoid.cs index 4f5b5a9..0d4970f 100644 --- a/Assets/NanoBrain/Perceptoid.cs +++ b/Assets/NanoBrain/Perceptoid.cs @@ -68,14 +68,14 @@ public class Perceptoid : Neuroid { this.thingType = thingType; this.receptor.thingType = thingType; - this.receptor.localPosition = Spherical.zero; + this.receptor.localPosition = Vector3.zero; - this.outputValue = Spherical.zero; + this.outputValue = Vector3.zero; this.receivers = new(); } public override void UpdateState() { - Spherical result = this.receptor.localPosition; + Vector3 result = this.receptor.localPosition; UpdateResult(result); } diff --git a/Assets/NanoBrain/Receptor.cs b/Assets/NanoBrain/Receptor.cs index 47e215f..050993b 100644 --- a/Assets/NanoBrain/Receptor.cs +++ b/Assets/NanoBrain/Receptor.cs @@ -18,7 +18,7 @@ public class Receptor { } } } - public Spherical localPosition; + public Vector3 localPosition; public float distanceResolution = 0.1f; public float directionResolution = 5; @@ -38,10 +38,10 @@ public class Receptor { } public virtual void ProcessStimulus(int thingId, Vector3 newLocalPositionVector) { - Spherical newLocalPosition = Spherical.FromVector3(newLocalPositionVector); + //Spherical newLocalPosition = Spherical.FromVector3(newLocalPositionVector); - Spherical previousLocalPosition = this.localPosition; - this.localPosition = newLocalPosition; + Vector3 previousLocalPosition = this.localPosition; + this.localPosition = newLocalPositionVector; Perceptoid selectedPerceptoid = null; foreach (Perceptoid perceptoid in this.perceptei) { diff --git a/Assets/NanoBrain/VisualEditor/Editor/NanoBrainEditor.cs b/Assets/NanoBrain/VisualEditor/Editor/NanoBrainEditor.cs index 81ffac3..86d346d 100644 --- a/Assets/NanoBrain/VisualEditor/Editor/NanoBrainEditor.cs +++ b/Assets/NanoBrain/VisualEditor/Editor/NanoBrainEditor.cs @@ -339,7 +339,7 @@ public class GraphBoardView : VisualElement { currentNucleus.name = EditorGUILayout.TextField(currentNucleus.name); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Output Value", GUILayout.Width(100)); - EditorGUILayout.Vector3Field(GUIContent.none, currentNucleus.outputValue.ToVector3()); + EditorGUILayout.Vector3Field(GUIContent.none, currentNucleus.outputValue); EditorGUILayout.EndHorizontal(); if (currentNucleus.synapses.Count > 0) { EditorGUILayout.LabelField("Synapses"); @@ -358,7 +358,7 @@ public class GraphBoardView : VisualElement { // currentNucleus.synapses[nucleus] = EditorGUILayout.FloatField(weight, GUILayout.Width(40)); synapse.weight = EditorGUILayout.FloatField(synapse.weight, GUILayout.Width(40)); EditorGUI.indentLevel++; - EditorGUILayout.Vector3Field(GUIContent.none, synapse.nucleus.outputValue.ToVector3(), GUILayout.Width(180)); + EditorGUILayout.Vector3Field(GUIContent.none, synapse.nucleus.outputValue, GUILayout.Width(180)); EditorGUILayout.EndHorizontal(); EditorGUI.EndDisabledGroup(); diff --git a/Assets/NanoBrain/VisualEditor/Editor/NanoBrainInspector.cs b/Assets/NanoBrain/VisualEditor/Editor/NanoBrainInspector.cs index 9ab8a35..fce8b3e 100644 --- a/Assets/NanoBrain/VisualEditor/Editor/NanoBrainInspector.cs +++ b/Assets/NanoBrain/VisualEditor/Editor/NanoBrainInspector.cs @@ -457,7 +457,7 @@ public class NanoBrainInspector : Editor { DisconnectNucleus(this.currentNucleus); if (this.gameObject != null) { - Vector3 worldVector = this.gameObject.transform.TransformVector(this.currentNucleus.outputValue.ToVector3()); + Vector3 worldVector = this.gameObject.transform.TransformVector(this.currentNucleus.outputValue); Debug.DrawRay(this.gameObject.transform.position, worldVector, Color.yellow); } }); diff --git a/Assets/Scenes/Boids/Scripts/Boid.cs b/Assets/Scenes/Boids/Scripts/Boid.cs index ef7846d..260a788 100644 --- a/Assets/Scenes/Boids/Scripts/Boid.cs +++ b/Assets/Scenes/Boids/Scripts/Boid.cs @@ -44,15 +44,15 @@ public class Boid : MonoBehaviour { if (neighbour == null || neighbour == this) continue; - Vector3 localPosition = this.transform.InverseTransformPoint(neighbour.transform.position); - //localPosition = localPosition.normalized * (localPosition.magnitude - sc.separationDistance); - //Debug.DrawRay(this.transform.position, this.transform.TransformDirection(localPosition), Color.magenta); + int thingId = neighbour.GetInstanceID(); + + Vector3 localPosition = this.transform.InverseTransformPoint(neighbour.transform.position); + if (localPosition.sqrMagnitude > 0) + boidReceptor?.ProcessStimulus(thingId, localPosition); Vector3 localVelocity = this.transform.InverseTransformVector(neighbour.velocity); - - int thingId = neighbour.GetInstanceID(); - boidReceptor?.ProcessStimulus(thingId, localPosition); - boidVelocityReceptor?.ProcessStimulus(thingId, localVelocity); + if (localVelocity.sqrMagnitude > 0) + boidVelocityReceptor?.ProcessStimulus(thingId, localVelocity); } } @@ -64,8 +64,7 @@ public class Boid : MonoBehaviour { boundaryReceptor.ProcessStimulus(777, desiredLocalSpace); } - - Vector3 worldForce = this.transform.TransformDirection(nanoBrain.root.outputValue.ToVector3()); + Vector3 worldForce = this.transform.TransformDirection(nanoBrain.root.outputValue); this.velocity = (1 - sc.inertia) * (worldForce * Time.deltaTime) + sc.inertia * velocity; if (this.velocity.magnitude > 0)