diff --git a/Editor/ClusterEditor.cs b/Editor/ClusterEditor.cs index e3ed2ef..3bc2791 100644 --- a/Editor/ClusterEditor.cs +++ b/Editor/ClusterEditor.cs @@ -186,7 +186,7 @@ namespace NanoBrain.Unity { protected void ClusterInspector(Cluster cluster, ref bool anythingChanged) { EditorGUILayout.BeginHorizontal(); - int instanceCount = cluster.instanceCount; + int instanceCount = (int)cluster.instanceCount; if (instanceCount <= 1) { if (cluster.instances != null && cluster.instances.Length > 1) instanceCount = cluster.instances.Count(); diff --git a/Runtime/Scripts/Core/Cluster.cs b/Runtime/Scripts/Core/Cluster.cs index 77ed36b..8abf227 100644 --- a/Runtime/Scripts/Core/Cluster.cs +++ b/Runtime/Scripts/Core/Cluster.cs @@ -63,7 +63,7 @@ namespace NanoBrain { /// /// A cluster is a multi-clsuter when there is more than one instance. [SerializeField] - public int instanceCount = 1; + public uint instanceCount = 1; /// /// The mapping from things to cluster instances /// @@ -89,7 +89,7 @@ namespace NanoBrain { /// /// The prefab to use /// The cluster in which this new cluster will be placed - public Cluster(ClusterPrefab prefab, Cluster parent) { + public Cluster(ClusterPrefab prefab, Cluster parent, uint instanceCount = 1) { this.prefab = prefab; this.version = prefab.version; this.name = prefab.name; @@ -97,6 +97,27 @@ namespace NanoBrain { this.parent = parent; this.parent?.nuclei.Add(this); ClonePrefab(); + + if (instanceCount > 1) { + Debug.Log($" InstanceCount = {instanceCount}"); + List siblings = new() { this }; + for (int instanceIx = 1; instanceIx < instanceCount; instanceIx++) { + // Create another sibling + Cluster sibling = new(prefab, this) { + name = $"{this.baseName}: {instanceIx}", + parent = this.parent, + instanceCount = this.instanceCount, + }; + siblings.Add(sibling); + CopyAllExternalReceivers(this, sibling, this); + } + Cluster[] siblingClusters = siblings.ToArray(); + foreach (Cluster sibling in siblings) { + sibling.instanceCount = instanceCount; + sibling.instances = siblingClusters; + } + + } } /// @@ -158,7 +179,12 @@ namespace NanoBrain { if (extPrefab == null) Debug.LogError($"Could not find cluster Resource {synapseData.clusterName}"); else { - Cluster extCluster = new Cluster(extPrefab, this); + uint instanceCount = 1; + foreach (ExternalClusterData externalCluster in clusterData.clusters) { + if (externalCluster.name == synapseData.clusterName) + instanceCount = externalCluster.instanceCount; + } + Cluster extCluster = new Cluster(extPrefab, this, instanceCount); Neuron extNeuron = extCluster.GetNeuron(synapseData.neuronName); extNeuron.AddReceiver(receiver); }