85 lines
3.8 KiB
C#
85 lines
3.8 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class ReceptorArray {
|
|
public string name;
|
|
|
|
public Cluster parent { get; set; }
|
|
|
|
public NucleusArray nuclei;
|
|
public int size => nuclei.nuclei.Length;
|
|
|
|
public Dictionary<int, INucleus> thingReceivers = new();
|
|
|
|
public ReceptorArray(Cluster parent, NucleusArray nuclei) {
|
|
this.parent = parent;
|
|
this.nuclei = nuclei;
|
|
}
|
|
|
|
public virtual void ProcessStimulus(int thingId, Vector3 newLocalPositionVector, string thingName = null) {
|
|
if (!thingReceivers.TryGetValue(thingId, out INucleus selectedReceiver)) {
|
|
foreach (IReceptor receptor in this.nuclei.nuclei) {
|
|
if (receptor is not INucleus receiver)
|
|
continue;
|
|
if (thingReceivers.ContainsValue(receiver))
|
|
continue;
|
|
// receiver is not used yet
|
|
thingReceivers.Add(thingId, receiver);
|
|
selectedReceiver = receiver;
|
|
}
|
|
}
|
|
//selectedReceiver.outputValue = newLocalPositionVector;
|
|
|
|
|
|
/*
|
|
int receiverIx = 0;
|
|
INucleus selectedReceiver = null;
|
|
int selectedReceiverIx = 0;
|
|
foreach (INucleus receiver in this.receivers) {
|
|
if (thingIds[receiverIx] == thingId) {
|
|
// We found an existing receiver for this thing
|
|
selectedReceiver = receiver;
|
|
selectedReceiverIx = receiverIx;
|
|
// Do not look any further
|
|
break;
|
|
}
|
|
else if (receiver.isSleeping) {
|
|
// A sleeping receiver is not active and can therefore always be used
|
|
selectedReceiver = receiver;
|
|
selectedReceiverIx = receiverIx;
|
|
// Look further because we may find an existing receiver for this thing
|
|
}
|
|
else if (selectedReceiver == null) {
|
|
// If we haven't found a receiver yet, just start by taking the first
|
|
selectedReceiver = receiver;
|
|
selectedReceiverIx = receiverIx;
|
|
}
|
|
else if (selectedReceiver.isSleeping == false) {
|
|
// If no existing or sleeping receiver is found, we look for
|
|
// the receiver with the furthest/least interesting stimulus
|
|
if (length(receiver.outputValue) < length(selectedReceiver.outputValue)) {
|
|
// Debug.Log($"{selectedReceiver.name}[{selectedReceiverIx}] {length(selectedReceiver.outputValue)}" +
|
|
// $" {receiver.name}[{receiverIx}] {length(receiver.outputValue)} ");
|
|
selectedReceiver = receiver;
|
|
selectedReceiverIx = receiverIx;
|
|
}
|
|
}
|
|
receiverIx++;
|
|
}
|
|
if (selectedReceiverIx >= thingIds.Length)
|
|
return;
|
|
|
|
thingIds[selectedReceiverIx] = thingId;
|
|
if (thingName != null) {
|
|
string baseName = selectedReceiver.name;
|
|
int colonPos = selectedReceiver.name.IndexOf(":");
|
|
if (colonPos > 0)
|
|
baseName = selectedReceiver.name.Substring(0, colonPos);
|
|
selectedReceiver.name = baseName + ": " + thingName;
|
|
}
|
|
Debug.Log($"Receiver {selectedReceiver.name}[{selectedReceiverIx}] for thing {thingId}");
|
|
selectedReceiver.parent.UpdateStateIsolated();
|
|
*/
|
|
}
|
|
|
|
} |