Improved clusterarray support

This commit is contained in:
Pascal Serrarens 2026-04-21 12:47:29 +02:00
parent c2e4e1b33f
commit c708f4da9e
2 changed files with 67 additions and 23 deletions

View File

@ -58,7 +58,6 @@ namespace NanoBrain {
outputsPopup.RegisterValueChangedCallback(evt => OnOutputChanged(evt.newValue));
topMenuContainer.Add(outputsPopup);
}
Add(topMenuContainer);
scrollView = new(ScrollViewMode.Horizontal);
scrollView.style.position = Position.Absolute;
@ -80,6 +79,7 @@ namespace NanoBrain {
scrollView.contentContainer.Add(graphContainer);
Add(scrollView);
Add(topMenuContainer);
// Subscribe when added to panel (editor UI ready)
@ -437,17 +437,21 @@ namespace NanoBrain {
// This is used to 'scale' the output value colors of the nuclei
float maxValue = 0;
int neuronCount = 0;
List<Nucleus[]> drawnArrays = new();
//List<Nucleus[]> drawnArrays = new();
Cluster[] drawnCluster = null;
foreach (Synapse synapse in nucleus.synapses) {
if (synapse.neuron == null)
continue;
if (synapse.neuron.parent is Cluster cluster &&
cluster.siblingClusters != null &&
//cluster.siblingClusters != null &&
synapse.neuron.parent != nucleus.parent) {
if (drawnArrays.Contains(cluster.siblingClusters))
//if (drawnArrays.Contains(cluster.siblingClusters))
if (drawnCluster is not null && cluster.SameSiblingsAs(drawnCluster))
continue;
drawnArrays.Add(cluster.siblingClusters);
//drawnArrays.Add(cluster.siblingClusters);
drawnCluster = cluster.siblingClusters;
}
if (synapse.neuron is Neuron synapseNeuron) {
float value = synapseNeuron.outputMagnitude * synapse.weight;
@ -463,25 +467,22 @@ namespace NanoBrain {
float margin = 10 + spacing / 2;
int row = 0;
drawnArrays = new();
//drawnArrays = new();
drawnCluster = null;
foreach (Synapse synapse in nucleus.synapses) {
if (synapse.neuron is null)
continue;
// if (synapse.neuron is Receptor neuron) {
// if (drawnArrays.Contains(neuron.nucleiArray))
// continue;
// drawnArrays.Add(neuron.nucleiArray);
// }
// else if (synapse.neuron.parent is ClusterReceptor clusterReceptor) {
// if (drawnArrays.Contains(clusterReceptor.nucleiArray))
// continue;
// drawnArrays.Add(clusterReceptor.nucleiArray);
// }
if (synapse.neuron.parent is Cluster cluster) {
if (drawnArrays.Contains(cluster.siblingClusters))
if (synapse.neuron.parent is Cluster cluster &&
//cluster.siblingClusters != null &&
synapse.neuron.parent != nucleus.parent) {
// if (drawnArrays.Contains(cluster.siblingClusters))
// continue;
// drawnArrays.Add(cluster.siblingClusters);
if (drawnCluster is not null && cluster.SameSiblingsAs(drawnCluster))
continue;
drawnArrays.Add(cluster.siblingClusters);
drawnCluster = cluster.siblingClusters;
}
Vector3 pos = new(250, margin + row * spacing, 0.0f);
Handles.color = Color.white;
@ -547,7 +548,7 @@ namespace NanoBrain {
fontStyle = FontStyle.Bold,
};
if (nucleus.parent is Cluster parentCluster) {
if (nucleus.parent is Cluster parentCluster && parentCluster != currentNucleus.parent) {
if (expandArray) {
// Put array indices above elements
style.alignment = TextAnchor.LowerCenter;

View File

@ -28,8 +28,6 @@ namespace NanoBrain {
}
}
//[SerializeReference]
//public ClusterArray clusterArray;
[SerializeReference]
public Cluster[] siblingClusters;
public Dictionary<int, Cluster> thingClusters = new();
@ -117,6 +115,44 @@ namespace NanoBrain {
}
}
// Copy the siblings for clusters
for (int nucleusIx = 0; nucleusIx < prefabNuclei.Length; nucleusIx++) {
Nucleus prefabNucleus = prefabNuclei[nucleusIx];
if (prefabNucleus is not Cluster prefabCluster)
continue;
if (prefabCluster.siblingClusters == null || prefabCluster.siblingClusters.Length == 0)
continue;
Cluster clonedNucleus = clonedNuclei[nucleusIx] as Cluster;
if (prefabCluster == prefabCluster.siblingClusters[0]) {
// We clone the array only for the first entry
//NucleusArray clonedArray = new(prefabReceptor.nucleiArray.Length);
Cluster[] clonedArray = new Cluster[prefabCluster.siblingClusters.Length];
int arrayIx = 0;
foreach (Cluster prefabArrayNucleus in prefabCluster.siblingClusters) {
int arrayNucleusIx = GetNucleusIndex(prefabNuclei, prefabArrayNucleus);
if (arrayNucleusIx >= 0) {
Cluster clonedArrayNucleus = clonedNuclei[arrayNucleusIx] as Cluster;
clonedArray[arrayIx] = clonedArrayNucleus;
}
else {
Debug.LogError($" Could not find prefab nucleus {prefabNucleus.name} in the clones");
}
arrayIx++;
}
//clonedNucleus.array = clonedArray;
clonedNucleus.siblingClusters = clonedArray;
}
else {
// The others will refer to the array created for the first nucleus in the array
int firstNucleusIx = GetNucleusIndex(prefabNuclei, prefabCluster.siblingClusters[0]);
Cluster clonedFirstNucleus = clonedNuclei[firstNucleusIx] as Cluster;
clonedNucleus.siblingClusters = clonedFirstNucleus.siblingClusters;
}
}
foreach (Nucleus nucleus in this.clusterNuclei) {
if (nucleus is Cluster clonedSubCluster)
RestoreAllExternalReceivers(clonedSubCluster, this.prefab, this);
@ -278,7 +314,6 @@ namespace NanoBrain {
#region Cluster Array
public void AddInstance(ClusterPrefab prefab) {
// Ensure siblingClusters exists
if (this.siblingClusters == null || this.siblingClusters.Length == 0)
@ -366,6 +401,14 @@ namespace NanoBrain {
thingClusters.Remove(thingId);
}
public bool SameSiblingsAs(Cluster[] otherSiblingClusters) {
for (int ix = 0; ix < this.siblingClusters.Length; ix++) {
if (this.siblingClusters[ix] != otherSiblingClusters[ix])
return false;
}
return true;
}
#endregion ClusterArray
public ClusterPrefab prefab;