First setup
This commit is contained in:
parent
14436cbfba
commit
4b72e6c712
@ -10,6 +10,7 @@ public class Cluster : ScriptableObject, INucleus {
|
|||||||
|
|
||||||
[SerializeReference]
|
[SerializeReference]
|
||||||
public List<IReceptor> nuclei = new();
|
public List<IReceptor> nuclei = new();
|
||||||
|
public List<Cluster> subClusters = new();
|
||||||
|
|
||||||
public INucleus output => this.nuclei[0] as INucleus;
|
public INucleus output => this.nuclei[0] as INucleus;
|
||||||
|
|
||||||
@ -33,6 +34,18 @@ public class Cluster : ScriptableObject, INucleus {
|
|||||||
|
|
||||||
public NucleusArray array { get; set; }
|
public NucleusArray array { get; set; }
|
||||||
|
|
||||||
|
public List<INucleus> receivers {
|
||||||
|
get { return this.output.receivers; }
|
||||||
|
set { this.output.receivers = value; }
|
||||||
|
}
|
||||||
|
public List<Cluster> clusterReceivers {
|
||||||
|
get { return this.output.clusterReceivers; }
|
||||||
|
set { this.output.clusterReceivers = clusterReceivers; }
|
||||||
|
}
|
||||||
|
public IEnumerable<INucleus> allReceivers {
|
||||||
|
get => output.allReceivers;
|
||||||
|
}
|
||||||
|
|
||||||
public INucleus Clone() {
|
public INucleus Clone() {
|
||||||
Cluster clone = CreateInstance<Cluster>();
|
Cluster clone = CreateInstance<Cluster>();
|
||||||
// Lots to add here...
|
// Lots to add here...
|
||||||
@ -48,19 +61,27 @@ public class Cluster : ScriptableObject, INucleus {
|
|||||||
new Neuron(this, "Output"); // Every cluster should have at least 1 neuron
|
new Neuron(this, "Output"); // Every cluster should have at least 1 neuron
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddReceiver(INucleus receiver) {
|
public void AddReceiver(INucleus receivingNucleus) {
|
||||||
output.AddReceiver(receiver);
|
//output.AddReceiver(receiver);
|
||||||
|
this.output.receivers.Add(receivingNucleus);
|
||||||
|
receivingNucleus.AddClusterSynapse(this);
|
||||||
|
}
|
||||||
|
public void AddClusterReceiver(Cluster clusterReceiver) {
|
||||||
|
this.output.clusterReceivers.Add(clusterReceiver);
|
||||||
|
clusterReceiver.AddClusterSynapse(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveReceiver(INucleus receiver) {
|
public void RemoveReceiver(INucleus receiver) {
|
||||||
output.RemoveReceiver(receiver);
|
output.RemoveReceiver(receiver);
|
||||||
}
|
}
|
||||||
public List<INucleus> receivers {
|
|
||||||
get => output.receivers;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Synapse AddSynapse(IReceptor sender) {
|
public Synapse AddSynapse(IReceptor sender) {
|
||||||
Synapse synapse = new(sender, 1.0f);
|
Synapse synapse = new(sender);
|
||||||
|
synapses.Add(synapse);
|
||||||
|
return synapse;
|
||||||
|
}
|
||||||
|
public Synapse AddClusterSynapse(Cluster sender) {
|
||||||
|
Synapse synapse = new(sender);
|
||||||
synapses.Add(synapse);
|
synapses.Add(synapse);
|
||||||
return synapse;
|
return synapse;
|
||||||
}
|
}
|
||||||
@ -89,9 +110,9 @@ public class Cluster : ScriptableObject, INucleus {
|
|||||||
}
|
}
|
||||||
nucleus.synapses.RemoveAll(synapse => visitedSynapses.Contains(synapse) == false);
|
nucleus.synapses.RemoveAll(synapse => visitedSynapses.Contains(synapse) == false);
|
||||||
}
|
}
|
||||||
if (nucleus.receivers != null) {
|
if (nucleus.allReceivers != null) {
|
||||||
HashSet<INucleus> visitedReceivers = new();
|
HashSet<INucleus> visitedReceivers = new();
|
||||||
foreach (INucleus receiver in nucleus.receivers) {
|
foreach (INucleus receiver in nucleus.allReceivers) {
|
||||||
if (receiver != null && receiver != null) {
|
if (receiver != null && receiver != null) {
|
||||||
visitedReceivers.Add(receiver);
|
visitedReceivers.Add(receiver);
|
||||||
visitedNuclei.Add(receiver);
|
visitedNuclei.Add(receiver);
|
||||||
|
|||||||
@ -1,7 +1,4 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
|
||||||
using Unity.Burst;
|
|
||||||
using Unity.Collections;
|
|
||||||
using Unity.Mathematics;
|
using Unity.Mathematics;
|
||||||
|
|
||||||
public interface INucleus : IReceptor {
|
public interface INucleus : IReceptor {
|
||||||
@ -14,6 +11,7 @@ public interface INucleus : IReceptor {
|
|||||||
// Senders
|
// Senders
|
||||||
public List<Synapse> synapses { get; }
|
public List<Synapse> synapses { get; }
|
||||||
public Synapse AddSynapse(IReceptor sender);
|
public Synapse AddSynapse(IReceptor sender);
|
||||||
|
public Synapse AddClusterSynapse(Cluster clusterSender);
|
||||||
|
|
||||||
public NucleusArray array { get; set; }
|
public NucleusArray array { get; set; }
|
||||||
|
|
||||||
@ -35,8 +33,12 @@ public interface IReceptor {
|
|||||||
public string name { get; set; }
|
public string name { get; set; }
|
||||||
|
|
||||||
// Receivers
|
// Receivers
|
||||||
public List<INucleus> receivers { get; }
|
public List<INucleus> receivers { get; set; }
|
||||||
|
public List<Cluster> clusterReceivers { get; set; }
|
||||||
|
public IEnumerable<INucleus> allReceivers { get; }
|
||||||
|
|
||||||
public void AddReceiver(INucleus receiver);
|
public void AddReceiver(INucleus receiver);
|
||||||
|
public void AddClusterReceiver(Cluster clusterReceiver);
|
||||||
public void RemoveReceiver(INucleus receiverNucleus);
|
public void RemoveReceiver(INucleus receiverNucleus);
|
||||||
|
|
||||||
#endregion static
|
#endregion static
|
||||||
|
|||||||
60
Assets/NanoBrain/Identity.asset
Normal file
60
Assets/NanoBrain/Identity.asset
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 60a957541c24c57e78018c202ebb1d9b, type: 3}
|
||||||
|
m_Name: Identity
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::Cluster
|
||||||
|
nuclei:
|
||||||
|
- rid: 2243601242842202169
|
||||||
|
references:
|
||||||
|
version: 2
|
||||||
|
RefIds:
|
||||||
|
- rid: 2243601242842202169
|
||||||
|
type: {class: Neuron, ns: , asm: Assembly-CSharp}
|
||||||
|
data:
|
||||||
|
_name: Output
|
||||||
|
_synapses: []
|
||||||
|
_receivers: []
|
||||||
|
_array:
|
||||||
|
rid: 2243601242842202170
|
||||||
|
_curvePreset: 0
|
||||||
|
curve:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Curve:
|
||||||
|
- serializedVersion: 3
|
||||||
|
time: 0
|
||||||
|
value: 0
|
||||||
|
inSlope: 0
|
||||||
|
outSlope: 1
|
||||||
|
tangentMode: 0
|
||||||
|
weightedMode: 0
|
||||||
|
inWeight: 0
|
||||||
|
outWeight: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
time: 1000
|
||||||
|
value: 1000
|
||||||
|
inSlope: 1
|
||||||
|
outSlope: 0
|
||||||
|
tangentMode: 0
|
||||||
|
weightedMode: 0
|
||||||
|
inWeight: 0
|
||||||
|
outWeight: 0
|
||||||
|
m_PreInfinity: 2
|
||||||
|
m_PostInfinity: 2
|
||||||
|
m_RotationOrder: 4
|
||||||
|
curveMax: 1
|
||||||
|
average: 0
|
||||||
|
- rid: 2243601242842202170
|
||||||
|
type: {class: NucleusArray, ns: , asm: Assembly-CSharp}
|
||||||
|
data:
|
||||||
|
nuclei:
|
||||||
|
- rid: 2243601242842202169
|
||||||
|
name: Output
|
||||||
8
Assets/NanoBrain/Identity.asset.meta
Normal file
8
Assets/NanoBrain/Identity.asset.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5f4d2ea0d0115b3549f8e9aa5e669163
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using Unity.Mathematics;
|
using Unity.Mathematics;
|
||||||
using static Unity.Mathematics.math;
|
using static Unity.Mathematics.math;
|
||||||
@ -20,7 +21,25 @@ public class Neuron : INucleus {
|
|||||||
|
|
||||||
[SerializeReference]
|
[SerializeReference]
|
||||||
private List<INucleus> _receivers = new();
|
private List<INucleus> _receivers = new();
|
||||||
public List<INucleus> receivers => _receivers;
|
public List<INucleus> receivers {
|
||||||
|
get { return _receivers; }
|
||||||
|
set { _receivers = value; }
|
||||||
|
}
|
||||||
|
private List<Cluster> _clusterReceivers = new();
|
||||||
|
public List<Cluster> clusterReceivers {
|
||||||
|
get { return _clusterReceivers; }
|
||||||
|
set { _clusterReceivers = value; }
|
||||||
|
}
|
||||||
|
public IEnumerable<INucleus> allReceivers { //=> _receivers.Concat(_clusterReceivers);
|
||||||
|
get {
|
||||||
|
if (_receivers == null)
|
||||||
|
return _clusterReceivers;
|
||||||
|
else if (_clusterReceivers == null)
|
||||||
|
return _receivers;
|
||||||
|
else
|
||||||
|
return _receivers.Concat(_clusterReceivers);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[SerializeReference]
|
[SerializeReference]
|
||||||
private NucleusArray _array;
|
private NucleusArray _array;
|
||||||
@ -133,28 +152,32 @@ public class Neuron : INucleus {
|
|||||||
Synapse clonedSynapse = clone.AddSynapse(synapse.nucleus);
|
Synapse clonedSynapse = clone.AddSynapse(synapse.nucleus);
|
||||||
clonedSynapse.weight = synapse.weight;
|
clonedSynapse.weight = synapse.weight;
|
||||||
}
|
}
|
||||||
foreach (INucleus receiver in this.receivers) {
|
foreach (INucleus receiver in this.allReceivers) {
|
||||||
clone.AddReceiver(receiver);
|
clone.AddReceiver(receiver);
|
||||||
}
|
}
|
||||||
return clone;
|
return clone;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void AddReceiver(INucleus receivingNucleus) {
|
public virtual void AddReceiver(INucleus receivingNucleus) {
|
||||||
this.receivers.Add(receivingNucleus);
|
this._receivers.Add(receivingNucleus);
|
||||||
receivingNucleus.AddSynapse(this);
|
receivingNucleus.AddSynapse(this);
|
||||||
}
|
}
|
||||||
|
public void AddClusterReceiver(Cluster receivingCluster) {
|
||||||
|
this._clusterReceivers.Add(receivingCluster);
|
||||||
|
receivingCluster.AddSynapse(this);
|
||||||
|
}
|
||||||
|
|
||||||
public void RemoveReceiver(INucleus receiverNucleus) {
|
public void RemoveReceiver(INucleus receiverNucleus) {
|
||||||
this.receivers.RemoveAll(receiver => receiver == receiverNucleus);
|
this._receivers.RemoveAll(receiver => receiver == receiverNucleus);
|
||||||
receiverNucleus.synapses.RemoveAll(synapse => synapse.nucleus == this);
|
receiverNucleus.synapses.RemoveAll(synapse => synapse.nucleus == this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Delete(INucleus nucleus) {
|
public static void Delete(INucleus nucleus) {
|
||||||
foreach (Synapse synapse in nucleus.synapses) {
|
foreach (Synapse synapse in nucleus.synapses) {
|
||||||
if (synapse.nucleus is Neuron synapse_nucleus) {
|
if (synapse.nucleus is Neuron synapse_nucleus) {
|
||||||
if (synapse_nucleus.receivers.Count > 1) {
|
if (synapse_nucleus._receivers.Count > 1) {
|
||||||
// there is another nucleus feeding into this input nucleus
|
// there is another nucleus feeding into this input nucleus
|
||||||
synapse_nucleus.receivers.RemoveAll(r => r == nucleus);
|
synapse_nucleus._receivers.RemoveAll(r => r == nucleus);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// No other links, delete it.
|
// No other links, delete it.
|
||||||
@ -162,7 +185,7 @@ public class Neuron : INucleus {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach (INucleus receiver in nucleus.receivers) {
|
foreach (INucleus receiver in nucleus.allReceivers) {
|
||||||
if (receiver != null && receiver.synapses != null)
|
if (receiver != null && receiver.synapses != null)
|
||||||
receiver.synapses.RemoveAll(s => s.nucleus == nucleus);
|
receiver.synapses.RemoveAll(s => s.nucleus == nucleus);
|
||||||
}
|
}
|
||||||
@ -174,7 +197,12 @@ public class Neuron : INucleus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Synapse AddSynapse(IReceptor sendingNucleus) {
|
public Synapse AddSynapse(IReceptor sendingNucleus) {
|
||||||
Synapse synapse = new(sendingNucleus, 1.0f);
|
Synapse synapse = new(sendingNucleus);
|
||||||
|
this.synapses.Add(synapse);
|
||||||
|
return synapse;
|
||||||
|
}
|
||||||
|
public Synapse AddClusterSynapse(Cluster sendingCluster) {
|
||||||
|
Synapse synapse = new(sendingCluster);
|
||||||
this.synapses.Add(synapse);
|
this.synapses.Add(synapse);
|
||||||
return synapse;
|
return synapse;
|
||||||
}
|
}
|
||||||
@ -222,7 +250,7 @@ public class Neuron : INucleus {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
this.outputValue = result;
|
this.outputValue = result;
|
||||||
foreach (INucleus receiver in this.receivers)
|
foreach (INucleus receiver in this.allReceivers)
|
||||||
receiver.UpdateState();
|
receiver.UpdateState();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,6 +5,7 @@ using UnityEngine;
|
|||||||
public class NucleusArray {
|
public class NucleusArray {
|
||||||
[SerializeReference]
|
[SerializeReference]
|
||||||
public INucleus[] nuclei;
|
public INucleus[] nuclei;
|
||||||
|
public Cluster[] clusters;
|
||||||
public string name;
|
public string name;
|
||||||
|
|
||||||
public NucleusArray(INucleus nucleus) {
|
public NucleusArray(INucleus nucleus) {
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Linq;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using Unity.Mathematics;
|
using Unity.Mathematics;
|
||||||
@ -25,17 +26,30 @@ public class Receptor : IReceptor {
|
|||||||
|
|
||||||
[SerializeReference]
|
[SerializeReference]
|
||||||
private List<INucleus> _receivers = new();
|
private List<INucleus> _receivers = new();
|
||||||
public List<INucleus> receivers => _receivers;
|
public List<INucleus> receivers {
|
||||||
|
get { return _receivers; }
|
||||||
|
set { _receivers = value; }
|
||||||
|
}
|
||||||
|
private List<Cluster> _clusterReceivers = new();
|
||||||
|
public List<Cluster> clusterReceivers {
|
||||||
|
get { return _clusterReceivers; }
|
||||||
|
set { _clusterReceivers = value; }
|
||||||
|
}
|
||||||
|
public IEnumerable<INucleus> allReceivers => _receivers.Concat(_clusterReceivers);
|
||||||
|
|
||||||
protected int[] thingIds; // every receiver can handle a thing with this id
|
protected int[] thingIds; // every receiver can handle a thing with this id
|
||||||
|
|
||||||
public virtual void AddReceiver(INucleus receivingNucleus) {
|
public virtual void AddReceiver(INucleus receivingNucleus) {
|
||||||
this.receivers.Add(receivingNucleus);
|
this._receivers.Add(receivingNucleus);
|
||||||
receivingNucleus.AddSynapse(this);
|
receivingNucleus.AddSynapse(this);
|
||||||
}
|
}
|
||||||
|
public void AddClusterReceiver(Cluster receivingCluster) {
|
||||||
|
this._clusterReceivers.Add(receivingCluster);
|
||||||
|
receivingCluster.AddSynapse(this);
|
||||||
|
}
|
||||||
|
|
||||||
public void RemoveReceiver(INucleus receiverNucleus) {
|
public void RemoveReceiver(INucleus receiverNucleus) {
|
||||||
this.receivers.RemoveAll(receiver => receiver == receiverNucleus);
|
this._receivers.RemoveAll(receiver => receiver == receiverNucleus);
|
||||||
receiverNucleus.synapses.RemoveAll(synapse => synapse.nucleus == this);
|
receiverNucleus.synapses.RemoveAll(synapse => synapse.nucleus == this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,7 +102,7 @@ public class Receptor : IReceptor {
|
|||||||
receptor.AddReceiver(nucleus);
|
receptor.AddReceiver(nucleus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (receptor.receivers.Count == 0)
|
if (receptor._receivers.Count == 0)
|
||||||
return null;
|
return null;
|
||||||
else
|
else
|
||||||
return receptor;
|
return receptor;
|
||||||
@ -97,12 +111,12 @@ public class Receptor : IReceptor {
|
|||||||
public virtual void ProcessStimulus(int thingId, Vector3 newLocalPositionVector, string thingName = null) {
|
public virtual void ProcessStimulus(int thingId, Vector3 newLocalPositionVector, string thingName = null) {
|
||||||
this.localPosition = newLocalPositionVector;
|
this.localPosition = newLocalPositionVector;
|
||||||
|
|
||||||
thingIds ??= new int[this.receivers.Count];
|
thingIds ??= new int[this._receivers.Count];
|
||||||
|
|
||||||
int receiverIx = 0;
|
int receiverIx = 0;
|
||||||
INucleus selectedReceiver = null;
|
INucleus selectedReceiver = null;
|
||||||
int selectedReceiverIx = 0;
|
int selectedReceiverIx = 0;
|
||||||
foreach (INucleus receiver in this.receivers) {
|
foreach (INucleus receiver in this.allReceivers) {
|
||||||
// selectedReceiver = receiver;
|
// selectedReceiver = receiver;
|
||||||
// receiverIx++;
|
// receiverIx++;
|
||||||
|
|
||||||
|
|||||||
@ -4,12 +4,16 @@ using UnityEditor;
|
|||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class Synapse {
|
public class Synapse {
|
||||||
//[NonSerialized]
|
// Support access to cluster of basic nucleus
|
||||||
[SerializeReference]
|
public IReceptor nucleus => clusterNucleus != null ? clusterNucleus : basicNucleus;
|
||||||
public IReceptor nucleus;
|
|
||||||
[SerializeReference]
|
[SerializeReference]
|
||||||
|
private IReceptor basicNucleus;
|
||||||
|
// The Cluster is a ScriptableObject and can therefore not be serialized using [SerializeReference]
|
||||||
|
private Cluster clusterNucleus;
|
||||||
|
|
||||||
public Cluster cluster;
|
public Cluster cluster;
|
||||||
//public int nucleusId;
|
|
||||||
public float weight;
|
public float weight;
|
||||||
|
|
||||||
public enum CurvePresets {
|
public enum CurvePresets {
|
||||||
@ -19,55 +23,16 @@ public class Synapse {
|
|||||||
Reciprocal,
|
Reciprocal,
|
||||||
Custom
|
Custom
|
||||||
}
|
}
|
||||||
// public CurvePresets curvePreset;
|
|
||||||
// public AnimationCurve curve;
|
|
||||||
public float curveMax = 1.0f;
|
public float curveMax = 1.0f;
|
||||||
|
|
||||||
public Synapse(IReceptor nucleus, float weight) {
|
public Synapse(IReceptor nucleus, float weight = 1.0f) {
|
||||||
this.nucleus = nucleus;
|
this.basicNucleus = nucleus;
|
||||||
//this.nucleusId = nucleus.id;
|
this.weight = weight;
|
||||||
|
}
|
||||||
|
public Synapse(Cluster cluster, float weight = 1.0f) {
|
||||||
|
this.clusterNucleus = cluster;
|
||||||
this.weight = weight;
|
this.weight = weight;
|
||||||
}
|
}
|
||||||
|
|
||||||
// public void Rebuild(NanoBrain brain) {
|
|
||||||
// // if (brain == null) {
|
|
||||||
// // return;
|
|
||||||
// // }
|
|
||||||
|
|
||||||
// // foreach (Nucleus nucleus in brain.nuclei) {
|
|
||||||
// // if (nucleus.id == this.nucleusId) {
|
|
||||||
// // this.nucleus = nucleus;
|
|
||||||
// // return;
|
|
||||||
// // }
|
|
||||||
// // }
|
|
||||||
// // foreach (Perceptoid perceptoid in brain.perceptei) {
|
|
||||||
// // if (perceptoid.id == this.nucleusId) {
|
|
||||||
// // this.nucleus = perceptoid;
|
|
||||||
// // return;
|
|
||||||
// // }
|
|
||||||
// // }
|
|
||||||
// // Debug.LogError($"Synapse deserialization error: could not find nucleus with id {this.nucleusId}");
|
|
||||||
// }
|
|
||||||
|
|
||||||
// public AnimationCurve GenerateCurve() {
|
|
||||||
// switch (this.curvePreset) {
|
|
||||||
// case CurvePresets.Linear:
|
|
||||||
// this.curveMax = this.weight;
|
|
||||||
// return Presets.Linear(this.weight);
|
|
||||||
// case CurvePresets.Power:
|
|
||||||
// this.curveMax = this.weight;
|
|
||||||
// return Presets.Power(2.0f, this.weight);
|
|
||||||
// case CurvePresets.Sqrt:
|
|
||||||
// this.curveMax = this.weight;
|
|
||||||
// return Presets.Power(0.5f, this.weight);
|
|
||||||
// case CurvePresets.Reciprocal:
|
|
||||||
// this.curveMax = 1 / 0.01f * this.weight;
|
|
||||||
// return Presets.Reciprocal(this.weight);
|
|
||||||
// default:
|
|
||||||
// this.curveMax = weight;
|
|
||||||
// return AnimationCurve.Constant(0, 1, weight);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
public static class Presets {
|
public static class Presets {
|
||||||
private const int samples = 32;
|
private const int samples = 32;
|
||||||
|
|||||||
@ -3,15 +3,13 @@ using UnityEngine;
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
public class BrainPickerWindow : EditorWindow
|
public class BrainPickerWindow : EditorWindow {
|
||||||
{
|
|
||||||
private Vector2 scroll;
|
private Vector2 scroll;
|
||||||
private Cluster[] items = new Cluster[0];
|
private Cluster[] items = new Cluster[0];
|
||||||
private Action<Cluster> onPicked;
|
private Action<Cluster> onPicked;
|
||||||
private string search = "";
|
private string search = "";
|
||||||
|
|
||||||
public static void ShowPicker(Action<Cluster> onPicked, string title = "Select NanoBrain")
|
public static void ShowPicker(Action<Cluster> onPicked, string title = "Select Cluster") {
|
||||||
{
|
|
||||||
var w = CreateInstance<BrainPickerWindow>();
|
var w = CreateInstance<BrainPickerWindow>();
|
||||||
w.titleContent = new GUIContent(title);
|
w.titleContent = new GUIContent(title);
|
||||||
w.minSize = new Vector2(360, 320);
|
w.minSize = new Vector2(360, 320);
|
||||||
@ -22,9 +20,8 @@ public class BrainPickerWindow : EditorWindow
|
|||||||
|
|
||||||
private void OnEnable() => RefreshList();
|
private void OnEnable() => RefreshList();
|
||||||
|
|
||||||
private void RefreshList()
|
private void RefreshList() {
|
||||||
{
|
var guids = AssetDatabase.FindAssets("t:Cluster");
|
||||||
var guids = AssetDatabase.FindAssets("t:NanoBrain");
|
|
||||||
items = guids
|
items = guids
|
||||||
.Select(g => AssetDatabase.LoadAssetAtPath<Cluster>(AssetDatabase.GUIDToAssetPath(g)))
|
.Select(g => AssetDatabase.LoadAssetAtPath<Cluster>(AssetDatabase.GUIDToAssetPath(g)))
|
||||||
.Where(b => b != null)
|
.Where(b => b != null)
|
||||||
@ -32,11 +29,10 @@ public class BrainPickerWindow : EditorWindow
|
|||||||
.ToArray();
|
.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnGUI()
|
private void OnGUI() {
|
||||||
{
|
|
||||||
EditorGUILayout.Space();
|
EditorGUILayout.Space();
|
||||||
EditorGUILayout.BeginHorizontal();
|
EditorGUILayout.BeginHorizontal();
|
||||||
EditorGUILayout.LabelField("Choose NanoBrain:", EditorStyles.boldLabel);
|
EditorGUILayout.LabelField("Choose Cluster:", EditorStyles.boldLabel);
|
||||||
if (GUILayout.Button("Refresh", GUILayout.Width(80))) RefreshList();
|
if (GUILayout.Button("Refresh", GUILayout.Width(80))) RefreshList();
|
||||||
GUILayout.FlexibleSpace();
|
GUILayout.FlexibleSpace();
|
||||||
EditorGUILayout.EndHorizontal();
|
EditorGUILayout.EndHorizontal();
|
||||||
@ -46,15 +42,13 @@ public class BrainPickerWindow : EditorWindow
|
|||||||
|
|
||||||
EditorGUILayout.Space();
|
EditorGUILayout.Space();
|
||||||
scroll = EditorGUILayout.BeginScrollView(scroll);
|
scroll = EditorGUILayout.BeginScrollView(scroll);
|
||||||
foreach (var it in items)
|
foreach (var it in items) {
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(search) && it.name.IndexOf(search, StringComparison.OrdinalIgnoreCase) < 0)
|
if (!string.IsNullOrEmpty(search) && it.name.IndexOf(search, StringComparison.OrdinalIgnoreCase) < 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
EditorGUILayout.BeginHorizontal();
|
EditorGUILayout.BeginHorizontal();
|
||||||
EditorGUILayout.LabelField(EditorGUIUtility.ObjectContent(it, typeof(Cluster)), GUILayout.Height(20));
|
EditorGUILayout.LabelField(EditorGUIUtility.ObjectContent(it, typeof(Cluster)), GUILayout.Height(20));
|
||||||
if (GUILayout.Button("Select", GUILayout.Width(70)))
|
if (GUILayout.Button("Select", GUILayout.Width(70))) {
|
||||||
{
|
|
||||||
onPicked?.Invoke(it);
|
onPicked?.Invoke(it);
|
||||||
Close();
|
Close();
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -156,8 +156,8 @@ public class ClusterInspector : Editor {
|
|||||||
return;
|
return;
|
||||||
NeuroidLayer currentLayer = new() { ix = layerIx };
|
NeuroidLayer currentLayer = new() { ix = layerIx };
|
||||||
|
|
||||||
if (selectedNucleus.receivers != null) {
|
if (selectedNucleus.allReceivers != null) {
|
||||||
foreach (INucleus receiver in selectedNucleus.receivers) {
|
foreach (INucleus receiver in selectedNucleus.allReceivers) {
|
||||||
INucleus outputNeuroid = receiver;
|
INucleus outputNeuroid = receiver;
|
||||||
if (outputNeuroid != null) {
|
if (outputNeuroid != null) {
|
||||||
AddToLayer(currentLayer, outputNeuroid);
|
AddToLayer(currentLayer, outputNeuroid);
|
||||||
@ -201,19 +201,6 @@ public class ClusterInspector : Editor {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// void OnMouseDown(MouseDownEvent e) {
|
|
||||||
// if (e.button == 2) { draggingCanvas = true; lastMouse = e.mousePosition; e.StopPropagation(); }
|
|
||||||
// }
|
|
||||||
// void OnMouseMove(MouseMoveEvent e) {
|
|
||||||
// if (draggingCanvas) {
|
|
||||||
// var delta = e.mousePosition - lastMouse;
|
|
||||||
// pan += delta;
|
|
||||||
// //content.style.left = pan.x;
|
|
||||||
// //content.style.top = pan.y;
|
|
||||||
// lastMouse = e.mousePosition;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// void OnMouseUp(MouseUpEvent e) { if (e.button == 2) draggingCanvas = false; }
|
|
||||||
|
|
||||||
public void OnIMGUI() {
|
public void OnIMGUI() {
|
||||||
if (currentNucleus == null)
|
if (currentNucleus == null)
|
||||||
@ -285,12 +272,12 @@ public class ClusterInspector : Editor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void DrawReceivers(INucleus nucleus, Vector3 parentPos, float size) {
|
private void DrawReceivers(INucleus nucleus, Vector3 parentPos, float size) {
|
||||||
int nodeCount = nucleus.receivers.Count;
|
int nodeCount = nucleus.allReceivers.Count();
|
||||||
|
|
||||||
// Determine the maximum value in this layer
|
// Determine the maximum value in this layer
|
||||||
// This is used to 'scale' the output value colors of the nuclei
|
// This is used to 'scale' the output value colors of the nuclei
|
||||||
float maxValue = 0;
|
float maxValue = 0;
|
||||||
foreach (INucleus receiver in nucleus.receivers) {
|
foreach (INucleus receiver in nucleus.allReceivers) {
|
||||||
if (receiver is Neuron neuroid) {
|
if (receiver is Neuron neuroid) {
|
||||||
float value = length(neuroid.outputValue);
|
float value = length(neuroid.outputValue);
|
||||||
if (value > maxValue)
|
if (value > maxValue)
|
||||||
@ -303,7 +290,7 @@ public class ClusterInspector : Editor {
|
|||||||
float margin = 10 + spacing / 2;
|
float margin = 10 + spacing / 2;
|
||||||
|
|
||||||
int row = 0;
|
int row = 0;
|
||||||
foreach (INucleus receiver in nucleus.receivers) {
|
foreach (INucleus receiver in nucleus.allReceivers) {
|
||||||
INucleus receiverNucleus = receiver;
|
INucleus receiverNucleus = receiver;
|
||||||
if (receiverNucleus == null)
|
if (receiverNucleus == null)
|
||||||
continue;
|
continue;
|
||||||
@ -414,9 +401,14 @@ public class ClusterInspector : Editor {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
style.alignment = TextAnchor.UpperCenter;
|
style.alignment = TextAnchor.UpperCenter;
|
||||||
Vector3 labelPos = position - Vector3.down * (size + 0.2f); // below disc along up axis
|
Vector3 labelPos = position - Vector3.down * (size + 10f); // below disc along up axis
|
||||||
Handles.Label(labelPos, nucleus.name, style);
|
Handles.Label(labelPos, nucleus.name, style);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nucleus is Cluster cluster) {
|
||||||
|
Handles.color = Color.white;
|
||||||
|
Handles.DrawWireDisc(position, Vector3.forward, size + 10);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
style.alignment = TextAnchor.UpperCenter;
|
style.alignment = TextAnchor.UpperCenter;
|
||||||
@ -592,7 +584,7 @@ public class ClusterInspector : Editor {
|
|||||||
return;
|
return;
|
||||||
if (nucleus.cluster != null)
|
if (nucleus.cluster != null)
|
||||||
this.currentNucleus = nucleus.cluster.output;
|
this.currentNucleus = nucleus.cluster.output;
|
||||||
foreach (INucleus receiver in nucleus.receivers) {
|
foreach (INucleus receiver in nucleus.allReceivers) {
|
||||||
if (receiver != null) {
|
if (receiver != null) {
|
||||||
this.currentNucleus = receiver;
|
this.currentNucleus = receiver;
|
||||||
break;
|
break;
|
||||||
@ -606,9 +598,9 @@ public class ClusterInspector : Editor {
|
|||||||
BrainPickerWindow.ShowPicker(brain => OnClusterPicked(nucleus, brain), "Select Cluster");
|
BrainPickerWindow.ShowPicker(brain => OnClusterPicked(nucleus, brain), "Select Cluster");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnClusterPicked(INucleus nucleus, Cluster brain) {
|
private void OnClusterPicked(INucleus nucleus, Cluster cluster) {
|
||||||
Cluster brainInstance = Instantiate(brain);
|
Cluster clusterInstance = Instantiate(cluster);
|
||||||
brainInstance.AddReceiver(nucleus);
|
clusterInstance.AddReceiver(nucleus);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connect to another nucleus in the same cluster
|
// Connect to another nucleus in the same cluster
|
||||||
|
|||||||
62
Assets/Scenes/Boids/New Cluster.asset
Normal file
62
Assets/Scenes/Boids/New Cluster.asset
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 60a957541c24c57e78018c202ebb1d9b, type: 3}
|
||||||
|
m_Name: New Cluster
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::Cluster
|
||||||
|
nuclei:
|
||||||
|
- rid: 2243601242842202217
|
||||||
|
subClusters: []
|
||||||
|
references:
|
||||||
|
version: 2
|
||||||
|
RefIds:
|
||||||
|
- rid: 2243601242842202217
|
||||||
|
type: {class: Neuron, ns: , asm: Assembly-CSharp}
|
||||||
|
data:
|
||||||
|
_name: Output
|
||||||
|
_synapses: []
|
||||||
|
_receivers: []
|
||||||
|
_array:
|
||||||
|
rid: 2243601242842202218
|
||||||
|
_curvePreset: 0
|
||||||
|
curve:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Curve:
|
||||||
|
- serializedVersion: 3
|
||||||
|
time: 0
|
||||||
|
value: 0
|
||||||
|
inSlope: 0
|
||||||
|
outSlope: 1
|
||||||
|
tangentMode: 0
|
||||||
|
weightedMode: 0
|
||||||
|
inWeight: 0
|
||||||
|
outWeight: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
time: 1000
|
||||||
|
value: 1000
|
||||||
|
inSlope: 1
|
||||||
|
outSlope: 0
|
||||||
|
tangentMode: 0
|
||||||
|
weightedMode: 0
|
||||||
|
inWeight: 0
|
||||||
|
outWeight: 0
|
||||||
|
m_PreInfinity: 2
|
||||||
|
m_PostInfinity: 2
|
||||||
|
m_RotationOrder: 4
|
||||||
|
curveMax: 1
|
||||||
|
average: 0
|
||||||
|
- rid: 2243601242842202218
|
||||||
|
type: {class: NucleusArray, ns: , asm: Assembly-CSharp}
|
||||||
|
data:
|
||||||
|
nuclei:
|
||||||
|
- rid: 2243601242842202217
|
||||||
|
clusters: []
|
||||||
|
name: Output
|
||||||
8
Assets/Scenes/Boids/New Cluster.asset.meta
Normal file
8
Assets/Scenes/Boids/New Cluster.asset.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4160a4557d16d7c03833982ab779d28e
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -32,7 +32,6 @@ public class Boid : MonoBehaviour {
|
|||||||
// boidVelocityReceptor = Receptor.GetReceptor(nanoBrain.brain, BoidVelocityType);
|
// boidVelocityReceptor = Receptor.GetReceptor(nanoBrain.brain, BoidVelocityType);
|
||||||
boundaryReceptor = Receptor.CreateReceptor(nanoBrain.brain, "Avoidance");
|
boundaryReceptor = Receptor.CreateReceptor(nanoBrain.brain, "Avoidance");
|
||||||
boundaryReceptor.name = "Boundary";
|
boundaryReceptor.name = "Boundary";
|
||||||
boundaryReceptor.receivers[0].synapses[0].weight = -1;
|
|
||||||
boidReceptor = Receptor.CreateReceptor(nanoBrain.brain, "Boid");
|
boidReceptor = Receptor.CreateReceptor(nanoBrain.brain, "Boid");
|
||||||
boidVelocityReceptor = Receptor.CreateReceptor(nanoBrain.brain, "Alignment");
|
boidVelocityReceptor = Receptor.CreateReceptor(nanoBrain.brain, "Alignment");
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user