From 8e87e4ea77308b51c3691bdad96e7f9707952821 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 7 Apr 2026 09:12:29 +0200 Subject: [PATCH 01/38] Squashed 'NanoBrain/' content from commit b3423b9 git-subtree-dir: NanoBrain git-subtree-split: b3423b99a752cdabbc4e7c51565fb54425481feb --- Cluster.cs | 508 +++++++ Cluster.cs.meta | 2 + ClusterPrefab.cs | 116 ++ ClusterPrefab.cs.meta | 2 + ClusterReceptor.cs | 214 +++ ClusterReceptor.cs.meta | 2 + Editor.meta | 8 + Editor/BrainEditorWindow.cs | 365 +++++ Editor/BrainEditorWindow.cs.meta | 2 + Editor/BrainPickerWindow.cs | 66 + Editor/BrainPickerWindow.cs.meta | 2 + Editor/ClusterInspector.cs | 1100 ++++++++++++++ Editor/ClusterInspector.cs.meta | 2 + Editor/DAGWindow.cs | 393 +++++ Editor/DAGWindow.cs.meta | 2 + Editor/NanoBrain_Editor.cs | 49 + Editor/NanoBrain_Editor.cs.meta | 2 + Editor/Resources.meta | 8 + Editor/Resources/GraphStyles.uss | 12 + Editor/Resources/GraphStyles.uss.meta | 11 + IReceptor.cs | 73 + IReceptor.cs.meta | 2 + Icons.meta | 8 + Icons/NeuraalNetwerkIcoonSchets1.png | Bin 0 -> 60406 bytes Icons/NeuraalNetwerkIcoonSchets1.png.meta | 117 ++ Icons/NeuraalNetwerkIcoonSchets2.png | Bin 0 -> 39373 bytes Icons/NeuraalNetwerkIcoonSchets2.png.meta | 117 ++ Icons/NeuraalNetwerkIcoonSchets3.png | Bin 0 -> 40575 bytes Icons/NeuraalNetwerkIcoonSchets3.png.meta | 117 ++ Identity.asset | 59 + Identity.asset.meta | 8 + LinearAlgebra.meta | 8 + LinearAlgebra/.editorconfig | 19 + .../.gitea/workflows/unit_tests.yaml | 37 + LinearAlgebra/.gitignore | 5 + LinearAlgebra/LinearAlgebra-csharp.sln | 30 + LinearAlgebra/src/Angle.cs | 341 +++++ LinearAlgebra/src/Decomposition.cs | 287 ++++ LinearAlgebra/src/Direction.cs | 261 ++++ LinearAlgebra/src/Float.cs | 41 + LinearAlgebra/src/LinearAlgebra.csproj | 14 + LinearAlgebra/src/Matrix.cs | 689 +++++++++ LinearAlgebra/src/Quat32.cs | 87 ++ LinearAlgebra/src/Quaternion.cs | 582 ++++++++ LinearAlgebra/src/Spherical.cs | 279 ++++ LinearAlgebra/src/SwingTwist.cs | 136 ++ LinearAlgebra/src/Vector2Float.cs | 479 ++++++ LinearAlgebra/src/Vector2Int.cs | 185 +++ LinearAlgebra/src/Vector3Float.cs | 402 +++++ LinearAlgebra/src/Vector3Int.cs | 273 ++++ LinearAlgebra/src/float16.cs | 322 ++++ LinearAlgebra/test/AngleTest.cs | 501 +++++++ LinearAlgebra/test/DirectionTest.cs | 226 +++ LinearAlgebra/test/LinearAlgebra_Test.csproj | 19 + LinearAlgebra/test/QuaternionTest.cs | 185 +++ LinearAlgebra/test/SphericalTest.cs | 271 ++++ LinearAlgebra/test/SwingTwistTest.cs | 131 ++ LinearAlgebra/test/Vector2FloatTest.cs | 364 +++++ LinearAlgebra/test/Vector2IntTest.cs | 270 ++++ LinearAlgebra/test/Vector3FloatTest.cs | 581 ++++++++ LinearAlgebra/test/Vector3IntTest.cs | 349 +++++ MemoryCell.cs | 59 + MemoryCell.cs.meta | 2 + NanoBrain-Unity.code-workspace | 12 + NanoBrain-Unity.code-workspace.meta | 7 + NanoBrain.cs | 31 + NanoBrain.cs.meta | 2 + Neuron.cs | 334 +++++ Neuron.cs.meta | 2 + NewVelocity.asset | 1305 +++++++++++++++++ NewVelocity.asset.meta | 8 + Nucleus.cs | 72 + Nucleus.cs.meta | 2 + NucleusArray.cs | 157 ++ NucleusArray.cs.meta | 2 + Receptor.cs | 78 + Receptor.cs.meta | 2 + Scene.meta | 8 + Scene/TestScene Boid.unity | 487 ++++++ Scene/TestScene Boid.unity.meta | 7 + Scene/TestScene Experiment.unity | 365 +++++ Scene/TestScene Experiment.unity.meta | 7 + Scripts.meta | 8 + Scripts/Experimental.meta | 8 + Scripts/NeuraalNetwerkIcoonSchets1.png | Bin 0 -> 63771 bytes Scripts/NeuraalNetwerkIcoonSchets1.png.meta | 117 ++ Scripts/NeuraalNetwerkIcoonSchets2.png | Bin 0 -> 39373 bytes Scripts/NeuraalNetwerkIcoonSchets2.png.meta | 117 ++ Synapse.cs | 15 + Synapse.cs.meta | 2 + Velocity.asset | 128 ++ Velocity.asset.meta | 8 + 92 files changed, 14093 insertions(+) create mode 100644 Cluster.cs create mode 100644 Cluster.cs.meta create mode 100644 ClusterPrefab.cs create mode 100644 ClusterPrefab.cs.meta create mode 100644 ClusterReceptor.cs create mode 100644 ClusterReceptor.cs.meta create mode 100644 Editor.meta create mode 100644 Editor/BrainEditorWindow.cs create mode 100644 Editor/BrainEditorWindow.cs.meta create mode 100644 Editor/BrainPickerWindow.cs create mode 100644 Editor/BrainPickerWindow.cs.meta create mode 100644 Editor/ClusterInspector.cs create mode 100644 Editor/ClusterInspector.cs.meta create mode 100644 Editor/DAGWindow.cs create mode 100644 Editor/DAGWindow.cs.meta create mode 100644 Editor/NanoBrain_Editor.cs create mode 100644 Editor/NanoBrain_Editor.cs.meta create mode 100644 Editor/Resources.meta create mode 100644 Editor/Resources/GraphStyles.uss create mode 100644 Editor/Resources/GraphStyles.uss.meta create mode 100644 IReceptor.cs create mode 100644 IReceptor.cs.meta create mode 100644 Icons.meta create mode 100644 Icons/NeuraalNetwerkIcoonSchets1.png create mode 100644 Icons/NeuraalNetwerkIcoonSchets1.png.meta create mode 100644 Icons/NeuraalNetwerkIcoonSchets2.png create mode 100644 Icons/NeuraalNetwerkIcoonSchets2.png.meta create mode 100644 Icons/NeuraalNetwerkIcoonSchets3.png create mode 100644 Icons/NeuraalNetwerkIcoonSchets3.png.meta create mode 100644 Identity.asset create mode 100644 Identity.asset.meta create mode 100644 LinearAlgebra.meta create mode 100644 LinearAlgebra/.editorconfig create mode 100644 LinearAlgebra/.gitea/workflows/unit_tests.yaml create mode 100644 LinearAlgebra/.gitignore create mode 100644 LinearAlgebra/LinearAlgebra-csharp.sln create mode 100644 LinearAlgebra/src/Angle.cs create mode 100644 LinearAlgebra/src/Decomposition.cs create mode 100644 LinearAlgebra/src/Direction.cs create mode 100644 LinearAlgebra/src/Float.cs create mode 100644 LinearAlgebra/src/LinearAlgebra.csproj create mode 100644 LinearAlgebra/src/Matrix.cs create mode 100644 LinearAlgebra/src/Quat32.cs create mode 100644 LinearAlgebra/src/Quaternion.cs create mode 100644 LinearAlgebra/src/Spherical.cs create mode 100644 LinearAlgebra/src/SwingTwist.cs create mode 100644 LinearAlgebra/src/Vector2Float.cs create mode 100644 LinearAlgebra/src/Vector2Int.cs create mode 100644 LinearAlgebra/src/Vector3Float.cs create mode 100644 LinearAlgebra/src/Vector3Int.cs create mode 100644 LinearAlgebra/src/float16.cs create mode 100644 LinearAlgebra/test/AngleTest.cs create mode 100644 LinearAlgebra/test/DirectionTest.cs create mode 100644 LinearAlgebra/test/LinearAlgebra_Test.csproj create mode 100644 LinearAlgebra/test/QuaternionTest.cs create mode 100644 LinearAlgebra/test/SphericalTest.cs create mode 100644 LinearAlgebra/test/SwingTwistTest.cs create mode 100644 LinearAlgebra/test/Vector2FloatTest.cs create mode 100644 LinearAlgebra/test/Vector2IntTest.cs create mode 100644 LinearAlgebra/test/Vector3FloatTest.cs create mode 100644 LinearAlgebra/test/Vector3IntTest.cs create mode 100644 MemoryCell.cs create mode 100644 MemoryCell.cs.meta create mode 100644 NanoBrain-Unity.code-workspace create mode 100644 NanoBrain-Unity.code-workspace.meta create mode 100644 NanoBrain.cs create mode 100644 NanoBrain.cs.meta create mode 100644 Neuron.cs create mode 100644 Neuron.cs.meta create mode 100644 NewVelocity.asset create mode 100644 NewVelocity.asset.meta create mode 100644 Nucleus.cs create mode 100644 Nucleus.cs.meta create mode 100644 NucleusArray.cs create mode 100644 NucleusArray.cs.meta create mode 100644 Receptor.cs create mode 100644 Receptor.cs.meta create mode 100644 Scene.meta create mode 100644 Scene/TestScene Boid.unity create mode 100644 Scene/TestScene Boid.unity.meta create mode 100644 Scene/TestScene Experiment.unity create mode 100644 Scene/TestScene Experiment.unity.meta create mode 100644 Scripts.meta create mode 100644 Scripts/Experimental.meta create mode 100644 Scripts/NeuraalNetwerkIcoonSchets1.png create mode 100644 Scripts/NeuraalNetwerkIcoonSchets1.png.meta create mode 100644 Scripts/NeuraalNetwerkIcoonSchets2.png create mode 100644 Scripts/NeuraalNetwerkIcoonSchets2.png.meta create mode 100644 Synapse.cs create mode 100644 Synapse.cs.meta create mode 100644 Velocity.asset create mode 100644 Velocity.asset.meta diff --git a/Cluster.cs b/Cluster.cs new file mode 100644 index 0000000..996fb2c --- /dev/null +++ b/Cluster.cs @@ -0,0 +1,508 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using Unity.Mathematics; +using static Unity.Mathematics.math; + +[Serializable] +public class Cluster : Nucleus { + + public string baseName { + get { + int colonPositon = this.name.IndexOf(':'); + if (colonPositon < 0) + return this.name; + return this.name[..colonPositon]; + } + } + + #region Init + + public Cluster(ClusterPrefab prefab, Cluster parent) { + this.prefab = prefab; + this.name = prefab.name; + + this.parent = parent; + this.parent?.clusterNuclei.Add(this); + + ClonePrefab(); + _ = this.inputs; + this.sortedNuclei = TopologicalSort(this.clusterNuclei); + } + + public Cluster(ClusterPrefab prefab, ClusterPrefab parent = null) { + this.prefab = prefab; + this.name = prefab.name; + this.clusterPrefab = parent; + + if (this.clusterPrefab != null) + this.clusterPrefab.nuclei.Add(this); + + ClonePrefab(); + _ = this.inputs; + this.sortedNuclei = TopologicalSort(this.clusterNuclei); + } + + private void ClonePrefab() { + Nucleus[] prefabNuclei = this.prefab.nuclei.ToArray(); + // first clone the nuclei without their connections + foreach (Nucleus nucleus in this.prefab.nuclei) { + nucleus.ShallowCloneTo(this); + } + Nucleus[] clonedNuclei = this.clusterNuclei.ToArray(); + + // Now clone the connections + for (int nucleusIx = 0; nucleusIx < prefabNuclei.Length; nucleusIx++) { + Nucleus prefabNucleus = prefabNuclei[nucleusIx]; + if (prefabNucleus is not Neuron prefabNeuron) + continue; + + Nucleus clonedNucleus = clonedNuclei[nucleusIx]; + if (clonedNucleus == null || clonedNucleus is not Neuron clonedNeuron) + continue; + + // Copy the receivers, which will also create the synapses + // Clusters do not have receivers... + foreach (Nucleus receiver in prefabNeuron.receivers.ToArray()) { + int ix = GetNucleusIndex(prefabNuclei, receiver); + if (ix < 0) + continue; + + if (clonedNuclei[ix] is not Nucleus clonedReceiver) + continue; + + // Find the synapse for the weight + float weight = 1; + foreach (Synapse synapse in receiver.synapses) { + // Find the weight for this synapse + if (synapse.neuron == prefabNucleus) { + weight = synapse.weight; + break; + } + } + + clonedNeuron.AddReceiver(clonedReceiver, weight); + } + } + + // Copy nucleus arrays for receptors + for (int nucleusIx = 0; nucleusIx < prefabNuclei.Length; nucleusIx++) { + Nucleus prefabNucleus = prefabNuclei[nucleusIx]; + if (prefabNucleus is not IReceptor prefabReceptor) + continue; + + if (prefabReceptor.nucleiArray == null || prefabReceptor.nucleiArray.Length == 0) + continue; + + IReceptor clonedNucleus = clonedNuclei[nucleusIx] as IReceptor; + if (prefabReceptor == prefabReceptor.nucleiArray[0]) { + // We clone the array only for the first entry + NucleusArray clonedArray = new(prefabReceptor.nucleiArray.Length, "array"); + int arrayIx = 0; + foreach (Nucleus prefabArrayNucleus in prefabReceptor.nucleiArray) { + int arrayNucleusIx = GetNucleusIndex(prefabNuclei, prefabArrayNucleus); + if (arrayNucleusIx >= 0) { + Nucleus clonedArrayNucleus = clonedNuclei[arrayNucleusIx]; + clonedArray.nuclei[arrayIx] = clonedArrayNucleus; + } + else { + Debug.LogError($" Could not find prefab nucleus {prefabNucleus.name} in the clones"); + } + arrayIx++; + } + //clonedNucleus.array = clonedArray; + clonedNucleus.nucleiArray = clonedArray.nuclei; + } + else { + // The others will refer to the array created for the first nucleus in the array + int firstNucleusIx = GetNucleusIndex(prefabNuclei, prefabReceptor.nucleiArray[0]); + IReceptor clonedFirstNucleus = clonedNuclei[firstNucleusIx] as IReceptor; + clonedNucleus.nucleiArray = clonedFirstNucleus.nucleiArray; + } + } + + foreach (Nucleus nucleus in this.clusterNuclei) { + if (nucleus is Cluster clonedSubCluster) + RestoreAllExternalReceivers(clonedSubCluster, this.prefab, this); + } + } + + // Sort the nuclei in a correct evaluation order + private List TopologicalSort(List nodes) { + Dictionary inDegree = new(); + foreach (Nucleus node in nodes) + inDegree[node] = 0; // Initialize in-degree to zero + + // Calculate in-degrees + foreach (Nucleus node in nodes) { + if (node is Cluster cluster) { + foreach (Nucleus receiver in cluster.CollectReceivers()) + inDegree[receiver]++; + } + else if (node is Neuron neuron) { + foreach (Nucleus receiver in neuron.receivers) + inDegree[receiver]++; + } + } + + Queue queue = new(); + foreach (Nucleus node in nodes) { + if (inDegree[node] == 0) // Nodes with no dependencies + queue.Enqueue(node); + } + // The queue basically stores all input nuclei? + + List sortedOrder = new(); + while (queue.Count > 0) { + Nucleus current = queue.Dequeue(); + sortedOrder.Add(current); // Process the node + + if (current is Neuron neuron) { + foreach (Nucleus receiver in neuron.receivers) { + inDegree[receiver]--; + if (inDegree[receiver] == 0) // If all dependencies resolved + queue.Enqueue(receiver); + } + } + else if (current is Cluster cluster) { + foreach (Nucleus receiver in cluster.CollectReceivers()) { + inDegree[receiver]--; + if (inDegree[receiver] == 0) // If all dependencies resolved + queue.Enqueue(receiver); + } + } + } + + // Check for cycles in the graph + if (sortedOrder.Count != nodes.Count) + throw new InvalidOperationException("Graph is not a DAG; a cycle exists."); + + return sortedOrder; + } + + public override Nucleus Clone(ClusterPrefab parent) { + Cluster clone = new(this.prefab, parent); + + foreach (Synapse synapse in this.synapses) { + Synapse clonedSynapse = clone.AddSynapse(synapse.neuron); + clonedSynapse.weight = synapse.weight; + } + + foreach (Neuron output in this.outputs) { + foreach (Nucleus receiver in output.receivers) { + int ix = GetNucleusIndex(this.clusterNuclei.ToArray(), output); + if (ix < 0) + continue; + + if (clone.clusterNuclei[ix] is not Neuron clonedOutput) + continue; + + clonedOutput.AddReceiver(receiver); + } + } + + return clone; + } + + public override Nucleus ShallowCloneTo(Cluster parent) { + Cluster clone = new(this.prefab, parent) { + name = this.name, + clusterPrefab = this.clusterPrefab, + }; + + return clone; + } + + private static void RestoreAllExternalReceivers(Cluster clonedCluster, ClusterPrefab prefabParent, Cluster clonedParent) { + int clonedClusterIx = GetNucleusIndex(clonedParent.clusterNuclei, clonedCluster); + if (prefabParent.nuclei[clonedClusterIx] is not Cluster sourceCluster) + return; + + for (int nucleusIx = 0; nucleusIx < sourceCluster.clusterNuclei.Count; nucleusIx++) { + Nucleus sourceNucleus = sourceCluster.clusterNuclei[nucleusIx]; + if (sourceNucleus is not Neuron sourceNeuron) + continue; + + if (clonedCluster.clusterNuclei[nucleusIx] is not Neuron clonedNeuron) + continue; + + // copy the receivers (and thus synapses) from the source to the clone + foreach (Nucleus receiver in sourceNeuron.receivers) { + int ix = GetNucleusIndex(prefabParent.nuclei, receiver); + if (ix < 0 || ix >= clonedParent.clusterNuclei.Count) + continue; + + Nucleus clonedReceiver = clonedParent.clusterNuclei[ix]; + + // Find the synapse for the weight + float weight = 1; + foreach (Synapse synapse in receiver.synapses) { + // Find the weight for this synapse + if (synapse.neuron == sourceNucleus) { + weight = synapse.weight; + break; + } + } + + clonedNeuron.AddReceiver(clonedReceiver, weight); + // Debug.Log($"external: {clonedReceiver.name} receives from {clonedNeuron.name} {clonedNeuron.GetHashCode()}"); + } + } + } + + protected int GetNucleusIndex(Nucleus[] nuclei, Nucleus nucleus) { + for (int i = 0; i < nuclei.Length; i++) { + if (nucleus == nuclei[i]) + return i; + } + return -1; + } + + public static int GetNucleusIndex(List nuclei, Nucleus nucleus) { + int i = 0; + foreach (Nucleus nucleiElement in nuclei) { + //for (int i = 0; i < nuclei.Length; i++) { + if (nucleus == nucleiElement) + return i; + i++; + } + return -1; + } + + #endregion Init + + public ClusterPrefab prefab; + + + [SerializeReference] + public List clusterNuclei = new(); + // the nuclei sorted using topological sorting + // to ensure that the cluster is computer in the right order + public List sortedNuclei; + //public Dictionary nucleiDict = new(); + + public List _inputs = null; + public virtual List inputs { + get { + if (this._inputs == null) { + this._inputs = new(); + foreach (Nucleus nucleus in this.clusterNuclei) { + // inputs have no synapses + if (nucleus.synapses.Count == 0) + this._inputs.Add(nucleus); + } + ComputeOrders(); + } + return this._inputs; + } + } + + public Dictionary> computeOrders = new(); + private void ComputeOrders() { + foreach (Nucleus input in this._inputs) + computeOrders[input] = TopologicalSort2(input); + } + + private List TopologicalSort2(Nucleus startNode) { + Dictionary inDegree = new(); + HashSet visited = new(); + + // Initialize in-degrees and mark all nodes as unvisited + foreach (Nucleus node in this.clusterNuclei) + inDegree[node] = 0; + + // Calculate in-degrees for all nodes reachable from the start node + Queue queue = new Queue(); + queue.Enqueue(startNode); + visited.Add(startNode); + + while (queue.Count > 0) { + Nucleus current = queue.Dequeue(); + List receivers = null; + if (current is Neuron neuron) + receivers = neuron.receivers; + else if (current is Cluster cluster) + receivers = cluster.CollectReceivers(); + + // if (current is Neuron neuron) { + foreach (Nucleus receiver in receivers) { + if (!visited.Contains(receiver)) { + visited.Add(receiver); + queue.Enqueue(receiver); + } + inDegree[receiver]++; + } + // } + } + + // Perform topological sort on all reachable nodes + queue.Clear(); + foreach (Nucleus node in visited) { + if (inDegree[node] == 0) + queue.Enqueue(node); + } + + List sortedOrder = new List(); + while (queue.Count > 0) { + Nucleus current = queue.Dequeue(); + sortedOrder.Add(current); // Process the node + + List receivers = null; + if (current is Neuron neuron) + receivers = neuron.receivers; + else if (current is Cluster cluster) + receivers = cluster.CollectReceivers(); + + //if (current is Neuron neuron) { + + foreach (Nucleus receiver in receivers) { + if (visited.Contains(receiver)) { + inDegree[receiver]--; + if (inDegree[receiver] == 0) // If all dependencies resolved + queue.Enqueue(receiver); + } + } + //} + } + + // Check for cycles in the graph + if (sortedOrder.Count != visited.Count) + throw new InvalidOperationException("Graph is not a DAG; a cycle exists."); + + return sortedOrder; + } + + public virtual Neuron defaultOutput {//=> this.nuclei[0] as Nucleus; + get { + if (this.clusterNuclei.Count > 0) + return this.clusterNuclei[0] as Neuron; + return null; + } + } + protected List _outputs = null; + public List outputs { + get { + if (this._outputs == null) { + this._outputs = new(); + foreach (Nucleus nucleus in this.clusterNuclei) { + if (nucleus is Neuron neuron) // && neuron.receivers.Count == 0) + this._outputs.Add(neuron); + } + } + return this._outputs; + } + } + + public bool TryGetNucleus(string nucleusName, out Nucleus foundNucleus) { + foreach (Nucleus receptor in this.clusterNuclei) { + if (receptor is Nucleus nucleus) + if (nucleus.name == nucleusName) { + foundNucleus = nucleus; + return true; + } + } + foundNucleus = null; + return false; + } + + public Nucleus GetNucleus(string nucleusName) { + int dotPosition = nucleusName.IndexOf('.'); + if (dotPosition >= 0) { + string clusterName = nucleusName[..dotPosition]; + string clusterName0 = clusterName + ": 0"; + foreach (Nucleus nucleus in this.clusterNuclei) { + if (nucleus is Cluster cluster) { + if (cluster.name == clusterName || cluster.name == clusterName0) { + string subNucleusName = nucleusName[(dotPosition + 1)..]; + return cluster.GetNucleus(subNucleusName); + } + } + } + return null; + } + else { + string nucleusName0 = nucleusName + ": 0"; + foreach (Nucleus nucleus in this.clusterNuclei) { + if (nucleus is IReceptor receptor) { + if (nucleus.name == nucleusName | nucleus.name == nucleusName0) + return nucleus; + } + else if (nucleus.name == nucleusName) + return nucleus; + } + return null; + } + } + + // [Obsolete("Use GetNucleus instead")] + // public IReceptor GetReceptor(string receptorName) { + // return GetNucleus(receptorName) as IReceptor; + // } + + #region Receivers + + public virtual List CollectReceivers() { + List receivers = new(); + foreach (Neuron output in this.outputs) { + foreach (Nucleus receiver in output.receivers) { + // Only add receivers outside this cluster + if (receiver.clusterPrefab != this.prefab) + receivers.Add(receiver); + //receivers.AddRange(output.receivers); + } + } + return receivers; + } + + #endregion Receivers + + #region Update + + public void UpdateFromNucleus(Nucleus startNucleus) { + // no bias+synapse input state calculation for now... + + if (this.computeOrders.ContainsKey(startNucleus) == false) { + //Debug.LogError($"{this.name} compute orders does not contain an order for {startNucleus.name}"); + return; + } + + List computeOrder = this.computeOrders[startNucleus]; + if (startNucleus.trace) + Debug.Log($"Update from {startNucleus.name}"); + foreach (Nucleus nucleus in computeOrder) { + nucleus.UpdateStateIsolated(); + if (startNucleus.trace && nucleus is Neuron neuron) + Debug.Log($" {nucleus.name}[{nucleus.GetHashCode()}] = {neuron.outputValue}"); + } + + // continue in parent + this.parent?.UpdateFromNucleus(this); + + UpdateNuclei(); + } + + public override void UpdateStateIsolated() { + throw new Exception("Cluster should not be updated!"); + // float3 sum = this.bias; + + // //Applying the weight factors + // foreach (Synapse synapse in this.synapses) { + // if (lengthsq(synapse.neuron.outputValue) > 0) { + // sum += synapse.weight * synapse.neuron.outputValue; + // } + // } + + // foreach (Nucleus nucleus in this.sortedNuclei) + // nucleus.UpdateStateIsolated(); + + // UpdateNuclei(); + } + + public override void UpdateNuclei() { + foreach (Nucleus nucleus in this.clusterNuclei) + nucleus.UpdateNuclei(); + } + + #endregion Update + +} diff --git a/Cluster.cs.meta b/Cluster.cs.meta new file mode 100644 index 0000000..a10caff --- /dev/null +++ b/Cluster.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f13cdc4a175a9f379a00317ae68d8bea \ No newline at end of file diff --git a/ClusterPrefab.cs b/ClusterPrefab.cs new file mode 100644 index 0000000..760e8bb --- /dev/null +++ b/ClusterPrefab.cs @@ -0,0 +1,116 @@ +using System.Collections.Generic; +using UnityEngine; + +[CreateAssetMenu(menuName = "Passer/Cluster")] +public class ClusterPrefab : ScriptableObject { + // The ScriptableObject asset from which the runtime object has been created + + [SerializeReference] + public List nuclei = new(); + + + public virtual Nucleus output => this.nuclei[0] as Nucleus; + + public List _inputs = null; + public virtual List inputs { + get { + if (this._inputs == null) { + this._inputs = new(); + foreach (Nucleus receptor in this.nuclei) { + if (receptor is Nucleus nucleus) { + // inputs have no incoming synapses yet. + if (nucleus.synapses.Count == 0) + this._inputs.Add(nucleus); + } + } + } + return this._inputs; + } + } + private List _outputs = null; + public List outputs { + get { + if (this._outputs == null) + RefreshOutputs(); + return this._outputs; + } + } + public void RefreshOutputs() { + this._outputs = new(); + foreach (Nucleus nucleus in this.nuclei) { + if (nucleus is Neuron neuron && neuron.receivers.Count == 0) + this._outputs.Add(nucleus); + } + } + + public Nucleus GetNucleus(string nucleusName) { + foreach (Nucleus nucleus in this.nuclei) { + if (nucleus.name == nucleusName) + return nucleus; + } + return null; + } + + // Call this function to ensure that there is at least one nucleus + // This is an invariant and should be ensured before the nucleus is used + // because output requires it. + public void EnsureInitialization() { + nuclei ??= new List(); + if (nuclei.Count == 0) + new Neuron(this, "Output"); // Every cluster should have at least 1 neuron + } + + public void GarbageCollection() { + HashSet visitedNuclei = new(); + foreach (Nucleus output in this.outputs) + MarkNuclei(visitedNuclei, output); + //Debug.Log($"Garbage collection found {visitedNuclei.Count} Nuclei"); + this.nuclei.RemoveAll(nucleus => visitedNuclei.Contains(nucleus) == false); + } + + public void MarkNuclei(HashSet visitedNuclei, Nucleus nucleus) { + if (nucleus is null) + return; + + if (nucleus.parent != null && nucleus.parent.prefab != this) + visitedNuclei.Add(nucleus.parent); + else + visitedNuclei.Add(nucleus); + if (nucleus.synapses != null) { + HashSet visitedSynapses = new(); + foreach (Synapse synapse in nucleus.synapses) { + if (synapse != null && synapse.neuron != null) { + visitedSynapses.Add(synapse); + if (synapse.neuron is Nucleus synapse_nucleus) + MarkNuclei(visitedNuclei, synapse_nucleus); + } + } + nucleus.synapses.RemoveAll(synapse => visitedSynapses.Contains(synapse) == false); + } + if (nucleus is Neuron neuron && neuron.receivers != null) { + HashSet visitedReceivers = new(); + foreach (Nucleus receiver in neuron.receivers) { + if (receiver != null && receiver != null) { + visitedReceivers.Add(receiver); + visitedNuclei.Add(receiver); + } + } + neuron.receivers.RemoveAll(receiver => visitedReceivers.Contains(receiver) == false); + } + } + + public virtual void UpdateNuclei() { + foreach (Nucleus nucleus in this.nuclei) + nucleus.UpdateNuclei(); + } + + public int GetNucleusIndex(Nucleus receiver) { + int ix = 0; + foreach (Nucleus nucleus in this.nuclei) { + if (receiver == nucleus) + return ix; + ix++; + } + return -1; + } +} diff --git a/ClusterPrefab.cs.meta b/ClusterPrefab.cs.meta new file mode 100644 index 0000000..ee35e0b --- /dev/null +++ b/ClusterPrefab.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 60a957541c24c57e78018c202ebb1d9b \ No newline at end of file diff --git a/ClusterReceptor.cs b/ClusterReceptor.cs new file mode 100644 index 0000000..ac65e7a --- /dev/null +++ b/ClusterReceptor.cs @@ -0,0 +1,214 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using Unity.Mathematics; +using static Unity.Mathematics.math; +using System.Linq; + +[Serializable] +public class ClusterReceptor : Cluster, IReceptor { + public ClusterReceptor(ClusterPrefab prefab, Cluster parent, string name) : base(prefab, parent) { + this.name = name; + this.array = new NucleusArray(this); + if (this.name.IndexOf(":") < 0) + this.name += ": 0"; + + } + public ClusterReceptor(ClusterPrefab prefab, ClusterPrefab parent, string name) : base(prefab, parent) { + this.name = name; + this.array = new NucleusArray(this); + } + + public string GetName() { + return this.name; + } + + public override Nucleus ShallowCloneTo(Cluster parent) { + ClusterReceptor clone = new(this.prefab, parent, this.name) { + clusterPrefab = this.clusterPrefab, + }; + + return clone; + } + + public override Nucleus Clone(ClusterPrefab parent) { + ClusterReceptor clone = new(prefab, parent, this.name) { + array = this._array + }; + + foreach (Synapse synapse in this.synapses) { + Synapse clonedSynapse = clone.AddSynapse(synapse.neuron); + clonedSynapse.weight = synapse.weight; + } + + this._outputs = null; // Make sure the output are regenerated + foreach (Neuron output in this.outputs) { + int ix = GetNucleusIndex(this.clusterNuclei, output); + if (ix < 0 || clone.clusterNuclei[ix] is not Neuron clonedOutput) + continue; + + foreach (Nucleus receiver in output.receivers) + clonedOutput.AddReceiver(receiver); + } + return clone; + } + + public override List CollectReceivers() { + List receivers = new(); + foreach (Nucleus element in this.nucleiArray) { + if (element is not Cluster clusterElement) + continue; + + foreach (Nucleus outputNucleus in clusterElement.clusterNuclei) { + if (outputNucleus is not Neuron output) + continue; + + // this should be clusterElement.outputs, + // but outputs is not updated when correctly and may contain old data... + foreach (Nucleus receiver in output.receivers) { + // Only add receivers outside clusterElement cluster + if (receiver.clusterPrefab != clusterElement.prefab && + receivers.Contains(receiver) == false) + receivers.Add(receiver); + } + } + } + return receivers; + } + + [SerializeReference] + private NucleusArray _array; + public NucleusArray array { + set { _array = value; } + } + + public Nucleus[] nucleiArray { + get { return _array.nuclei; } + set { _array.nuclei = value; } + } + + public void AddReceptorElement(ClusterPrefab prefab) { + IReceptorHelpers.AddReceptorElement(this, prefab); + } + + public void RemoveReceptorElement() { + IReceptorHelpers.RemoveReceptorElement(this); + } + + public void AddArrayReceiver(Nucleus receiverToAdd, float weight = 1) { + IReceptorHelpers.AddArrayReceiver(this, receiverToAdd, weight); + } + + public override void UpdateStateIsolated() { + // Clusters don't do anything, + // The nuclei in them do the work + // and should be called directly, not from the cluster + } + + public override void UpdateNuclei() { + foreach (Nucleus nucleus in this.clusterNuclei) + nucleus.UpdateNuclei(); + } + + public override void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = null) { + Debug.LogError("Process Stimulus was called on clusterreceptor without a neuron specified"); + } + + private readonly Dictionary thingReceivers = new(); + + public virtual void ProcessStimulus(Neuron input, Vector3 inputValue, int thingId = 0, string thingName = null) { + CleanupReceivers(); + + if (!thingReceivers.TryGetValue(thingId, out ClusterReceptor selectedReceiver)) + selectedReceiver = FindReceiver2(thingId, inputValue, input); + if (selectedReceiver == null) + return; + + if (thingName != null) { + string baseName = selectedReceiver.name; + int colonPos = selectedReceiver.name.IndexOf(":"); + if (colonPos > 0) + baseName = selectedReceiver.name[..colonPos]; + selectedReceiver.name = baseName + ": " + thingName; + } + + int inputIx = GetNucleusIndex(this.clusterNuclei, input); + if (inputIx < 0) + return; + + if (selectedReceiver.clusterNuclei[inputIx] is Neuron selectedNeuron) + selectedNeuron.ProcessStimulusDirect(inputValue); + } + + private ClusterReceptor FindReceiver2(int thingId, float3 inputValue, Neuron input) { + // No existing nucleus for this thing + ClusterReceptor selectedReceiver = null; + float selectedMagnitude = 0; + foreach (ClusterReceptor receiver in this.nucleiArray.Cast()) { + if (thingReceivers.ContainsValue(receiver) == false) { + // We found an unusued receiver + thingReceivers.Add(thingId, receiver); + return receiver; + } + else if (receiver.defaultOutput.isSleeping) { + // A sleeping receiver is not active and can therefore always be used + thingReceivers.Add(thingId, receiver); + receiver.bias = float3(0, 0, 0); + return receiver; + } + else if (selectedReceiver == null) { + // If we haven't found a receiver yet, just start by taking the first + selectedReceiver = receiver; + selectedMagnitude = length(selectedReceiver.defaultOutput.outputValue); + } + // Look for the receiver with the lowest output magnitude + else { + float magnitude = length(receiver.defaultOutput.outputValue); + + if (length(receiver.defaultOutput.outputValue) < selectedMagnitude) { + selectedReceiver = receiver; + selectedMagnitude = length(selectedReceiver.defaultOutput.outputValue); + } + } + } + if (selectedReceiver != null) { + // To re-initialize the cluster (esp. memory cells) + // we update the cluster neuron twice. + // Bit of a hack..... + int inputIx = GetNucleusIndex(this.clusterNuclei, input); + if (inputIx >= 0) { + if (selectedReceiver.clusterNuclei[inputIx] is Neuron selectedNeuron) + selectedNeuron.ProcessStimulusDirect(inputValue); + } + + // Replace the receiver + // Find the thingId current associated with the receiver + int keyToRemove = thingReceivers.FirstOrDefault(r => r.Value.Equals(selectedReceiver)).Key; + if (keyToRemove != 0 || thingReceivers.ContainsKey(keyToRemove)) + thingReceivers.Remove(keyToRemove); + // And add the new association + thingReceivers.Add(thingId, selectedReceiver); + } + return selectedReceiver; + } + + + private void CleanupReceivers() { + // Remove a thing-receiver connection when the nucleus is inactive + List receiversToRemove = new(); + foreach (KeyValuePair item in thingReceivers) { + if (item.Value != null && item.Value.defaultOutput.isSleeping) + receiversToRemove.Add(item.Key); + } + foreach (int thingId in receiversToRemove) { + Nucleus selectedReceiver = thingReceivers[thingId]; + + thingReceivers.Remove(thingId); + + int colonPos = selectedReceiver.name.IndexOf(":"); + if (colonPos > 0) + selectedReceiver.name = selectedReceiver.name[..colonPos]; + + } + } +} \ No newline at end of file diff --git a/ClusterReceptor.cs.meta b/ClusterReceptor.cs.meta new file mode 100644 index 0000000..027f164 --- /dev/null +++ b/ClusterReceptor.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4f64f5d72a422a7c8bb9ace598432aad \ No newline at end of file diff --git a/Editor.meta b/Editor.meta new file mode 100644 index 0000000..090b3ac --- /dev/null +++ b/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3aedf57a50b6dfa46a59457c87b8ef9d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/BrainEditorWindow.cs b/Editor/BrainEditorWindow.cs new file mode 100644 index 0000000..11bba19 --- /dev/null +++ b/Editor/BrainEditorWindow.cs @@ -0,0 +1,365 @@ +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.Linq; + +// Simple DAG data model +[System.Serializable] +public class DagNode { + public int id; + public string title; + public Vector2 position; + public float radius = 20f; // circle radius +} + +[System.Serializable] +public class DagEdge { + public int fromId; + public int toId; +} + +public class BrainEditorWindow : EditorWindow { + readonly List nodes = new(); + readonly List edges = new(); + + Vector2 pan = Vector2.zero; + float zoom = 1.0f; + const float minZoom = 0.5f; + const float maxZoom = 2.0f; + + // Vector2 dragStart; + // bool draggingNode = false; + // int draggingNodeId = -1; + + private readonly System.Type acceptedType = typeof(ClusterPrefab); + + [MenuItem("Window/Brain Viewer")] + public static void ShowWindow() { + var w = GetWindow("Brain Viewer"); + w.minSize = new Vector2(500, 300); + } + + void OnEnable() { + // if (nodes.Count == 0) + // CreateSampleGraph(); + + + // Register callback so window updates when selection changes + Selection.selectionChanged += OnSelectionChanged; + RefreshSelection(); + ComputeLeftToRightLayout(); + } + + private void OnDisable() { + Selection.selectionChanged -= OnSelectionChanged; + } + + private void OnSelectionChanged() { + RefreshSelection(); + ComputeLeftToRightLayout(); + Repaint(); + } + + private void RefreshSelection() { + ClusterPrefab prefab = Selection.activeObject as ClusterPrefab; + if (prefab != null && acceptedType.IsAssignableFrom(prefab.GetType())) { + GenerateGraph(prefab); + } + } + + private void GenerateGraph(ClusterPrefab prefab) { + nodes.Clear(); + edges.Clear(); + + int ix = 0; + foreach (Nucleus nucleus in prefab.nuclei) { + nodes.Add(new DagNode() { id = ix, title = nucleus.name }); + if (nucleus is Neuron neuron) { + foreach (Nucleus receiver in neuron.receivers) { + int receiverIx = prefab.GetNucleusIndex(receiver); + edges.Add(new DagEdge() { fromId = ix, toId = receiverIx }); + } + } + ix++; + } + } + + + // void CreateSampleGraph() { + // nodes.Clear(); + // edges.Clear(); + + // nodes.Add(new DagNode() { id = 0, title = "In1" }); + // nodes.Add(new DagNode() { id = 1, title = "In2" }); + // nodes.Add(new DagNode() { id = 2, title = "A" }); + // nodes.Add(new DagNode() { id = 3, title = "B" }); + // nodes.Add(new DagNode() { id = 4, title = "C" }); + // nodes.Add(new DagNode() { id = 5, title = "Out1" }); + // nodes.Add(new DagNode() { id = 6, title = "Out2" }); + + // edges.Add(new DagEdge() { fromId = 0, toId = 2 }); + // edges.Add(new DagEdge() { fromId = 1, toId = 2 }); + // edges.Add(new DagEdge() { fromId = 2, toId = 3 }); + // edges.Add(new DagEdge() { fromId = 2, toId = 4 }); + // edges.Add(new DagEdge() { fromId = 3, toId = 5 }); + // edges.Add(new DagEdge() { fromId = 4, toId = 6 }); + // } + + void OnGUI() { + HandleInput(); + + Rect rect = new(0, 0, position.width, position.height); + EditorGUI.DrawRect(rect, new Color(0.11f, 0.11f, 0.11f)); + + // compute window center + Vector2 windowCenter = new(position.width / 2f, position.height / 2f); + + // compute graph bounds center (in graph space) + Rect bounds = GetGraphBounds(); + Vector2 graphCenter = bounds.center; + + // compute autoPan that recenters the graph (does not modify node positions) + Vector2 autoPan = -graphCenter; // moves graph center to origin + // total translation = windowCenter + autoPan + user pan + Matrix4x4 oldMatrix = GUI.matrix; + GUI.matrix = Matrix4x4.TRS(windowCenter + autoPan + pan, Quaternion.identity, Vector3.one * zoom) * + Matrix4x4.TRS(-windowCenter, Quaternion.identity, Vector3.one); + + + // Draw edges first + foreach (DagEdge e in edges) { + DagNode from = GetNodeById(e.fromId); + DagNode to = GetNodeById(e.toId); + if (from == null || to == null) continue; + DrawEdgeCircleNodes(from, to); + } + + // Draw nodes (circles) + foreach (DagNode n in nodes) + DrawNucleus(n); + + GUI.matrix = oldMatrix; + + // Footer toolbar + GUILayout.FlexibleSpace(); + EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); + if (GUILayout.Button("Fit", EditorStyles.toolbarButton)) FitToView(); + if (GUILayout.Button("Layout LR", EditorStyles.toolbarButton)) ComputeLeftToRightLayout(); + EditorGUILayout.EndHorizontal(); + } + + void HandleInput() { + Event e = Event.current; + + // Zoom with scroll + if (e.type == EventType.ScrollWheel) { + float oldZoom = zoom; + float delta = -e.delta.y * 0.01f; + zoom = Mathf.Clamp(zoom + delta, minZoom, maxZoom); + Vector2 mouse = e.mousePosition; + pan += (mouse - new Vector2(position.width / 2, position.height / 2)) * (1 - zoom / oldZoom); + e.Use(); + } + + // Pan with middle or right+ctrl drag + if (e.type == EventType.MouseDrag && (e.button == 2 || (e.button == 1 && e.control))) { + pan += e.delta; + e.Use(); + } + } + + DagNode GetNodeById(int id) => nodes.FirstOrDefault(x => x.id == id); + List GetIncomingEdges(DagNode node) { + List incoming = new(); + foreach (DagEdge e in edges) { + if (e.toId == node.id) + incoming.Add(e); + } + return incoming; + } + List GetOutgoingEdges(DagNode node) { + List outgoing = new(); + foreach (DagEdge e in edges) { + if (e.fromId == node.id) + outgoing.Add(e); + } + return outgoing; + } + + void DrawNucleus(DagNode n) { + Vector3 position = n.position; + + Handles.color = Color.white * 0.9f; + Handles.DrawSolidDisc(n.position, Vector3.forward, n.radius); + + if (GetIncomingEdges(n).Count == 0) + DrawArrowHead(n.position - new Vector2(n.radius + 10, 0), n.position - new Vector2(n.radius + 5, 0), 10f / zoom, 12f / zoom, Color.white); + if (GetOutgoingEdges(n).Count == 0) + DrawArrowHead(n.position + new Vector2(n.radius + 10, 0), n.position + new Vector2(n.radius + 15, 0), 10f / zoom, 12f / zoom, Color.white); + + Handles.color = Color.white; + GUIStyle style = new(EditorStyles.label) { + alignment = TextAnchor.UpperCenter, + normal = { textColor = Color.white }, + fontStyle = FontStyle.Bold, + }; + Vector3 labelPos = position - Vector3.down * (n.radius + 10f); // below disc along up axis + Handles.Label(labelPos, n.title, style); + } + + void DrawEdgeCircleNodes(DagNode from, DagNode to) { + Vector2 a = from.position; + Vector2 b = to.position; + if (a == b) return; + + Handles.color = Color.white * 0.9f; + Handles.DrawLine(from.position, to.position); + + // Vector2 dir = (b - a).normalized; + // Vector2 start = a + dir * from.radius; + // Vector2 end = b - dir * to.radius; + + //DrawArrowHead(end - dir * 2f, end, 10f / zoom, 12f / zoom, Color.white); + + } + + void DrawArrowHead(Vector2 from, Vector2 to, float headWidth, float headLength, Color color) { + Vector2 dir = (to - from).normalized; + if (dir == Vector2.zero) return; + Vector2 right = new Vector2(-dir.y, dir.x); + + Vector3 p1 = to; + Vector3 p2 = to - dir * headLength + right * headWidth * 0.5f; + Vector3 p3 = to - dir * headLength - right * headWidth * 0.5f; + + Handles.color = color; + Handles.DrawAAConvexPolygon(p1, p2, p3); + } + + // Left-to-right layered layout (sources on the left, sinks on the right) + void ComputeLeftToRightLayout() { + // build adjacency and indegree + var adj = nodes.ToDictionary(n => n.id, n => new List()); + var indeg = nodes.ToDictionary(n => n.id, n => 0); + foreach (var e in edges) { + if (!adj.ContainsKey(e.fromId) || !adj.ContainsKey(e.toId)) continue; + adj[e.fromId].Add(e.toId); + indeg[e.toId]++; + } + + // Kahn's algorithm to compute topological layers (horizontal layers) + Dictionary layer = new(); + Queue q = new(indeg.Where(kv => kv.Value == 0).Select(kv => kv.Key)); + foreach (var id in q) layer[id] = 0; + + while (q.Count > 0) { + int u = q.Dequeue(); + int l = layer[u]; + foreach (var v in adj[u]) { + // prefer placing v at least one layer after u + if (!layer.ContainsKey(v) || layer[v] < l + 1) layer[v] = l + 1; + indeg[v]--; + if (indeg[v] == 0) q.Enqueue(v); + } + } + + // Any unreachable nodes -> assign next layers + int maxLayer = layer.Count > 0 ? layer.Values.Max() : 0; + foreach (var n in nodes) { + if (!layer.ContainsKey(n.id)) { + maxLayer++; + layer[n.id] = maxLayer; + } + } + + // Group nodes by layer (left to right) + var layers = layer.GroupBy(kv => kv.Value).OrderBy(g => g.Key).Select(g => g.Select(x => x.Key).ToList()).ToList(); + + // Layout parameters (horizontal spacing drives left->right) + float hSpacing = 150f; + float vSpacing = 100f; + + // Place nodes: x increases with layer index, y spaced within layer + for (int li = 0; li < layers.Count; li++) { + var lst = layers[li]; + float totalHeight = (lst.Count - 1) * vSpacing; + for (int i = 0; i < lst.Count; i++) { + int id = lst[i]; + var n = GetNodeById(id); + if (n == null) continue; + float x = hSpacing + li * hSpacing; + float y = 400 - totalHeight / 2f + i * vSpacing; + // Debug.Log($"({li}, {i}) -> {x}, {y}"); + n.position = new Vector2(x, y); + } + } + + Repaint(); + } + + void FitToView() { + if (nodes.Count == 0) return; + // compute bounds including radii + Rect bounds = new Rect(nodes[0].position - Vector2.one * nodes[0].radius, Vector2.one * nodes[0].radius * 2f); + foreach (var n in nodes) + bounds = RectUnion(bounds, new Rect(n.position - Vector2.one * n.radius, Vector2.one * n.radius * 2f)); + + // center graph at origin (0,0) then set pan so it appears centered in window + Vector2 graphCenter = bounds.center; + // move nodes so center is at origin + for (int i = 0; i < nodes.Count; i++) + nodes[i].position -= graphCenter; + + // reset pan/zoom so centered + pan = Vector2.zero; + zoom = 1.0f; + Repaint(); + } + + + static Rect RectUnion(Rect a, Rect b) { + float xMin = Mathf.Min(a.xMin, b.xMin); + float xMax = Mathf.Max(a.xMax, b.xMax); + float yMin = Mathf.Min(a.yMin, b.yMin); + float yMax = Mathf.Max(a.yMax, b.yMax); + return Rect.MinMaxRect(xMin, yMin, xMax, yMax); + } + + Vector2 ScreenToGraph_old(Vector2 screenPos) { + Vector2 origin = new Vector2(position.width / 2, position.height / 2); + // invert the GUI.matrix transform (approx for current simple transforms) + return (screenPos - (origin + pan)) / zoom + origin * (1 - 1 / zoom); + } + Vector2 ScreenToGraph(Vector2 screenPos) { + Vector2 windowCenter = new Vector2(position.width / 2f, position.height / 2f); + Rect bounds = GetGraphBounds(); + Vector2 graphCenter = bounds.center; + Vector2 autoPan = -graphCenter; + // inverse of: screen -> translate by -(windowCenter+autoPan+pan), scale by 1/zoom, translate by windowCenter + return (screenPos - (windowCenter + autoPan + pan)) / zoom + windowCenter; + } + + + Rect GetGraphBounds() { + if (nodes == null || nodes.Count == 0) return new Rect(Vector2.zero, Vector2.one); + Rect bounds = new( + nodes[0].position - Vector2.one * nodes[0].radius, + 2f * nodes[0].radius * Vector2.one); + foreach (var n in nodes) + bounds = RectUnion(bounds, + new Rect(n.position - Vector2.one * n.radius, 2f * n.radius * Vector2.one)); + return bounds; + } + + + + int HitTestNode(Vector2 graphPos) { + // returns node id under point or -1 + for (int i = nodes.Count - 1; i >= 0; i--) { + var n = nodes[i]; + if ((graphPos - n.position).sqrMagnitude <= n.radius * n.radius) return n.id; + } + return -1; + } + +} diff --git a/Editor/BrainEditorWindow.cs.meta b/Editor/BrainEditorWindow.cs.meta new file mode 100644 index 0000000..5d8b61f --- /dev/null +++ b/Editor/BrainEditorWindow.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f041740900808273ab006e7d276a78e9 diff --git a/Editor/BrainPickerWindow.cs b/Editor/BrainPickerWindow.cs new file mode 100644 index 0000000..503bd10 --- /dev/null +++ b/Editor/BrainPickerWindow.cs @@ -0,0 +1,66 @@ +using UnityEditor; +using UnityEngine; +using System; +using System.Linq; + +public class ClusterPickerWindow : EditorWindow { + private Vector2 scroll; + private ClusterPrefab[] items = new ClusterPrefab[0]; + private Action onPicked; + private string search = ""; + + public static void ShowPicker(Action onPicked, string title = "Select Cluster") { + var w = CreateInstance(); + w.titleContent = new GUIContent(title); + w.minSize = new Vector2(360, 320); + w.onPicked = onPicked; + w.RefreshList(); + w.ShowModalUtility(); // modal dialog + } + + private void OnEnable() => RefreshList(); + + private void RefreshList() { + var guids = AssetDatabase.FindAssets("t:ClusterPrefab"); + items = guids + .Select(g => AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(g))) + .Where(b => b != null) + .OrderBy(b => b.name) + .ToArray(); + } + + private void OnGUI() { + EditorGUILayout.Space(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Choose Cluster:", EditorStyles.boldLabel); + if (GUILayout.Button("Refresh", GUILayout.Width(80))) RefreshList(); + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.Space(); + search = EditorGUILayout.TextField(search); + + EditorGUILayout.Space(); + scroll = EditorGUILayout.BeginScrollView(scroll); + foreach (var it in items) { + if (!string.IsNullOrEmpty(search) && it.name.IndexOf(search, StringComparison.OrdinalIgnoreCase) < 0) + continue; + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(EditorGUIUtility.ObjectContent(it, typeof(ClusterPrefab)), GUILayout.Height(20)); + if (GUILayout.Button("Select", GUILayout.Width(70))) { + onPicked?.Invoke(it); + Close(); + return; + } + EditorGUILayout.EndHorizontal(); + } + EditorGUILayout.EndScrollView(); + + EditorGUILayout.Space(); + EditorGUILayout.BeginHorizontal(); + if (GUILayout.Button("Cancel")) { onPicked?.Invoke(null); Close(); } + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + } +} diff --git a/Editor/BrainPickerWindow.cs.meta b/Editor/BrainPickerWindow.cs.meta new file mode 100644 index 0000000..b2de114 --- /dev/null +++ b/Editor/BrainPickerWindow.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9197e2d322d23b5798ab4aef729815b0 \ No newline at end of file diff --git a/Editor/ClusterInspector.cs b/Editor/ClusterInspector.cs new file mode 100644 index 0000000..5aeb9c9 --- /dev/null +++ b/Editor/ClusterInspector.cs @@ -0,0 +1,1100 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEditor; + +using UnityEngine; +using UnityEngine.UIElements; +using Unity.Mathematics; +using static Unity.Mathematics.math; + +[CustomEditor(typeof(ClusterPrefab))] +public class ClusterInspector : Editor { + protected static VisualElement mainContainer; + protected static VisualElement inspectorContainer; + + protected bool breakOnWake = false; + + #region Start + + public override VisualElement CreateInspectorGUI() { + ClusterPrefab prefab = target as ClusterPrefab; + + if (prefab != null) + prefab.EnsureInitialization(); + + serializedObject.Update(); + + VisualElement root = new(); + CreateInspector(root, prefab, prefab.output, null); + + serializedObject.ApplyModifiedProperties(); + return root; + } + + public static GraphView CreateInspector(VisualElement root, ClusterPrefab cluster, Nucleus output, GameObject gameObject) { + root.style.paddingLeft = 0; + root.style.paddingRight = 0; + root.style.paddingTop = 0; + root.style.paddingBottom = 0; + + root.styleSheets.Add(Resources.Load("GraphStyles")); + + // does the main container have added value? + // is just is like the root + mainContainer = new() { + style = { + height = 450, + flexDirection = FlexDirection.Row + } + }; + GraphView graph = new(cluster); + graph.style.flexGrow = 1; + + inspectorContainer = new VisualElement { + name = "inspector", + style = { + width = 300, + flexGrow = 0 + } + }; + + mainContainer.Add(graph); + mainContainer.Add(inspectorContainer); + root.Add(mainContainer); + + graph.SetGraph(gameObject, output, inspectorContainer); + + return graph; + } + + + public class GraphView : VisualElement { + readonly ClusterPrefab prefab; + SerializedObject serializedBrain; + Nucleus currentNucleus; + GameObject gameObject; + private List layers = new(); + private readonly Dictionary neuroidPositions = new(); + private bool expandArray = false; + + ClusterPrefab prefabAsset; + readonly PopupField outputsField; + + public GraphView(ClusterPrefab prefab) { + this.prefab = prefab; + + name = "content"; + style.flexGrow = 1; + + IMGUIContainer graphContainer = new(OnIMGUI); + graphContainer.style.position = Position.Absolute; + graphContainer.style.left = 0; graphContainer.style.top = 0; + graphContainer.style.right = 0; graphContainer.style.bottom = 0; + graphContainer.pickingMode = PickingMode.Position; + graphContainer.focusable = true; + Add(graphContainer); + + VisualElement outputContainer = new() { + style = { + flexDirection = FlexDirection.Row, + alignItems = Align.Center, + } + }; + + List names = this.prefab.outputs.Select(output => output.name).ToList(); + if (names.Count > 0 && names.First() != null) { + outputsField = new(names, names.First()) { + style = { flexGrow = 1 } + }; + outputsField.RegisterValueChangedCallback(evt => OnOutputChanged(evt.newValue)); + outputContainer.Add(outputsField); + } + + Button addButton = new(() => OnAddClusterOutput()) { + text = "Add" + }; + outputContainer.Add(addButton); + + Add(outputContainer); + + // Subscribe when added to panel (editor UI ready) + RegisterCallback(evt => Subscribe()); + RegisterCallback(evt => Unsubscribe()); + } + + void OnOutputChanged(string outputName) { + if (this.currentNucleus.parent != null) + // Get nucleus in the parent instance + this.currentNucleus = this.currentNucleus.parent.GetNucleus(outputName); + else + // Get nucleus in the prefab + this.currentNucleus = this.prefab.GetNucleus(outputName); + } + + void OnAddClusterOutput() { + Nucleus newOutput = new Neuron(this.prefab, "New Output"); + this.prefab.RefreshOutputs(); + outputsField.choices = this.prefab.outputs.Select(output => output.name).ToList(); + outputsField.value = newOutput.name; + + this.currentNucleus = newOutput; + } + + bool subscribed = false; + void Subscribe() { + if (subscribed) return; + SceneView.duringSceneGui += OnSceneGUI; + subscribed = true; + SceneView.RepaintAll(); + } + + void Unsubscribe() { + if (!subscribed) return; + SceneView.duringSceneGui -= OnSceneGUI; + subscribed = false; + } + + public void SetGraph(GameObject gameObject, Nucleus nucleus, VisualElement inspectorContainer) { + this.gameObject = gameObject; + //this.cluster = brain; + if (Application.isPlaying == false) + this.serializedBrain = new SerializedObject(this.prefab); + this.currentNucleus = nucleus; + Rebuild(inspectorContainer); + } + + void Rebuild(VisualElement inspectorContainer) { + BuildLayers(); + + if (this.currentNucleus == null) { + inspectorContainer.Clear(); + return; + } + + string path = AssetDatabase.GetAssetPath(this.prefab); // or known path + this.prefabAsset = AssetDatabase.LoadAssetAtPath(path); + if (this.prefabAsset == null) { + // create in memory save if it doesn't exist + this.prefabAsset = CreateInstance(); + //Debug.LogError("Cluster Prefab is not found on disk"); + } + DrawInspector(inspectorContainer); + } + + private void BuildLayers() { + // A temporary list to track what's been added to layers + this.layers = new(); + int layerIx = 0; + + Nucleus selectedNucleus = this.currentNucleus; + if (selectedNucleus == null) + return; + NeuroidLayer currentLayer = new() { ix = layerIx }; + + if (selectedNucleus is Neuron selectedNeuron && selectedNeuron.receivers != null) { + foreach (Nucleus receiver in selectedNeuron.receivers) { + Nucleus outputNeuroid = receiver; + if (outputNeuroid != null) { + AddToLayer(currentLayer, outputNeuroid); + // Debug.Log($"layer {layerIx} nucleus {outputNeuroid.name}"); + } + } + } + if (currentLayer.neuroids.Count > 0) { + this.layers.Add(currentLayer); + layerIx++; + currentLayer = new() { ix = layerIx }; + } + + AddToLayer(currentLayer, selectedNucleus); + this.layers.Add(currentLayer); + // Debug.Log($"layer {layerIx} nucleus {selectedNucleus.name}"); + + layerIx++; + currentLayer = new() { ix = layerIx }; + + if (selectedNucleus.synapses != null) { + foreach (Synapse synapse in selectedNucleus.synapses) { + Nucleus input = synapse.neuron; + AddToLayer(currentLayer, input); + // Debug.Log($"layer {layerIx} nucleus {input.name}"); + } + } + if (currentLayer.neuroids.Count > 0) { + this.layers.Add(currentLayer); + } + } + + private void AddToLayer(NeuroidLayer layer, Nucleus nucleus) { + if (nucleus == null) + return; + layer.neuroids.Add(nucleus); + //nucleus.layerIx = layer.ix; + // Store its position + Vector2Int neuroidPosition = new(layer.ix, layer.neuroids.Count - 1); + neuroidPositions[nucleus] = neuroidPosition; + + } + + + public void OnIMGUI() { + if (currentNucleus == null) + return; + + if (Application.isPlaying == false) + serializedBrain.Update(); + + Handles.BeginGUI(); + DrawGraph(); + Handles.EndGUI(); + + } + + private void DrawGraph() { + float size = 20; + Vector3 position = new(150, 210, 0); + + DrawReceivers(this.currentNucleus, position, size); + DrawSynapses(this.currentNucleus, position, size); + + // Draw selected Nucleus + if (expandArray) { + if (this.currentNucleus is IReceptor receptor1) { + float maxValue = 0; + foreach (Nucleus nucleus in receptor1.nucleiArray) { + if (nucleus is Neuron neuron) { + float value = length(neuron.outputValue); + if (value > maxValue) + maxValue = value; + } + } + + float spacing = 400f / receptor1.nucleiArray.Count(); + float margin = 10 + spacing / 2; + float xMin = 150 - size; + float xMax = 150 + size; + float yMin = 10 + margin - size / 2; + float yMax = 400 - margin + size; + Vector3[] verts = new Vector3[4] { + new(xMin, yMin, 0), + new(xMax, yMin, 0), + new(xMax, yMax, 0), + new(xMin, yMax, 0) + }; + Handles.color = Color.black; + Handles.DrawAAConvexPolygon(verts); + int row = 0; + foreach (Nucleus nucleus in receptor1.nucleiArray) { + Vector3 pos = new(150, margin + row * spacing, 0.0f); + Handles.color = Color.white; + // The selected nucleus highlight ring + Handles.DrawSolidDisc(pos, Vector3.forward, size + 2); + DrawNucleus(nucleus, pos, maxValue, size); + row++; + } + GUIStyle style = new(EditorStyles.label) { + alignment = TextAnchor.UpperCenter, + normal = { textColor = Color.white }, + fontStyle = FontStyle.Bold, + }; + Vector3 labelPos = new(150, yMax + size + 5, 0); + string receptorName = receptor1.GetName(); + int colonPos = receptorName.IndexOf(":"); + if (colonPos > 0) { + string baseName = receptorName[..colonPos]; + Handles.Label(labelPos, baseName, style); + } + else + Handles.Label(labelPos, receptorName, style); + } + else { + Handles.color = Color.white; + // The selected nucleus highlight ring + Handles.DrawSolidDisc(position, Vector3.forward, size + 2); + float maxValue = 1; + if (this.currentNucleus is Neuron neuron) + maxValue = length(neuron.outputValue); + else if (this.currentNucleus is Cluster cluster) + maxValue = length(cluster.defaultOutput.outputValue); + + DrawNucleus(this.currentNucleus, position, maxValue, 20); + + } + } + else { + Handles.color = Color.white; + // The selected nucleus highlight ring + Handles.DrawSolidDisc(position, Vector3.forward, size + 2); + float maxValue = 1; + if (this.currentNucleus is Neuron neuron) + maxValue = length(neuron.outputValue); + else if (this.currentNucleus is Cluster cluster) + maxValue = length(cluster.defaultOutput.outputValue); + DrawNucleus(this.currentNucleus, position, maxValue, 20); + } + } + + private void DrawReceivers(Nucleus nucleus, Vector3 parentPos, float size) { + List receivers; + if (nucleus is Neuron neuron) + receivers = neuron.receivers; + else if (nucleus is Cluster cluster) + receivers = cluster.CollectReceivers(); + else + return; + + int nodeCount = receivers.Count(); //neuron != null ? neuron.receivers.Count() : 1; + + // Determine the maximum value in this layer + // This is used to 'scale' the output value colors of the nuclei + float maxValue = 0; + foreach (Nucleus receiver in receivers) { + if (receiver is Neuron neuroid) { + float value = length(neuroid.outputValue); + if (value > maxValue) + maxValue = value; + } + } + + // Determine the spacing of the nuclei in the layer + float spacing = 400f / nodeCount; + float margin = 10 + spacing / 2; + + int row = 0; + List drawnArrays = new(); + foreach (Nucleus receiver in receivers) { + if (receiver is Receptor receptor) { + if (drawnArrays.Contains(receptor.nucleiArray)) + continue; + drawnArrays.Add(receptor.nucleiArray); + } + + Nucleus receiverNucleus = receiver; + if (receiverNucleus == null) + continue; + + Vector3 pos = new(50, margin + row * spacing, 0.0f); + Handles.color = Color.white; + Handles.DrawLine(parentPos, pos); + + DrawNucleus(receiverNucleus, pos, maxValue, size); + row++; + } + } + + private void DrawSynapses(Nucleus nucleus, Vector3 parentPos, float size) { + int nodeCount = nucleus.synapses.Count; + + // Determine the maximum value in this layer + // This is used to 'scale' the output value colors of the nuclei + float maxValue = 0; + int neuronCount = 0; + List drawnArrays = new(); + foreach (Synapse synapse in nucleus.synapses) { + if (synapse.neuron == null) + continue; + + if (synapse.neuron is Receptor receptor) { + if (drawnArrays.Contains(receptor.nucleiArray)) + continue; + drawnArrays.Add(receptor.nucleiArray); + } + else if (synapse.neuron.parent is ClusterReceptor clusterReceptor) { + if (drawnArrays.Contains(clusterReceptor.nucleiArray)) + continue; + drawnArrays.Add(clusterReceptor.nucleiArray); + } + if (synapse.neuron is Neuron synapseNeuron) { + float value = length(synapseNeuron.outputValue) * synapse.weight; + // Debug.Log($"{synapse.nucleus.name}: {value} {length(synapse.nucleus.outputValue)} {synapse.weight}"); + if (value > maxValue) + maxValue = value; + } + neuronCount++; + } + + // Determine the spacing of the nuclei in the layer + float spacing = 400f / neuronCount; + float margin = 10 + spacing / 2; + + int row = 0; + drawnArrays = new(); + 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); + } + Vector3 pos = new(250, margin + row * spacing, 0.0f); + Handles.color = Color.white; + Handles.DrawLine(parentPos, pos); + Color color = Color.black; + if (Application.isPlaying) { + if (maxValue == 0 || !float.IsFinite(maxValue)) + maxValue = 1; + float brightness = 0; + if (synapse.neuron is Neuron synapseNeuron) + brightness = length(synapseNeuron.outputValue * synapse.weight) / maxValue; + color = new Color(brightness, brightness, brightness, 1f); + } + if (synapse.neuron.parent != null && synapse.neuron.parent != this.currentNucleus.parent) { + // the synapse nucleus is part of a subcluster + DrawNucleus(synapse.neuron.parent, pos, maxValue, size, color); + } + // else if (synapse.nucleus.cluster != null && synapse.nucleus.cluster != this.currentNucleus.cluster) { + // DrawNucleus(synapse.nucleus.parent, pos, maxValue, size, color); + // } + else { + DrawNucleus(synapse.neuron, pos, maxValue, size, color); + } + row++; + } + } + + private void DrawNucleus(Nucleus nucleus, Vector3 position, float maxValue, float size) { + Color color; + if (Application.isPlaying) { + float brightness = 0; + if (nucleus is Neuron neuron) + brightness = length(neuron.outputValue) / maxValue; + color = new Color(brightness, brightness, brightness, 1f); + } + else + color = Color.black; + DrawNucleus(nucleus, position, maxValue, size, color); + } + + private void DrawNucleus(Nucleus nucleus, Vector3 position, float maxValue, float size, Color color) { + if (nucleus is MemoryCell) { + Handles.color = Color.white; + Handles.DrawWireDisc(position + Vector3.right * 10, Vector3.forward, size); + } + + Handles.color = color; + Handles.DrawSolidDisc(position, Vector3.forward, size); + + Handles.color = Color.white; + // Position the label in front of the disc + Vector3 labelPosition = position + (Vector3.forward * 0.1f); + + GUIStyle style = new(EditorStyles.label) { + alignment = TextAnchor.MiddleCenter, + normal = { textColor = Color.white }, + fontStyle = FontStyle.Bold, + }; + + if (nucleus is IReceptor receptor1) { + if (expandArray) { + // Put array indices above elements + style.alignment = TextAnchor.LowerCenter; + Vector3 labelPos1 = position + Vector3.down * (size + 5); // below disc + int colonPos1 = nucleus.name.IndexOf(":"); + if (colonPos1 > 0) { + string extName = nucleus.name[(colonPos1 + 2)..]; + Handles.Label(labelPos1, extName, style); + } + } + else { + // draw the array size label + if (color.grayscale > 0.5f) + style.normal.textColor = Color.black; + else + style.normal.textColor = Color.white; + Handles.Label(labelPosition, receptor1.nucleiArray.Length.ToString(), style); + style.normal.textColor = Color.white; + } + } + + if (expandArray == false || nucleus is not IReceptor) { + // put name below nucleus + Vector3 labelPos = position - Vector3.down * (size + 5); // below neuron + style.alignment = TextAnchor.UpperCenter; + + int colonPos = nucleus.name.IndexOf(":"); + if (colonPos > 0 && colonPos < nucleus.name.Length - 2) { + // if it is an array, we should not show the :0 of the first element + string baseName = nucleus.name[..colonPos]; + Handles.Label(labelPos, baseName, style); + } + else + Handles.Label(labelPos, nucleus.name, style); + + } + + // Draw Cluster ring + if (nucleus is Cluster) { + Handles.color = Color.white; + Handles.DrawWireDisc(position, Vector3.forward, size + 5); + } + + // Tooltip + Rect neuronRect = new(position.x - size, position.y - size, size * 2, size * 2); + int id = GUIUtility.GetControlID(FocusType.Passive); + Event e = Event.current; + EventType et = e.GetTypeForControl(id); + if (e != null && neuronRect.Contains(e.mousePosition)) { + // Process Hover + HandleMouseHover(nucleus, neuronRect); + // Process click + if (e.type == EventType.MouseDown && e.button == 0) { + // Consume the event so the scene doesn't also handle it + e.Use(); + HandleClicked(nucleus); + } + } + } + + private void HandleMouseHover(Nucleus nucleus, Rect rect) { + GUIContent tooltip; + if (nucleus is Neuron neuron) { + tooltip = new( + $"{nucleus.name}" + + $"\nValue: {length(neuron.outputValue)}"); + } + else + tooltip = new($"{nucleus.name}"); + + Vector2 mousePosition = Event.current.mousePosition; + + // Display tooltip with some offset + Vector2 tooltipSize = GUI.skin.box.CalcSize(tooltip); + Rect tooltipRect = new Rect(mousePosition.x + 10, mousePosition.y + 10, tooltipSize.x, tooltipSize.y); + + GUI.Box(tooltipRect, tooltip); + } + + private void HandleClicked(Nucleus nucleus) { + if (nucleus == this.currentNucleus) { + if (nucleus is Receptor || nucleus is ClusterReceptor) + expandArray = !expandArray; + else + expandArray = false; + } + // else if (nucleus is ReceptorInstance receptor) { + // this.currentNucleus = receptor.receptor; + // expandArray = false; + // BuildLayers(); + // } + else { + this.currentNucleus = nucleus; + expandArray = false; + BuildLayers(); + } + } + + private VisualElement inspectorIMGUIContainer; + private bool showSynapses = true; + private bool showActivation = true; + protected bool breakOnWake = false; + protected bool trace = false; + void DrawInspector(VisualElement inspectorContainer) { + if (inspectorContainer == null) + return; + + inspectorContainer.Clear(); + if (this.currentNucleus == null) + return; + + // create a SerializedObject wrapper so Unity inspector controls work (and Undo) + SerializedObject so = new(prefabAsset); + this.inspectorIMGUIContainer = new IMGUIContainer(() => InspectorHandler(so)); + + inspectorContainer.Add(inspectorIMGUIContainer); + } + + void InspectorHandler(SerializedObject serializedObject) { + bool anythingChanged = false; + + if (serializedObject == null || serializedObject.targetObject == null) + return; + + if (this.currentNucleus == null) + return; + + serializedObject.Update(); + + GUIStyle headerStyle = new(EditorStyles.boldLabel) { + alignment = TextAnchor.MiddleLeft, + margin = new RectOffset(10, 0, 4, 4) + }; + GUIStyle boldTextFieldStyle = new(EditorStyles.textField) { + fontStyle = FontStyle.Bold + }; + + GUILayout.Label(this.currentNucleus.GetType().ToString(), headerStyle); + string newName = EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); + if (newName != this.currentNucleus.name) { + this.currentNucleus.name = newName; + this.prefab.RefreshOutputs(); + outputsField.choices = this.prefab.outputs.Select(output => output.name).ToList(); + anythingChanged = true; + } + + if (Application.isPlaying) { + if (currentNucleus is Neuron currentNeuron1) { + GUIContent nameLabel = new("Output", currentNeuron1.outputValue.ToString()); + EditorGUILayout.FloatField(nameLabel, length(currentNeuron1.outputValue)); + } + else + EditorGUILayout.LabelField(" "); + } + else + EditorGUILayout.LabelField(" "); + + if (this.currentNucleus is MemoryCell memory) { + memory.staticMemory = EditorGUILayout.Toggle("Static Memory", memory.staticMemory); + } + + if (this.currentNucleus is IReceptor receptor1) { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.IntField("Array size", receptor1.nucleiArray.Count()); + if (GUILayout.Button("Add")) { + Undo.RecordObject(prefabAsset, "Array add " + prefabAsset.name); + receptor1.AddReceptorElement(this.prefab); + anythingChanged = true; + } + if (GUILayout.Button("Del")) { + Undo.RecordObject(prefabAsset, "Array delete " + prefabAsset.name); + receptor1.RemoveReceptorElement(); + anythingChanged = true; + } + EditorGUILayout.EndHorizontal(); + } + + // Synapses + + if (this.currentNucleus is not Receptor && this.currentNucleus is not ClusterReceptor) { + showSynapses = EditorGUILayout.BeginFoldoutHeaderGroup(showSynapses, "Synapses"); + if (showSynapses) { + if (this.currentNucleus is Neuron neuron2) { + Neuron.CombinatorType newCombinator = (Neuron.CombinatorType)EditorGUILayout.EnumPopup("Combinator", neuron2.combinator); + anythingChanged |= newCombinator != neuron2.combinator; + neuron2.combinator = newCombinator; + } + + EditorGUIUtility.wideMode = true; + EditorGUIUtility.labelWidth = 100; + Vector3 newBias = EditorGUILayout.Vector3Field("Bias", this.currentNucleus.bias); + anythingChanged |= newBias != this.currentNucleus.bias; + this.currentNucleus.bias = newBias; + + Nucleus[] array = null; + int elementIx = -1; + if (this.currentNucleus.synapses.Count > 0) { + Synapse[] synapses = this.currentNucleus.synapses.ToArray(); + foreach (Synapse synapse in synapses) { + if (synapse.neuron == null) + continue; + + if (array != null) { + if (synapse.neuron.parent is Cluster iCluster && elementIx > 0) { + int thisElementIx = Cluster.GetNucleusIndex(iCluster.clusterNuclei, synapse.neuron); + if (thisElementIx == elementIx) + continue; + else + elementIx = thisElementIx; + } + // if (array.Contains(synapse.nucleus)) + // continue; + else if (array.Contains(synapse.neuron.parent)) + continue; + } + else { + if (synapse.neuron.parent is IReceptor iReceptor) { + array = iReceptor.nucleiArray; + if (iReceptor is Cluster iCluster) + elementIx = Cluster.GetNucleusIndex(iCluster.clusterNuclei, synapse.neuron); + } + // else if (synapse.nucleus is Receptor receptor2) // && receptor2.array != null && receptor2.array.nuclei.Length > 1) + // array = receptor2.nucleiArray; + } + + EditorGUILayout.Space(); + + if (Application.isPlaying) { + if (synapse.neuron is Neuron synapseNeuron) { + Vector3 value = synapseNeuron.outputValue * synapse.weight; + GUIContent synapseValueLabel = new(synapse.neuron.name, synapseNeuron.outputValue.ToString()); + EditorGUILayout.FloatField(synapseValueLabel, length(synapseNeuron.outputValue)); + } + } + else { + EditorGUILayout.BeginHorizontal(); + + if (synapse.neuron.parent != null && synapse.neuron.parent != this.currentNucleus) { + // If it is a cluster + GUIStyle labelStyle = new(GUI.skin.label); + float labelWidth = 200; + if (synapse.neuron.clusterPrefab != null) { + labelWidth = labelStyle.CalcSize(new GUIContent($"{synapse.neuron.parent.baseName}.")).x; + GUILayout.Label($"{synapse.neuron.parent.baseName}", GUILayout.Width(labelWidth)); + } + string[] options = synapse.neuron.parent.clusterNuclei.Select(n => n.name).ToArray(); + int selectedIndex = System.Array.IndexOf(options, synapse.neuron.name); + int newIndex = EditorGUILayout.Popup(selectedIndex, options); + if (newIndex != selectedIndex && synapse.neuron.parent.clusterNuclei[newIndex] is Neuron newNeuron) + ChangeSynapse(synapse, newNeuron); + } + else + GUILayout.Label(synapse.neuron.name); + + bool disconnecting = GUILayout.Button("Disconnect", GUILayout.Width(80)); + if (disconnecting && synapse.neuron is Neuron synapseNeuron) { + synapseNeuron.RemoveReceiver(this.currentNucleus); + this.prefab.GarbageCollection(); + anythingChanged = true; + } + EditorGUILayout.EndHorizontal(); + + } + + EditorGUI.indentLevel++; + float newWeight = EditorGUILayout.FloatField("Weight", synapse.weight); + if (newWeight != synapse.weight) { + if (synapse.neuron.parent is IReceptor receptor) { + Nucleus[] receptorArray = receptor.nucleiArray; + foreach (Synapse s in this.currentNucleus.synapses) { + if (s.neuron.parent is IReceptor r && r.nucleiArray == receptorArray) + s.weight = newWeight; + } + } + else + synapse.weight = newWeight; + anythingChanged = true; + } + EditorGUI.indentLevel--; + } + } + + EditorGUILayout.Space(); + anythingChanged |= ConnectNucleus(this.prefab, this.currentNucleus); + anythingChanged |= AddSynapse(this.prefab, this.currentNucleus); + } + EditorGUILayout.EndFoldoutHeaderGroup(); + } + + // Activation + + if (this.currentNucleus is not Cluster) { + EditorGUILayout.Space(); + showActivation = EditorGUILayout.BeginFoldoutHeaderGroup(showActivation, "Activation"); + if (showActivation) { + if (this.currentNucleus is Neuron neuron) { + if (this.currentNucleus is not MemoryCell) { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Activation Curve", GUILayout.Width(150)); + if (neuron.curveMax > 0) + EditorGUILayout.CurveField(neuron.curve, Color.cyan, new Rect(0, 0, 1, neuron.curveMax)); + else + EditorGUILayout.CurveField(neuron.curve, Color.cyan, new Rect(0, neuron.curveMax, 1, -neuron.curveMax)); + Neuron.CurvePresets newPreset = (Neuron.CurvePresets)EditorGUILayout.EnumPopup(neuron.curvePreset, GUILayout.Width(100)); + anythingChanged |= newPreset != neuron.curvePreset; + neuron.curvePreset = newPreset; + EditorGUILayout.EndHorizontal(); + } + if (neuron is Receptor receptor2) { + if (receptor2.nucleiArray == null || receptor2.nucleiArray.Count() == 0) + receptor2.array = new NucleusArray(neuron); + } + } + + EditorGUILayout.Space(); + } + EditorGUILayout.EndFoldoutHeaderGroup(); + } + + if (GUILayout.Button("Delete this neuron")) + DeleteNucleus(this.currentNucleus); + + if (this.currentNucleus is Cluster subCluster) { + if (GUILayout.Button("Edit Cluster")) + EditCluster(subCluster); + } + + EditorGUILayout.Space(); + breakOnWake = EditorGUILayout.Toggle("Break on wake", breakOnWake); + if (breakOnWake && this.currentNucleus is Neuron currentNeuron) { + if (currentNeuron.isSleeping == false) + Debug.Break(); + } + trace = EditorGUILayout.Toggle("Trace", trace); + this.currentNucleus.trace = trace; + + serializedObject.ApplyModifiedProperties(); + if (anythingChanged) { + EditorUtility.SetDirty(prefabAsset); + AssetDatabase.SaveAssets(); + } + } + + void OnSceneGUI(SceneView sceneView) { + if (this.gameObject != null) { + if (this.currentNucleus is IReceptor receptor) { + foreach (Nucleus nucleus in receptor.nucleiArray) { + if (nucleus is Neuron neuron) { + Vector3 worldVector = this.gameObject.transform.TransformVector(neuron.outputValue); + Handles.color = Color.yellow; + Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); + } + } + } + else { + if (this.currentNucleus is Neuron currentNeuron) { + Vector3 worldVector = this.gameObject.transform.TransformVector(currentNeuron.outputValue); + Handles.color = Color.yellow; + Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); + } + } + } + } + + #region Synapses + + protected virtual void AddInput(Nucleus.Type selectedType, Nucleus nucleus) { + switch (selectedType) { + case Nucleus.Type.Neuron: + AddNeuronInput(nucleus); + break; + case Nucleus.Type.MemoryCell: + AddMemoryCellInput(nucleus); + break; + // case Nucleus.Type.Selector: + // AddSelectorInput(nucleus); + // break; + case Nucleus.Type.Cluster: + AddClusterInput(nucleus); + break; + // case Nucleus.Type.Pulsar: + // AddPulsarInput(nucleus); + // break; + case Nucleus.Type.Receptor: + AddReceptorInput(nucleus); + break; + // case Nucleus.Type.ReceptorArray: + // AddReceptorArrayInput(nucleus); + // break; + case Nucleus.Type.ClusterReceptor: + AddClusterReceptorInput(nucleus); + break; + default: + break; + } + } + + protected virtual void AddNeuronInput(Nucleus nucleus) { + Neuron newNeuroid = new(this.prefab, "New neuron"); + newNeuroid.AddReceiver(nucleus); + this.currentNucleus = newNeuroid; + BuildLayers(); + } + + // protected void AddSelectorInput(Nucleus nucleus) { + // Selector newSelector = new(this.prefab, "New Selector"); + // newSelector.AddReceiver(nucleus); + // this.currentNucleus = newSelector; + // BuildLayers(); + // } + + // protected void AddPulsarInput(Nucleus nucleus) { + // Pulsar newPulsar = new(this.prefab, "New Pulsar"); + // newPulsar.AddReceiver(nucleus); + // this.currentNucleus = newPulsar; + // BuildLayers(); + // } + + protected virtual void AddMemoryCellInput(Nucleus nucleus) { + MemoryCell newMemory = new(this.prefab, "New memory cell"); + newMemory.AddReceiver(nucleus); + this.currentNucleus = newMemory; + BuildLayers(); + } + + protected virtual void AddClusterInput(Nucleus nucleus) { + ClusterPickerWindow.ShowPicker(brain => OnClusterPicked(nucleus, brain), "Select Cluster"); + } + private void OnClusterPicked(Nucleus nucleus, ClusterPrefab prefab) { + Cluster subclusterInstance = new(prefab, this.prefab); + subclusterInstance.defaultOutput.AddReceiver(nucleus); + } + + protected virtual void AddReceptorInput(Nucleus nucleus) { + Receptor newReceptor = new(this.prefab, "New Receptor"); + newReceptor.AddReceiver(nucleus); + this.currentNucleus = newReceptor; + BuildLayers(); + } + + protected virtual void AddClusterReceptorInput(Nucleus nucleus) { + ClusterPickerWindow.ShowPicker(prefab => OnClusterReceptorPicked(nucleus, prefab), "Select Cluster"); + } + private void OnClusterReceptorPicked(Nucleus nucleus, ClusterPrefab selectedPrefab) { + ClusterReceptor clusterInstance = new(selectedPrefab, this.prefab, "New " + selectedPrefab.name); + clusterInstance.defaultOutput.AddReceiver(nucleus); + this.currentNucleus = clusterInstance; + BuildLayers(); + } + + private void EditCluster(Cluster subCluster) { + // May be used with storedPrefab... + Selection.activeObject = subCluster.prefab; + EditorGUIUtility.PingObject(subCluster.prefab); + var editor = Editor.CreateEditor(subCluster.prefab); + } + + int selectedConnectNucleus = -1; + // Connect to another nucleus in the same cluster + protected virtual bool ConnectNucleus(ClusterPrefab cluster, Nucleus nucleusToConnect) { + if (cluster == null) + return false; + + IEnumerable synapseNuclei = this.currentNucleus.synapses + .Where(synapse => synapse.neuron != null) + .Select(synapse => synapse.neuron); + + IEnumerable nuclei = cluster.nuclei + .Except(synapseNuclei); + IEnumerable nucleiNames = nuclei + .Select(n => { + int idx = n.name.IndexOf(':'); + return idx < 0 ? n.name : n.name[..idx]; + }) + .Distinct(); + + string[] names = nucleiNames.ToArray(); + EditorGUILayout.BeginHorizontal(); + selectedConnectNucleus = EditorGUILayout.Popup(selectedConnectNucleus, names); + bool connecting = GUILayout.Button("Connect", GUILayout.Width(80)); + EditorGUILayout.EndHorizontal(); + if (connecting) { + Nucleus nucleus = nuclei.ElementAt(selectedConnectNucleus); + if (nucleus is IReceptor receptor) + receptor.AddArrayReceiver(this.currentNucleus); + else if (nucleus is Neuron neuron) + neuron.AddReceiver(this.currentNucleus); + else if (nucleus is Cluster subCluster) + subCluster.defaultOutput.AddReceiver(this.currentNucleus); + + } + return connecting; + } + + protected virtual void DeleteNucleus(Nucleus nucleus) { + if (nucleus == null) + return; + + if (nucleus is Neuron neuron) { + foreach (Nucleus receiver in neuron.receivers) { + if (receiver != null) { + this.currentNucleus = receiver; + break; + } + } + } + this.prefab.nuclei.Remove(nucleus); + + if (outputsField.value == nucleus.name) { + this.prefab.RefreshOutputs(); + outputsField.choices = this.prefab.outputs.Select(output => output.name).ToList(); + outputsField.index = 0; + } + + Neuron.Delete(nucleus); + + this.currentNucleus = this.prefab.output; + BuildLayers(); + } + + Nucleus.Type selectedType = Nucleus.Type.None; + protected virtual bool AddSynapse(ClusterPrefab cluster, Nucleus nucleus) { + if (cluster == null) + return false; + + EditorGUILayout.BeginHorizontal(); + selectedType = (Nucleus.Type)EditorGUILayout.EnumPopup(selectedType); + bool connecting = GUILayout.Button("Add", GUILayout.Width(80)); + EditorGUILayout.EndHorizontal(); + + if (connecting) { + AddInput(selectedType, this.currentNucleus); + } + return connecting; + // if (selectedType == Nucleus.Type.None) + // return false; + + // AddInput(selectedType, this.currentNucleus); + // return true; + } + + protected virtual void ChangeSynapse(Synapse synapse, Neuron newNucleus) { + Neuron synapseNeuron = synapse.neuron as Neuron; + if (synapse.neuron.parent is Cluster subCluster && subCluster.prefab != this.prefab) { + if (synapse.neuron.parent is ClusterReceptor receptor) { + // the new nucleus is part of a (cluster) receptor, + // so we have to change all synapses to this nucleus array elements + int oldNucleusIx = Cluster.GetNucleusIndex(subCluster.clusterNuclei, synapse.neuron); + int newNucleusIx = Cluster.GetNucleusIndex(subCluster.clusterNuclei, newNucleus); + foreach (Nucleus element in receptor.nucleiArray) { + if (element is not ClusterReceptor clusterReceptor) + continue; + // Get the same neuron as the synapse.nucleus in a different element + // of the ClusterReceptor array + Nucleus oldElementNucleus = clusterReceptor.clusterNuclei[oldNucleusIx]; + if (oldElementNucleus is not Neuron oldElementNeuron) + continue; + // Get the same neuron as newNucleus in a different element + // of the ClusterReceptor array + Nucleus newElementNucleus = clusterReceptor.clusterNuclei[newNucleusIx]; + if (newElementNucleus is not Neuron newElementNeuron) + continue; + + oldElementNeuron.RemoveReceiver(this.currentNucleus); + newElementNeuron.AddReceiver(this.currentNucleus); + // Now find the synapse which pointed to the old Neuron + // Synapse synapseForUpdate = this.currentNucleus.GetSynapse(oldElementNeuron); + // synapseForUpdate.nucleus = newElementNeuron; + } + } + else { + // it is a neuron in a subcluster + synapseNeuron.RemoveReceiver(this.currentNucleus); + newNucleus.AddReceiver(this.currentNucleus); + } + } + else { + synapseNeuron.RemoveReceiver(this.currentNucleus); + newNucleus.AddReceiver(this.currentNucleus); + } + } + + protected virtual void DisconnectNucleus(Neuron nucleus) { + if (this.currentNucleus.clusterPrefab == null) + return; + string[] names = this.currentNucleus.synapses.Select(synapse => synapse.neuron.name).ToArray(); + int selectedIndex = -1; + selectedIndex = EditorGUILayout.Popup("Disconnect from", selectedIndex, names); + if (selectedIndex >= 0 && selectedIndex < this.currentNucleus.clusterPrefab.nuclei.Count) { + Synapse synapse = this.currentNucleus.synapses[selectedIndex]; + Neuron synapseNeuron = synapse.neuron as Neuron; + synapseNeuron.RemoveReceiver(this.currentNucleus); + } + } + + #endregion Synapses + } + + #endregion Start + +} + +public class NeuroidLayer { + public int ix = 0; + public List neuroids = new(); +} diff --git a/Editor/ClusterInspector.cs.meta b/Editor/ClusterInspector.cs.meta new file mode 100644 index 0000000..a1a18f5 --- /dev/null +++ b/Editor/ClusterInspector.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1fc1fb7db9f7ad54a87d31313e7f457d \ No newline at end of file diff --git a/Editor/DAGWindow.cs b/Editor/DAGWindow.cs new file mode 100644 index 0000000..aaf5aa3 --- /dev/null +++ b/Editor/DAGWindow.cs @@ -0,0 +1,393 @@ + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.Linq; + +// Simple DAG data model +// [System.Serializable] +// public class DagNode +// { +// public int id; +// public string title; +// public Vector2 position; +// public float radius = 36f; // circle radius +// } + +// [System.Serializable] +// public class DagEdge +// { +// public int fromId; +// public int toId; +// } + +public class DAGEditorWindow : EditorWindow +{ + List nodes = new List(); + List edges = new List(); + + Vector2 pan = Vector2.zero; + float zoom = 1.0f; + const float minZoom = 0.5f; + const float maxZoom = 2.0f; + + GUIStyle labelStyle; + int selectedNodeId = -1; + + Vector2 dragStart; + bool draggingNode = false; + int draggingNodeId = -1; + + [MenuItem("Window/DAG Viewer (LR, Circles)")] + public static void ShowWindow() + { + var w = GetWindow("DAG Viewer (LR)"); + w.minSize = new Vector2(500, 300); + } + + void OnEnable() + { + labelStyle = new GUIStyle(EditorStyles.label); + labelStyle.alignment = TextAnchor.MiddleCenter; + labelStyle.normal.textColor = Color.white; + labelStyle.fontStyle = FontStyle.Bold; + + if (nodes.Count == 0) + CreateSampleGraph(); + + ComputeLeftToRightLayout(); + } + + void CreateSampleGraph() + { + nodes.Clear(); + edges.Clear(); + + nodes.Add(new DagNode() { id = 0, title = "In1" }); + nodes.Add(new DagNode() { id = 1, title = "In2" }); + nodes.Add(new DagNode() { id = 2, title = "A" }); + nodes.Add(new DagNode() { id = 3, title = "B" }); + nodes.Add(new DagNode() { id = 4, title = "C" }); + nodes.Add(new DagNode() { id = 5, title = "Out1" }); + nodes.Add(new DagNode() { id = 6, title = "Out2" }); + + edges.Add(new DagEdge() { fromId = 0, toId = 2 }); + edges.Add(new DagEdge() { fromId = 1, toId = 2 }); + edges.Add(new DagEdge() { fromId = 2, toId = 3 }); + edges.Add(new DagEdge() { fromId = 2, toId = 4 }); + edges.Add(new DagEdge() { fromId = 3, toId = 5 }); + edges.Add(new DagEdge() { fromId = 4, toId = 6 }); + } + + void OnGUI() + { + HandleInput(); + + Rect rect = new Rect(0, 0, position.width, position.height); + EditorGUI.DrawRect(rect, new Color(0.11f, 0.11f, 0.11f)); + + Matrix4x4 oldMatrix = GUI.matrix; + Vector2 origin = new Vector2(position.width / 2, position.height / 2); + GUI.matrix = Matrix4x4.TRS(origin + pan, Quaternion.identity, Vector3.one * zoom) * + Matrix4x4.TRS(-origin, Quaternion.identity, Vector3.one); + + // Draw edges first + foreach (var e in edges) + { + var from = GetNodeById(e.fromId); + var to = GetNodeById(e.toId); + if (from == null || to == null) continue; + DrawEdgeCircleNodes(from, to); + } + + // Draw nodes (circles) + foreach (var n in nodes) + { + DrawNodeCircle(n); + } + + GUI.matrix = oldMatrix; + + // Footer toolbar + GUILayout.FlexibleSpace(); + EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); + if (GUILayout.Button("Fit", EditorStyles.toolbarButton)) FitToView(); + if (GUILayout.Button("Layout LR", EditorStyles.toolbarButton)) ComputeLeftToRightLayout(); + if (GUILayout.Button("Add Node", EditorStyles.toolbarButton)) + { + AddNode("N" + nodes.Count); + ComputeLeftToRightLayout(); + } + if (GUILayout.Button("Add Edge (selected->new)", EditorStyles.toolbarButton)) + { + if (selectedNodeId != -1) + { + var newNode = AddNode("N" + nodes.Count); + edges.Add(new DagEdge() { fromId = selectedNodeId, toId = newNode.id }); + ComputeLeftToRightLayout(); + } + } + EditorGUILayout.EndHorizontal(); + } + + void HandleInput() + { + Event e = Event.current; + + // Zoom with scroll + if (e.type == EventType.ScrollWheel) + { + float oldZoom = zoom; + float delta = -e.delta.y * 0.01f; + zoom = Mathf.Clamp(zoom + delta, minZoom, maxZoom); + Vector2 mouse = e.mousePosition; + pan += (mouse - new Vector2(position.width / 2, position.height / 2)) * (1 - zoom / oldZoom); + e.Use(); + } + + // Pan with middle or right+ctrl drag + if (e.type == EventType.MouseDrag && (e.button == 2 || (e.button == 1 && e.control))) + { + pan += e.delta; + e.Use(); + } + + // Node dragging & selection (convert mouse to graph space) + Vector2 graphMouse = ScreenToGraph(e.mousePosition); + if (e.type == EventType.MouseDown && e.button == 0) + { + int hit = HitTestNode(graphMouse); + if (hit != -1) + { + selectedNodeId = hit; + draggingNode = true; + draggingNodeId = hit; + dragStart = graphMouse; + e.Use(); + } + else + { + selectedNodeId = -1; + } + } + + if (draggingNode && draggingNodeId != -1) + { + if (e.type == EventType.MouseDrag && e.button == 0) + { + Vector2 graphDelta = e.delta / zoom; + var n = GetNodeById(draggingNodeId); + if (n != null) + { + n.position += graphDelta; + Repaint(); + e.Use(); + } + } + if (e.type == EventType.MouseUp && e.button == 0) + { + draggingNode = false; + draggingNodeId = -1; + e.Use(); + } + } + } + + DagNode AddNode(string title) + { + int nextId = nodes.Count > 0 ? nodes.Max(n => n.id) + 1 : 0; + var n = new DagNode() { id = nextId, title = title, position = Vector2.zero }; + nodes.Add(n); + return n; + } + + DagNode GetNodeById(int id) => nodes.FirstOrDefault(x => x.id == id); + + void DrawNodeCircle(DagNode n) + { + Vector2 center = n.position; + float r = n.radius; + Rect nodeRect = new Rect(center.x - r, center.y - r, r * 2, r * 2); + + // circle background + Color bg = (n.id == selectedNodeId) ? new Color(0.15f, 0.5f, 0.9f) : new Color(0.2f, 0.2f, 0.2f); + EditorGUI.DrawRect(nodeRect, bg); + + // anti-aliased circle outline + Handles.color = Color.white * 0.9f; + Handles.DrawAAPolyLine(3f / zoom, GetCircleOutlinePoints(center, r, 48).ToArray()); + + // label + Vector2 labelPos = center - new Vector2(0, 8); + GUI.Label(new Rect(labelPos.x - r, labelPos.y - 8, r * 2, 18), n.title, labelStyle); + } + + List GetCircleOutlinePoints(Vector2 center, float radius, int segments) + { + var pts = new List(segments + 1); + for (int i = 0; i <= segments; i++) + { + float a = (float)i / segments * Mathf.PI * 2f; + pts.Add(new Vector3(center.x + Mathf.Cos(a) * radius, center.y + Mathf.Sin(a) * radius, 0)); + } + return pts; + } + + void DrawEdgeCircleNodes(DagNode from, DagNode to) + { + Vector2 a = from.position; + Vector2 b = to.position; + if (a == b) return; + + // Compute edge line that starts/ends at circle circumferences + Vector2 dir = (b - a).normalized; + Vector2 start = a + dir * from.radius; + Vector2 end = b - dir * to.radius; + + // Use a simple curved line: start -> control -> end (bezier) + Vector2 control = new Vector2((start.x + end.x) / 2f, (start.y + end.y) / 2f); + // Slight vertical offset to separate overlapping lines based on node ids + float offset = ((from.id * 7 + to.id * 11) % 7 - 3) * 6f / zoom; + control += new Vector2(0, offset); + + Handles.color = Color.white * 0.9f; + Handles.DrawAAPolyLine(3f / zoom, 20, GetBezierPoints(start, control, end, 24).ToArray()); + + // Arrow at end pointing towards 'b' + DrawArrowHead(end - dir * 2f, end, 10f / zoom, 12f / zoom, Color.white); + } + + List GetBezierPoints(Vector2 p0, Vector2 p1, Vector2 p2, int seg) + { + var pts = new List(seg + 1); + for (int i = 0; i <= seg; i++) + { + float t = (float)i / seg; + Vector2 p = (1 - t) * (1 - t) * p0 + 2 * (1 - t) * t * p1 + t * t * p2; + pts.Add(new Vector3(p.x, p.y, 0)); + } + return pts; + } + + void DrawArrowHead(Vector2 from, Vector2 to, float headWidth, float headLength, Color color) + { + Vector2 dir = (to - from).normalized; + if (dir == Vector2.zero) return; + Vector2 right = new Vector2(-dir.y, dir.x); + + Vector3 p1 = to; + Vector3 p2 = to - dir * headLength + right * headWidth * 0.5f; + Vector3 p3 = to - dir * headLength - right * headWidth * 0.5f; + + Handles.color = color; + Handles.DrawAAConvexPolygon(p1, p2, p3); + } + + // Left-to-right layered layout (sources on the left, sinks on the right) + void ComputeLeftToRightLayout() + { + // build adjacency and indegree + var adj = nodes.ToDictionary(n => n.id, n => new List()); + var indeg = nodes.ToDictionary(n => n.id, n => 0); + foreach (var e in edges) + { + if (!adj.ContainsKey(e.fromId) || !adj.ContainsKey(e.toId)) continue; + adj[e.fromId].Add(e.toId); + indeg[e.toId]++; + } + + // Kahn's algorithm to compute topological layers (horizontal layers) + Dictionary layer = new Dictionary(); + Queue q = new Queue(indeg.Where(kv => kv.Value == 0).Select(kv => kv.Key)); + foreach (var id in q) layer[id] = 0; + + while (q.Count > 0) + { + int u = q.Dequeue(); + int l = layer[u]; + foreach (var v in adj[u]) + { + // prefer placing v at least one layer after u + if (!layer.ContainsKey(v) || layer[v] < l + 1) layer[v] = l + 1; + indeg[v]--; + if (indeg[v] == 0) q.Enqueue(v); + } + } + + // Any unreachable nodes -> assign next layers + int maxLayer = layer.Count > 0 ? layer.Values.Max() : 0; + foreach (var n in nodes) + { + if (!layer.ContainsKey(n.id)) + { + maxLayer++; + layer[n.id] = maxLayer; + } + } + + // Group nodes by layer (left to right) + var layers = layer.GroupBy(kv => kv.Value).OrderBy(g => g.Key).Select(g => g.Select(x => x.Key).ToList()).ToList(); + + // Layout parameters (horizontal spacing drives left->right) + float hSpacing = 220f; + float vSpacing = 120f; + + // Place nodes: x increases with layer index, y spaced within layer + for (int li = 0; li < layers.Count; li++) + { + var lst = layers[li]; + float totalHeight = (lst.Count - 1) * vSpacing; + for (int i = 0; i < lst.Count; i++) + { + int id = lst[i]; + var n = GetNodeById(id); + if (n == null) continue; + float x = li * hSpacing; + float y = -totalHeight / 2f + i * vSpacing; + n.position = new Vector2(x, y); + } + } + + Repaint(); + } + + void FitToView() + { + if (nodes.Count == 0) return; + Rect bounds = new Rect(nodes[0].position - Vector2.one * nodes[0].radius, Vector2.one * nodes[0].radius * 2f); + foreach (var n in nodes) + bounds = RectUnion(bounds, new Rect(n.position - Vector2.one * n.radius, Vector2.one * n.radius * 2f)); + + Vector2 center = bounds.center; + pan = -center; + zoom = 1.0f; + Repaint(); + } + + static Rect RectUnion(Rect a, Rect b) + { + float xMin = Mathf.Min(a.xMin, b.xMin); + float xMax = Mathf.Max(a.xMax, b.xMax); + float yMin = Mathf.Min(a.yMin, b.yMin); + float yMax = Mathf.Max(a.yMax, b.yMax); + return Rect.MinMaxRect(xMin, yMin, xMax, yMax); + } + + Vector2 ScreenToGraph(Vector2 screenPos) + { + Vector2 origin = new Vector2(position.width / 2, position.height / 2); + // invert the GUI.matrix transform (approx for current simple transforms) + return (screenPos - (origin + pan)) / zoom + origin * (1 - 1 / zoom); + } + + int HitTestNode(Vector2 graphPos) + { + // returns node id under point or -1 + for (int i = nodes.Count - 1; i >= 0; i--) + { + var n = nodes[i]; + if ((graphPos - n.position).sqrMagnitude <= n.radius * n.radius) return n.id; + } + return -1; + } +} diff --git a/Editor/DAGWindow.cs.meta b/Editor/DAGWindow.cs.meta new file mode 100644 index 0000000..ea0ee9e --- /dev/null +++ b/Editor/DAGWindow.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 95393aed582b8b30d965400672aec4d8 \ No newline at end of file diff --git a/Editor/NanoBrain_Editor.cs b/Editor/NanoBrain_Editor.cs new file mode 100644 index 0000000..164e1db --- /dev/null +++ b/Editor/NanoBrain_Editor.cs @@ -0,0 +1,49 @@ +using UnityEditor; +using UnityEditor.UIElements; + +using UnityEngine; +using UnityEngine.UIElements; + +[CustomEditor(typeof(NanoBrain))] +public class NanoBrainComponent_Editor : Editor { + protected static VisualElement mainContainer; + protected static VisualElement inspectorContainer; + + protected NanoBrain component; + private SerializedProperty brainProp; + + ClusterInspector.GraphView board; + + public void OnEnable() { + component = target as NanoBrain; + + if (Application.isPlaying == false && serializedObject != null) { + string propertyName = nameof(NanoBrain.defaultBrain); + brainProp = serializedObject.FindProperty(propertyName); + } + } + + public override VisualElement CreateInspectorGUI() { + Cluster brain = component.brain; + + if (Application.isPlaying == false) + serializedObject.Update(); + + + VisualElement root = new(); + if (Application.isPlaying == false) { + PropertyField brainField = new(brainProp) { + label = "Nano Brain" + }; + root.Add(brainField); + } + + if (brain != null) + ClusterInspector.CreateInspector(root, brain.prefab, brain.defaultOutput, component.gameObject); + + if (Application.isPlaying == false) + serializedObject.ApplyModifiedProperties(); + return root; + } + +} \ No newline at end of file diff --git a/Editor/NanoBrain_Editor.cs.meta b/Editor/NanoBrain_Editor.cs.meta new file mode 100644 index 0000000..eaf830b --- /dev/null +++ b/Editor/NanoBrain_Editor.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f05072314d39990639a2dbf99f322664 \ No newline at end of file diff --git a/Editor/Resources.meta b/Editor/Resources.meta new file mode 100644 index 0000000..e9c19e4 --- /dev/null +++ b/Editor/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7b61a93fc9332d2adae74fe4abe92d53 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Resources/GraphStyles.uss b/Editor/Resources/GraphStyles.uss new file mode 100644 index 0000000..79bafe8 --- /dev/null +++ b/Editor/Resources/GraphStyles.uss @@ -0,0 +1,12 @@ +#content { + background-color: #2b2b2b; +} +#inspector { + border-left-width: 1px; + border-left-color: #000; + padding: 3px; +} +#title { + -unity-font-style: bold; + color: white; + } diff --git a/Editor/Resources/GraphStyles.uss.meta b/Editor/Resources/GraphStyles.uss.meta new file mode 100644 index 0000000..2546c45 --- /dev/null +++ b/Editor/Resources/GraphStyles.uss.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 28268b644fa8f3948851b25e41f5b03b +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 diff --git a/IReceptor.cs b/IReceptor.cs new file mode 100644 index 0000000..b56a360 --- /dev/null +++ b/IReceptor.cs @@ -0,0 +1,73 @@ +using UnityEngine; + +public interface IReceptor { + public string GetName(); + + public Nucleus[] nucleiArray { get; set; } + + public void AddReceptorElement(ClusterPrefab prefab); + public void RemoveReceptorElement(); + + public void AddArrayReceiver(Nucleus receiverToAdd, float weight = 1); + + public void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = null); +} + +public static class IReceptorHelpers { + + public static void AddReceptorElement(IReceptor receptor, ClusterPrefab prefab) { + if (receptor.nucleiArray.Length == 0) { + Debug.LogError("Empty perceptoid array, cannot add"); + } + int newLength = receptor.nucleiArray.Length + 1; + Nucleus[] newArray = new Nucleus[newLength]; + + string baseName = receptor.GetName(); + int colonPos = baseName.IndexOf(":"); + if (colonPos > 0) + baseName = baseName[..colonPos]; + + for (int i = 0; i < receptor.nucleiArray.Length; i++) + newArray[i] = receptor.nucleiArray[i]; + if (receptor.nucleiArray[0] is Nucleus nucleus) { + newArray[newLength - 1] = nucleus.Clone(prefab); + newArray[newLength - 1].name = $"{baseName}: {newLength - 1}"; + } + + foreach (Nucleus element in receptor.nucleiArray) { + if (element is IReceptor receptorElement) { + receptorElement.nucleiArray = newArray; + } + } + } + + public static void RemoveReceptorElement(IReceptor receptor) { + int newLength = receptor.nucleiArray.Length - 1; + if (newLength == 0) { + Debug.LogWarning("Perceptoid array cannot be empty"); + } + Nucleus[] newArray = new Nucleus[newLength]; + for (int i = 0; i < newLength; i++) + newArray[i] = receptor.nucleiArray[i]; + // Delete the last perception + if (receptor.nucleiArray[newLength] is Nucleus nucleus) + Neuron.Delete(nucleus); + + foreach (Nucleus element in receptor.nucleiArray) { + if (element is IReceptor receptorElement) { + receptorElement.nucleiArray = newArray; + } + } + + } + + public static void AddArrayReceiver(IReceptor receptor, Nucleus receiverToAdd, float weight = 1) { + foreach (Nucleus element in receptor.nucleiArray) { + if (element is Cluster cluster) + cluster.defaultOutput.AddReceiver(receiverToAdd, weight); + if (element is Neuron neuron) + neuron.AddReceiver(receiverToAdd, weight); + } + + } +} \ No newline at end of file diff --git a/IReceptor.cs.meta b/IReceptor.cs.meta new file mode 100644 index 0000000..0c0ee6f --- /dev/null +++ b/IReceptor.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 73f052292ad16bb53a3c07aa1694c705 \ No newline at end of file diff --git a/Icons.meta b/Icons.meta new file mode 100644 index 0000000..4b8dfb3 --- /dev/null +++ b/Icons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 885c5a70637820322b07e023ce18fdd5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Icons/NeuraalNetwerkIcoonSchets1.png b/Icons/NeuraalNetwerkIcoonSchets1.png new file mode 100644 index 0000000000000000000000000000000000000000..3a314eedf02c118cc7d939130ddf6ccec4766091 GIT binary patch literal 60406 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 Hu0mjfMCK@{ literal 0 HcmV?d00001 diff --git a/Icons/NeuraalNetwerkIcoonSchets1.png.meta b/Icons/NeuraalNetwerkIcoonSchets1.png.meta new file mode 100644 index 0000000..1ea36b8 --- /dev/null +++ b/Icons/NeuraalNetwerkIcoonSchets1.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 288088fdc016525a59f83f1c608e514d +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Icons/NeuraalNetwerkIcoonSchets2.png b/Icons/NeuraalNetwerkIcoonSchets2.png new file mode 100644 index 0000000000000000000000000000000000000000..35853d65078c2e6c2326da8a10e5f8d57db43a76 GIT binary patch literal 39373 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 literal 0 HcmV?d00001 diff --git a/Icons/NeuraalNetwerkIcoonSchets2.png.meta b/Icons/NeuraalNetwerkIcoonSchets2.png.meta new file mode 100644 index 0000000..524e4c8 --- /dev/null +++ b/Icons/NeuraalNetwerkIcoonSchets2.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: e16264b4b7305e5c5b5b1389d6b2f13e +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Icons/NeuraalNetwerkIcoonSchets3.png b/Icons/NeuraalNetwerkIcoonSchets3.png new file mode 100644 index 0000000000000000000000000000000000000000..f2faf0ceb6c7192aa42dd7536bb0755b7cead3b9 GIT binary patch literal 40575 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

Qn64b=iQ=0`h)j4_K*TP7AwdnvVO9~Me7l%cQ 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 literal 0 HcmV?d00001 diff --git a/Icons/NeuraalNetwerkIcoonSchets3.png.meta b/Icons/NeuraalNetwerkIcoonSchets3.png.meta new file mode 100644 index 0000000..e7b0a3c --- /dev/null +++ b/Icons/NeuraalNetwerkIcoonSchets3.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 948c13386d926b7bbbca85239a974d85 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Identity.asset b/Identity.asset new file mode 100644 index 0000000..2471b04 --- /dev/null +++ b/Identity.asset @@ -0,0 +1,59 @@ +%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::ClusterPrefab + nuclei: + - rid: 2262690531574022216 + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } + - rid: 2262690531574022216 + type: {class: Neuron, ns: , asm: Assembly-CSharp} + data: + name: Output + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: [] diff --git a/Identity.asset.meta b/Identity.asset.meta new file mode 100644 index 0000000..b2382a6 --- /dev/null +++ b/Identity.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5f4d2ea0d0115b3549f8e9aa5e669163 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/LinearAlgebra.meta b/LinearAlgebra.meta new file mode 100644 index 0000000..c54c1af --- /dev/null +++ b/LinearAlgebra.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d98555a675e8e5e879de17db950b55fe +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/LinearAlgebra/.editorconfig b/LinearAlgebra/.editorconfig new file mode 100644 index 0000000..1ec7f97 --- /dev/null +++ b/LinearAlgebra/.editorconfig @@ -0,0 +1,19 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = crlf +charset = utf-8 +trim_trailing_whitespace = false +insert_final_newline = false +max_line_length = 80 + +[*.cs] +csharp_new_line_before_open_brace = none +# Suppress warnings everywhere +dotnet_diagnostic.IDE1006.severity = none +dotnet_diagnostic.IDE0130.severity = none \ No newline at end of file diff --git a/LinearAlgebra/.gitea/workflows/unit_tests.yaml b/LinearAlgebra/.gitea/workflows/unit_tests.yaml new file mode 100644 index 0000000..e98b26e --- /dev/null +++ b/LinearAlgebra/.gitea/workflows/unit_tests.yaml @@ -0,0 +1,37 @@ +name: Build and Run C# Unit Tests + +on: + push: + branches: + - '**' + pull_request: + branches: + - '**' + +jobs: + build-and-test: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup .NET + uses: actions/setup-dotnet@v1 + with: + dotnet-version: '8.0.x' # Specify the .NET SDK version + + - name: Check Current Directory + run: pwd # Logs the current working directory + + - name: List Files + run: ls -la # Lists all files in the current directory + + - name: Restore Dependencies + run: dotnet restore ./LinearAlgebra-csharp.sln # Restore NuGet packages + + - name: Build the Project + run: dotnet build ./LinearAlgebra-csharp.sln --configuration Release # Build the C# project + + - name: Run Unit Tests + run: dotnet test ./test/LinearAlgebra_Test.csproj --configuration Release # Execute unit tests diff --git a/LinearAlgebra/.gitignore b/LinearAlgebra/.gitignore new file mode 100644 index 0000000..b32a30c --- /dev/null +++ b/LinearAlgebra/.gitignore @@ -0,0 +1,5 @@ +DoxyGen/DoxyWarnLogfile.txt +.vscode/settings.json +**bin +**obj +**.meta diff --git a/LinearAlgebra/LinearAlgebra-csharp.sln b/LinearAlgebra/LinearAlgebra-csharp.sln new file mode 100644 index 0000000..4b13b2b --- /dev/null +++ b/LinearAlgebra/LinearAlgebra-csharp.sln @@ -0,0 +1,30 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.2.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LinearAlgebra", "src\LinearAlgebra.csproj", "{ECB58727-0354-924D-AE7B-22F6B21097EB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LinearAlgebra_Test", "test\LinearAlgebra_Test.csproj", "{715BB399-5FC4-2AC9-3757-177CA0C80774}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {ECB58727-0354-924D-AE7B-22F6B21097EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ECB58727-0354-924D-AE7B-22F6B21097EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ECB58727-0354-924D-AE7B-22F6B21097EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ECB58727-0354-924D-AE7B-22F6B21097EB}.Release|Any CPU.Build.0 = Release|Any CPU + {715BB399-5FC4-2AC9-3757-177CA0C80774}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {715BB399-5FC4-2AC9-3757-177CA0C80774}.Debug|Any CPU.Build.0 = Debug|Any CPU + {715BB399-5FC4-2AC9-3757-177CA0C80774}.Release|Any CPU.ActiveCfg = Release|Any CPU + {715BB399-5FC4-2AC9-3757-177CA0C80774}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E93B8294-87D4-4887-83B7-182A623D5833} + EndGlobalSection +EndGlobal diff --git a/LinearAlgebra/src/Angle.cs b/LinearAlgebra/src/Angle.cs new file mode 100644 index 0000000..7d2fd6b --- /dev/null +++ b/LinearAlgebra/src/Angle.cs @@ -0,0 +1,341 @@ +using System; + +namespace LinearAlgebra { + + public struct AngleFloat { + public const float Rad2Deg = 360.0f / ((float)Math.PI * 2); //0.0174532924F; + public const float Deg2Rad = (float)Math.PI * 2 / 360.0f; //57.29578F; + + private AngleFloat(float degrees) { + this.value = degrees; + } + private readonly float value; + + public static AngleFloat Degrees(float degrees) { + // Reduce it to (-180..180] + if (float.IsFinite(degrees)) { + while (degrees < -180) + degrees += 360; + while (degrees >= 180) + degrees -= 360; + } + return new AngleFloat(degrees); + } + + public static AngleFloat Radians(float radians) { + // Reduce it to (-pi..pi] + if (float.IsFinite(radians)) { + while (radians <= -Math.PI) + radians += 2 * (float)Math.PI; + while (radians > Math.PI) + radians -= 2 * (float)Math.PI; + } + + return new AngleFloat(radians * Rad2Deg); + } + + public static AngleFloat Revolutions(float revolutions) { + // reduce it to (-0.5 .. 0.5] + if (float.IsFinite(revolutions)) { + // Get the integer part + int integerPart = (int)revolutions; + + // Get the decimal part + revolutions -= integerPart; + if (revolutions < -0.5) + revolutions += 1; + if (revolutions >= 0.5) + revolutions -= 1; + } + return new AngleFloat(revolutions * 360); + } + + public readonly float inDegrees => this.value; + + public readonly float inRadians => this.value * Deg2Rad; + + public readonly float inRevolutions => this.value / 360.0f; + + public override string ToString() { + return $"{this.inDegrees}\u00B0"; + } + + public static readonly AngleFloat zero = Degrees(0); + public static readonly AngleFloat deg90 = Degrees(90); + public static readonly AngleFloat deg180 = Degrees(180); + + ///

+ /// Get the sign of the angle + /// + /// The angle + /// -1 when the angle is negative, 1 when it is positive and 0 in all other cases + public static int Sign(AngleFloat a) { + if (a.value < 0) + return -1; + if (a.value > 0) + return 1; + return 0; + } + + /// + /// Returns the magnitude of the angle + /// + /// The angle + /// The positive magnitude of the angle + /// Negative values are negated to get a positive result + public static AngleFloat Abs(AngleFloat a) { + if (Sign(a) < 0) + return -a; + else + return a; + } + + /// + /// Tests the equality of two angles + /// + /// + /// + /// True when the angles are equal, false otherwise + /// The equality is determine within the limits of precision of a float + public static bool operator ==(AngleFloat a1, AngleFloat a2) { + return a1.value == a2.value; + } + + /// + /// Tests the inequality of two angles + /// + /// + /// + /// True when the angles are not equal, false otherwise + /// The equality is determine within the limits of precision of a float + public static bool operator !=(AngleFloat a1, AngleFloat a2) { + return a1.value != a2.value; + } + + public override readonly bool Equals(object obj) { + if (obj is AngleFloat other) { + return this == other; + } + return false; + } + + public override readonly int GetHashCode() { + return this.value.GetHashCode(); + } + + + /// + /// Tests if the first angle is greater than the second + /// + /// + /// + /// True when a1 is greater than a2, False otherwise + public static bool operator >(AngleFloat a1, AngleFloat a2) { + return a1.value > a2.value; + } + + /// + /// Tests if the first angle is greater than or equal to the second + /// + /// + /// + /// True when a1 is greater than or equal to a2, False otherwise + public static bool operator >=(AngleFloat a1, AngleFloat a2) { + return a1.value >= a2.value; + } + + /// + /// Tests if the first angle is less than the second + /// + /// + /// + /// True when a1 is less than a2, False otherwise + public static bool operator <(AngleFloat a1, AngleFloat a2) { + return a1.value < a2.value; + } + + /// + /// Tests if the first angle is less than or equal to the second + /// + /// + /// + /// True when a1 is less than or equal to a2, False otherwise + public static bool operator <=(AngleFloat a1, AngleFloat a2) { + return a1.value <= a2.value; + } + + /// + /// Negate the angle + /// + /// The angle + /// The negated angle + /// The negation of -180 is still -180 because the range is (-180..180] + public static AngleFloat operator -(AngleFloat a) { + AngleFloat r = new(-a.value); + return r; + } + + /// + /// Subtract two angles + /// + /// Angle 1 + /// Angle 2 + /// The result of the subtraction + public static AngleFloat operator -(AngleFloat a1, AngleFloat a2) { + AngleFloat r = new(a1.value - a2.value); + return r; + } + /// + /// Add two angles + /// + /// Angle 1 + /// Angle 2 + /// The result of the addition + public static AngleFloat operator +(AngleFloat a1, AngleFloat a2) { + AngleFloat r = new(a1.value + a2.value); + return r; + } + + /// + /// Multiplies the angle + /// + /// The angle to multiply + /// The factor by which the angle is multiplied + /// The multiplied angle + public static AngleFloat operator *(AngleFloat a, float factor) { + return Degrees(a.inDegrees * factor); + } + public static AngleFloat operator *(float factor, AngleFloat a) { + return Degrees(factor * a.inDegrees); + } + + /// + /// Clamp the angle between the given min and max values + /// + /// The angle to clamp + /// The minimum angle + /// The maximum angle + /// The clamped angle + /// Angles are normalized + public static float Clamp(AngleFloat angle, AngleFloat min, AngleFloat max) { + return Float.Clamp(angle.inDegrees, min.inDegrees, max.inDegrees); + } + + /// @brief Calculates the cosine of an angle + /// @param angle The given angle + /// @return The cosine of the angle + public static float Cos(AngleFloat angle) { + return MathF.Cos(angle.inRadians); + } + /// @brief Calculates the sine of an angle + /// @param angle The given angle + /// @return The sine of the angle + public static float Sin(AngleFloat angle) { + return MathF.Sin(angle.inRadians); + } + /// @brief Calculates the tangent of an angle + /// @param angle The given angle + /// @return The tangent of the angle + public static float Tan(AngleFloat angle) { + return MathF.Tan(angle.inRadians); + } + + /// @brief Calculates the arc cosine angle + /// @param f The value + /// @return The arc cosine for the given value + public static AngleFloat Acos(float f) { + return Radians(MathF.Acos(f)); + } + /// @brief Calculates the arc sine angle + /// @param f The value + /// @return The arc sine for the given value + public static AngleFloat Asin(float f) { + return Radians(MathF.Asin(f)); + } + /// @brief Calculates the arc tangent angle + /// @param f The value + /// @return The arc tangent for the given value + public static AngleFloat Atan(float f) { + return Radians(MathF.Atan(f)); + } + /// @brief Calculates the tangent for the given values + /// @param y The vertical value + /// @param x The horizontal value + /// @return The tanget for the given values + /// Uses the y and x signs to compute the quadrant + public static AngleFloat Atan2(float y, float x) { + return Radians(MathF.Atan2(y, x)); + } + + /// + /// Rotate from one angle to the other with a maximum degrees + /// + /// Starting angle + /// Target angle + /// Maximum angle to rotate + /// The resulting angle + /// This function is compatible with radian and degrees angles + public static AngleFloat MoveTowards(AngleFloat fromAngle, AngleFloat toAngle, float maxDegrees) { + maxDegrees = Math.Max(0, maxDegrees); // filter out negative distances + AngleFloat d = toAngle - fromAngle; + float dDegrees = Abs(d).inDegrees; + d = Degrees(Float.Clamp(dDegrees, 0, maxDegrees)); + if (Sign(d) < 0) + d = -d; + return fromAngle + d; + } + } + + + /// + /// %Angle utilities + /// + public static class Angles { + public const float pi = 3.1415927410125732421875F; + // public static float Rad2Deg = 360.0f / ((float)Math.PI * 2); + // public static float Deg2Rad = ((float)Math.PI * 2) / 360.0f; + + + /// + /// Determine the angle difference, result is a normalized angle + /// + /// First first angle + /// The second angle + /// the angle between the two angles + /// Angle values should be degrees + public static float Difference(float a, float b) { + float r = Normalize(b - a); + return r; + } + + /// + /// Normalize an angle to the range -180 < angle <= 180 + /// + /// The angle to normalize + /// The normalized angle in interval (-180..180] + /// Angle values should be in degrees + public static float Normalize(float angle) { + if (float.IsInfinity(angle)) + return angle; + + while (angle <= -180) angle += 360; + while (angle > 180) angle -= 360; + return angle; + } + + /// + /// Map interval of angles between vectors [0..Pi] to interval [0..1] + /// + /// The first vector + /// The second vector + /// The resulting factor in interval [0..1] + /// Vectors a and b must be normalized + /// \deprecated Please use Vector2.ToFactor instead. + // [Obsolete("Please use Vector2.ToFactor instead.")] + // public static float ToFactor(Vector2Float v1, Vector2Float v2) { + // return (1 - Vector2Float.Dot(v1, v2)) / 2; + // } + + } + +} \ No newline at end of file diff --git a/LinearAlgebra/src/Decomposition.cs b/LinearAlgebra/src/Decomposition.cs new file mode 100644 index 0000000..ddaf434 --- /dev/null +++ b/LinearAlgebra/src/Decomposition.cs @@ -0,0 +1,287 @@ +using System; +namespace LinearAlgebra { + class QR { + // QR Decomposition of a matrix A + public static (Matrix2 Q, Matrix2 R) Decomposition(Matrix2 A) { + int nRows = A.nRows; + int nCols = A.nCols; + + float[,] Q = new float[nRows, nCols]; + float[,] R = new float[nCols, nCols]; + + // Perform Gram-Schmidt orthogonalization + for (uint colIx = 0; colIx < nCols; colIx++) { + + // Step 1: v = column(ix) of A + float[] v = new float[nRows]; + for (int rowIx = 0; rowIx < nRows; rowIx++) + v[rowIx] = A.data[rowIx, colIx]; + + // Step 2: Subtract projections of v onto previous q's (orthogonalize) + for (uint colIx2 = 0; colIx2 < colIx; colIx2++) { + float dotProd = 0; + for (int i = 0; i < nRows; i++) + dotProd += Q[i, colIx2] * v[i]; + for (int i = 0; i < nRows; i++) + v[i] -= dotProd * Q[i, colIx2]; + } + + // Step 3: Normalize v to get column(ix) of Q + float norm = 0; + for (int rowIx = 0; rowIx < nRows; rowIx++) + norm += v[rowIx] * v[rowIx]; + norm = (float)Math.Sqrt(norm); + + for (int rowIx = 0; rowIx < nRows; rowIx++) + Q[rowIx, colIx] = v[rowIx] / norm; + + // Store the coefficients of R + for (int colIx2 = 0; colIx2 <= colIx; colIx2++) { + R[colIx2, colIx] = 0; + for (int k = 0; k < nRows; k++) + R[colIx2, colIx] += Q[k, colIx2] * A.data[k, colIx]; + } + } + return (new Matrix2(Q), new Matrix2(R)); + } + + // Reduced QR Decomposition of a matrix A + public static (Matrix2 Q, Matrix2 R) ReducedDecomposition(Matrix2 A) { + int nRows = A.nRows; + int nCols = A.nCols; + + float[,] Q = new float[nRows, nCols]; + float[,] R = new float[nCols, nCols]; + + // Perform Gram-Schmidt orthogonalization + for (int colIx = 0; colIx < nCols; colIx++) { + + // Step 1: v = column(colIx) of A + float[] columnIx = new float[nRows]; + bool isZeroColumn = true; + for (int rowIx = 0; rowIx < nRows; rowIx++) { + columnIx[rowIx] = A.data[rowIx, colIx]; + if (columnIx[rowIx] != 0) + isZeroColumn = false; + } + if (isZeroColumn) { + for (int rowIx = 0; rowIx < nRows; rowIx++) + Q[rowIx, colIx] = 0; + // Set corresponding R element to 0 + R[colIx, colIx] = 0; + + Console.WriteLine($"zero column {colIx}"); + + continue; + } + + // Step 2: Subtract projections of v onto previous q's (orthogonalize) + for (int colIx2 = 0; colIx2 < colIx; colIx2++) { + // Compute the dot product of v and column(colIx2) of Q + float dotProduct = 0; + for (int rowIx2 = 0; rowIx2 < nRows; rowIx2++) + dotProduct += columnIx[rowIx2] * Q[rowIx2, colIx2]; + // Subtract the projection from v + for (int rowIx2 = 0; rowIx2 < nRows; rowIx2++) + columnIx[rowIx2] -= dotProduct * Q[rowIx2, colIx2]; + } + + // Step 3: Normalize v to get column(colIx) of Q + float norm = 0; + for (int rowIx = 0; rowIx < nRows; rowIx++) + norm += columnIx[rowIx] * columnIx[rowIx]; + if (norm == 0) + throw new Exception("invalid value"); + + norm = (float)Math.Sqrt(norm); + + for (int rowIx = 0; rowIx < nRows; rowIx++) + Q[rowIx, colIx] = columnIx[rowIx] / norm; + + // Here is where it deviates from the Full QR Decomposition ! + + // Step 4: Compute the row(colIx) of R + for (int colIx2 = colIx; colIx2 < nCols; colIx2++) { + float dotProduct = 0; + for (int rowIx2 = 0; rowIx2 < nRows; rowIx2++) + dotProduct += Q[rowIx2, colIx] * A.data[rowIx2, colIx2]; + R[colIx, colIx2] = dotProduct; + } + } + if (!float.IsFinite(R[0, 0])) + throw new Exception("invalid value"); + + return (new Matrix2(Q), new Matrix2(R)); + } + } + + class SVD { + // According to ChatGPT, Mathnet uses Golub-Reinsch SVD algorithm + // 1. Bidiagonalization: The input matrix AA is reduced to a bidiagonal form using Golub-Kahan bidiagonalization. + // This process involves applying a sequence of Householder reflections to AA to create a bidiagonal matrix. + // This step reduces the complexity by making the matrix simpler while retaining the essential structure needed for SVD. + // + // 2. Diagonalization: Once the matrix is in bidiagonal form, + // the singular values are computed using an iterative process + // (typically involving QR factorization or Jacobi rotations) until convergence. + // This process diagonalizes the bidiagonal matrix and allows extraction of the singular values. + // + // 3. Computing UU and VTVT: After obtaining the singular values, + // the left singular vectors UU and right singular vectors VTVT are computed + // using the accumulated transformations (such as Householder reflections) from the bidiagonalization step. + + // Bidiagnolizations through Householder transformations + public static (Matrix2 U1, Matrix2 B, Matrix2 V1) Bidiagonalization(Matrix2 A) { + int m = A.nRows; // Rows of A + int n = A.nCols; // Columns of A + float[,] U1 = new float[m, m]; // Left orthogonal matrix + float[,] V1 = new float[n, n]; // Right orthogonal matrix + float[,] B = A.Clone().data; // Copy A to B for transformation + + // Initialize U1 and V1 as identity matrices + for (int i = 0; i < m; i++) + U1[i, i] = 1; + for (int i = 0; i < n; i++) + V1[i, i] = 1; + + // Perform Householder reflections to create a bidiagonal matrix B + for (int j = 0; j < n; j++) { + // Step 1: Construct the Householder vector y + float[] y = new float[m - j]; + for (int i = j; i < m; i++) + y[i - j] = B[i, j]; + + // Step 2: Compute the norm and scalar alpha + float norm = 0; + for (int i = 0; i < y.Length; i++) + norm += y[i] * y[i]; + norm = (float)Math.Sqrt(norm); + + if (B[j, j] > 0) + norm = -norm; + + float alpha = (float)Math.Sqrt(0.5 * (norm * (norm - B[j, j]))); + float r = (float)Math.Sqrt(0.5 * (norm * (norm + B[j, j]))); + + // Step 3: Apply the reflection to zero out below diagonal + for (int k = j; k < n; k++) { + float dot = 0; + for (int i = j; i < m; i++) + dot += y[i - j] * B[i, k]; + dot /= r; + + for (int i = j; i < m; i++) + B[i, k] -= 2 * dot * y[i - j]; + } + + // Step 4: Update U1 with the Householder reflection (U1 * Householder) + for (int i = j; i < m; i++) + U1[i, j] = y[i - j] / alpha; + + // Step 5: Update V1 (storing the Householder vector y) + // Correct indexing: we only need to store part of y in V1 from index j to n + for (int i = j; i < n; i++) + V1[j, i] = B[j, i]; + + // Repeat steps for further columns if necessary + } + return (new Matrix2(U1), new Matrix2(B), new Matrix2(V1)); + } + + public static Matrix2 Bidiagonalize(Matrix2 A) { + int m = A.nRows; // Rows of A + int n = A.nCols; // Columns of A + float[,] B = A.Clone().data; // Copy A to B for transformation + + // Perform Householder reflections to create a bidiagonal matrix B + for (int j = 0; j < n; j++) { + // Step 1: Construct the Householder vector y + float[] y = new float[m - j]; + for (int i = j; i < m; i++) + y[i - j] = B[i, j]; + + // Step 2: Compute the norm and scalar alpha + float norm = 0; + for (int i = 0; i < y.Length; i++) + norm += y[i] * y[i]; + norm = (float)Math.Sqrt(norm); + + if (B[j, j] > 0) + norm = -norm; + + float r = (float)Math.Sqrt(0.5 * (norm * (norm + B[j, j]))); + + // Step 3: Apply the reflection to zero out below diagonal + for (int k = j; k < n; k++) { + float dot = 0; + for (int i = j; i < m; i++) + dot += y[i - j] * B[i, k]; + dot /= r; + + for (int i = j; i < m; i++) + B[i, k] -= 2 * dot * y[i - j]; + } + + // Repeat steps for further columns if necessary + } + return new Matrix2(B); + } + + // QR Iteration for diagonalization of a bidiagonal matrix B + public static (Matrix1 singularValues, Matrix2 U, Matrix2 Vt) QRIteration(Matrix2 B) { + int m = B.nRows; + int n = B.nCols; + + Matrix2 U = new(m, m); // Left singular vectors (U) + Matrix2 Vt = new(n, n); // Right singular vectors (V^T) + float[] singularValues = new float[Math.Min(m, n)]; // Singular values + + // Initialize U and Vt as identity matrices + for (int i = 0; i < m; i++) + U.data[i, i] = 1; + for (int i = 0; i < n; i++) + Vt.data[i, i] = 1; + + // Perform QR iterations + float tolerance = 1e-7f; //1e-12f; for double + bool converged = false; + while (!converged) { + // Perform QR decomposition on the matrix B + (Matrix2 Q, Matrix2 R) = QR.Decomposition(B); + + // Update B to be the product Q * R //R * Q + B = R * Q; + + // Accumulate the transformations in U and Vt + U *= Q; + Vt *= R; + + // Check convergence by looking at the off-diagonal elements of B + converged = true; + for (int i = 0; i < m - 1; i++) { + for (int j = i + 1; j < n; j++) { + if (Math.Abs(B.data[i, j]) > tolerance) { + converged = false; + break; + } + } + } + } + + // Extract singular values (diagonal elements of B) + for (int i = 0; i < Math.Min(m, n); i++) + singularValues[i] = B.data[i, i]; + + return (new Matrix1(singularValues), U, Vt); + } + + public static (Matrix2 U, Matrix1 S, Matrix2 Vt) Decomposition(Matrix2 A) { + if (A.nRows != A.nCols) + throw new ArgumentException("SVD: matrix A has to be square."); + + Matrix2 B = Bidiagonalize(A); + (Matrix1 S, Matrix2 U, Matrix2 Vt) = QRIteration(B); + return (U, S, Vt); + } + } +} \ No newline at end of file diff --git a/LinearAlgebra/src/Direction.cs b/LinearAlgebra/src/Direction.cs new file mode 100644 index 0000000..fd25b98 --- /dev/null +++ b/LinearAlgebra/src/Direction.cs @@ -0,0 +1,261 @@ +using System; +#if UNITY_5_3_OR_NEWER +using Vector3Float = UnityEngine.Vector3; +#endif + +namespace LinearAlgebra +{ + + /// + /// A direction in 3D space + /// + /// A direction is represented using two angles: + /// * The horizontal angle ranging from -180 (inclusive) to 180 (exclusive) + /// degrees which is a rotation in the horizontal plane + /// * A vertical angle ranging from -90 (inclusive) to 90 (exclusive) degrees + /// which is the rotation in the up/down direction applied after the horizontal + /// rotation has been applied. + /// The angles are automatically normalized to stay within the abovenmentioned + /// ranges. + public struct Direction + { + /// @brief horizontal angle, range = (-180..180] degrees + public AngleFloat horizontal; + /// @brief vertical angle, range in degrees = (-90..90] degrees + public AngleFloat vertical; + + /// + /// Create a new direction + /// + /// The horizontal angle + /// The vertical angle + /// The direction will be normalized automatically + /// to ensure the angles are within the allowed ranges + public Direction(AngleFloat horizontal, AngleFloat vertical) + { + this.horizontal = horizontal; + this.vertical = vertical; + this.Normalize(); + } + + /// + /// Create a direction using angle values in degrees + /// + /// The horizontal angle in degrees + /// The vertical angle in degrees + /// The direction + /// The direction will be normalized automatically + /// to ensure the angles are within the allowed ranges + public static Direction Degrees(float horizontal, float vertical) + { + Direction d = new() + { + horizontal = AngleFloat.Degrees(horizontal), + vertical = AngleFloat.Degrees(vertical) + }; + d.Normalize(); + return d; + } + /// + /// Create a direction using angle values in radians + /// + /// The horizontal angle in radians + /// The vertical angle in radians + /// The direction + public static Direction Radians(float horizontal, float vertical) + { + Direction d = new() + { + horizontal = AngleFloat.Radians(horizontal), + vertical = AngleFloat.Radians(vertical) + }; + d.Normalize(); + return d; + } + + public override readonly string ToString() { + return $"Direction(h: {this.horizontal}, v: {this.vertical})"; + } + + /// + /// A forward direction with zero for both angles + /// + public readonly static Direction forward = Degrees(0, 0); + /// + /// A backward direction with horizontal angle -180 and zero vertical + /// angle + /// + public readonly static Direction backward = Degrees(-180, 0); + /// + /// A upward direction with zero horizontal angle and vertical angle 90 + /// + public readonly static Direction up = Degrees(0, 90); + /// + /// A downward direction with zero horizontal angle and vertical angle + /// -90 + /// + public readonly static Direction down = Degrees(0, -90); + /// + /// A left-pointing direction with horizontal angle -90 and zero + /// vertical angle + /// + public readonly static Direction left = Degrees(-90, 0); + /// + /// A right-pointing direction with horizontal angle 90 and zero + /// vertical angle + /// + public readonly static Direction right = Degrees(90, 0); + + private void Normalize() + { + if (this.vertical > AngleFloat.deg90 || this.vertical < -AngleFloat.deg90) + { + this.horizontal += AngleFloat.deg180; + this.vertical = AngleFloat.Degrees(180 - this.vertical.inDegrees); + } + } + +#if UNITY_5_3_OR_NEWER + /// + /// Convert the direction into a carthesian vector + /// + /// The carthesian vector corresponding to this direction. + public readonly UnityEngine.Vector3 ToVector3() { + // Convert degrees to radians + float radH = this.horizontal.inRadians; + float radV = this.vertical.inRadians; + + // Calculate Vector + float cosV = MathF.Cos(radV); + float sinV = MathF.Sin(radV); + + float x = cosV * MathF.Sin(radH); + float y = sinV; + float z = cosV * MathF.Cos(radH); + + return new UnityEngine.Vector3(x, y, z); + } + + /// + /// Convert a carthesian vector into a direction + /// + /// The carthesian vector + /// The direction + /// Information about the length of the carthesian vector is not + /// included in this transformation + public static Direction FromVector3(UnityEngine.Vector3 v) { + AngleFloat horizontal = AngleFloat.Atan2(v.x, v.z); + AngleFloat vertical = AngleFloat.deg90 - AngleFloat.Acos(v.y); + Direction d = new(horizontal, vertical); + return d; + } +#else + /// + /// Convert the direction into a carthesian vector + /// + /// The carthesian vector corresponding to this direction. + public readonly Vector3Float ToVector3() { + // Quaternion q = Quaternion.Euler(90 - this.vertical.inDegrees, this.horizontal.inDegrees, 0); + // Vector3Float v = q * Vector3Float.forward; + // return v; + + float radH = this.horizontal.inRadians; + float radV = this.vertical.inRadians; + + float cosV = MathF.Cos(radV); + float sinV = MathF.Sin(radV); + + float horizontal = cosV * MathF.Sin(radH); + float vertical = sinV; + float depth = cosV * MathF.Cos(radH); + + return new Vector3Float(horizontal, vertical, depth); + } + + /// + /// Convert a carthesian vector into a direction + /// + /// The carthesian vector + /// The direction + /// Information about the length of the carthesian vector is not + /// included in this transformation + public static Direction FromVector3(Vector3Float v) + { + AngleFloat horizontal = AngleFloat.Atan2(v.horizontal, v.depth); + AngleFloat vertical = AngleFloat.deg90 - AngleFloat.Acos(v.vertical); + Direction d = new(horizontal, vertical); + return d; + } +#endif + + public static Direction operator -(Direction d) { + AngleFloat horizontal = d.horizontal + AngleFloat.deg180; + AngleFloat vertical = -d.vertical; + return new Direction(horizontal, vertical); + } + + /// + /// Tests the equality of two directions + /// + /// + /// + /// True when the direction angles are equal, false otherwise. + public static bool operator ==(Direction d1, Direction d2) + { + bool horizontalEq = d1.horizontal == d2.horizontal; + bool verticalEq = d1.vertical == d2.vertical; + return horizontalEq && verticalEq; + } + + /// + /// Tests the inequality of two directions + /// + /// + /// + /// True when the direction angles are not equal, false otherwise. + public static bool operator !=(Direction d1, Direction d2) + { + bool horizontalNEq = d1.horizontal != d2.horizontal; + bool verticalNEq = d1.vertical != d2.vertical; + return horizontalNEq || verticalNEq; + } + + public override readonly bool Equals(object obj) + { + if (obj is not Direction d) + return false; + + bool horizontalEq = this.horizontal == d.horizontal; + bool verticalEq = this.vertical == d.vertical; + return horizontalEq && verticalEq; + } + + + public override readonly int GetHashCode() + { + return HashCode.Combine(horizontal, vertical); + } + + public static AngleFloat UnsignedAngle(Direction d1, Direction d2) { + // Convert angles from degrees to radians + float horizontal1Rad = d1.horizontal.inRadians; + float vertical1Rad = d1.vertical.inRadians; + + float horizontal2Rad = d2.horizontal.inRadians; + float vertical2Rad = d2.vertical.inRadians; + + // Calculate the cosine of the angle using the spherical law of cosines + float cosTheta = MathF.Sin(vertical1Rad) * MathF.Sin(vertical2Rad) + + MathF.Cos(vertical1Rad) * MathF.Cos(vertical2Rad) * + MathF.Cos(horizontal1Rad - horizontal2Rad); + + // Clip cosTheta to the valid range for acos + cosTheta = Float.Clamp(cosTheta, -1.0f, 1.0f); + + // Calculate the angle + AngleFloat angle = AngleFloat.Acos(cosTheta); + return angle; + } + } + +} \ No newline at end of file diff --git a/LinearAlgebra/src/Float.cs b/LinearAlgebra/src/Float.cs new file mode 100644 index 0000000..2217b84 --- /dev/null +++ b/LinearAlgebra/src/Float.cs @@ -0,0 +1,41 @@ +namespace LinearAlgebra { + + /// + /// Float number utilities + /// + public class Float { + /// + /// The precision of float numbers + /// + public const float epsilon = 1E-05f; + /// + /// The square of the float number precision + /// + public const float sqrEpsilon = 1e-10f; + + /// + /// Clamp the value between the given minimum and maximum values + /// + /// The value to clamp + /// The minimum value + /// The maximum value + /// The clamped value + public static float Clamp(float f, float min, float max) { + if (f < min) + return min; + if (f > max) + return max; + return f; + } + + /// + /// Clamp the value between to the interval [0..1] + /// + /// The value to clamp + /// The clamped value + public static float Clamp01(float f) { + return Clamp(f, 0, 1); + } + } + +} \ No newline at end of file diff --git a/LinearAlgebra/src/LinearAlgebra.csproj b/LinearAlgebra/src/LinearAlgebra.csproj new file mode 100644 index 0000000..d2d5a85 --- /dev/null +++ b/LinearAlgebra/src/LinearAlgebra.csproj @@ -0,0 +1,14 @@ + + + + false + false + net8.0 + + + + + + + + diff --git a/LinearAlgebra/src/Matrix.cs b/LinearAlgebra/src/Matrix.cs new file mode 100644 index 0000000..37c6c24 --- /dev/null +++ b/LinearAlgebra/src/Matrix.cs @@ -0,0 +1,689 @@ +using System; +#if UNITY_5_3_OR_NEWER +using Vector3Float = UnityEngine.Vector3; +using Vector2Float = UnityEngine.Vector2; +using Quaternion = UnityEngine.Quaternion; +#endif + +namespace LinearAlgebra { + + public readonly struct Slice + { + public int start { get; } + public int stop { get; } + public Slice(int start, int stop) + { + this.start = start; + this.stop = stop; + } + } + + public class Matrix2 { + public float[,] data { get; } + + public int nRows => data.GetLength(0); + public int nCols => data.GetLength(1); + + public Matrix2(int nRows, int nCols) + { + this.data = new float[nRows, nCols]; + } + public Matrix2(float[,] data) { + this.data = data; + } + + public Matrix2 Clone() { + float[,] data = new float[this.nRows, nCols]; + for (int rowIx = 0; rowIx < this.nRows; rowIx++) { + for (int colIx = 0; colIx < this.nCols; colIx++) + data[rowIx, colIx] = this.data[rowIx, colIx]; + } + return new Matrix2(data); + } + + public static Matrix2 Zero(int nRows, int nCols) + { + return new Matrix2(nRows, nCols); + } + + public static Matrix2 FromVector3(Vector3Float v) { + float[,] result = new float[3, 1]; + result[0, 0] = v.horizontal; + result[1, 0] = v.vertical; + result[2, 0] = v.depth; + return new Matrix2(result); + } + + public static Matrix2 Identity(int size) + { + return Diagonal(1, size); + } + public static Matrix2 Identity(int nRows, int nCols) + { + Matrix2 m = Zero(nRows, nCols); + m.FillDiagonal(1); + return m; + } + + public static Matrix2 Diagonal(Matrix1 v) { + float[,] resultData = new float[v.size, v.size]; + for (int ix = 0; ix < v.size; ix++) + resultData[ix, ix] = v.data[ix]; + return new Matrix2(resultData); + } + public static Matrix2 Diagonal(float f, int size) + { + float[,] resultData = new float[size, size]; + for (int ix = 0; ix < size; ix++) + resultData[ix, ix] = f; + return new Matrix2(resultData); + } + public void FillDiagonal(Matrix1 v) + { + int n = (int)Math.Min(Math.Min(this.nRows, this.nCols), v.size); + for (int ix = 0; ix < n; ix++) + this.data[ix, ix] = v.data[ix]; + } + public void FillDiagonal(float f) + { + int n = Math.Min(this.nRows, this.nCols); + for (int ix = 0; ix < n; ix++) + this.data[ix, ix] = f; + } + + public static Matrix2 SkewMatrix(Vector3Float v) { + float[,] result = new float[3, 3] { + {0, -v.depth, v.vertical}, + {v.depth, 0, -v.horizontal}, + {-v.vertical, v.horizontal, 0} + }; + return new Matrix2(result); + } + + public Matrix1 GetRow(int rowIx) { + float[] row = new float[this.nCols]; + for (int colIx = 0; colIx < this.nCols; colIx++) { + row[colIx] = this.data[rowIx, colIx]; + } + return new Matrix1(row); + } + +#if UNITY_5_3_OR_NEWER + public UnityEngine.Vector3 GetRow3(int rowIx) { + int cols = this.nCols; + UnityEngine.Vector3 row = new() { + x = this.data[rowIx, 0], + y = this.data[rowIx, 1], + z = this.data[rowIx, 2] + }; + return row; + } +#endif + public void SetRow(int rowIx, Matrix1 v) { + for (uint ix = 0; ix < v.size; ix++) + this.data[rowIx, ix] = v.data[ix]; + } + public void SetRow3(int rowIx, Vector3Float v) { + this.data[rowIx, 0] = v.horizontal; + this.data[rowIx, 1] = v.vertical; + this.data[rowIx, 2] = v.depth; + } + + public void SwapRows(int row1, int row2) { + for (uint ix = 0; ix < this.nCols; ix++) { + float temp = this.data[row1, ix]; + this.data[row1, ix] = this.data[row2, ix]; + this.data[row2, ix] = temp; + } + } + + public Matrix1 GetColumn(int colIx) + { + float[] column = new float[this.nRows]; + for (int i = 0; i < this.nRows; i++) { + column[i] = this.data[i, colIx]; + } + return new Matrix1(column); + } + public void SetColumn(int colIx, Matrix1 v) { + for (uint ix = 0; ix < v.size; ix++) + this.data[ix, colIx] = v.data[ix]; + } + public void SetColumn(int colIx, Vector3Float v) { + this.data[0, colIx] = v.horizontal; + this.data[1, colIx] = v.vertical; + this.data[2, colIx] = v.depth; + } + + public static bool AllClose(Matrix2 A, Matrix2 B, float atol = 1e-08f) { + for (int i = 0; i < A.nRows; i++) { + for (int j = 0; j < A.nCols; j++) { + float d = MathF.Abs(A.data[i, j] - B.data[i, j]); + if (d > atol) + return false; + } + } + return true; + } + + public Matrix2 Transpose() { + float[,] resultData = new float[this.nCols, this.nRows]; + for (uint rowIx = 0; rowIx < this.nRows; rowIx++) { + for (uint colIx = 0; colIx < this.nCols; colIx++) + resultData[colIx, rowIx] = this.data[rowIx, colIx]; + } + return new Matrix2(resultData); + // double checked code + } + public Matrix2 transposed { + get => Transpose(); + } + + public static Matrix2 operator -(Matrix2 m) { + float[,] result = new float[m.nRows, m.nCols]; + + for (int i = 0; i < m.nRows; i++) { + for (int j = 0; j < m.nCols; j++) + result[i, j] = -m.data[i, j]; + } + return new Matrix2(result); + } + + public static Matrix2 operator -(Matrix2 A, Matrix2 B) { + if (A.nRows != B.nRows || A.nCols != B.nCols) + throw new System.ArgumentException("Size of A must match size of B."); + + float[,] result = new float[A.nRows, B.nCols]; + + for (int i = 0; i < A.nRows; i++) { + for (int j = 0; j < A.nCols; j++) + result[i, j] = A.data[i, j] - B.data[i, j]; + } + return new Matrix2(result); + } + + public static Matrix2 operator +(Matrix2 A, Matrix2 B) { + if (A.nRows != B.nRows || A.nCols != B.nCols) + throw new System.ArgumentException("Size of A must match size of B."); + + float[,] result = new float[A.nRows, B.nCols]; + + for (int i = 0; i < A.nRows; i++) { + for (int j = 0; j < A.nCols; j++) + result[i, j] = A.data[i, j] + B.data[i, j]; + } + return new Matrix2(result); + } + + public static Matrix2 operator *(Matrix2 A, Matrix2 B) { + if (A.nCols != B.nRows) + throw new System.ArgumentException("Number of columns in A must match number of rows in B."); + + float[,] result = new float[A.nRows, B.nCols]; + + for (int i = 0; i < A.nRows; i++) { + for (int j = 0; j < B.nCols; j++) { + float sum = 0.0f; + for (int k = 0; k < A.nCols; k++) + sum += A.data[i, k] * B.data[k, j]; + + result[i, j] = sum; + } + } + + return new Matrix2(result); + // double checked code + } + + public static Matrix1 operator *(Matrix2 A, Matrix1 v) { + float[] result = new float[A.nRows]; + + for (int i = 0; i < A.nRows; i++) { + for (int j = 0; j < A.nCols; j++) { + result[i] += A.data[i, j] * v.data[j]; + } + } + + return new Matrix1(result); + } + + public static Vector3Float operator *(Matrix2 A, Vector3Float v) { + return new Vector3Float( + A.data[0, 0] * v.horizontal + A.data[0, 1] * v.vertical + A.data[0, 2] * v.depth, + A.data[1, 0] * v.horizontal + A.data[1, 1] * v.vertical + A.data[1, 2] * v.depth, + A.data[2, 0] * v.horizontal + A.data[2, 1] * v.vertical + A.data[2, 2] * v.depth + ); + } + + public static Matrix2 operator *(Matrix2 A, float s) { + float[,] result = new float[A.nRows, A.nCols]; + + for (int i = 0; i < A.nRows; i++) { + for (int j = 0; j < A.nCols; j++) + result[i, j] = A.data[i, j] * s; + } + + return new Matrix2(result); + } + public static Matrix2 operator *(float s, Matrix2 A) { + return A * s; + } + + public static Matrix2 operator /(Matrix2 A, float s) { + float[,] result = new float[A.nRows, A.nCols]; + + for (int i = 0; i < A.nRows; i++) { + for (int j = 0; j < A.nCols; j++) + result[i, j] = A.data[i, j] / s; + } + + return new Matrix2(result); + } + public static Matrix2 operator /(float s, Matrix2 A) { + float[,] result = new float[A.nRows, A.nCols]; + + for (int i = 0; i < A.nRows; i++) { + for (int j = 0; j < A.nCols; j++) + result[i, j] = s / A.data[i, j]; + } + + return new Matrix2(result); + } + + public Matrix2 GetRows(Slice slice) { + return GetRows(slice.start, slice.stop); + } + public Matrix2 GetRows(int from, int to) { + if (from < 0 || to >= this.nRows) + throw new System.ArgumentException("Slice index out of range."); + + float[,] result = new float[to - from, this.nCols]; + int resultRowIx = 0; + for (int rowIx = from; rowIx < to; rowIx++) { + for (int colIx = 0; colIx < this.nCols; colIx++) + result[resultRowIx, colIx] = this.data[rowIx, colIx]; + + resultRowIx++; + } + + return new Matrix2(result); + } + + public Matrix2 Slice(Slice slice) + { + return Slice(slice.start, slice.stop); + } + public Matrix2 Slice(int from, int to) + { + if (from < 0 || to >= this.nRows) + throw new System.ArgumentException("Slice index out of range."); + + float[,] result = new float[to - from, this.nCols]; + int resultRowIx = 0; + for (int rowIx = from; rowIx < to; rowIx++) + { + for (int colIx = 0; colIx < this.nCols; colIx++) + { + result[resultRowIx, colIx] = this.data[rowIx, colIx]; + } + resultRowIx++; + } + + return new Matrix2(result); + } + public Matrix2 Slice(Slice rowRange, Slice colRange) { + return Slice((rowRange.start, rowRange.stop), (colRange.start, colRange.stop)); + } + public Matrix2 Slice((int start, int stop) rowRange, (int start, int stop) colRange) + { + float[,] result = new float[rowRange.stop - rowRange.start, colRange.stop - colRange.start]; + + int resultRowIx = 0; + int resultColIx = 0; + for (int i = rowRange.start; i < rowRange.stop; i++) + { + for (int j = colRange.start; j < colRange.stop; j++) + result[resultRowIx, resultColIx] = this.data[i, j]; + } + return new Matrix2(result); + } + + public void UpdateSlice(Slice slice, Matrix2 m) { + UpdateSlice((slice.start, slice.stop), m); + } + public void UpdateSlice((int start, int stop) slice, Matrix2 m) { + // if (slice.start == slice.stop) + // Console.WriteLine("WARNING: no data is updates when start equals stop in a slice!"); + int mRowIx = 0; + for (int rowIx = slice.start; rowIx < slice.stop; rowIx++, mRowIx++) { + for (int colIx = 0; colIx < this.nCols; colIx++) + this.data[rowIx, colIx] = m.data[mRowIx, colIx]; + } + } + + public void UpdateSlice(Slice rowRange, Slice colRange, Matrix2 m) + { + UpdateSlice((rowRange.start, rowRange.stop), (colRange.start, colRange.stop), m); + } + public void UpdateSlice((int start, int stop) rowRange, (int start, int stop) colRange, Matrix2 m) + { + for (int i = rowRange.start; i < rowRange.stop; i++) + { + for (int j = colRange.start; j < colRange.stop; j++) + this.data[i, j] = m.data[i - rowRange.start, j - colRange.start]; + } + } + + public Matrix2 Inverse() { + Matrix2 A = this; + // unchecked + int n = A.nRows; + + // Create an identity matrix of the same size as the original matrix + float[,] augmentedMatrix = new float[n, 2 * n]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + augmentedMatrix[i, j] = A.data[i, j]; + augmentedMatrix[i, j + n] = (i == j) ? 1 : 0; // Identity matrix + } + } + + // Perform Gaussian elimination + for (int i = 0; i < n; i++) { + // Find the pivot row + float pivot = augmentedMatrix[i, i]; + if (Math.Abs(pivot) < 1e-10) // Check for singular matrix + throw new InvalidOperationException("Matrix is singular and cannot be inverted."); + + // Normalize the pivot row + for (int j = 0; j < 2 * n; j++) + augmentedMatrix[i, j] /= pivot; + + // Eliminate the column below the pivot + for (int j = i + 1; j < n; j++) { + float factor = augmentedMatrix[j, i]; + for (int k = 0; k < 2 * n; k++) + augmentedMatrix[j, k] -= factor * augmentedMatrix[i, k]; + } + } + + // Back substitution + for (int i = n - 1; i >= 0; i--) + { + // Eliminate the column above the pivot + for (int j = i - 1; j >= 0; j--) + { + float factor = augmentedMatrix[j, i]; + for (int k = 0; k < 2 * n; k++) + augmentedMatrix[j, k] -= factor * augmentedMatrix[i, k]; + } + } + + // Extract the inverse matrix from the augmented matrix + float[,] inverse = new float[n, n]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) + inverse[i, j] = augmentedMatrix[i, j + n]; + } + + return new Matrix2(inverse); + } + + public float Determinant() + { + int n = this.nRows; + if (n != this.nCols) + throw new System.ArgumentException("Matrix must be square."); + + if (n == 1) + return this.data[0, 0]; // Base case for 1x1 matrix + + if (n == 2) // Base case for 2x2 matrix + return this.data[0, 0] * this.data[1, 1] - this.data[0, 1] * this.data[1, 0]; + + float det = 0; + for (int col = 0; col < n; col++) + det += (col % 2 == 0 ? 1 : -1) * this.data[0, col] * this.Minor(0, col).Determinant(); + + return det; + } + + // Helper function to compute the minor of a matrix + private Matrix2 Minor(int rowToRemove, int colToRemove) + { + int n = this.nRows; + float[,] minor = new float[n - 1, n - 1]; + + int r = 0, c = 0; + for (int i = 0; i < n; i++) { + if (i == rowToRemove) continue; + + c = 0; + for (int j = 0; j < n; j++) { + if (j == colToRemove) continue; + + minor[r, c] = this.data[i, j]; + c++; + } + r++; + } + + return new Matrix2(minor); + } + + public static Matrix2 DeleteRows(Matrix2 A, Slice rowRange) { + float[,] result = new float[A.nRows - (rowRange.stop - rowRange.start), A.nCols]; + + int resultRowIx = 0; + for (int i = 0; i < A.nRows; i++) { + if (i >= rowRange.start && i < rowRange.stop) + continue; + + for (int j = 0; j < A.nCols; j++) + result[resultRowIx, j] = A.data[i, j]; + + resultRowIx++; + } + return new Matrix2(result); + } + + internal static Matrix2 DeleteColumns(Matrix2 A, Slice colRange) { + float[,] result = new float[A.nRows, A.nCols - (colRange.stop - colRange.start)]; + + for (int i = 0; i < A.nRows; i++) { + int resultColIx = 0; + for (int j = 0; j < A.nCols; j++) { + if (j >= colRange.start && j < colRange.stop) + continue; + + result[i, resultColIx++] = A.data[i, j]; + } + } + return new Matrix2(result); + } + } + + public class Matrix1 + { + public float[] data { get; } + + public int size => data.GetLength(0); + + public Matrix1(int size) + { + this.data = new float[size]; + } + + public Matrix1(float[] data) { + this.data = data; + } + + public static Matrix1 Zero(int size) + { + return new Matrix1(size); + } + + public static Matrix1 FromVector2(Vector2Float v) { + float[] result = new float[2]; + result[0] = v.horizontal; + result[1] = v.vertical; + return new Matrix1(result); + } + + public static Matrix1 FromVector3(Vector3Float v) { + float[] result = new float[3]; + result[0] = v.horizontal; + result[1] = v.vertical; + result[2] = v.depth; + return new Matrix1(result); + } + +#if UNITY_5_3_OR_NEWER + public static Matrix1 FromQuaternion(Quaternion q) { + float[] result = new float[4]; + result[0] = q.x; + result[1] = q.y; + result[2] = q.z; + result[3] = q.w; + return new Matrix1(result); + } +#endif + + public Vector2Float vector2 { + get { + if (this.size != 2) + throw new System.ArgumentException("Matrix1 must be of size 2"); + return new Vector2Float(this.data[0], this.data[1]); + } + } + public Vector3Float vector3 { + get { + if (this.size != 3) + throw new System.ArgumentException("Matrix1 must be of size 3"); + return new Vector3Float(this.data[0], this.data[1], this.data[2]); + } + } + +#if UNITY_5_3_OR_NEWER + public Quaternion quaternion { + get { + if (this.size != 4) + throw new System.ArgumentException("Matrix1 must be of size 4"); + return new Quaternion(this.data[0], this.data[1], this.data[2], this.data[3]); + } + } +#endif + + public Matrix1 Clone() { + float[] data = new float[this.size]; + for (int rowIx = 0; rowIx < this.size; rowIx++) + data[rowIx] = this.data[rowIx]; + return new Matrix1(data); + } + + + public float magnitude { + get { + float sum = 0; + foreach (var elm in data) + sum += elm; + return sum / data.Length; + } + } + public static Matrix1 operator +(Matrix1 A, Matrix1 B) { + if (A.size != B.size) + throw new System.ArgumentException("Size of A must match size of B."); + + float[] result = new float[A.size]; + + for (int i = 0; i < A.size; i++) { + result[i] = A.data[i] + B.data[i]; + } + return new Matrix1(result); + } + + public Matrix2 Transpose() { + float[,] r = new float[1, this.size]; + for (uint colIx = 0; colIx < this.size; colIx++) + r[1, colIx] = this.data[colIx]; + + return new Matrix2(r); + } + + public static float Dot(Matrix1 a, Matrix1 b) { + if (a.size != b.size) + throw new System.ArgumentException("Vectors must be of the same length."); + + float result = 0.0f; + for (int i = 0; i < a.size; i++) { + result += a.data[i] * b.data[i]; + } + return result; + } + + public static Matrix1 operator -(Matrix1 A, Matrix1 B) { + if (A.size != B.size) + throw new System.ArgumentException("Size of A must match size of B."); + + float[] result = new float[A.size]; + + for (int i = 0; i < A.size; i++) { + result[i] = A.data[i] - B.data[i]; + } + return new Matrix1(result); + } + + public static Matrix1 operator *(Matrix1 A, float f) + { + float[] result = new float[A.size]; + + for (int i = 0; i < A.size; i++) + result[i] += A.data[i] * f; + + return new Matrix1(result); + } + public static Matrix1 operator *(float f, Matrix1 A) { + return A * f; + } + + public static Matrix1 operator /(Matrix1 A, float f) { + float[] result = new float[A.size]; + + for (int i = 0; i < A.size; i++) + result[i] = A.data[i] / f; + + return new Matrix1(result); + } + public static Matrix1 operator /(float f, Matrix1 A) { + float[] result = new float[A.size]; + + for (int i = 0; i < A.size; i++) + result[i] = f / A.data[i]; + + return new Matrix1(result); + } + + public Matrix1 Slice(Slice range) + { + return Slice(range.start, range.stop); + } + public Matrix1 Slice(int from, int to) + { + if (from < 0 || to >= this.size) + throw new System.ArgumentException("Slice index out of range."); + + float[] result = new float[to - from]; + int resultIx = 0; + for (int ix = from; ix < to; ix++) + result[resultIx++] = this.data[ix]; + + return new Matrix1(result); + } + public void UpdateSlice(Slice slice, Matrix1 v) { + int vIx = 0; + for (int ix = slice.start; ix < slice.stop; ix++, vIx++) + this.data[ix] = v.data[vIx]; + } + } + +} \ No newline at end of file diff --git a/LinearAlgebra/src/Quat32.cs b/LinearAlgebra/src/Quat32.cs new file mode 100644 index 0000000..19ee9bc --- /dev/null +++ b/LinearAlgebra/src/Quat32.cs @@ -0,0 +1,87 @@ +using System; + +namespace LinearAlgebra { + public class Quat32 { + public float x; + public float y; + public float z; + public float w; + + public Quat32() { + this.x = 0; + this.y = 0; + this.z = 0; + this.w = 1; + } + + public Quat32(float x, float y, float z, float w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + public static Quat32 FromSwingTwist(SwingTwist s) { + Quat32 q32 = Quat32.Euler(-s.swing.vertical.inDegrees, s.swing.horizontal.inDegrees, s.twist.inDegrees); + return q32; + } + + public static Quat32 Euler(float yaw, float pitch, float roll) { + float rollOver2 = roll * AngleFloat.Deg2Rad * 0.5f; + float sinRollOver2 = (float)Math.Sin((float)rollOver2); + float cosRollOver2 = (float)Math.Cos((float)rollOver2); + float pitchOver2 = pitch * 0.5f; + float sinPitchOver2 = (float)Math.Sin((float)pitchOver2); + float cosPitchOver2 = (float)Math.Cos((float)pitchOver2); + float yawOver2 = yaw * 0.5f; + float sinYawOver2 = (float)Math.Sin((float)yawOver2); + float cosYawOver2 = (float)Math.Cos((float)yawOver2); + Quat32 result = new Quat32() { + w = cosYawOver2 * cosPitchOver2 * cosRollOver2 + + sinYawOver2 * sinPitchOver2 * sinRollOver2, + x = sinYawOver2 * cosPitchOver2 * cosRollOver2 + + cosYawOver2 * sinPitchOver2 * sinRollOver2, + y = cosYawOver2 * sinPitchOver2 * cosRollOver2 - + sinYawOver2 * cosPitchOver2 * sinRollOver2, + z = cosYawOver2 * cosPitchOver2 * sinRollOver2 - + sinYawOver2 * sinPitchOver2 * cosRollOver2 + }; + return result; + } + + public void ToAngles(out float right, out float up, out float forward) { + float test = this.x * this.y + this.z * this.w; + if (test > 0.499f) { // singularity at north pole + right = 0; + up = 2 * (float)Math.Atan2(this.x, this.w) * AngleFloat.Rad2Deg; + forward = 90; + return; + //return Vector3(0, 2 * (float)atan2(this.x, this.w) * Angle.Rad2Deg, 90); + } + else if (test < -0.499f) { // singularity at south pole + right = 0; + up = -2 * (float)Math.Atan2(this.x, this.w) * AngleFloat.Rad2Deg; + forward = -90; + return; + //return Vector3(0, -2 * (float)atan2(this.x, this.w) * Angle.Rad2Deg, -90); + } + else { + float sqx = this.x * this.x; + float sqy = this.y * this.y; + float sqz = this.z * this.z; + + right = (float)Math.Atan2(2 * this.x * this.w - 2 * this.y * this.z, 1 - 2 * sqx - 2 * sqz) * AngleFloat.Rad2Deg; + up = (float)Math.Atan2(2 * this.y * this.w - 2 * this.x * this.z, 1 - 2 * sqy - 2 * sqz) * AngleFloat.Rad2Deg; + forward = (float)Math.Asin(2 * test) * AngleFloat.Rad2Deg; + return; + // return Vector3( + // atan2f(2 * this.x * this.w - 2 * this.y * this.z, 1 - 2 * sqx - 2 * sqz) * + // Rad2Deg, + // atan2f(2 * this.y * this.w - 2 * this.x * this.z, 1 - 2 * sqy - 2 * sqz) * + // Rad2Deg, + // asinf(2 * test) * Angle.Rad2Deg); + } + } + + } +} \ No newline at end of file diff --git a/LinearAlgebra/src/Quaternion.cs b/LinearAlgebra/src/Quaternion.cs new file mode 100644 index 0000000..7936843 --- /dev/null +++ b/LinearAlgebra/src/Quaternion.cs @@ -0,0 +1,582 @@ +using System; +#if UNITY_5_3_OR_NEWER +using Quaternion = UnityEngine.Quaternion; +#endif + +namespace LinearAlgebra { + +#if UNITY_5_3_OR_NEWER + public class QuaternionExtensions { + public static Quaternion Reflect(Quaternion q) { + return new(-q.x, -q.y, -q.z, q.w); + } + + public static Matrix2 ToRotationMatrix(Quaternion q) { + float w = q.x, x = q.y, y = q.z, z = q.w; + + float[,] result = new float[,] + { + { 1 - 2 * (y * y + z * z), 2 * (x * y - w * z), 2 * (x * z + w * y) }, + { 2 * (x * y + w * z), 1 - 2 * (x * x + z * z), 2 * (y * z - w * x) }, + { 2 * (x * z - w * y), 2 * (y * z + w * x), 1 - 2 * (x * x + y * y) } + }; + return new Matrix2(result); + } + + public static Quaternion FromRotationMatrix(Matrix2 m) { + float trace = m.data[0, 0] + m.data[1, 1] + m.data[2, 2]; + float w, x, y, z; + + if (trace > 0) { + float s = 0.5f / (float)Math.Sqrt(trace + 1.0f); + w = 0.25f / s; + x = (m.data[2, 1] - m.data[1, 2]) * s; + y = (m.data[0, 2] - m.data[2, 0]) * s; + z = (m.data[1, 0] - m.data[0, 1]) * s; + } + else { + if (m.data[0, 0] > m.data[1, 1] && m.data[0, 0] > m.data[2, 2]) { + float s = 2.0f * (float)Math.Sqrt(1.0f + m.data[0, 0] - m.data[1, 1] - m.data[2, 2]); + w = (m.data[2, 1] - m.data[1, 2]) / s; + x = 0.25f * s; + y = (m.data[0, 1] + m.data[1, 0]) / s; + z = (m.data[0, 2] + m.data[2, 0]) / s; + } + else if (m.data[1, 1] > m.data[2, 2]) { + float s = 2.0f * (float)Math.Sqrt(1.0f + m.data[1, 1] - m.data[0, 0] - m.data[2, 2]); + w = (m.data[0, 2] - m.data[2, 0]) / s; + x = (m.data[0, 1] + m.data[1, 0]) / s; + y = 0.25f * s; + z = (m.data[1, 2] + m.data[2, 1]) / s; + } + else { + float s = 2.0f * (float)Math.Sqrt(1.0f + m.data[2, 2] - m.data[0, 0] - m.data[1, 1]); + w = (m.data[1, 0] - m.data[0, 1]) / s; + x = (m.data[0, 2] + m.data[2, 0]) / s; + y = (m.data[1, 2] + m.data[2, 1]) / s; + z = 0.25f * s; + } + } + + return new Quaternion(x, y, z, w); + } + } +#else + public struct Quaternion { + public float x; + public float y; + public float z; + public float w; + + /// + /// create a new quaternion with the given values + /// + /// x component + /// y component + /// z component + /// w component + public Quaternion(float x, float y, float z, float w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + /// + /// An identity quaternion + /// + public static readonly Quaternion identity = new(0, 0, 0, 1); + + private readonly Vector3Float xyz => new(x, y, z); + + private readonly float magnitude => MathF.Sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); + + private readonly float sqrMagnitude => x * x + y * y + z * z + w * w; + + /// + /// Convert to unit quaternion + /// + /// This will preserve the orientation, + /// but ensures that it is a unit quaternion. + public readonly Quaternion normalized { + get { + float length = this.magnitude; + Quaternion q = new(this.x / length, this.y / length, this.z / length, this.w / length); + return q; + } + } + + /// + /// Convert to unity quaternion + /// + /// The quaternion to convert + /// A unit quaternion + /// This will preserve the orientation, + /// but ensures that it is a unit quaternion. + public static Quaternion Normalize(Quaternion q) { + return q.normalized; + } + + /// + /// Convert to euler angles + /// + /// The quaternion to convert + /// A vector containing euler angles + /// The euler angles performed in the order: Z, X, Y + public static Vector3Float ToAngles(Quaternion q) { + // Extract Euler angles in Unity order (X = pitch, Y = yaw, Z = roll), returned in degrees as (x,pitch),(y,yaw),(z,roll) + // Handle singularities/gimbal lock + float test = 2f * (q.w * q.x - q.y * q.z); + // clamp + if (test >= 1f) test = 1f; + if (test <= -1f) test = -1f; + + float pitch = MathF.Asin(test); // X + + float roll = MathF.Atan2(2f * (q.w * q.z + q.x * q.y), + 1f - 2f * (q.x * q.x + q.z * q.z)); // Z + + float yaw = MathF.Atan2(2f * (q.w * q.y + q.x * q.z), + 1f - 2f * (q.y * q.y + q.x * q.x)); // Y + + const float rad2deg = 180f / MathF.PI; + return new Vector3Float(pitch * rad2deg, yaw * rad2deg, roll * rad2deg); + // float test = q.x * q.y + q.z * q.w; + // if (test > 0.499f) // singularity at north pole + // return new Vector3Float(0, 2 * MathF.Atan2(q.x, q.w) * AngleFloat.Rad2Deg, 90); + + // else if (test < -0.499f) // singularity at south pole + // return new Vector3Float(0, -2 * MathF.Atan2(q.x, q.w) * AngleFloat.Rad2Deg, -90); + + // else { + // float sqx = q.x * q.x; + // float sqy = q.y * q.y; + // float sqz = q.z * q.z; + + // return new Vector3Float( + // MathF.Atan2(2 * q.x * q.w - 2 * q.y * q.z, 1 - 2 * sqx - 2 * sqz) * + // AngleFloat.Rad2Deg, + // MathF.Atan2(2 * q.y * q.w - 2 * q.x * q.z, 1 - 2 * sqy - 2 * sqz) * + // AngleFloat.Rad2Deg, + // MathF.Asin(2 * test) * AngleFloat.Rad2Deg); + // } + } + + /// + /// Create a rotation from euler angles + /// + /// The angle around the right axis + /// The angle around the upward axis + /// The angle around the forward axis + /// The resulting quaternion + /// Rotation are appied in the order Z, X, Y. + public static Quaternion Euler(float x, float y, float z) { + return Quaternion.Euler(new Vector3Float(x, y, z)); + } + /// + /// Create a rotation from a vector containing euler angles + /// + /// Vector with the euler angles + /// The resulting quaternion + /// Rotation are appied in the order Z, X, Y. + public static Quaternion Euler(Vector3Float angles) { + Vector3Float euler = angles * AngleFloat.Deg2Rad; + float cx = MathF.Cos(euler.horizontal * 0.5f); + float sx = MathF.Sin(euler.horizontal * 0.5f); + float cy = MathF.Cos(euler.vertical * 0.5f); + float sy = MathF.Sin(euler.vertical * 0.5f); + float cz = MathF.Cos(euler.depth * 0.5f); + float sz = MathF.Sin(euler.depth * 0.5f); + + // Unity uses intrinsic Z, then X, then Y -> q = Qy * Qx * Qz + Quaternion q; + q.w = cy * cx * cz + sy * sx * sz; + q.x = cy * sx * cz + sy * cx * sz; + q.y = sy * cx * cz - cy * sx * sz; + q.z = cy * cx * sz - sy * sx * cz; + return q; + } + + /// + /// Multiply two quaternions + /// + /// + /// + /// The resulting rotation + public static Quaternion operator *(Quaternion q1, Quaternion q2) { + return new Quaternion( + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y + q1.w * q2.x, + -q1.x * q2.z + q1.y * q2.w + q1.z * q2.x + q1.w * q2.y, + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w + q1.w * q2.z, + -q1.x * q2.x - q1.y * q2.y - q1.z * q2.z + q1.w * q2.w); + } + + /// + /// Rotate a vector using this quaterion + /// + /// The rotation + /// The vector to rotate + /// The rotated vector + public static Vector3Float operator *(Quaternion q, Vector3Float v) { + float num = q.x * 2; + float num2 = q.y * 2; + float num3 = q.z * 2; + float num4 = q.x * num; + float num5 = q.y * num2; + float num6 = q.z * num3; + float num7 = q.x * num2; + float num8 = q.x * num3; + float num9 = q.y * num3; + float num10 = q.w * num; + float num11 = q.w * num2; + float num12 = q.w * num3; + + float px = v.horizontal; + float py = v.vertical; + float pz = v.depth; + float rx = + (1 - (num5 + num6)) * px + (num7 - num12) * py + (num8 + num11) * pz; + float ry = + (num7 + num12) * px + (1 - (num4 + num6)) * py + (num9 - num10) * pz; + float rz = + (num8 - num11) * px + (num9 + num10) * py + (1 - (num4 + num5)) * pz; + Vector3Float result = new(rx, ry, rz); + return result; + } + + /// + /// The inverse of quaterion + /// + /// The quaternion for which the inverse is + /// needed The inverted quaternion + public static Quaternion Inverse(Quaternion q) { + float n = MathF.Sqrt(q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w); + return new Quaternion(-q.x / n, -q.y / n, -q.z / n, q.w / n); + } + + /// + /// A rotation which looks in the given direction + /// + /// The look direction + /// The up direction + /// The look rotation + public static Quaternion LookRotation(Vector3Float forward, Vector3Float up) { + Vector3Float nForward = forward.normalized; + Vector3Float nRight = Vector3Float.Normalize(Vector3Float.Cross(up, nForward)); + Vector3Float nUp = Vector3Float.Cross(nForward, nRight); + float m00 = nRight.horizontal; // x; + float m01 = nRight.vertical; // y; + float m02 = nRight.depth; // z; + float m10 = nUp.horizontal; // x; + float m11 = nUp.vertical; // y; + float m12 = nUp.depth; // z; + float m20 = nForward.horizontal; // x; + float m21 = nForward.vertical; // y; + float m22 = nForward.depth; // z; + + float num8 = (m00 + m11) + m22; + float x, y, z, w; + if (num8 > 0) { + float num = MathF.Sqrt(num8 + 1); + w = num * 0.5f; + num = 0.5f / num; + x = (m12 - m21) * num; + y = (m20 - m02) * num; + z = (m01 - m10) * num; + return new Quaternion(x, y, z, w); + } + if ((m00 >= m11) && (m00 >= m22)) { + float num7 = MathF.Sqrt(((1 + m00) - m11) - m22); + float num4 = 0.5F / num7; + x = 0.5f * num7; + y = (m01 + m10) * num4; + z = (m02 + m20) * num4; + w = (m12 - m21) * num4; + return new Quaternion(x, y, z, w); + } + if (m11 > m22) { + float num6 = MathF.Sqrt(((1 + m11) - m00) - m22); + float num3 = 0.5F / num6; + x = (m10 + m01) * num3; + y = 0.5F * num6; + z = (m21 + m12) * num3; + w = (m20 - m02) * num3; + return new Quaternion(x, y, z, w); + } + float num5 = MathF.Sqrt(((1 + m22) - m00) - m11); + float num2 = 0.5F / num5; + x = (m20 + m02) * num2; + y = (m21 + m12) * num2; + z = 0.5F * num5; + w = (m01 - m10) * num2; + return new Quaternion(x, y, z, w); + } + + /// + /// Creates a quaternion with the given forward direction with up = + /// Vector3::up + /// + /// The look direction + /// The rotation for this direction + /// For the rotation, Vector::up is used for the up direction. + /// Note: if the forward direction == Vector3::up, the result is + /// Quaternion::identity + public static Quaternion LookRotation(Vector3Float forward) { + Vector3Float up = new(0, 1, 0); + return LookRotation(forward, up); + } + + /// + /// Calculat the rotation from on vector to another + /// + /// The from direction + /// The to direction + /// The rotation from the first to the second vector + public static Quaternion FromToRotation(Vector3Float fromDirection, Vector3Float toDirection) { + Vector3Float axis = Vector3Float.Cross(fromDirection, toDirection); + axis = axis.normalized; + AngleFloat angle = Vector3Float.SignedAngle(fromDirection, toDirection, axis); + Quaternion rotation = AngleAxis(angle, axis); + return rotation; + + } + + /// + /// Rotate form one orientation to anther with a maximum amount of degrees + /// + /// The from rotation + /// The destination rotation + /// The maximum amount of degrees to + /// rotate The possibly limited rotation + public static Quaternion RotateTowards(Quaternion from, Quaternion to, + float maxDegreesDelta) { + float num = Quaternion.UnsignedAngle(from, to); + if (num == 0) { + return to; + } + float t = MathF.Min(1, maxDegreesDelta / num); + return SlerpUnclamped(from, to, t); + + } + + /// + /// Convert an angle/axis representation to a quaternion + /// + /// The angle + /// The axis + /// The resulting quaternion + public static Quaternion AngleAxis(AngleFloat angle, Vector3Float axis) { + if (axis.sqrMagnitude == 0.0f) + return Quaternion.identity; + + float radians = angle.inRadians; + radians *= 0.5f; + + Vector3Float axis2 = axis * MathF.Sin(radians); + float x = axis2.horizontal; // x; + float y = axis2.vertical; // y; + float z = axis2.depth; // z; + float w = MathF.Cos(radians); + + return new Quaternion(x, y, z, w).normalized; + } + /// + /// Convert this quaternion to angle/axis representation + /// + /// A pointer to the angle for the result + /// A pointer to the axis for the result + public readonly void ToAngleAxis(out AngleFloat angle, out Vector3Float axis) { + Quaternion q1 = (MathF.Abs(this.w) > 1.0f) ? this.normalized : this; + angle = AngleFloat.Radians(2.0f * MathF.Acos(q1.w)); // angle + float den = MathF.Sqrt(1.0F - q1.w * q1.w); + if (den > 0.0001f) { + axis = Vector3Float.Normalize(q1.xyz / den); + } + else { + // This occurs when the angle is zero. + // Not a problem: just set an arbitrary normalized axis. + axis = Vector3Float.right; + } + } + + /// + /// Get the angle between two orientations + /// + /// The first orientation + /// The second orientation + /// The smallest angle in degrees between the two + /// orientations + public static float UnsignedAngle(Quaternion q1, Quaternion q2) { + // float f = Dot(q1, q2); + // return MathF.Acos(MathF.Min(MathF.Abs(f), 1)) * 2 * AngleFloat.Rad2Deg; + + float dot = q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w; + dot = MathF.Min(MathF.Max(dot, -1f), 1f); + return 2f * MathF.Acos(MathF.Abs(dot)) * (180f / MathF.PI); + } + + /// + /// Sherical lerp between two rotations + /// + /// The first rotation + /// The second rotation + /// The factor between 0 and 1. + /// The resulting rotation + /// A factor 0 returns rotation1, factor1 returns rotation2. + public static Quaternion Slerp(Quaternion a, + Quaternion b, float t) { + if (t > 1) + t = 1; + if (t < 0) + t = 0; + return SlerpUnclamped(a, b, t); + } + + /// + /// Unclamped sherical lerp between two rotations + /// + /// The first rotation + /// The second rotation + /// The factor + /// The resulting rotation + /// A factor 0 returns rotation1, factor1 returns rotation2. + /// Values outside the 0..1 range will result in extrapolated rotations + public static Quaternion SlerpUnclamped(Quaternion a, + Quaternion b, float t) { + // if either input is zero, return the other. + if (a.sqrMagnitude == 0.0f) { + if (b.sqrMagnitude == 0.0f) { + return identity; + } + return b; + } + else if (b.sqrMagnitude == 0.0f) { + return a; + } + + Vector3Float axyz = a.xyz; + Vector3Float bxyz = b.xyz; + float cosHalfAngle = a.w * b.w + Vector3Float.Dot(axyz, bxyz); + + Quaternion b2 = b; + if (cosHalfAngle >= 1.0f || cosHalfAngle <= -1.0f) { + // angle = 0.0f, so just return one input. + return a; + } + else if (cosHalfAngle < 0.0f) { + b2.x = -b.x; + b2.y = -b.y; + b2.z = -b.z; + b2.w = -b.w; + cosHalfAngle = -cosHalfAngle; + } + + float blendA; + float blendB; + if (cosHalfAngle < 0.99f) { + // do proper slerp for big angles + float halfAngle = MathF.Acos(cosHalfAngle); + float sinHalfAngle = MathF.Sin(halfAngle); + float oneOverSinHalfAngle = 1.0F / sinHalfAngle; + blendA = MathF.Sin(halfAngle * (1.0F - t)) * oneOverSinHalfAngle; + blendB = MathF.Sin(halfAngle * t) * oneOverSinHalfAngle; + } + else { + // do lerp if angle is really small. + blendA = 1.0f - t; + blendB = t; + } + Vector3Float v = axyz * blendA + b2.xyz * blendB; + Quaternion result = + new(v.horizontal, v.vertical, v.depth, blendA * a.w + blendB * b2.w); + if (result.sqrMagnitude > 0.0f) + return result.normalized; + else + return Quaternion.identity; + } + + /// + /// Convert this quaternion to angle/axis representation + /// + /// A pointer to the angle for the result + /// A pointer to the axis for the result + public readonly void ToAngleAxis(out float angle, out Vector3Float axis) { + ToAxisAngleRad(this, out axis, out angle); + angle *= AngleFloat.Rad2Deg; + } + private static void ToAxisAngleRad(Quaternion q, + out Vector3Float axis, + out float angle) { + Quaternion q1 = (MathF.Abs(q.w) > 1.0f) ? Quaternion.Normalize(q) : q; + angle = 2.0f * MathF.Acos(q1.w); // angle + float den = MathF.Sqrt(1.0F - q1.w * q1.w); + if (den > 0.0001f) { + axis = (q1.xyz / den).normalized; + } + else { + // This occurs when the angle is zero. + // Not a problem: just set an arbitrary normalized axis. + axis = new Vector3Float(1, 0, 0); + } + } + + /// + /// Returns the angle of around the give axis for a rotation + /// + /// The axis around which the angle should be + /// computed The source rotation + /// The signed angle around the axis + public static float GetAngleAround(Vector3Float axis, Quaternion rotation) { + Quaternion secondaryRotation = GetRotationAround(axis, rotation); + secondaryRotation.ToAngleAxis(out float rotationAngle, out Vector3Float rotationAxis); + + // Do the axis point in opposite directions? + if (Vector3Float.Dot(axis, rotationAxis) < 0) + rotationAngle = -rotationAngle; + + return rotationAngle; + } + + /// + /// Returns the rotation limited around the given axis + /// + /// The axis which which the rotation should be + /// limited The source rotation + /// The rotation around the given axis + public static Quaternion GetRotationAround(Vector3Float axis, Quaternion rotation) { + Vector3Float ra = new(rotation.x, rotation.y, rotation.z); // rotation axis + Vector3Float p = Vector3Float.Project( + ra, axis); // return projection ra on to axis (parallel component) + Quaternion twist = new(p.horizontal, p.vertical, p.depth, rotation.w); + twist = Normalize(twist); + return twist; + + } + + /// + /// Swing-twist decomposition of a rotation + /// + /// The base direction for the decomposition + /// The source rotation + /// A pointer to the quaternion for the swing + /// result A pointer to the quaternion for the + /// twist result + static void GetSwingTwist(Vector3Float axis, Quaternion q, + out Quaternion swing, out Quaternion twist) { + twist = GetRotationAround(axis, q); + swing = q * Inverse(twist); + } + + /// + /// Calculate the dot product of two quaternions + /// + /// The first rotation + /// The second rotation + /// + public static float Dot(Quaternion q1, Quaternion q2) { + return q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w; + } + } +#endif + +} \ No newline at end of file diff --git a/LinearAlgebra/src/Spherical.cs b/LinearAlgebra/src/Spherical.cs new file mode 100644 index 0000000..318839d --- /dev/null +++ b/LinearAlgebra/src/Spherical.cs @@ -0,0 +1,279 @@ +using System; +using System.Collections.Generic; + +#if UNITY_5_3_OR_NEWER +using Vector3 = UnityEngine.Vector3; +#endif + +namespace LinearAlgebra { + /// + /// A spherical vector + /// + /// This is a struct such that it is a value type and cannot be null + public struct Spherical { + /// + /// Create a spherical vector + /// + /// The distance in meters + /// The direction of the vector + public Spherical(float distance, Direction direction) { + if (distance > 0) { + this.distance = distance; + this.direction = direction; + } + else { + this.distance = -distance; + this.direction = -direction; + } + } + + /// + /// Create spherical vector. All given angles are in degrees + /// + /// The distance in meters + /// The horizontal angle in degrees + /// The vertical angle in degrees + /// + public static Spherical Degrees(float distance, float horizontal, float vertical) { + Direction direction = Direction.Degrees(horizontal, vertical); + Spherical s = new(distance, direction); + return s; + } + + public static Spherical Radians(float distance, float horizontal, float vertical) { + Direction direction = Direction.Radians(horizontal, vertical); + Spherical s = new(distance, direction); + return s; + } + + /// + /// The distance in meters + /// + /// @remark The distance should never be negative + public float distance; + /// + /// The direction of the vector + /// + public Direction direction; + + /// + /// A spherical vector with zero degree angles and distance + /// + public readonly static Spherical zero = new(0, Direction.forward); + /// + /// A normalized forward-oriented vector + /// + public readonly static Spherical forward = new(1, Direction.forward); + +#if UNITY_5_3_OR_NEWER + public static Spherical FromVector3(Vector3 v) { + float distance = v.magnitude; + Direction direction = Direction.FromVector3(v / distance); + return new Spherical(distance, direction); + } + + public readonly Vector3 ToVector3() { + Vector3 v = this.direction.ToVector3(); + v *= this.distance; + return v; + } +#else + public static Spherical FromVector3(Vector3Float v) { + float distance = v.magnitude; + if (distance == 0.0f) + return Spherical.zero; + else { + float verticalAngle = (float)(Math.PI / 2 - Math.Acos(v.vertical / distance)) * AngleFloat.Rad2Deg; + float horizontalAngle = (float)Math.Atan2(v.horizontal, v.depth) * AngleFloat.Rad2Deg; + return Degrees(distance, horizontalAngle, verticalAngle); + } + } + + public readonly Vector3Float ToVector3() { + // float verticalRad = (AngleFloat.deg90 - this.direction.vertical).inRadians; + // float horizontalRad = this.direction.horizontal.inRadians; + // float cosVertical = (float)Math.Cos(verticalRad); + // float sinVertical = (float)Math.Sin(verticalRad); + // float cosHorizontal = (float)Math.Cos(horizontalRad); + // float sinHorizontal = (float)Math.Sin(horizontalRad); + + // float x = this.distance * sinVertical * sinHorizontal; + // float y = this.distance * cosVertical; + // float z = this.distance * sinVertical * cosHorizontal; + + // Vector3Float v = new(x, y, z); + Vector3Float v = this.direction.ToVector3(); + v *= this.distance; + return v; + } +#endif + + public override readonly string ToString() { + return $"Spherical({this.distance}, h: {this.direction.horizontal}, v: {this.direction.vertical})"; + } + + + public readonly float magnitude => this.distance; + + public Spherical normalized { + get { + Spherical r = new() { + distance = 1, + direction = this.direction + }; + return r; + } + } + + public static Spherical operator +(Spherical s1, Spherical s2) { + // let's do it the easy way... + // using vars to be compatible with both unity (Vector3) and native (Vector3Float) + var v1 = s1.ToVector3(); + var v2 = s2.ToVector3(); + var v = v1 + v2; + Spherical r = FromVector3(v); + return r; + } + + public static Spherical operator *(Spherical v, float d) { + Spherical r = new(v.distance * d, v.direction); + return r; + } + + public static bool operator ==(Spherical v1, Spherical v2) { + return (v1.distance == v2.distance && v1.direction == v2.direction); + } + + public static bool operator !=(Spherical v1, Spherical v2) { + return (v1.distance != v2.distance || v1.direction != v2.direction); + } + + public override readonly bool Equals(object o) { + if (o is Spherical s) + return this == s; + return false; + } + + public override readonly int GetHashCode() { + return HashCode.Combine(this.distance, this.direction); + } + + public static float Distance(Spherical v1, Spherical v2) { + // Convert degrees to radians + float thetaARadians = v1.direction.horizontal.inRadians; + float phiARadians = v1.direction.vertical.inRadians;// DegreesToRadians(phiA); + float thetaBRadians = v2.direction.horizontal.inRadians; // DegreesToRadians(thetaB); + float phiBRadians = v2.direction.vertical.inRadians; // DegreesToRadians(phiB); + + // Calculate sine and cosine values + float sinPhiA = MathF.Sin(phiARadians); + float cosPhiA = MathF.Cos(phiARadians); + float sinPhiB = MathF.Sin(phiBRadians); + float cosPhiB = MathF.Cos(phiBRadians); + + // Calculate the cosine of the difference in azimuthal angles + float cosThetaDifference = MathF.Cos(thetaARadians - thetaBRadians); + + // Apply the spherical law of cosines + float distance = MathF.Sqrt( + v1.distance * v1.distance + + v2.distance * v2.distance - + 2 * v1.distance * v2.distance * (sinPhiA * sinPhiB * cosThetaDifference + cosPhiA * cosPhiB) + ); + + return distance; + } + + public static Spherical Average(Spherical v1, Spherical v2) { + const float EPS = 1e-6f; + + // Angles in radians + float a1 = v1.direction.horizontal.inRadians; + float a2 = v2.direction.horizontal.inRadians; + float e1 = v1.direction.vertical.inRadians; + float e2 = v2.direction.vertical.inRadians; + + // Fast path: exactly same direction (allowing wrap for azimuth) -> preserve exact angles + bool sameAz = MathF.Abs(MathF.IEEERemainder(a1 - a2, MathF.PI * 2f)) < EPS; + bool sameEl = MathF.Abs(e1 - e2) < EPS; + if (sameAz && sameEl) { + // Distances may differ; average distance but keep exact angles from v1 + float rAvgExact = 0.5f * (v1.distance + v2.distance); + return new Spherical(rAvgExact, v1.direction); + } + + // Horizontal unit-circle sum + float cx = MathF.Cos(a1) + MathF.Cos(a2); + float cy = MathF.Sin(a1) + MathF.Sin(a2); + + // Vertical as z = sin(el) + float z1 = MathF.Sin(e1); + float z2 = MathF.Sin(e2); + float cz = z1 + z2; + + // Magnitude of summed unit-direction vectors + float sumX = cx; + float sumY = cy; + float sumZ = cz; + float magSum = MathF.Sqrt(sumX * sumX + sumY * sumY + sumZ * sumZ); + + // If the two direction unit-vectors cancel (or nearly), return zero distance. + if (magSum < EPS) { + return Spherical.Radians(0f, 0f, 0f); + } + + // Normalized averaged direction components + float ux = sumX / magSum; + float uy = sumY / magSum; + float uz = sumZ / magSum; + + // Compute averaged angles from normalized vector + float azAvgRad = MathF.Atan2(uy, ux); + float elAvgRad = MathF.Asin(Float.Clamp(uz, -1f, 1f)); + + // Average distance (arithmetic mean) + float rAvg = 0.5f * (v1.distance + v2.distance); + + return Spherical.Radians(rAvg, azAvgRad, elAvgRad); + } + + public static Spherical Sum(List vectors) { + if (vectors == null || vectors.Count == 0) + throw new ArgumentException("vectors must contain at least one element", nameof(vectors)); + +#if UNITY_5_3_OR_NEWER + Vector3 sum = Vector3.zero; +#else + Vector3Float sum = Vector3Float.zero; +#endif + foreach (Spherical v in vectors) + sum += v.ToVector3(); + + return FromVector3(sum); + } + + + public static Spherical Average(List vectors) { + if (vectors == null || vectors.Count == 0) + throw new ArgumentException("vectors must contain at least one element", nameof(vectors)); + +#if UNITY_5_3_OR_NEWER + Vector3 sum = Vector3.zero; +#else + Vector3Float sum = Vector3Float.zero; +#endif + int n = 0; + foreach (Spherical v in vectors) { + sum += v.ToVector3(); + n++; + } + var avg = sum / n; + + // if (avg.sqrMagnitude == 0f) + // return new Spherical(0f, new Direction(AngleFloat.Radians(0f), AngleFloat.Radians(0f))); + // else + return FromVector3(avg); + } + + } +} \ No newline at end of file diff --git a/LinearAlgebra/src/SwingTwist.cs b/LinearAlgebra/src/SwingTwist.cs new file mode 100644 index 0000000..df6e048 --- /dev/null +++ b/LinearAlgebra/src/SwingTwist.cs @@ -0,0 +1,136 @@ +// #if !UNITY_5_3_OR_NEWER +// using UnityEngine; +// #endif + +namespace LinearAlgebra { + + /// + /// An orientation using swing and twist angles + /// + /// The swing rotation + /// The twist rotation + public struct SwingTwist { + public Direction swing; + public AngleFloat twist; + + public SwingTwist(Direction swing, AngleFloat twist) { + this.swing = swing; + this.twist = twist; + } + + /// + /// Create a swing/twist rotation using angles in degrees + /// + /// The swing angle in the horizontal plane in degrees + /// The swing angle in the vertical plan in degrees + /// The twist angle in degrees + /// The swing/twist rotation + public static SwingTwist Degrees(float horizontalSwing, float verticalSwing, float twist) { + Direction swing = Direction.Degrees(horizontalSwing, verticalSwing); + AngleFloat twistAngle = AngleFloat.Degrees(twist); + SwingTwist s = new(swing, twistAngle); + return s; + } + + /// + /// Create a swing/twist rotation using angles in degrees + /// + /// The swing angle in the horizontal plane in degrees + /// The swing angle in the vertical plan in degrees + /// The twist angle in degrees + /// The swing/twist rotation + public static SwingTwist Radians(float horizontalSwing, float verticalSwing, float twist) { + Direction swing = Direction.Radians(horizontalSwing, verticalSwing); + AngleFloat twistAngle = AngleFloat.Radians(twist); + SwingTwist s = new(swing, twistAngle); + return s; + } + +#if UNITY_5_3_OR_NEWER + /// + /// A zero angle rotation + /// + public static readonly SwingTwist zero = Degrees(0, 0, 0); + + public Spherical ToAngleAxis() { + UnityEngine.Quaternion q = this.ToQuaternion(); + q.ToAngleAxis(out float angle, out UnityEngine.Vector3 axis); + Direction direction = Direction.FromVector3(axis); + + Spherical r = new(angle, direction); + return r; + } + + public static SwingTwist FromAngleAxis(Spherical r) { + UnityEngine.Vector3 vectorAxis = r.direction.ToVector3(); + UnityEngine.Quaternion q = UnityEngine.Quaternion.AngleAxis(r.distance, vectorAxis); + return FromQuaternion(q); + } + + /// + /// Convert a quaternion in a swing/twist rotation + /// + /// The quaternion to convert + /// The swing/twist rotation + public static SwingTwist FromQuaternion(UnityEngine.Quaternion q) { + UnityEngine.Vector3 angles = q.eulerAngles; + SwingTwist r = Degrees(angles.y, -angles.x, -angles.z); + return r; + } + + public UnityEngine.Quaternion ToQuaternion() { + UnityEngine.Quaternion q = UnityEngine.Quaternion.Euler(this.swing.vertical.inDegrees, + this.swing.horizontal.inDegrees, + this.twist.inDegrees); + return q; + } +#else + /// + /// A zero angle rotation + /// + public static readonly SwingTwist zero = Degrees(0, 0, 0); + + public Spherical ToAngleAxis() { + LinearAlgebra.Quaternion q = this.ToQuaternion(); + q.ToAngleAxis(out float angle, out Vector3Float axis); + Direction direction = Direction.FromVector3(axis); + + Spherical r = new(angle, direction); + return r; + } + + public static SwingTwist FromAngleAxis(Spherical r) { + Vector3Float vectorAxis = r.direction.ToVector3(); + LinearAlgebra.Quaternion q = LinearAlgebra.Quaternion.AngleAxis(AngleFloat.Degrees(r.distance), vectorAxis); + return FromQuaternion(q); + } + + /// + /// Convert a quaternion in a swing/twist rotation + /// + /// The quaternion to convert + /// The swing/twist rotation + public static SwingTwist FromQuaternion(LinearAlgebra.Quaternion q) { + Vector3Float v = LinearAlgebra.Quaternion.ToAngles(q); + SwingTwist r = Degrees(v.vertical, v.horizontal, v.depth); + return r; + } + + public LinearAlgebra.Quaternion ToQuaternion() { + LinearAlgebra.Quaternion q = LinearAlgebra.Quaternion.Euler(this.swing.vertical.inDegrees, + this.swing.horizontal.inDegrees, + this.twist.inDegrees); + return q; + + } + + public static SwingTwist FromQuat32(Quat32 q32) { + q32.ToAngles(out float right, out float up, out float forward); + SwingTwist r = Degrees(up, right, forward); + return r; + } +#endif + + } + +} \ No newline at end of file diff --git a/LinearAlgebra/src/Vector2Float.cs b/LinearAlgebra/src/Vector2Float.cs new file mode 100644 index 0000000..ac1867c --- /dev/null +++ b/LinearAlgebra/src/Vector2Float.cs @@ -0,0 +1,479 @@ +using System; +using System.Numerics; + +namespace LinearAlgebra { + + /* + public struct Vector2Int { + public int horizontal; + public int vertical; + + public Vector2Int(int horizontal, int vertical) { + this.horizontal = horizontal; + this.vertical = vertical; + } + + /// + /// A vector with zero for all axis + /// + public static readonly Vector2Int zero = new(0, 0); + /// + /// A vector with values (1, 1) + /// + public static readonly Vector2Int one = new(1, 1); + /// + /// A vector with values (0, 1) + /// + public static readonly Vector2Int up = new(0, 1); + /// + /// A vector with values (0, -1) + /// + public static readonly Vector2Int down = new(0, -1); + /// + /// A vector with values (0, 1) + /// + public static readonly Vector2Int forward = new(0, 1); + /// + /// A vector with values (0, -1) + /// + public static readonly Vector2Int back = new(0, -1); + /// + /// A vector3 with values (-1, 0) + /// + public static readonly Vector2Int left = new(-1, 0); + /// + /// A vector with values (1, 0) + /// + public static readonly Vector2Int right = new(1, 0); + + /// + /// Tests if the vector has equal values as the given vector + /// + /// The vector to compare to + /// true if the vector values are equal + public readonly bool Equals(Vector2Int v) => this.horizontal == v.horizontal && vertical == v.vertical; + + /// + /// Tests if the vector is equal to the given object + /// + /// The object to compare to + /// false when the object is not a Vector2 or does not have equal values + public override readonly bool Equals(object obj) { + if (obj is not Vector2Int v) + return false; + + return (this.horizontal == v.horizontal && this.vertical == v.vertical); + } + + /// + /// Tests if the two vectors have equal values + /// + /// The first vector + /// The second vector + /// truewhen the vectors have equal values + /// Note that this uses a Float equality check which cannot be not exact in all cases. + /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon + /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon + public static bool operator ==(Vector2Int v1, Vector2Int v2) { + return (v1.horizontal == v2.horizontal && v1.vertical == v2.vertical); + } + /// + /// Tests if two vectors have different values + /// + /// The first vector + /// The second vector + /// truewhen the vectors have different values + /// Note that this uses a Float equality check which cannot be not exact in all case. + /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon. + /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon + public static bool operator !=(Vector2Int v1, Vector2Int v2) { + return (v1.horizontal != v2.horizontal || v1.vertical != v2.vertical); + } + public readonly float magnitude { + get { + int h = this.horizontal; + int v = this.vertical; + return MathF.Sqrt(h * h + v * v); + } + } + + public static float MagnitudeOf(Vector2Int v) { + return v.magnitude; + } + + public static Vector2Int operator -(Vector2Int v1, Vector2Int v2) { + return new Vector2Int(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical); + } + public static Vector2Int operator +(Vector2Int v1, Vector2Int v2) { + return new Vector2Int(v1.horizontal + v2.horizontal, v1.vertical + v2.vertical); + } + + public static float Distance(Vector2Int v1, Vector2Int v2) { + return (v1 - v2).magnitude; + } + } + + public struct Vector2Float { + public float horizontal; + public float vertical; + + public Vector2Float(float horizontal, float vertical) { + this.horizontal = horizontal; + this.vertical = vertical; + } + + public readonly float magnitude { + get { + float h = this.horizontal; + float v = this.vertical; + return MathF.Sqrt(h * h + v * v); + } + } + + public static Vector2Float operator -(Vector2Float v1, Vector2Float v2) { + return new Vector2Float(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical); + } + + public static float Distance(Vector2Float v1, Vector2Float v2) { + return (v1 - v2).magnitude; + } + } + */ + + /// + /// 2-dimensional vectors + /// + public struct Vector2Float { + + /// + /// The right axis of the vector + /// + public float horizontal; // left/right + /// + /// The upward/forward axis of the vector + /// + public float vertical; // forward/backward + // directions are to be inline with Vector3 as much as possible... + + /// + /// Create a new 2-dimensional vector + /// + /// x axis value + /// y axis value + public Vector2Float(float x, float y) { + this.horizontal = x; + this.vertical = y; + } + + /// + /// Convert a Vector2Int into a Vector2Float + /// + /// The Vector2Int + public Vector2Float(Vector2Int v) { + this.horizontal = v.horizontal; + this.vertical = v.vertical; + } + + /// + /// A vector with zero for all axis + /// + public static readonly Vector2Float zero = new Vector2Float(0, 0); + /// + /// A vector with values (1, 1) + /// + public static readonly Vector2Float one = new Vector2Float(1, 1); + /// + /// A vector with values (0, 1) + /// + public static readonly Vector2Float up = new Vector2Float(0, 1); + /// + /// A vector with values (0, -1) + /// + public static readonly Vector2Float down = new Vector2Float(0, -1); + /// + /// A vector with values (0, 1) + /// + public static readonly Vector2Float forward = new Vector2Float(0, 1); + /// + /// A vector with values (0, -1) + /// + public static readonly Vector2Float back = new Vector2Float(0, -1); + /// + /// A vector3 with values (-1, 0) + /// + public static readonly Vector2Float left = new Vector2Float(-1, 0); + /// + /// A vector with values (1, 0) + /// + public static readonly Vector2Float right = new Vector2Float(1, 0); + + /// + /// The squared length of this vector + /// + /// The squared length + /// The squared length is computationally simpler than the real length. + /// Think of Pythagoras A^2 + B^2 = C^2. + /// This leaves out the calculation of the squared root of C. + public readonly float sqrMagnitude => horizontal * horizontal + vertical * vertical; + public static float SqrMagnitudeOf(Vector2Float v) { + return v.sqrMagnitude; + } + + /// + /// The length of this vector + /// + /// The length of this vector + public readonly float magnitude => MathF.Sqrt(horizontal * horizontal + vertical * vertical); + public static float MagnitudeOf(Vector2Float v) { + return v.magnitude; + } + + /// + /// Convert the vector to a length of a 1 + /// + /// The vector with length 1 + public Vector2Float normalized { + get { + float l = magnitude; + Vector2Float v = zero; + if (l > Float.epsilon) + v = this / l; + return v; + } + } + public static Vector2Float Normalize(Vector2Float v) { + return v.normalized; + } + + /// + /// Add two vectors + /// + /// The first vector + /// The second vector + /// The result of adding the two vectors + public static Vector2Float operator +(Vector2Float v1, Vector2Float v2) { + Vector2Float v = new Vector2Float(v1.horizontal + v2.horizontal, v1.vertical + v2.vertical); + return v; + } + + /// + /// Subtract two vectors + /// + /// The first vector + /// The second vector + /// The result of adding the two vectors + public static Vector2Float operator -(Vector2Float v1, Vector2Float v2) { + Vector2Float v = new Vector2Float(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical); + return v; + } + + /// + /// Negate the vector + /// + /// The vector to negate + /// The negated vector + /// This will result in a vector pointing in the opposite direction + public static Vector2Float operator -(Vector2Float v1) { + Vector2Float v = new Vector2Float(-v1.horizontal, -v1.vertical); + return v; + } + + /// + /// Scale a vector uniformly down + /// + /// The vector to scale + /// The scaling factor + /// The scaled vector + /// Each component of the vector will be devided by the same factor. + public static Vector2Float operator /(Vector2Float v, float f) { + Vector2Float r = new(v.horizontal / f, v.vertical / f); + return r; + } + + + /// + /// Scale a vector uniformly up + /// + /// The vector to scale + /// The scaling factor + /// The scaled vector + /// Each component of the vector will be multipled with the same factor. + public static Vector2Float operator *(Vector2Float v1, float f) { + Vector2Float v = new Vector2Float(v1.horizontal * f, v1.vertical * f); + return v; + } + + /// + /// Scale a vector uniformly up + /// + /// The scaling factor + /// The vector to scale + /// The scaled vector + /// Each component of the vector will be multipled with the same factor. + public static Vector2Float operator *(float f, Vector2Float v1) { + Vector2Float v = new Vector2Float(f * v1.horizontal, f * v1.vertical); + return v; + } + + /// @brief Scale the vector using another vector + /// @param v1 The vector to scale + /// @param v2 A vector with the scaling factors + /// @return The scaled vector + /// @remark Each component of the vector v1 will be multiplied with the + /// matching component from the scaling vector v2. + public static Vector2Float Scale(Vector2Float v1, Vector2Float v2) { + return new Vector2Float(v1.horizontal * v2.horizontal, v1.vertical * v2.vertical); + } + + /// + /// Tests if the vector has equal values as the given vector + /// + /// The vector to compare to + /// true if the vector values are equal + //public readonly bool Equals(Vector2Float v1) => horizontal == v1.horizontal && vertical == v1.vertical; + + /// + /// Tests if the two vectors have equal values + /// + /// The first vector + /// The second vector + /// truewhen the vectors have equal values + /// Note that this uses a Float equality check which cannot be not exact in all cases. + /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon + /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon + public static bool operator ==(Vector2Float v1, Vector2Float v2) { + return (v1.horizontal == v2.horizontal && v1.vertical == v2.vertical); + } + + /// + /// Tests if two vectors have different values + /// + /// The first vector + /// The second vector + /// truewhen the vectors have different values + /// Note that this uses a Float equality check which cannot be not exact in all case. + /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon. + /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon + public static bool operator !=(Vector2Float v1, Vector2Float v2) { + return (v1.horizontal != v2.horizontal || v1.vertical != v2.vertical); + } + + /// + /// Tests if the vector is equal to the given object + /// + /// The object to compare to + /// false when the object is not a Vector2 or does not have equal values + public override readonly bool Equals(object obj) { + if (obj is not Vector2Float v) + return false; + + return (horizontal == v.horizontal && vertical == v.vertical); + } + + /// + /// Get an hash code for the vector + /// + /// The hash code + public override readonly int GetHashCode() { + return HashCode.Combine(horizontal, vertical); + } + + /// + /// Get the distance between two vectors + /// + /// The first vector + /// The second vector + /// The distance between the two vectors + public static float Distance(Vector2Float v1, Vector2Float v2) { + float x = v1.horizontal - v2.horizontal; + float y = v1.vertical - v2.vertical; + float d = (float)Math.Sqrt(x * x + y * y); + return d; + } + + /// + /// The dot product of two vectors + /// + /// The first vector + /// The second vector + /// The dot product of the two vectors + public static float Dot(Vector2Float v1, Vector2Float v2) { + return v1.horizontal * v2.horizontal + v1.vertical * v2.vertical; + } + + /// + /// Calculate the signed angle between two vectors. + /// + /// The starting vector + /// The ending vector + /// The axis to rotate around + /// The signed angle in degrees + public static float SignedAngle(Vector2Float from, Vector2Float to) { + //float sign = Math.Sign(v1.y * v2.x - v1.x * v2.y); + //return Vector2.Angle(v1, v2) * sign; + + float sqrMagFrom = from.sqrMagnitude; + float sqrMagTo = to.sqrMagnitude; + + if (sqrMagFrom == 0 || sqrMagTo == 0) + return 0; + //if (!isfinite(sqrMagFrom) || !isfinite(sqrMagTo)) + // return nanf(""); + + float angleFrom = (float)Math.Atan2(from.vertical, from.horizontal); + float angleTo = (float)Math.Atan2(to.vertical, to.horizontal); + return -(angleTo - angleFrom) * AngleFloat.Rad2Deg; + } + + public static float UnsignedAngle(Vector2Float from, Vector2Float to) { + return MathF.Abs(SignedAngle(from, to)); + } + + /// + /// Rotates the vector with the given angle + /// + /// The vector to rotate + /// The angle in degrees + /// + public static Vector2Float Rotate(Vector2Float v1, AngleFloat angle) { + float sin = (float)Math.Sin(angle.inRadians); + float cos = (float)Math.Cos(angle.inRadians); + // float sin = AngleFloat.Sin(angle); + // float cos = AngleFloat.Cos(angle); + + float tx = v1.horizontal; + float ty = v1.vertical; + Vector2Float v = new Vector2Float() { + horizontal = (cos * tx) - (sin * ty), + vertical = (sin * tx) + (cos * ty) + }; + return v; + } + + /// + /// Lerp between two vectors + /// + /// The from vector + /// The to vector + /// The interpolation distance [0..1] + /// The lerped vector + /// The factor f is unclamped. Value 0 matches the *v1* vector, Value 1 + /// matches the *v2* vector Value -1 is *v1* vector minus the difference + /// between *v1* and *v2* etc. + public static Vector2Float Lerp(Vector2Float v1, Vector2Float v2, float f) { + Vector2Float v = v1 + (v2 - v1) * f; + return v; + } + + /// + /// Map interval of angles between vectors [0..Pi] to interval [0..1] + /// + /// The first vector + /// The second vector + /// The resulting factor in interval [0..1] + /// Vectors a and b must be normalized + public static float ToFactor(Vector2Float v1, Vector2Float v2) { + return (1 - Vector2Float.Dot(v1, v2)) / 2; + } + } +} \ No newline at end of file diff --git a/LinearAlgebra/src/Vector2Int.cs b/LinearAlgebra/src/Vector2Int.cs new file mode 100644 index 0000000..ed68e8b --- /dev/null +++ b/LinearAlgebra/src/Vector2Int.cs @@ -0,0 +1,185 @@ +using System; + +namespace LinearAlgebra { + + public struct Vector2Int { + public int horizontal; + public int vertical; + + public Vector2Int(int horizontal, int vertical) { + this.horizontal = horizontal; + this.vertical = vertical; + } + + /// + /// A vector with zero for all axis + /// + public static readonly Vector2Int zero = new(0, 0); + /// + /// A vector with values (1, 1) + /// + public static readonly Vector2Int one = new(1, 1); + /// + /// A vector with values (0, 1) + /// + public static readonly Vector2Int up = new(0, 1); + /// + /// A vector with values (0, -1) + /// + public static readonly Vector2Int down = new(0, -1); + /// + /// A vector with values (0, 1) + /// + public static readonly Vector2Int forward = new(0, 1); + /// + /// A vector with values (0, -1) + /// + public static readonly Vector2Int back = new(0, -1); + /// + /// A vector3 with values (-1, 0) + /// + public static readonly Vector2Int left = new(-1, 0); + /// + /// A vector with values (1, 0) + /// + public static readonly Vector2Int right = new(1, 0); + + /* + /// + /// Get an hash code for the vector + /// + /// The hash code + public override int GetHashCode() { + return (this.horizontal, this.vertical).GetHashCode(); + } + + /// + /// Tests if the vector has equal values as the given vector + /// + /// The vector to compare to + /// true if the vector values are equal + public readonly bool Equals(Vector2Int v) => this.horizontal == v.horizontal && vertical == v.vertical; + + */ + + /// + /// Tests if the two vectors have equal values + /// + /// The first vector + /// The second vector + /// truewhen the vectors have equal values + /// Note that this uses a Float equality check which cannot be not exact in all cases. + /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon + /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon + public static bool operator ==(Vector2Int v1, Vector2Int v2) { + return (v1.horizontal == v2.horizontal && v1.vertical == v2.vertical); + } + /// + /// Tests if two vectors have different values + /// + /// The first vector + /// The second vector + /// truewhen the vectors have different values + /// Note that this uses a Float equality check which cannot be not exact in all case. + /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon. + /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon + public static bool operator !=(Vector2Int v1, Vector2Int v2) { + return (v1.horizontal != v2.horizontal || v1.vertical != v2.vertical); + } + + /// + /// Tests if the vector is equal to the given object + /// + /// The object to compare to + /// false when the object is not a Vector2 or does not have equal values + public override readonly bool Equals(object obj) { + if (obj is not Vector2Int v) + return false; + + return (this.horizontal == v.horizontal && this.vertical == v.vertical); + } + + /// + /// Get an hash code for the vector + /// + /// The hash code + public override readonly int GetHashCode() { + return HashCode.Combine(horizontal, vertical); + } + + public readonly float sqrMagnitude => this.horizontal * this.horizontal + this.vertical * this.vertical; + + public static float SqrMagnitudeOf(Vector2Int v) { + return v.sqrMagnitude; + } + + public readonly float magnitude => + MathF.Sqrt(this.horizontal * this.horizontal + this.vertical * this.vertical); + + public static float MagnitudeOf(Vector2Int v) { + return v.magnitude; + } + + /// @brief Convert the vector to a length of 1 + /// @return The vector normalized to a length of 1 + public readonly Vector2Float normalized { + get { + float l = magnitude; + Vector2Float v = Vector2Float.zero; + if (l > Float.epsilon) + v = new Vector2Float(this) / l; + return v; + } + } + /// @brief Convert the vector to a length of 1 + /// @param v The vector to convert + /// @return The vector normalized to a length of 1 + public static Vector2Float Normalize(Vector2Int v) { + float num = v.magnitude; + Vector2Float result = Vector2Float.zero; + if (num > Float.epsilon) + result = new Vector2Float(v) / num; + + return result; + } + + public static Vector2Int operator -(Vector2Int v) { + return new Vector2Int(-v.horizontal, -v.vertical); + } + + public static Vector2Int operator -(Vector2Int v1, Vector2Int v2) { + return new Vector2Int(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical); + } + public static Vector2Int operator +(Vector2Int v1, Vector2Int v2) { + return new Vector2Int(v1.horizontal + v2.horizontal, v1.vertical + v2.vertical); + } + + public static Vector2Int operator /(Vector2Int v, int f) { + return new Vector2Int(v.horizontal / f, v.vertical / f); + } + + public static Vector2Int operator *(Vector2Int v1, int d) { + return new Vector2Int(v1.horizontal * d, v1.vertical * d); + } + + public static Vector2Int operator *(int d, Vector2Int v1) { + return new Vector2Int(d * v1.horizontal, d * v1.vertical); + } + + public static Vector2Int Scale(Vector2Int v1, Vector2Int v2) { + return new Vector2Int(v1.horizontal * v2.horizontal, v1.vertical * v2.vertical); + } + + /// @brief The dot product of two vectors + /// @param v1 The first vector + /// @param v2 The second vector + /// @return The dot product of the two vectors + public static int Dot(Vector2Int v1, Vector2Int v2) { + return v1.horizontal * v2.horizontal + v1.vertical * v2.vertical; + } + + public static float Distance(Vector2Int v1, Vector2Int v2) { + return (v1 - v2).magnitude; + } + } +} \ No newline at end of file diff --git a/LinearAlgebra/src/Vector3Float.cs b/LinearAlgebra/src/Vector3Float.cs new file mode 100644 index 0000000..bcf8626 --- /dev/null +++ b/LinearAlgebra/src/Vector3Float.cs @@ -0,0 +1,402 @@ +//#if !UNITY_5_3_OR_NEWER +using System; + +namespace LinearAlgebra { + /* + public struct Vector3Float { + public float horizontal; + public float vertical; + public float depth; + + public Vector3Float(float horizontal, float vertical, float depth) { + this.horizontal = horizontal; + this.vertical = vertical; + this.depth = depth; + } + + /// + /// A vector with zero for all axis + /// + public static readonly Vector3Float zero = new(0, 0, 0); + + public readonly float magnitude { + get => (float)Math.Sqrt(this.horizontal * this.horizontal + this.vertical * this.vertical + this.depth * this.depth); + } + + /// + /// Convert the vector to a length of a 1 + /// + /// The vector with length 1 + public readonly Vector3Float normalized { + get { + float l = magnitude; + Vector3Float v = zero; + if (l > Float.epsilon) + v = this / l; + return v; + } + } + + + public static Vector3Float operator *(Vector3Float v, float f) { + Vector3Float r = new(v.horizontal * f, v.vertical * f, v.depth * f); + return r; + } + public static Vector3Float operator /(Vector3Float v, float f) { + Vector3Float r = new(v.horizontal / f, v.vertical / f, v.depth / f); + return r; + } + + public static float Dot(Vector3Float v1, Vector3Float v2) { + return v1.horizontal * v2.horizontal + v1.vertical * v2.vertical + + v1.depth * v2.depth; + } + + const float epsilon = 1E-05f; + public static Vector3Float Project(Vector3Float v, Vector3Float n) { + float sqrMagnitude = Dot(n, n); + if (sqrMagnitude < epsilon) + return zero; + else { + float dot = Dot(v, n); + Vector3Float r = n * dot; + r /= sqrMagnitude; + return r; + } + + } + } + */ + + /// + /// 3-dimensional vectors + /// + /// This uses the right-handed coordinate system. + public struct Vector3Float { + + /// + /// The right axis of the vector + /// + public float horizontal; //> left/right + /// + /// The upward axis of the vector + /// + public float vertical; //> up/down + /// + /// The forward axis of the vector + /// + public float depth; //> forward/backward + + /// + /// Create a new 3-dimensional vector + /// + /// x axis value + /// y axis value + /// z axis value + public Vector3Float(float horizontal, float vertical, float depth) { + this.horizontal = horizontal; + this.vertical = vertical; + this.depth = depth; + } + + public Vector3Float(Vector3Int v) { + this.horizontal = v.horizontal; + this.vertical = v.vertical; + this.depth = v.depth; + } + + public static Vector3Float FromSpherical(Spherical s) { + float verticalRad = (AngleFloat.deg90 - s.direction.vertical).inRadians; + float horizontalRad = s.direction.horizontal.inRadians; + float cosVertical = MathF.Cos(verticalRad); + float sinVertical = MathF.Sin(verticalRad); + float cosHorizontal = MathF.Cos(horizontalRad); + float sinHorizontal = MathF.Sin(horizontalRad); + + float horizontal = s.distance * sinVertical * sinHorizontal; + float vertical = s.distance * cosVertical; + float depth = s.distance * sinVertical * cosHorizontal; + return new Vector3Float(horizontal, vertical, depth); + } + + public override string ToString() { + return $"({this.horizontal}, {this.vertical}, {this.depth})"; + } + + /// + /// A vector with zero for all axis + /// + public static readonly Vector3Float zero = new Vector3Float(0, 0, 0); + /// + /// A vector with one for all axis + /// + public static readonly Vector3Float one = new Vector3Float(1, 1, 1); + /// + /// A Vector3Float with values (-1, 0, 0) + /// + public static readonly Vector3Float left = new Vector3Float(-1, 0, 0); + /// + /// A vector with values (1, 0, 0) + /// + public static readonly Vector3Float right = new Vector3Float(1, 0, 0); + /// + /// A vector with values (0, -1, 0) + /// + public static readonly Vector3Float down = new Vector3Float(0, -1, 0); + /// + /// A vector with values (0, 1, 0) + /// + public static readonly Vector3Float up = new Vector3Float(0, 1, 0); + /// + /// A vector with values (0, 0, -1) + /// + public static readonly Vector3Float back = new Vector3Float(0, -1, 0); + /// + /// A vector with values (0, 0, 1) + /// + public static readonly Vector3Float forward = new Vector3Float(0, 1, 0); + + /// @brief The vector length + /// @return The vector length + public readonly float magnitude => MathF.Sqrt(horizontal * horizontal + vertical * vertical + depth * depth); + /// + /// The vector length + /// + /// The vector for which you need the length + /// The vector length + public static float MagnitudeOf(Vector3Float v) { + return v.magnitude; + } + + /// @brief The squared vector length + /// @return The squared vector length + /// @remark The squared length is computationally simpler than the real + /// length. Think of Pythagoras A^2 + B^2 = C^2. This leaves out the + /// calculation of the squared root of C. + public readonly float sqrMagnitude => (horizontal * horizontal + vertical * vertical + depth * depth); + + /// + /// The squared vector length + /// + /// The vector for which you need the squared length + /// The squared vector length + /// The squared length is computationally simpler than the real + /// length. Think of Pythagoras A^2 + B^2 = C^2. This leaves out the + /// calculation of the squared root of C. + public static float SqrMagnitudeOf(Vector3Float v) { + return v.sqrMagnitude; + } + + /// @brief Convert the vector to a length of 1 + /// @return The vector normalized to a length of 1 + public readonly Vector3Float normalized { + get { + float l = magnitude; + Vector3Float v = zero; + if (l > Float.epsilon) + v = this / l; + return v; + } + } + /// @brief Convert the vector to a length of 1 + /// @param v The vector to convert + /// @return The vector normalized to a length of 1 + public static Vector3Float Normalize(Vector3Float v) { + float num = v.magnitude; + Vector3Float result = zero; + if (num > Float.epsilon) + result = v / num; + + return result; + } + + /// + /// Negate te vector such that it points in the opposite direction + /// + /// + /// The negated vector + public static Vector3Float operator -(Vector3Float v1) { + Vector3Float v = new(-v1.horizontal, -v1.vertical, -v1.depth); + return v; + } + + /// + /// Subtract two vectors + /// + /// + /// + /// The result of the subtraction + public static Vector3Float operator -(Vector3Float v1, Vector3Float v2) { + Vector3Float v = new(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical, v1.depth - v2.depth); + return v; + } + + /// + /// Add two vectors + /// + /// + /// + /// The result of the addition + public static Vector3Float operator +(Vector3Float v1, Vector3Float v2) { + Vector3Float v = new(v1.horizontal + v2.horizontal, v1.vertical + v2.vertical, v1.depth + v2.depth); + return v; + } + + /// @brief Scale the vector using another vector + /// @param v1 The vector to scale + /// @param v2 A vector with the scaling factors + /// @return The scaled vector + /// @remark Each component of the vector v1 will be multiplied with the + /// matching component from the scaling vector v2. + public static Vector3Float Scale(Vector3Float v1, Vector3Float v2) { + return new Vector3Float(v1.horizontal * v2.horizontal, v1.vertical * v2.vertical, v1.depth * v2.depth); + } + + + public static Vector3Float operator *(Vector3Float v1, float d) { + Vector3Float v = new(v1.horizontal * d, v1.vertical * d, v1.depth * d); + return v; + } + + public static Vector3Float operator *(float d, Vector3Float v1) { + Vector3Float v = new(d * v1.horizontal, d * v1.vertical, d * v1.depth); + return v; + } + + public static Vector3Float operator /(Vector3Float v1, float d) { + Vector3Float v = new(v1.horizontal / d, v1.vertical / d, v1.depth / d); + return v; + } + + + //public bool Equals(Vector3Float v) => (horizontal == v.horizontal && vertical == v.vertical && depth == v.depth); + + public static bool operator ==(Vector3Float v1, Vector3Float v2) { + return (v1.horizontal == v2.horizontal && v1.vertical == v2.vertical && v1.depth == v2.depth); + } + + public static bool operator !=(Vector3Float v1, Vector3Float v2) { + return (v1.horizontal != v2.horizontal || v1.vertical != v2.vertical || v1.depth != v2.depth); + } + + public override readonly bool Equals(object obj) { + if (obj is not Vector3Float v) + return false; + + return (horizontal == v.horizontal && vertical == v.vertical && depth == v.depth); + } + + public override readonly int GetHashCode() { + return HashCode.Combine(horizontal, vertical, depth); + } + + /// @brief The distance between two vectors + /// @param v1 The first vector + /// @param v2 The second vector + /// @return The distance between the two vectors + public static float Distance(Vector3Float v1, Vector3Float v2) { + return (v2 - v1).magnitude; + } + + /// @brief The dot product of two vectors + /// @param v1 The first vector + /// @param v2 The second vector + /// @return The dot product of the two vectors + public static float Dot(Vector3Float v1, Vector3Float v2) { + return v1.horizontal * v2.horizontal + v1.vertical * v2.vertical + v1.depth * v2.depth; + } + + /// @brief The cross product of two vectors + /// @param v1 The first vector + /// @param v2 The second vector + /// @return The cross product of the two vectors + public static Vector3Float Cross(Vector3Float v1, Vector3Float v2) { + return new Vector3Float(v1.vertical * v2.depth - v1.depth * v2.vertical, v1.depth * v2.horizontal - v1.horizontal * v2.depth, + v1.horizontal * v2.vertical - v1.vertical * v2.horizontal); + + } + + /// @brief Project the vector on another vector + /// @param v The vector to project + /// @param n The normal vecto to project on + /// @return The projected vector + public static Vector3Float Project(Vector3Float v, Vector3Float n) { + float sqrMagnitude = Dot(n, n); + if (sqrMagnitude < Float.epsilon) + return zero; + else { + float dot = Dot(v, n); + Vector3Float r = n * dot / sqrMagnitude; + return r; + } + } + + /// @brief Project the vector on a plane defined by a normal orthogonal to the + /// plane. + /// @param v The vector to project + /// @param n The normal of the plane to project on + /// @return Teh projected vector + public static Vector3Float ProjectOnPlane(Vector3Float v, Vector3Float n) { + Vector3Float r = v - Project(v, n); + return r; + } + + /// @brief The angle between two vectors + /// @param v1 The first vector + /// @param v2 The second vector + /// @return The angle between the two vectors + /// @remark This reterns an unsigned angle which is the shortest distance + /// between the two vectors. Use Vector3::SignedAngle if a signed angle is + /// needed. + public static AngleFloat UnsignedAngle(Vector3Float v1, Vector3Float v2) { + float denominator = MathF.Sqrt(v1.sqrMagnitude * v2.sqrMagnitude); + if (denominator < Float.epsilon) + return AngleFloat.zero; + + float dot = Dot(v1, v2); + float fraction = dot / denominator; + if (float.IsNaN(fraction)) + return AngleFloat.Degrees( + fraction); // short cut to returning NaN universally + + float cdot = Float.Clamp(fraction, -1.0f, 1.0f); + float r = MathF.Acos(cdot); + return AngleFloat.Radians(r); + } + /// @brief The signed angle between two vectors + /// @param v1 The starting vector + /// @param v2 The ending vector + /// @param axis The axis to rotate around + /// @return The signed angle between the two vectors + public static AngleFloat SignedAngle(Vector3Float v1, Vector3Float v2, + Vector3Float axis) { + // angle in [0,180] + AngleFloat angle = UnsignedAngle(v1, v2); + + Vector3Float cross = Cross(v1, v2); + float b = Dot(axis, cross); + float signd = b < 0 ? -1.0F : (b > 0 ? 1.0F : 0.0F); + + // angle in [-179,180] + AngleFloat signed_angle = angle * signd; + + return signed_angle; + } + + + /// @brief Lerp (linear interpolation) between two vectors + /// @param v1 The starting vector + /// @param v2 The ending vector + /// @param f The interpolation distance + /// @return The lerped vector + /// @remark The factor f is unclamped. Value 0 matches the vector *v1*, Value + /// 1 matches vector *v2*. Value -1 is vector *v1* minus the difference + /// between *v1* and *v2* etc. + public static Vector3Float Lerp(Vector3Float v1, Vector3Float v2, float f) { + Vector3Float v = v1 + (v2 - v1) * f; + return v; + } + + } +} +//#endif \ No newline at end of file diff --git a/LinearAlgebra/src/Vector3Int.cs b/LinearAlgebra/src/Vector3Int.cs new file mode 100644 index 0000000..18edf40 --- /dev/null +++ b/LinearAlgebra/src/Vector3Int.cs @@ -0,0 +1,273 @@ +//#if !UNITY_5_3_OR_NEWER +using System; + +namespace LinearAlgebra { + + /// + /// 3-dimensional vectors + /// + /// This uses the right-handed coordinate system. + /// + /// Create a new 3-dimensional vector + /// + /// x axis value + /// y axis value + /// z axis value + public struct Vector3Int { + + /// + /// The right axis of the vector + /// + public int horizontal; //> left/right + /// + /// The upward axis of the vector + /// + public int vertical; //> up/down + /// + /// The forward axis of the vector + /// + public int depth; //> forward/backward + + public Vector3Int(int horizontal, int vertical, int depth) { + this.horizontal = horizontal; + this.vertical = vertical; + this.depth = depth; + } + + /// + /// A vector with zero for all axis + /// + public static readonly Vector3Int zero = new(0, 0, 0); + /// + /// A vector with one for all axis + /// + public static readonly Vector3Int one = new(1, 1, 1); + /// + /// A Vector3Int with values (-1, 0, 0) + /// + public static readonly Vector3Int left = new(-1, 0, 0); + /// + /// A vector with values (1, 0, 0) + /// + public static readonly Vector3Int right = new(1, 0, 0); + /// + /// A vector with values (0, -1, 0) + /// + public static readonly Vector3Int down = new(0, -1, 0); + /// + /// A vector with values (0, 1, 0) + /// + public static readonly Vector3Int up = new(0, 1, 0); + /// + /// A vector with values (0, 0, -1) + /// + public static readonly Vector3Int back = new(0, -1, 0); + /// + /// A vector with values (0, 0, 1) + /// + public static readonly Vector3Int forward = new(0, 1, 0); + + /// @brief The vector length + /// @return The vector length + public readonly float magnitude => MathF.Sqrt(horizontal * horizontal + vertical * vertical + depth * depth); + /// + /// The vector length + /// + /// The vector for which you need the length + /// The vector length + public static float MagnitudeOf(Vector3Int v) { + return v.magnitude; + } + + /// @brief The squared vector length + /// @return The squared vector length + /// @remark The squared length is computationally simpler than the real + /// length. Think of Pythagoras A^2 + B^2 = C^2. This leaves out the + /// calculation of the squared root of C. + public readonly float sqrMagnitude => (horizontal * horizontal + vertical * vertical + depth * depth); + + /// + /// The squared vector length + /// + /// The vector for which you need the squared length + /// The squared vector length + /// The squared length is computationally simpler than the real + /// length. Think of Pythagoras A^2 + B^2 = C^2. This leaves out the + /// calculation of the squared root of C. + public static float SqrMagnitudeOf(Vector3Int v) { + return v.sqrMagnitude; + } + + /// @brief Convert the vector to a length of 1 + /// @return The vector normalized to a length of 1 + public readonly Vector3Float normalized { + get { + float l = magnitude; + Vector3Float v = Vector3Float.zero; + if (l > Float.epsilon) + v = new Vector3Float(this) / l; + return v; + } + } + /// @brief Convert the vector to a length of 1 + /// @param v The vector to convert + /// @return The vector normalized to a length of 1 + public static Vector3Float Normalize(Vector3Int v) { + float num = v.magnitude; + Vector3Float result = Vector3Float.zero; + if (num > Float.epsilon) + result = new Vector3Float(v) / num; + + return result; + } + + /// + /// Negate te vector such that it points in the opposite direction + /// + /// + /// The negated vector + public static Vector3Int operator -(Vector3Int v1) { + Vector3Int v = new(-v1.horizontal, -v1.vertical, -v1.depth); + return v; + } + + /// + /// Subtract two vectors + /// + /// + /// + /// The result of the subtraction + public static Vector3Int operator -(Vector3Int v1, Vector3Int v2) { + Vector3Int v = new(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical, v1.depth - v2.depth); + return v; + } + + /// + /// Add two vectors + /// + /// + /// + /// The result of the addition + public static Vector3Int operator +(Vector3Int v1, Vector3Int v2) { + Vector3Int v = new(v1.horizontal + v2.horizontal, v1.vertical + v2.vertical, v1.depth + v2.depth); + return v; + } + + /// @brief Scale the vector using another vector + /// @param v1 The vector to scale + /// @param v2 A vector with the scaling factors + /// @return The scaled vector + /// @remark Each component of the vector v1 will be multiplied with the + /// matching component from the scaling vector v2. + public static Vector3Int Scale(Vector3Int v1, Vector3Int v2) { + return new Vector3Int(v1.horizontal * v2.horizontal, v1.vertical * v2.vertical, v1.depth * v2.depth); + } + + + public static Vector3Int operator *(Vector3Int v1, int d) { + Vector3Int v = new(v1.horizontal * d, v1.vertical * d, v1.depth * d); + return v; + } + + public static Vector3Int operator *(int d, Vector3Int v1) { + Vector3Int v = new(d * v1.horizontal, d * v1.vertical, d * v1.depth); + return v; + } + + public static Vector3Int operator /(Vector3Int v1, int d) { + Vector3Int v = new(v1.horizontal / d, v1.vertical / d, v1.depth / d); + return v; + } + + public bool Equals(Vector3Int v) => (horizontal == v.horizontal && vertical == v.vertical && depth == v.depth); + + public override bool Equals(object obj) { + if (!(obj is Vector3Int v)) + return false; + + return (horizontal == v.horizontal && vertical == v.vertical && depth == v.depth); + } + + public static bool operator ==(Vector3Int v1, Vector3Int v2) { + return (v1.horizontal == v2.horizontal && v1.vertical == v2.vertical && v1.depth == v2.depth); + } + + public static bool operator !=(Vector3Int v1, Vector3Int v2) { + return (v1.horizontal != v2.horizontal || v1.vertical != v2.vertical || v1.depth != v2.depth); + } + + public override int GetHashCode() { + return (horizontal, vertical, depth).GetHashCode(); + } + + /// @brief The distance between two vectors + /// @param v1 The first vector + /// @param v2 The second vector + /// @return The distance between the two vectors + public static float Distance(Vector3Int v1, Vector3Int v2) { + return (v2 - v1).magnitude; + } + + /// @brief The dot product of two vectors + /// @param v1 The first vector + /// @param v2 The second vector + /// @return The dot product of the two vectors + public static float Dot(Vector3Int v1, Vector3Int v2) { + return v1.horizontal * v2.horizontal + v1.vertical * v2.vertical + v1.depth * v2.depth; + } + + /// @brief The cross product of two vectors + /// @param v1 The first vector + /// @param v2 The second vector + /// @return The cross product of the two vectors + public static Vector3Int Cross(Vector3Int v1, Vector3Int v2) { + return new Vector3Int(v1.vertical * v2.depth - v1.depth * v2.vertical, v1.depth * v2.horizontal - v1.horizontal * v2.depth, + v1.horizontal * v2.vertical - v1.vertical * v2.horizontal); + + } + + /// @brief The angle between two vectors + /// @param v1 The first vector + /// @param v2 The second vector + /// @return The angle between the two vectors + /// @remark This reterns an unsigned angle which is the shortest distance + /// between the two vectors. Use Vector3::SignedAngle if a signed angle is + /// needed. + public static AngleFloat UnsignedAngle(Vector3Int v1, Vector3Int v2) { + float denominator = MathF.Sqrt(v1.sqrMagnitude * v2.sqrMagnitude); + if (denominator < Float.epsilon) + return AngleFloat.zero; + + float dot = Dot(v1, v2); + float fraction = dot / denominator; + if (float.IsNaN(fraction)) + return AngleFloat.Degrees( + fraction); // short cut to returning NaN universally + + float cdot = Float.Clamp(fraction, -1.0f, 1.0f); + float r = MathF.Acos(cdot); + return AngleFloat.Radians(r); + } + /// @brief The signed angle between two vectors + /// @param v1 The starting vector + /// @param v2 The ending vector + /// @param axis The axis to rotate around + /// @return The signed angle between the two vectors + public static AngleFloat SignedAngle(Vector3Int v1, Vector3Int v2, + Vector3Int axis) { + // angle in [0,180] + AngleFloat angle = UnsignedAngle(v1, v2); + + Vector3Int cross = Cross(v1, v2); + float b = Dot(axis, cross); + float signd = b < 0 ? -1.0F : (b > 0 ? 1.0F : 0.0F); + + // angle in [-179,180] + AngleFloat signed_angle = angle * signd; + + return signed_angle; + } + + } +} +//#endif \ No newline at end of file diff --git a/LinearAlgebra/src/float16.cs b/LinearAlgebra/src/float16.cs new file mode 100644 index 0000000..4b58cdd --- /dev/null +++ b/LinearAlgebra/src/float16.cs @@ -0,0 +1,322 @@ +using System; + +namespace LinearAlgebra { + + public class float16 { + // + // FILE: float16.cpp + // AUTHOR: Rob Tillaart + // VERSION: 0.1.8 + // PURPOSE: library for Float16s for Arduino + // URL: http://en.wikipedia.org/wiki/Half-precision_floating-point_format + + ushort _value; + + public float16() { _value = 0; } + + public float16(float f) { + //_value = f32tof16(f); + _value = F32ToF16__(f); + } + + public float toFloat() { + return f16tof32(_value); + } + + public ushort GetBinary() { return _value; } + public void SetBinary(ushort value) { _value = value; } + + ////////////////////////////////////////////////////////// + // + // EQUALITIES + // + /* + bool float16::operator ==(const float16 &f) { return (_value == f._value); } + + bool float16::operator !=(const float16 &f) { return (_value != f._value); } + + bool float16::operator >(const float16 &f) { + if ((_value & 0x8000) && (f._value & 0x8000)) + return _value < f._value; + if (_value & 0x8000) + return false; + if (f._value & 0x8000) + return true; + return _value > f._value; + } + + bool float16::operator >=(const float16 &f) { + if ((_value & 0x8000) && (f._value & 0x8000)) + return _value <= f._value; + if (_value & 0x8000) + return false; + if (f._value & 0x8000) + return true; + return _value >= f._value; + } + + bool float16::operator <(const float16 &f) { + if ((_value & 0x8000) && (f._value & 0x8000)) + return _value > f._value; + if (_value & 0x8000) + return true; + if (f._value & 0x8000) + return false; + return _value < f._value; + } + + bool float16::operator <=(const float16 &f) { + if ((_value & 0x8000) && (f._value & 0x8000)) + return _value >= f._value; + if (_value & 0x8000) + return true; + if (f._value & 0x8000) + return false; + return _value <= f._value; + } + + ////////////////////////////////////////////////////////// + // + // NEGATION + // + float16 float16::operator -() { + float16 f16; + f16.setBinary(_value ^ 0x8000); + return f16; + } + + ////////////////////////////////////////////////////////// + // + // MATH + // + float16 float16::operator +(const float16 &f) { + return float16(this->toDouble() + f.toDouble()); + } + + float16 float16::operator -(const float16 &f) { + return float16(this->toDouble() - f.toDouble()); + } + + float16 float16::operator *(const float16 &f) { + return float16(this->toDouble() * f.toDouble()); + } + + float16 float16::operator /(const float16 &f) { + return float16(this->toDouble() / f.toDouble()); + } + + float16 & float16::operator+=(const float16 &f) { + *this = this->toDouble() + f.toDouble(); + return *this; + } + + float16 & float16::operator-=(const float16 &f) { + *this = this->toDouble() - f.toDouble(); + return *this; + } + + float16 & float16::operator*=(const float16 &f) { + *this = this->toDouble() * f.toDouble(); + return *this; + } + + float16 & float16::operator/=(const float16 &f) { + *this = this->toDouble() / f.toDouble(); + return *this; + } + + ////////////////////////////////////////////////////////// + // + // MATH HELPER FUNCTIONS + // + int float16::sign() { + if (_value & 0x8000) + return -1; + if (_value & 0xFFFF) + return 1; + return 0; + } + + bool float16::isZero() { return ((_value & 0x7FFF) == 0x0000); } + + bool float16::isNaN() { + if ((_value & 0x7C00) != 0x7C00) + return false; + if ((_value & 0x03FF) == 0x0000) + return false; + return true; + } + + bool float16::isInf() { return ((_value == 0x7C00) || (_value == 0xFC00)); } + */ + ////////////////////////////////////////////////////////// + // + // CORE CONVERSION + // + float f16tof32(ushort _value) { + //ushort sgn; + ushort man; + int exp; + float f; + + //Debug.Log($"{_value}"); + + bool sgn = (_value & 0x8000) > 0; + exp = (_value & 0x7C00) >> 10; + man = (ushort)(_value & 0x03FF); + + //Debug.Log($"{sgn} {exp} {man}"); + + // ZERO + if ((_value & 0x7FFF) == 0) { + return sgn ? -0 : 0; + } + // NAN & INF + if (exp == 0x001F) { + if (man == 0) + return sgn ? float.NegativeInfinity : float.PositiveInfinity; //-INFINITY : INFINITY; + else + return float.NaN; // NAN; + } + + // SUBNORMAL/NORMAL + if (exp == 0) + f = 0; + else + f = 1; + + // PROCESS MANTISSE + for (int i = 9; i >= 0; i--) { + f *= 2; + if ((man & (1 << i)) != 0) + f = f + 1; + } + //Debug.Log($"{f}"); + f = f * (float)Math.Pow(2.0f, exp - 25); + if (exp == 0) { + f = f * (float)Math.Pow(2.0f, -13); // 5.96046447754e-8; + } + //Debug.Log($"{f}"); + return sgn ? -f : f; + } + + public static uint SingleToInt32Bits(float value) { + byte[] bytes = BitConverter.GetBytes(value); + if (BitConverter.IsLittleEndian) + Array.Reverse(bytes); // If the system is little-endian, reverse the byte order + return BitConverter.ToUInt32(bytes, 0); + } + + public ushort F32ToF16__(float f) { + uint t = BitConverter.ToUInt32(BitConverter.GetBytes(f), 0); + ushort man = (ushort)((t & 0x007FFFFF) >> 12); + int exp = (int)((t & 0x7F800000) >> 23); + bool sgn = (t & 0x80000000) != 0; + + // handle 0 + if ((t & 0x7FFFFFFF) == 0) { + return sgn ? (ushort)0x8000 : (ushort)0x0000; + } + // denormalized float32 does not fit in float16 + if (exp == 0x00) { + return sgn ? (ushort)0x8000 : (ushort)0x0000; + } + // handle infinity & NAN + if (exp == 0x00FF) { + if (man != 0) + return 0xFE00; // NAN + return sgn ? (ushort)0xFC00 : (ushort)0x7C00; // -INF : INF + } + + // normal numbers + exp = exp - 127 + 15; + // overflow does not fit => INF + if (exp > 30) { + return sgn ? (ushort)0xFC00 : (ushort)0x7C00; // -INF : INF + } + // subnormal numbers + if (exp < -38) { + return sgn ? (ushort)0x8000 : (ushort)0x0000; // -0 or 0 ? just 0 ? + } + if (exp <= 0) // subnormal + { + man >>= (exp + 14); + // rounding + man++; + man >>= 1; + if (sgn) + return (ushort)(0x8000 | man); + return man; + } + + // normal + // TODO rounding + exp <<= 10; + man++; + man >>= 1; + if (sgn) + return (ushort)(0x8000 | exp | man); + return (ushort)(exp | man); + } + + //This function is faulty!!!! + ushort f32tof16(float f) { + //uint t = *(uint*)&f; + //uint t = (uint)BitConverter.SingleToInt32Bits(f); + uint t = SingleToInt32Bits(f); + // man bits = 10; but we keep 11 for rounding + ushort man = (ushort)((t & 0x007FFFFF) >> 12); + short exp = (short)((t & 0x7F800000) >> 23); + bool sgn = (t & 0x80000000) != 0; + + // handle 0 + if ((t & 0x7FFFFFFF) == 0) { + return sgn ? (ushort)0x8000 : (ushort)0x0000; + } + // denormalized float32 does not fit in float16 + if (exp == 0x00) { + return sgn ? (ushort)0x8000 : (ushort)0x0000; + } + // handle infinity & NAN + if (exp == 0x00FF) { + if (man != 0) + return 0xFE00; // NAN + return sgn ? (ushort)0xFC00 : (ushort)0x7C00; // -INF : INF + } + + // normal numbers + exp = (short)(exp - 127 + 15); + // overflow does not fit => INF + if (exp > 30) { + return sgn ? (ushort)0xFC00 : (ushort)0x7C00; // -INF : INF + } + // subnormal numbers + if (exp < -38) { + return sgn ? (ushort)0x8000 : (ushort)0x0000; // -0 or 0 ? just 0 ? + } + if (exp <= 0) // subnormal + { + man >>= (exp + 14); + // rounding + man++; + man >>= 1; + if (sgn) + return (ushort)(0x8000 | man); + return man; + } + + // normal + // TODO rounding + exp <<= 10; + man++; + man >>= 1; + ushort uexp = (ushort)exp; + if (sgn) + return (ushort)(0x8000 | uexp | man); + return (ushort)(uexp | man); + } + + // -- END OF FILE -- + } + +} \ No newline at end of file diff --git a/LinearAlgebra/test/AngleTest.cs b/LinearAlgebra/test/AngleTest.cs new file mode 100644 index 0000000..8362d82 --- /dev/null +++ b/LinearAlgebra/test/AngleTest.cs @@ -0,0 +1,501 @@ +#if !UNITY_5_6_OR_NEWER +using System; +using System.Formats.Asn1; +using NUnit.Framework; + +namespace LinearAlgebra.Test { + public class AngleTests { + [SetUp] + public void Setup() { + } + + [Test] + public void Construct() { + // Degrees + float angle = 0.0f; + AngleFloat a = AngleFloat.Degrees(angle); + Assert.AreEqual(angle, a.inDegrees); + + angle = -180.0f; + a = AngleFloat.Degrees(angle); + Assert.AreEqual(angle, a.inDegrees); + + angle = 270.0f; + a = AngleFloat.Degrees(angle); + Assert.AreEqual(-90, a.inDegrees); + + angle = -270.0f; + a = AngleFloat.Degrees(angle); + Assert.AreEqual(90, a.inDegrees); + + // Radians + angle = 0.0f; + a = AngleFloat.Radians(angle); + Assert.AreEqual(angle, a.inRadians); + + angle = (float)-Math.PI; + a = AngleFloat.Radians(angle); + Assert.AreEqual(angle, a.inRadians); + + angle = (float)Math.PI * 1.5f; + a = AngleFloat.Radians(angle); + Assert.AreEqual(-Math.PI * 0.5f, a.inRadians, 1.0E-05F); + + // Revolutions + angle = 0.0f; + a = AngleFloat.Revolutions(angle); + Assert.AreEqual(angle, a.inRevolutions); + + angle = -0.5f; + a = AngleFloat.Revolutions(angle); + Assert.AreEqual(angle, a.inRevolutions); + + angle = 0.75f; + a = AngleFloat.Revolutions(angle); + Assert.AreEqual(-0.25f, a.inRevolutions); + + } + + [Test] + public void Revolutions() { + AngleFloat a; + + // Test zero + a = AngleFloat.Revolutions(0.0f); + Assert.AreEqual(0.0f, a.inRevolutions); + + // Test positive values within range + a = AngleFloat.Revolutions(0.25f); + Assert.AreEqual(0.25f, a.inRevolutions); + + a = AngleFloat.Revolutions(0.5f); + Assert.AreEqual(-0.5f, a.inRevolutions); + + // Test negative values within range + a = AngleFloat.Revolutions(-0.25f); + Assert.AreEqual(-0.25f, a.inRevolutions); + + a = AngleFloat.Revolutions(-0.5f); + Assert.AreEqual(-0.5f, a.inRevolutions); + + // Test values outside range (positive) + a = AngleFloat.Revolutions(1.0f); + Assert.AreEqual(0.0f, a.inRevolutions); + + a = AngleFloat.Revolutions(1.25f); + Assert.AreEqual(0.25f, a.inRevolutions); + + a = AngleFloat.Revolutions(1.75f); + Assert.AreEqual(-0.25f, a.inRevolutions); + + // Test values outside range (negative) + a = AngleFloat.Revolutions(-1.0f); + Assert.AreEqual(0.0f, a.inRevolutions); + + a = AngleFloat.Revolutions(-1.25f); + Assert.AreEqual(-0.25f, a.inRevolutions); + + a = AngleFloat.Revolutions(-1.75f); + Assert.AreEqual(0.25f, a.inRevolutions); + + // Test infinity + a = AngleFloat.Revolutions(float.PositiveInfinity); + Assert.AreEqual(float.PositiveInfinity, a.inRevolutions); + + a = AngleFloat.Revolutions(float.NegativeInfinity); + Assert.AreEqual(float.NegativeInfinity, a.inRevolutions); + } + + [Test] + public void Equality() { + // Test equality operator + Assert.IsTrue(AngleFloat.Degrees(90) == AngleFloat.Degrees(90), "90 == 90"); + Assert.IsFalse(AngleFloat.Degrees(90) == AngleFloat.Degrees(45), "90 == 45"); + Assert.IsTrue(AngleFloat.Degrees(0) == AngleFloat.Degrees(0), "0 == 0"); + Assert.IsTrue(AngleFloat.Degrees(-180) == AngleFloat.Degrees(-180), "-180 == -180"); + + // Test inequality operator + Assert.IsTrue(AngleFloat.Degrees(90) != AngleFloat.Degrees(45), "90 != 45"); + Assert.IsFalse(AngleFloat.Degrees(90) != AngleFloat.Degrees(90), "90 != 90"); + Assert.IsTrue(AngleFloat.Degrees(0) != AngleFloat.Degrees(1), "0 != 1"); + + // Test greater than operator + Assert.IsTrue(AngleFloat.Degrees(90) > AngleFloat.Degrees(45), "90 > 45"); + Assert.IsFalse(AngleFloat.Degrees(45) > AngleFloat.Degrees(90), "45 > 90"); + Assert.IsFalse(AngleFloat.Degrees(90) > AngleFloat.Degrees(90), "90 > 90"); + + // Test greater than or equal operator + Assert.IsTrue(AngleFloat.Degrees(90) >= AngleFloat.Degrees(45), "90 >= 45"); + Assert.IsTrue(AngleFloat.Degrees(90) >= AngleFloat.Degrees(90), "90 >= 90"); + Assert.IsFalse(AngleFloat.Degrees(45) >= AngleFloat.Degrees(90), "45 >= 90"); + + // Test less than operator + Assert.IsTrue(AngleFloat.Degrees(45) < AngleFloat.Degrees(90), "45 < 90"); + Assert.IsFalse(AngleFloat.Degrees(90) < AngleFloat.Degrees(45), "90 < 45"); + Assert.IsFalse(AngleFloat.Degrees(90) < AngleFloat.Degrees(90), "90 < 90"); + + // Test less than or equal operator + Assert.IsTrue(AngleFloat.Degrees(45) <= AngleFloat.Degrees(90), "45 <= 90"); + Assert.IsTrue(AngleFloat.Degrees(90) <= AngleFloat.Degrees(90), "90 <= 90"); + Assert.IsFalse(AngleFloat.Degrees(90) <= AngleFloat.Degrees(45), "90 <= 45"); + } + + // [Test] + // public void Normalize() { + // float r = 0; + + // r = Angle.Normalize(90); + // Assert.AreEqual(r, 90, "Normalize 90"); + + // r = Angle.Normalize(-90); + // Assert.AreEqual(r, -90, "Normalize -90"); + + // r = Angle.Normalize(270); + // Assert.AreEqual(r, -90, "Normalize 270"); + + // r = Angle.Normalize(270 + 360); + // Assert.AreEqual(r, -90, "Normalize 270+360"); + + // r = Angle.Normalize(-270); + // Assert.AreEqual(r, 90, "Normalize -270"); + + // r = Angle.Normalize(-270 - 360); + // Assert.AreEqual(r, 90, "Normalize -270-360"); + + // r = Angle.Normalize(0); + // Assert.AreEqual(r, 0, "Normalize 0"); + + // r = Angle.Normalize(float.PositiveInfinity); + // Assert.AreEqual(r, float.PositiveInfinity, "Normalize INFINITY"); + + // r = Angle.Normalize(float.NegativeInfinity); + // Assert.AreEqual(r, float.NegativeInfinity, "Normalize INFINITY"); + // } + + [Test] + public void Clamp() { + float r = 0; + + r = AngleFloat.Clamp(AngleFloat.Degrees(1), AngleFloat.Degrees(0), AngleFloat.Degrees(2)); + Assert.AreEqual(1, r, "Clamp 1 0 2"); + + r = AngleFloat.Clamp(AngleFloat.Degrees(-1), AngleFloat.Degrees(0), AngleFloat.Degrees(2)); + Assert.AreEqual(0, r, "Clamp -1 0 2"); + + r = AngleFloat.Clamp(AngleFloat.Degrees(3), AngleFloat.Degrees(0), AngleFloat.Degrees(2)); + Assert.AreEqual(2, r, "Clamp 3 0 2"); + + r = AngleFloat.Clamp(AngleFloat.Degrees(1), AngleFloat.Degrees(0), AngleFloat.Degrees(0)); + Assert.AreEqual(0, r, "Clamp 1 0 0"); + + r = AngleFloat.Clamp(AngleFloat.Degrees(0), AngleFloat.Degrees(0), AngleFloat.Degrees(0)); + Assert.AreEqual(0, r, "Clamp 0 0 0"); + + r = AngleFloat.Clamp(AngleFloat.Degrees(0), AngleFloat.Degrees(1), AngleFloat.Degrees(-1)); + Assert.AreEqual(1, r, "Clamp 0 1 -1"); + + r = AngleFloat.Clamp(AngleFloat.Degrees(1), AngleFloat.Degrees(0), AngleFloat.Degrees(float.PositiveInfinity)); + Assert.AreEqual(1, r, "Clamp 1 0 INFINITY"); + + r = AngleFloat.Clamp(AngleFloat.Degrees(1), AngleFloat.Degrees(float.NegativeInfinity), AngleFloat.Degrees(1)); + Assert.AreEqual(1, r, "Clamp 1 -INFINITY 1"); + } + + [Test] + public void Cos() { + // Test zero + Assert.AreEqual(1.0f, AngleFloat.Cos(AngleFloat.Degrees(0)), 1.0E-05F, "Cos(0°)"); + + // Test 90 degrees + Assert.AreEqual(0.0f, AngleFloat.Cos(AngleFloat.Degrees(90)), 1.0E-05F, "Cos(90°)"); + + // Test 180 degrees + Assert.AreEqual(-1.0f, AngleFloat.Cos(AngleFloat.Degrees(180)), 1.0E-05F, "Cos(180°)"); + + // Test 270 degrees + Assert.AreEqual(0.0f, AngleFloat.Cos(AngleFloat.Degrees(270)), 1.0E-05F, "Cos(270°)"); + + // Test 45 degrees + Assert.AreEqual(MathF.Sqrt(2) / 2, AngleFloat.Cos(AngleFloat.Degrees(45)), 1.0E-05F, "Cos(45°)"); + + // Test negative angle + Assert.AreEqual(1.0f, AngleFloat.Cos(AngleFloat.Degrees(-360)), 1.0E-05F, "Cos(-360°)"); + + // Test using radians + Assert.AreEqual(1.0f, AngleFloat.Cos(AngleFloat.Radians(0)), 1.0E-05F, "Cos(0 rad)"); + Assert.AreEqual(0.0f, AngleFloat.Cos(AngleFloat.Radians((float)Math.PI / 2)), 1.0E-05F, "Cos(π/2)"); + Assert.AreEqual(-1.0f, AngleFloat.Cos(AngleFloat.Radians((float)Math.PI)), 1.0E-05F, "Cos(π)"); + } + + [Test] + public void Sin() { + // Test zero + Assert.AreEqual(0.0f, AngleFloat.Sin(AngleFloat.Degrees(0)), 1.0E-05F, "Sin(0°)"); + + // Test 90 degrees + Assert.AreEqual(1.0f, AngleFloat.Sin(AngleFloat.Degrees(90)), 1.0E-05F, "Sin(90°)"); + + // Test 180 degrees + Assert.AreEqual(0.0f, AngleFloat.Sin(AngleFloat.Degrees(180)), 1.0E-05F, "Sin(180°)"); + + // Test 270 degrees + Assert.AreEqual(-1.0f, AngleFloat.Sin(AngleFloat.Degrees(270)), 1.0E-05F, "Sin(270°)"); + + // Test 45 degrees + Assert.AreEqual(MathF.Sqrt(2) / 2, AngleFloat.Sin(AngleFloat.Degrees(45)), 1.0E-05F, "Sin(45°)"); + + // Test negative angle + Assert.AreEqual(0.0f, AngleFloat.Sin(AngleFloat.Degrees(-360)), 1.0E-05F, "Sin(-360°)"); + + // Test using radians + Assert.AreEqual(0.0f, AngleFloat.Sin(AngleFloat.Radians(0)), 1.0E-05F, "Sin(0 rad)"); + Assert.AreEqual(1.0f, AngleFloat.Sin(AngleFloat.Radians((float)Math.PI / 2)), 1.0E-05F, "Sin(π/2)"); + Assert.AreEqual(0.0f, AngleFloat.Sin(AngleFloat.Radians((float)Math.PI)), 1.0E-05F, "Sin(π)"); + } + + [Test] + public void Tan() { + // Test zero + Assert.AreEqual(0.0f, AngleFloat.Tan(AngleFloat.Degrees(0)), 1.0E-05F, "Tan(0°)"); + + // Test 45 degrees + Assert.AreEqual(1.0f, AngleFloat.Tan(AngleFloat.Degrees(45)), 1.0E-05F, "Tan(45°)"); + + // Test -45 degrees + Assert.AreEqual(-1.0f, AngleFloat.Tan(AngleFloat.Degrees(-45)), 1.0E-05F, "Tan(-45°)"); + + // Test using radians + Assert.AreEqual(0.0f, AngleFloat.Tan(AngleFloat.Radians(0)), 1.0E-05F, "Tan(0 rad)"); + Assert.AreEqual(1.0f, AngleFloat.Tan(AngleFloat.Radians((float)Math.PI / 4)), 1.0E-05F, "Tan(π/4)"); + } + + [Test] + public void Acos() { + // Test 1 (0 degrees) + Assert.AreEqual(0.0f, AngleFloat.Acos(1.0f).inRadians, 1.0E-05F, "Acos(1)"); + + // Test 0 (90 degrees or π/2 radians) + Assert.AreEqual((float)Math.PI / 2, AngleFloat.Acos(0.0f).inRadians, 1.0E-05F, "Acos(0)"); + + // Test -1 (-180 degrees or π radians) + Assert.AreEqual((float)-Math.PI, AngleFloat.Acos(-1.0f).inRadians, 1.0E-05F, "Acos(-1)"); + + // Test 0.5 (60 degrees or π/3 radians) + Assert.AreEqual((float)Math.PI / 3, AngleFloat.Acos(0.5f).inRadians, 1.0E-05F, "Acos(0.5)"); + + // Test sqrt(2)/2 (45 degrees or π/4 radians) + Assert.AreEqual((float)Math.PI / 4, AngleFloat.Acos(MathF.Sqrt(2) / 2).inRadians, 1.0E-05F, "Acos(√2/2)"); + } + + [Test] + public void Asin() { + // Test 0 (0 degrees) + Assert.AreEqual(0.0f, AngleFloat.Asin(0.0f).inRadians, 1.0E-05F, "Asin(0)"); + + // Test 1 (90 degrees or π/2 radians) + Assert.AreEqual((float)Math.PI / 2, AngleFloat.Asin(1.0f).inRadians, 1.0E-05F, "Asin(1)"); + + // Test -1 (-90 degrees or -π/2 radians) + Assert.AreEqual(-(float)Math.PI / 2, AngleFloat.Asin(-1.0f).inRadians, 1.0E-05F, "Asin(-1)"); + + // Test 0.5 (30 degrees or π/6 radians) + Assert.AreEqual((float)Math.PI / 6, AngleFloat.Asin(0.5f).inRadians, 1.0E-05F, "Asin(0.5)"); + + // Test sqrt(2)/2 (45 degrees or π/4 radians) + Assert.AreEqual((float)Math.PI / 4, AngleFloat.Asin(MathF.Sqrt(2) / 2).inRadians, 1.0E-05F, "Asin(√2/2)"); + } + + + [Test] + public void Atan() { + // Test zero + Assert.AreEqual(0.0f, AngleFloat.Atan(0.0f).inRadians, 1.0E-05F, "Atan(0)"); + + // Test 1 (45 degrees or π/4 radians) + Assert.AreEqual((float)Math.PI / 4, AngleFloat.Atan(1.0f).inRadians, 1.0E-05F, "Atan(1)"); + + // Test -1 (-45 degrees or -π/4 radians) + Assert.AreEqual(-(float)Math.PI / 4, AngleFloat.Atan(-1.0f).inRadians, 1.0E-05F, "Atan(-1)"); + + // Test sqrt(3) (60 degrees or π/3 radians) + Assert.AreEqual((float)Math.PI / 3, AngleFloat.Atan(MathF.Sqrt(3)).inRadians, 1.0E-05F, "Atan(√3)"); + + // Test 1/sqrt(3) (30 degrees or π/6 radians) + Assert.AreEqual((float)Math.PI / 6, AngleFloat.Atan(1.0f / MathF.Sqrt(3)).inRadians, 1.0E-05F, "Atan(1/√3)"); + + // Test positive infinity + Assert.AreEqual((float)Math.PI / 2, AngleFloat.Atan(float.PositiveInfinity).inRadians, 1.0E-05F, "Atan(+∞)"); + + // Test negative infinity + Assert.AreEqual(-(float)Math.PI / 2, AngleFloat.Atan(float.NegativeInfinity).inRadians, 1.0E-05F, "Atan(-∞)"); + } + + [Test] + public void Atan2() { + // Test basic quadrant I + Assert.AreEqual((float)Math.PI / 4, AngleFloat.Atan2(1.0f, 1.0f).inRadians, 1.0E-05F, "Atan2(1, 1)"); + + // Test quadrant II + Assert.AreEqual(3 * (float)Math.PI / 4, AngleFloat.Atan2(1.0f, -1.0f).inRadians, 1.0E-05F, "Atan2(1, -1)"); + + // Test quadrant III + Assert.AreEqual(-(float)Math.PI * 0.75f, AngleFloat.Atan2(-1.0f, -1.0f).inRadians, 1.0E-05F, "Atan2(-1, -1)"); + + // Test quadrant IV + Assert.AreEqual(-(float)Math.PI / 4, AngleFloat.Atan2(-1.0f, 1.0f).inRadians, 1.0E-05F, "Atan2(-1, 1)"); + + // Test positive x-axis + Assert.AreEqual(0.0f, AngleFloat.Atan2(0.0f, 1.0f).inRadians, 1.0E-05F, "Atan2(0, 1)"); + + // Test positive y-axis + Assert.AreEqual((float)Math.PI / 2, AngleFloat.Atan2(1.0f, 0.0f).inRadians, 1.0E-05F, "Atan2(1, 0)"); + + // Test negative y-axis + Assert.AreEqual(-(float)Math.PI / 2, AngleFloat.Atan2(-1.0f, 0.0f).inRadians, 1.0E-05F, "Atan2(-1, 0)"); + + // Test origin + Assert.AreEqual(0.0f, AngleFloat.Atan2(0.0f, 0.0f).inRadians, 1.0E-05F, "Atan2(0, 0)"); + + // Test with different magnitudes + Assert.AreEqual((float)Math.PI / 3, AngleFloat.Atan2(MathF.Sqrt(3), 1.0f).inRadians, 1.0E-05F, "Atan2(√3, 1)"); + + // Test negative x-axis + Assert.AreEqual((float)-Math.PI, AngleFloat.Atan2(0.0f, -1.0f).inRadians, 1.0E-05F, "Atan2(0, -1)"); + } + + [Test] + public void Multiplication() { + AngleFloat r = AngleFloat.zero; + + // Angle * float + r = AngleFloat.Degrees(90) * 2; + Assert.AreEqual(-180, r.inDegrees, "Multiply 90 * 2"); + + r = AngleFloat.Degrees(45) * 0.5f; + Assert.AreEqual(22.5f, r.inDegrees, "Multiply 45 * 0.5"); + + r = AngleFloat.Degrees(90) * 0; + Assert.AreEqual(0, r.inDegrees, "Multiply 90 * 0"); + + r = AngleFloat.Degrees(-90) * 2; + Assert.AreEqual(-180, r.inDegrees, "Multiply -90 * 2"); + + r = AngleFloat.Degrees(270) * 2; + Assert.AreEqual(-180, r.inDegrees, "Multiply 270 * 2 (normalized)"); + + // float * Angle + r = 2 * AngleFloat.Degrees(90); + Assert.AreEqual(-180, r.inDegrees, "Multiply 2 * 90"); + + r = 0.5f * AngleFloat.Degrees(45); + Assert.AreEqual(22.5, r.inDegrees, "Multiply 0.5 * 45"); + + r = 0 * AngleFloat.Degrees(90); + Assert.AreEqual(0, r.inDegrees, "Multiply 0 * 90"); + + r = 2 * AngleFloat.Degrees(-90); + Assert.AreEqual(-180, r.inDegrees, "Multiply 2 * -90"); + + // Negative factor + r = AngleFloat.Degrees(90) * -1; + Assert.AreEqual(-90, r.inDegrees, "Multiply 90 * -1"); + + r = -1 * AngleFloat.Degrees(90); + Assert.AreEqual(-90, r.inDegrees, "Multiply -1 * 90"); + } + + [Test] + public void MoveTowards() { + AngleFloat r = AngleFloat.zero; + + r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), 30); + Assert.AreEqual(30, r.inDegrees, "MoveTowards 0 90 30"); + + r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), 90); + Assert.AreEqual(90, r.inDegrees, "MoveTowards 0 90 90"); + + r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), 180); + Assert.AreEqual(90, r.inDegrees, "MoveTowards 0 90 180"); + + r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), 270); + Assert.AreEqual(90, r.inDegrees, "MoveTowrads 0 90 270"); + + r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), -30); + Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 90 -30"); + + r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(-90), -30); + Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 -90 -30"); + + r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(-90), -90); + Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 -90 -90"); + + r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(-90), -180); + Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 -90 -180"); + + r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(-90), -270); + Assert.AreEqual(0, r.inDegrees, "MoveTowrads 0 -90 -270"); + + r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), 0); + Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 90 0"); + + r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(0), 0); + Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 0 0"); + + r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(0), 30); + Assert.AreEqual(0, r.inDegrees, "MoveTowrads 0 0 30"); + + r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), float.PositiveInfinity); + Assert.AreEqual(90, r.inDegrees, "MoveTowards 0 90 INFINITY"); + + r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(float.PositiveInfinity), 30); + Assert.AreEqual(30, r.inDegrees, "MoveTowrads 0 INFINITY 30"); + + r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(-90), float.NegativeInfinity); + Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 -90 -INFINITY"); + + r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(float.NegativeInfinity), -30); + Assert.AreEqual(0, r.inDegrees, "MoveTowrads 0 -INFINITY -30"); + + } + + [Test] + public void Difference() { + float r = 0; + + r = Angles.Difference(0, 90); + Assert.AreEqual(90, r, "Difference 0 90"); + + r = Angles.Difference(0, -90); + Assert.AreEqual(-90, r, "Difference 0 -90"); + + r = Angles.Difference(0, 270); + Assert.AreEqual(-90, r, "Difference 0 270"); + + r = Angles.Difference(0, -270); + Assert.AreEqual(90, r, "Difference 0 -270"); + + r = Angles.Difference(90, 0); + Assert.AreEqual(-90, r, "Difference 90 0"); + + r = Angles.Difference(-90, 0); + Assert.AreEqual(90, r, "Difference -90 0"); + + r = Angles.Difference(0, 0); + Assert.AreEqual(0, r, "Difference 0 0"); + + r = Angles.Difference(90, 90); + Assert.AreEqual(0, r, "Difference 90 90"); + + r = Angles.Difference(0, float.PositiveInfinity); + Assert.AreEqual(float.PositiveInfinity, r, "Difference 0 INFINITY"); + + r = Angles.Difference(0, float.NegativeInfinity); + Assert.AreEqual(float.NegativeInfinity, r, "Difference 0 -INFINITY"); + + r = Angles.Difference(float.NegativeInfinity, float.PositiveInfinity); + Assert.AreEqual(float.PositiveInfinity, r, "Difference -INFINITY INFINITY"); + } + } + +} +#endif diff --git a/LinearAlgebra/test/DirectionTest.cs b/LinearAlgebra/test/DirectionTest.cs new file mode 100644 index 0000000..0eb9882 --- /dev/null +++ b/LinearAlgebra/test/DirectionTest.cs @@ -0,0 +1,226 @@ +#if !UNITY_5_6_OR_NEWER +using System; +using NUnit.Framework; + +namespace LinearAlgebra.Test { + public class DirectionTest { + + [Test] + public void RadiansForward() { + Direction d = Direction.Radians(0, 0); + Assert.AreEqual(0, d.horizontal.inDegrees, 0.0001f); + Assert.AreEqual(0, d.vertical.inDegrees, 0.0001f); + } + + [Test] + public void RadiansUp() { + Direction d = Direction.Radians(0, (float)Math.PI / 2); + Assert.AreEqual(0, d.horizontal.inDegrees, 0.0001f); + Assert.AreEqual(90, d.vertical.inDegrees, 0.0001f); + } + + [Test] + public void RadiansDown() { + Direction d = Direction.Radians(0, -(float)Math.PI / 2); + Assert.AreEqual(0, d.horizontal.inDegrees, 0.0001f); + Assert.AreEqual(-90, d.vertical.inDegrees, 0.0001f); + } + + [Test] + public void RadiansArbitrary() { + Direction d = Direction.Radians((float)Math.PI / 4, (float)Math.PI / 6); + Assert.AreEqual(45, d.horizontal.inDegrees, 0.0001f); + Assert.AreEqual(30, d.vertical.inDegrees, 0.0001f); + } + + [Test] + public void DegreesNormalize1() { + Direction d = Direction.Degrees(112, 91); + Assert.AreEqual(-68, d.horizontal.inDegrees, 0.0001f); + Assert.AreEqual(89, d.vertical.inDegrees, 0.0001f); + } + + [Test] + public void RadiansEquivalentToDegreesConversion() { + Direction d1 = Direction.Radians((float)Math.PI / 3, (float)Math.PI / 4); + Direction d2 = Direction.Degrees(60, 45); + Assert.AreEqual(d1.horizontal.inDegrees, d2.horizontal.inDegrees, 0.0001f); + Assert.AreEqual(d1.vertical.inDegrees, d2.vertical.inDegrees, 0.0001f); + } + + [Test] + public void ToVector3Forward() { + Direction d = Direction.forward; + Vector3Float v = d.ToVector3(); + Assert.AreEqual(0, v.horizontal, 0.0001f); + Assert.AreEqual(0, v.vertical, 0.0001f); + Assert.AreEqual(1, v.depth, 0.0001f); + } + + [Test] + public void ToVector3Up() { + Direction d = Direction.up; + Vector3Float v = d.ToVector3(); + Assert.AreEqual(0, v.horizontal, 0.0001f); + Assert.AreEqual(1, v.vertical, 0.0001f); + Assert.AreEqual(0, v.depth, 0.0001f); + } + + [Test] + public void ToVector3Down() { + Direction d = Direction.down; + Vector3Float v = d.ToVector3(); + Assert.AreEqual(0, v.horizontal, 0.0001f); + Assert.AreEqual(-1, v.vertical, 0.0001f); + Assert.AreEqual(0, v.depth, 0.0001f); + } + + [Test] + public void ToVector3Left() { + Direction d = Direction.left; + Vector3Float v = d.ToVector3(); + Assert.AreEqual(-1, v.horizontal, 0.0001f); + Assert.AreEqual(0, v.vertical, 0.0001f); + Assert.AreEqual(0, v.depth, 0.0001f); + } + + [Test] + public void FromVector3Forward() { + Vector3Float v = new(0, 0, 1); + Direction d = Direction.FromVector3(v); + Assert.AreEqual(0, d.horizontal.inDegrees, 0.0001f); + Assert.AreEqual(0, d.vertical.inDegrees, 0.0001f); + } + + [Test] + public void ToVector3AndBack() { + Direction d1 = Direction.Degrees(45, 30); + Vector3Float v = d1.ToVector3(); + Direction d2 = Direction.FromVector3(v); + Assert.AreEqual(d1.horizontal.inDegrees, d2.horizontal.inDegrees, 0.0001f); + Assert.AreEqual(d1.vertical.inDegrees, d2.vertical.inDegrees, 0.0001f); + } + + [Test] + public void ToVector3AndBack2() { + Direction d1 = Direction.Degrees(-135, 85); + Vector3Float v = d1.ToVector3(); + Direction d2 = Direction.FromVector3(v); + Assert.AreEqual(d1.horizontal.inDegrees, d2.horizontal.inDegrees, 0.0001f); + Assert.AreEqual(d1.vertical.inDegrees, d2.vertical.inDegrees, 0.0001f); + } + + [Test] + public void Compare() { + Direction d1 = Direction.Degrees(45, 135); + Direction d2 = new(AngleFloat.Degrees(45), AngleFloat.Degrees(135)); + bool r; + r = d1 == d2; + Assert.True(r); + Assert.AreEqual(d1, d2); + } + + [Test] + public void NotEqualWithDifferentHorizontal() { + Direction d1 = Direction.Degrees(45, 30); + Direction d2 = Direction.Degrees(90, 30); + Assert.True(d1 != d2); + } + + [Test] + public void NotEqualWithDifferentVertical() { + Direction d1 = Direction.Degrees(45, 30); + Direction d2 = Direction.Degrees(45, 60); + Assert.True(d1 != d2); + } + + [Test] + public void NotEqualWithDifferentBoth() { + Direction d1 = Direction.Degrees(45, 30); + Direction d2 = Direction.Degrees(90, 60); + Assert.True(d1 != d2); + } + + [Test] + public void NotEqualWithSameValues() { + Direction d1 = Direction.Degrees(45, 30); + Direction d2 = Direction.Degrees(45, 30); + Assert.False(d1 != d2); + } + + + [Test] + public void EqualsWithSameValues() { + Direction d1 = Direction.Degrees(45, 30); + Direction d2 = Direction.Degrees(45, 30); + Assert.True(d1.Equals(d2)); + } + + [Test] + public void EqualsWithDifferentHorizontal() { + Direction d1 = Direction.Degrees(45, 30); + Direction d2 = Direction.Degrees(90, 30); + Assert.False(d1.Equals(d2)); + } + + [Test] + public void EqualsWithDifferentVertical() { + Direction d1 = Direction.Degrees(45, 30); + Direction d2 = Direction.Degrees(45, 60); + Assert.False(d1.Equals(d2)); + } + + [Test] + public void EqualsWithDifferentBoth() { + Direction d1 = Direction.Degrees(45, 30); + Direction d2 = Direction.Degrees(90, 60); + Assert.False(d1.Equals(d2)); + } + + [Test] + public void EqualsWithNonDirectionObject() { + Direction d = Direction.Degrees(45, 30); + Assert.False(d.Equals("not a direction")); + } + + [Test] + public void EqualsWithNull() { + Direction d = Direction.Degrees(45, 30); + Assert.False(d.Equals(null)); + } + + [Test] + public void EqualsWithZeros() { + Direction d1 = Direction.forward; + Direction d2 = Direction.Degrees(0, 0); + Assert.True(d1.Equals(d2)); + } + + [Test] + public void HashCode() { + Direction d1 = Direction.Degrees(45, 30); + Direction d2 = Direction.Degrees(45, 30); + Assert.AreEqual(d1.GetHashCode(), d2.GetHashCode()); + + d1 = Direction.Degrees(45, 30); + d2 = Direction.Degrees(90, 30); + Assert.AreNotEqual(d1.GetHashCode(), d2.GetHashCode()); + + d1 = Direction.Degrees(45, 30); + d2 = Direction.Degrees(45, 60); + Assert.AreNotEqual(d1.GetHashCode(), d2.GetHashCode()); + + Direction d = Direction.Degrees(45, 30); + int hash1 = d.GetHashCode(); + int hash2 = d.GetHashCode(); + Assert.AreEqual(hash1, hash2); + + d1 = Direction.forward; + d2 = Direction.Degrees(0, 0); + Assert.AreEqual(d1.GetHashCode(), d2.GetHashCode()); + } + + }; +} +#endif + diff --git a/LinearAlgebra/test/LinearAlgebra_Test.csproj b/LinearAlgebra/test/LinearAlgebra_Test.csproj new file mode 100644 index 0000000..5b48e60 --- /dev/null +++ b/LinearAlgebra/test/LinearAlgebra_Test.csproj @@ -0,0 +1,19 @@ + + + + net8.0 + false + true + + + + + + + + + + + + + diff --git a/LinearAlgebra/test/QuaternionTest.cs b/LinearAlgebra/test/QuaternionTest.cs new file mode 100644 index 0000000..9dd5a96 --- /dev/null +++ b/LinearAlgebra/test/QuaternionTest.cs @@ -0,0 +1,185 @@ +#if !UNITY_5_6_OR_NEWER +using NUnit.Framework; + +namespace LinearAlgebra.Test { + + public class QuaternionTest { + + [SetUp] + public void Setup() { + } + + [Test] + public void Normalize() { + Quaternion q1 = new(0, 0, 0, 1); + Quaternion r = Quaternion.identity; + + r = q1.normalized; + Assert.AreEqual(r, q1, "q.normalized 0 0 0 1"); + + r = Quaternion.Normalize(q1); + Assert.AreEqual(r, q1, "q.normalized 0 0 0 1"); + } + + [Test] + public void ToAngles() { + Quaternion q1 = new(0, 0, 0, 1); + Vector3Float v = Vector3Float.zero; + + v = Quaternion.ToAngles(q1); + Assert.AreEqual(v, new Vector3Float(0, 0, 0), "ToAngles 0 0 0 1"); + + q1 = new(1, 0, 0, 0); + v = Quaternion.ToAngles(q1); + Assert.AreEqual(0, v.horizontal, "1 0 0 0 H"); + Assert.AreEqual(180, v.vertical, "1 0 0 0 V"); + Assert.AreEqual(180, v.depth, "1 0 0 0 D"); + + } + + [Test] + public void Multiplication() { + Quaternion q1 = new(0, 0, 0, 1); + Quaternion q2 = new(1, 0, 0, 0); + Quaternion r; + + r = q1 * q2; + Assert.AreEqual(r, new Quaternion(1, 0, 0, 0), "0 0 0 1 * 1 0 0 0 "); + } + + [Test] + public void MultiplicationVector() { + Quaternion q1 = new(0, 0, 0, 1); + Vector3Float v1 = new(0, 1, 0); + Vector3Float r; + + r = q1 * v1; + Assert.AreEqual(r, new Vector3Float(0, 1, 0), "0 0 0 1 * Vector 0 1 0"); + + q1 = new(1, 0, 0, 0); + r = q1 * v1; + Assert.AreEqual(r, new Vector3Float(0, -1, 0), "1 0 0 0 * Vector 0 1 0"); + } + + [Test] + public void Equality() { + Quaternion q1 = new(0, 0, 0, 1); + Quaternion q2 = new(1, 0, 0, 0); + Assert.AreNotEqual(q1, q2, "0 0 0 1 == 1 0 0 0"); + + q2 = new(0, 0, 0, 1); + Assert.AreEqual(q1, q2, "0 0 0 1 == 1 0 0 0"); + } + + [Test, Ignore("ToDo")] + public void Inverse() { } + + [Test, Ignore("ToDo")] + public void LookRotation() { } + + [Test, Ignore("ToDo")] + public void FromToRotation() { } + + [Test, Ignore("ToDo")] + public void RotateTowards() { } + + [Test, Ignore("ToDo")] + public void AngleAxis() { } + + [Test, Ignore("ToDo")] + public void Angle() { } + + [Test, Ignore("ToDo")] + public void Slerp() { } + + [Test, Ignore("ToDo")] + public void SlerpUnclamped() { } + + [Test] + public void Euler() { + Vector3Float v1 = new(0, 0, 0); + Quaternion q; + + q = Quaternion.Euler(v1); + Assert.AreEqual(q, Quaternion.identity, "Euler Vector 0 0 0"); + + q = Quaternion.Euler(0, 0, 0); + Assert.AreEqual(q, Quaternion.identity, "Euler 0 0 0"); + + v1 = new(90, 90, -90); + q = Quaternion.Euler(v1); + Assert.AreEqual(q, new Quaternion(0, 0.707106709F, -0.707106709F, 0), "Euler Vector 90 90 -90"); + + q = Quaternion.Euler(90, 90, -90); + Assert.AreEqual(q, new Quaternion(0, 0.707106709F, -0.707106709F, 0), "Euler 90 90 -90"); + } + + [Test] + public void EulerToAngles() { + Vector3Float v; + Quaternion q; + Quaternion r; + + //v = new(0, 0, 0); + q = Quaternion.Euler(0, 0 , 0); + v = Quaternion.ToAngles(q); + r = Quaternion.Euler(v); + Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f, "0 0 0"); + + q = Quaternion.Euler(-45, -30, -15); + v = Quaternion.ToAngles(q); + r = Quaternion.Euler(v); + Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f, "-45, -30, -15"); + + // Gimball lock + // q = Quaternion.Euler(90, 90, -90); + // v = Quaternion.ToAngles(q); + // r = Quaternion.Euler(v); + // Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f, "0 0 0"); + + } + + [Test] + public void GetAngleAround() { + Vector3Float v1 = new(0, 1, 0); + Quaternion q1 = new(0, 0, 0, 1); + + float f = Quaternion.GetAngleAround(v1, q1); + Assert.AreEqual(f, 0, "GetAngleAround 0 1 0 , 0 0 0 1"); + + q1 = new(0, 0.707106709F, -0.707106709F, 0); + f = Quaternion.GetAngleAround(v1, q1); + Assert.AreEqual(f, 180, "GetAngleAround 0 1 0 , 0 0.7 -0.7 0"); + + v1 = new(0, 0, 0); + f = Quaternion.GetAngleAround(v1, q1); + Assert.IsTrue(float.IsNaN(f), "GetAngleAround 0 0 0 , 0 0.7 -0.7 0"); + } + + [Test] + public void GetRotationAround() { + Vector3Float v1 = new(0, 1, 0); + Quaternion q1 = new(0, 0, 0, 1); + + Quaternion q = Quaternion.GetRotationAround(v1, q1); + Assert.AreEqual(q, new Quaternion(0, 0, 0, 1), "GetRotationAround 0 1 0 , 0 0 0 1"); + + q1 = new(0, 0.707106709F, -0.707106709F, 0); + q = Quaternion.GetRotationAround(v1, q1); + Assert.AreEqual(q, new Quaternion(0, 1, 0, 0), "GetRotationAround 0 1 0 , 0 0.7 -0.7 0"); + + v1 = new(0, 0, 0); + q = Quaternion.GetRotationAround(v1, q1); + bool r = float.IsNaN(q.x) && float.IsNaN(q.y) && float.IsNaN(q.z) && float.IsNaN(q.w); + Assert.IsTrue(r, "GetRotationAround 0 0 0 , 0 0.7 -0.7 0"); + } + + [Test, Ignore("ToDo")] + public void GetSwingTwist() { } + + [Test, Ignore("ToDo")] + public void Dot() { } + + } +} +#endif \ No newline at end of file diff --git a/LinearAlgebra/test/SphericalTest.cs b/LinearAlgebra/test/SphericalTest.cs new file mode 100644 index 0000000..b28b9d9 --- /dev/null +++ b/LinearAlgebra/test/SphericalTest.cs @@ -0,0 +1,271 @@ +//#if !UNITY_5_6_OR_NEWER +using System; +using System.Collections.Generic; +using NUnit.Framework; + +namespace LinearAlgebra.Test { + public class SphericalTest { + [SetUp] + public void Setup() { + } + + [Test] + public void FromVector3() { +#if UNITY_5_6_OR_NEWER + UnityEngine.Vector3 v = new(0, 0, 1); +#else + Vector3Float v = new(0, 0, 1); +#endif + Spherical s = Spherical.FromVector3(v); + Assert.AreEqual(1.0f, s.distance, "s.distance 0 0 1"); + Assert.AreEqual(0.0f, s.direction.horizontal.inDegrees, "s.hor 0 0 1"); + Assert.AreEqual(0.0f, s.direction.vertical.inDegrees, 1.0E-05F, "s.vert 0 0 1"); + + v = new(0, 1, 0); + s = Spherical.FromVector3(v); + Assert.AreEqual(1.0f, s.distance, "s.distance 0 1 0"); + Assert.AreEqual(0.0f, s.direction.horizontal.inDegrees, "s.hor 0 1 0"); + Assert.AreEqual(90.0f, s.direction.vertical.inDegrees, "s.vert 0 1 0"); + + v = new(1, 0, 0); + s = Spherical.FromVector3(v); + Assert.AreEqual(1.0f, s.distance, "s.distance 1 0 0"); + Assert.AreEqual(90.0f, s.direction.horizontal.inDegrees, "s.hor 1 0 0"); + Assert.AreEqual(0.0f, s.direction.vertical.inDegrees, 1.0E-05F, "s.vert 1 0 0"); + } + + [Test] + public void Addition() { + Spherical v1 = Spherical.Degrees(1, 45, 0); + Spherical v2 = Spherical.zero; + Spherical r = Spherical.zero; + + r = v1 + v2; + Assert.AreEqual(v1.distance, r.distance, 1.0E-05F, "Addition(0,0,0)"); + + r = v1; + r += v2; + Assert.AreEqual(v1.distance, r.distance, 1.0E-05F, "Addition(0,0,0)"); + + v2 = Spherical.Degrees(1, 0, 90); + r = v1 + v2; + Assert.AreEqual(Math.Sqrt(2), r.distance, 1.0E-05F, "Addition(1 0 90)"); + Assert.AreEqual(45.0f, r.direction.horizontal.inDegrees, 1e-5f, "Addition(1 0 90)"); + Assert.AreEqual(45.0f, r.direction.vertical.inDegrees, 1.0E-05F, "Addition(1 0 90)"); + } + + [Test] + public void Average2_IdenticalVectors() { + Direction dir = Direction.Radians(MathF.PI / 4f, MathF.PI / 6f); + Spherical v = new(2.5f, dir); + + Spherical avg = Spherical.Average(v, v); + + Assert.AreEqual(2.5f, avg.distance, 1e-5f); + Assert.AreEqual(dir.horizontal, avg.direction.horizontal); + Assert.AreEqual(dir.vertical, avg.direction.vertical); + } + + [Test] + public void Average2_OppositeUnitVectors() { + // Two opposite vectors: same distance, horizontal opposite (pi apart), same vertical + Spherical v1 = Spherical.Radians(1f, 0f, 0f); + Spherical v2 = Spherical.Radians(1f, MathF.PI, 0f); + Spherical avg = Spherical.Average(v1, v2); + + Assert.AreEqual(0f, avg.distance, 1e-4f); + // When distance is zero, angles may be undefined; allow any angle but ensure near-zero magnitude + } + + [Test] + public void Average2_WeightedByDistance() { + // Two vectors same direction but different distances -> weighted average distance + Direction dir = Direction.Radians(MathF.PI / 3f, MathF.PI / 4f); + Spherical a = new(1f, dir); + Spherical b = new(3f, dir); + Spherical avg = Spherical.Average(a, b); + + // average distance should be (1+3)/2 = 2 + Assert.AreEqual(2f, avg.distance, 1e-5f); + Assert.AreEqual(dir.horizontal.inRadians, avg.direction.horizontal.inRadians, 1e-5f); + Assert.AreEqual(dir.vertical.inRadians, avg.direction.vertical.inRadians, 1e-5f); + } + + [Test] + public void Average2_OppositeButNotExact_NotZero() { + // Nearly opposite but not exact; expect a valid averaged direction and averaged distance + Direction d1 = Direction.Radians(0f, 0f); + Direction d2 = Direction.Radians(MathF.PI - 1e-3f, 0.0f); // slight offset + Spherical v1 = new(2.0f, d1); + Spherical v2 = new(4.0f, d2); + + Spherical avg = Spherical.Average(v1, v2); + + // Distance is arithmetic mean + Assert.AreEqual(3.0f, avg.distance, 1e-5f); + + // Averaged azimuth should be near +pi/2 or -pi/2? we can check it's not NaN and unit-vector properties hold + float ux = MathF.Cos(avg.direction.horizontal.inRadians) * MathF.Cos(avg.direction.vertical.inRadians); + float uy = MathF.Sin(avg.direction.horizontal.inRadians) * MathF.Cos(avg.direction.vertical.inRadians); + float uz = MathF.Sin(avg.direction.vertical.inRadians); + float mag = MathF.Sqrt(ux * ux + uy * uy + uz * uz); + Assert.IsTrue(mag > 0.999f && mag < 1.001f); + + } + + [Test] + public void Average2_BasicAverageDirectionAndDistance() { + // Two different directions not cancelling: expect vector-average result + Direction d1 = Direction.Radians(MathF.PI / 6f, MathF.PI / 12f); // 30°, 15° + Direction d2 = Direction.Radians(MathF.PI / 3f, MathF.PI / 18f); // 60°, 10° + Spherical v1 = new(2.0f, d1); + Spherical v2 = new(4.0f, d2); + + Spherical avg = Spherical.Average(v1, v2); + + // Distance is arithmetic mean + Assert.AreEqual(3.0f, avg.distance, 1e-5f); + + // Check averaged unit-vector equals normalized sum of unit vectors computed here + float a1 = d1.horizontal.inRadians; + float a2 = d2.horizontal.inRadians; + float e1 = d1.vertical.inRadians; + float e2 = d2.vertical.inRadians; + + float cx = MathF.Cos(a1) + MathF.Cos(a2); + float cy = MathF.Sin(a1) + MathF.Sin(a2); + float z1 = MathF.Sin(e1); + float z2 = MathF.Sin(e2); + float cz = z1 + z2; + float mag = MathF.Sqrt(cx * cx + cy * cy + cz * cz); + Assert.IsTrue(mag > 1e-6f); + + float ux = cx / mag; + float uy = cy / mag; + float uz = cz / mag; + + // Reconstruct direction from avg result + float uxAvg = MathF.Cos(avg.direction.horizontal.inRadians) * MathF.Cos(avg.direction.vertical.inRadians); + float uyAvg = MathF.Sin(avg.direction.horizontal.inRadians) * MathF.Cos(avg.direction.vertical.inRadians); + float uzAvg = MathF.Sin(avg.direction.vertical.inRadians); + + Assert.AreEqual(ux, uxAvg, 1e-4f); + Assert.AreEqual(uy, uyAvg, 1e-4f); + Assert.AreEqual(uz, uzAvg, 1e-4f); + } + + [Test] + public void Average_IdenticalVectors() { + var dir = Direction.Radians(MathF.PI / 4f, MathF.PI / 6f); + var v = new Spherical(2.5f, dir); + var list = new List { v, v, v }; + + var avg = Spherical.Average(list); + + Assert.AreEqual(2.5f, avg.distance, 1e-5f); + Assert.AreEqual(dir.horizontal, avg.direction.horizontal); + Assert.AreEqual(dir.vertical, avg.direction.vertical); + } + + [Test] + public void Average_SingleElement() { + Spherical s = Spherical.Radians(1.234f, 0.3f, -0.7f); + Spherical avg = Spherical.Average(new List { s }); + + Assert.AreEqual(s.distance, avg.distance, 1e-5f); + Assert.AreEqual(s.direction.horizontal.inRadians, avg.direction.horizontal.inRadians, 1e-5f); + Assert.AreEqual(s.direction.vertical.inRadians, avg.direction.vertical.inRadians, 1e-5f); + } + + [Test] + public void Average_OppositeUnitVectors() { + // Two opposite vectors: same distance, horizontal opposite (pi apart), same vertical + Spherical v1 = Spherical.Radians(1f, 0f, 0f); + Spherical v2 = Spherical.Radians(1f, MathF.PI, 0f); + Spherical avg = Spherical.Average(new List { v1, v2 }); + + Assert.AreEqual(0f, avg.distance, 1e-4f); + // When distance is zero, angles may be undefined; allow any angle but ensure near-zero magnitude + } + + [Test] + public void Average_WeightedByDistance() { + // Two vectors same direction but different distances -> weighted average distance + Direction dir = Direction.Radians(MathF.PI / 3f, MathF.PI / 4f); + Spherical a = new(1f, dir); + Spherical b = new(3f, dir); + Spherical avg = Spherical.Average(new List { a, b }); + + // average distance should be (1+3)/2 = 2 + Assert.AreEqual(2f, avg.distance, 1e-5f); + Assert.AreEqual(dir.horizontal.inRadians, avg.direction.horizontal.inRadians, 1e-5f); + Assert.AreEqual(dir.vertical.inRadians, avg.direction.vertical.inRadians, 1e-5f); + } + + [Test] + public void Average_AxisSymmetricAroundVertical() { + // Four vectors around azimuth 0, pi/2, pi, 3pi/2 at same elevation (vertical) angle phi + float phi = MathF.PI / 6f; // elevation from horizontal plane + var dirs = new List { + new(1f, Direction.Radians(0f, phi)), + new(1f, Direction.Radians(MathF.PI/2, phi)), + new(1f, Direction.Radians(MathF.PI, phi)), + new(1f, Direction.Radians(3*MathF.PI/2, phi)) + }; + + Spherical avg = Spherical.Average(dirs); + + // rAvg should equal r * sin(elevation) = sin(phi) + Assert.AreEqual(MathF.Sin(phi), avg.distance, 1e-4f); + // vertical angle undefined when horizontal xy components cancel; allow any angle but ensure r matches + } + + [Test] + public void Average_AxisSymmetricAroundVertical2() { + // Four vectors around azimuth 0, pi/2, pi, 3pi/2 at same polar angle from vertical (alpha) + float alpha = MathF.PI / 6f; // polar angle from vertical + float elevation = MathF.PI / 2f - alpha; // convert polar-from-vertical to elevation + var dirs = new List { + new(1f, Direction.Radians(0f, elevation)), + new(1f, Direction.Radians(MathF.PI/2, elevation)), + new(1f, Direction.Radians(MathF.PI, elevation)), + new(1f, Direction.Radians(3*MathF.PI/2, elevation)) + }; + + Spherical avg = Spherical.Average(dirs); + + // rAvg should equal r * sin(elevation) which equals cos(alpha) + Assert.AreEqual(MathF.Cos(alpha), avg.distance, 1e-4f); + } + + [Test] + public void Average_CompareWithVector3() { + // Four vectors around azimuth 0, pi/2, pi, 3pi/2 at same polar angle from vertical (alpha) + float alpha = MathF.PI / 6f; // polar angle from vertical + float elevation = MathF.PI / 2f - alpha; // convert polar-from-vertical to elevation + List dirs = new List { + new(1f, Direction.Radians(0f, elevation)), + new(2f, Direction.Radians(MathF.PI/2, elevation+1)), + new(3f, Direction.Radians(MathF.PI, elevation+2)), + new(4f, Direction.Radians(3*MathF.PI/2, elevation+3)) + }; + + Spherical avg = Spherical.Average(dirs); + +#if UNITY_5_3_OR_NEWER + UnityEngine.Vector3 r = UnityEngine.Vector3.zero; +#else + Vector3Float r = Vector3Float.zero; +#endif + foreach (Spherical dir in dirs) { + r += dir.ToVector3(); + } + r = r / 4; + Spherical avg2 = Spherical.FromVector3(r); + + Assert.AreEqual(avg, avg2); + } + + } +} +//#endif \ No newline at end of file diff --git a/LinearAlgebra/test/SwingTwistTest.cs b/LinearAlgebra/test/SwingTwistTest.cs new file mode 100644 index 0000000..5f05a96 --- /dev/null +++ b/LinearAlgebra/test/SwingTwistTest.cs @@ -0,0 +1,131 @@ +#if !UNITY_5_6_OR_NEWER +using NUnit.Framework; + +namespace LinearAlgebra.Test { + + [TestFixture] + public class SwingTwistTest { + + [Test] + public void Degrees_CreatesSwingTwistWithDegreeAngles() { + SwingTwist st = SwingTwist.Degrees(45, 30, 15); + Assert.IsNotNull(st); + Assert.AreEqual(45, st.swing.horizontal.inDegrees, 0.01f); + Assert.AreEqual(30, st.swing.vertical.inDegrees, 0.01f); + Assert.AreEqual(15, st.twist.inDegrees, 0.01f); + } + + [Test] + public void Radians_CreatesSwingTwistWithRadianAngles() { + float pi = (float)System.Math.PI; + SwingTwist st = SwingTwist.Radians(pi / 4, pi / 6, pi / 12); + Assert.IsNotNull(st); + Assert.AreEqual(45, st.swing.horizontal.inDegrees, 0.01f); + Assert.AreEqual(30, st.swing.vertical.inDegrees, 0.01f); + Assert.AreEqual(15, st.twist.inDegrees, 0.01f); + } + + [Test] + public void Zero_CreatesZeroRotation() { + SwingTwist st = SwingTwist.zero; + Assert.AreEqual(0, st.swing.horizontal.inDegrees, 0.01f); + Assert.AreEqual(0, st.swing.vertical.inDegrees, 0.01f); + Assert.AreEqual(0, st.twist.inDegrees, 0.01f); + } + + [Test] + public void QuaternionTest() { + Quaternion q; + SwingTwist s; + Quaternion r; + + q = Quaternion.identity; + s = SwingTwist.FromQuaternion(q); + r = s.ToQuaternion(); + Assert.AreEqual(q, r); + + q = Quaternion.Euler(90, 0, 0); + s = SwingTwist.FromQuaternion(q); + Assert.AreEqual(0, s.swing.horizontal.inDegrees, 10e-2f); + Assert.AreEqual(90, s.swing.vertical.inDegrees, 10e-2f); + Assert.AreEqual(0, s.twist.inDegrees, 0.01f); + r = s.ToQuaternion(); + Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f); + + q = Quaternion.Euler(0, 90, 0); + s = SwingTwist.FromQuaternion(q); + Assert.AreEqual(90, s.swing.horizontal.inDegrees,10e-2f); + Assert.AreEqual(0, s.swing.vertical.inDegrees, 0.01f); + Assert.AreEqual(0, s.twist.inDegrees, 0.01f); + r = s.ToQuaternion(); + Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f); + + q = Quaternion.Euler(0, 0, 90); + s = SwingTwist.FromQuaternion(q); + Assert.AreEqual(0, s.swing.horizontal.inDegrees, 0.01f); + Assert.AreEqual(0, s.swing.vertical.inDegrees, 0.01f); + Assert.AreEqual(90, s.twist.inDegrees, 0.01f); + r = s.ToQuaternion(); + Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f); + + q = Quaternion.Euler(0, 180, 0); + s = SwingTwist.FromQuaternion(q); + Assert.AreEqual(-180, s.swing.horizontal.inDegrees, 0.01f); + Assert.AreEqual(0, s.swing.vertical.inDegrees, 0.01f); + Assert.AreEqual(0, s.twist.inDegrees, 0.01f); + r = s.ToQuaternion(); + Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f); + + q = Quaternion.Euler(0, 135, 0); + s = SwingTwist.FromQuaternion(q); + Assert.AreEqual(135, s.swing.horizontal.inDegrees, 0.01f); + Assert.AreEqual(0, s.swing.vertical.inDegrees, 0.01f); + Assert.AreEqual(0, s.twist.inDegrees, 0.01f); + r = s.ToQuaternion(); + Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f); + + q = Quaternion.Euler(60, 45, 30); + s = SwingTwist.FromQuaternion(q); + Assert.AreEqual(45, s.swing.horizontal.inDegrees, 0.01f); + Assert.AreEqual(60, s.swing.vertical.inDegrees, 0.01f); + Assert.AreEqual(30, s.twist.inDegrees, 0.01f); + // r = s.ToQuaternion(); + // Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f); + + // q = Quaternion.Euler(-45, -30, -15); + // s = SwingTwist.FromQuaternion(q); + // Assert.AreEqual(-30, s.swing.horizontal.inDegrees, 0.01f); + // Assert.AreEqual(-45, s.swing.vertical.inDegrees, 0.01f); + // Assert.AreEqual(-15, s.twist.inDegrees, 0.01f); + // r = s.ToQuaternion(); + // Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f); + + // q = Quaternion.Euler(180, 180, 180); + // s = SwingTwist.FromQuaternion(q); + // Assert.AreEqual(-180, s.swing.horizontal.inDegrees, 0.01f); + // Assert.AreEqual(-180, s.swing.vertical.inDegrees, 0.01f); + // Assert.AreEqual(-180, s.twist.inDegrees, 0.01f); + // r = s.ToQuaternion(); + // Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f); + + } + + [Test] + public void ToAngleAxis_ConvertsToSpherical() { + SwingTwist st = SwingTwist.Degrees(45, 30, 15); + Spherical s = st.ToAngleAxis(); + Assert.IsNotNull(s); + } + + [Test] + public void FromAngleAxis_ConvertsFromSpherical() { + Spherical s = new(90, Direction.Degrees(45, 0)); + SwingTwist st = SwingTwist.FromAngleAxis(s); + Assert.IsNotNull(st); + } + + } + +} + +#endif \ No newline at end of file diff --git a/LinearAlgebra/test/Vector2FloatTest.cs b/LinearAlgebra/test/Vector2FloatTest.cs new file mode 100644 index 0000000..867765a --- /dev/null +++ b/LinearAlgebra/test/Vector2FloatTest.cs @@ -0,0 +1,364 @@ +#if !UNITY_5_6_OR_NEWER +using NUnit.Framework; + +namespace LinearAlgebra.Test { + using Vector2 = Vector2Float; + + public class Vector2FloatTest { + + [SetUp] + public void Setup() { + } + + [Test] + public void FromPolar() { + } + + [Test] + public void Equality() { + Vector2 v1 = new(4, 5); + Vector2 v2 = new(1, 2); + + Assert.IsFalse(v1 == v2, "4 5 == 1 2"); + Assert.IsTrue(v1 != v2, "4 5 != 1 2"); + + v2 = new(4, 5); + Assert.IsTrue(v1 == v2, "4 5 == 4 5"); + Assert.IsFalse(v1 != v2, "4 5 != 4 5"); + } + + [Test] + public void Magnitude() { + Vector2 v = new(1, 2); + float m = 0; + m = v.magnitude; + Assert.AreEqual(m, 2.236068F, "v.magnitude 1 2"); + + m = Vector2.MagnitudeOf(v); + Assert.AreEqual(m, 2.236068F, "MagnitudeOf 1 2"); + + v = new(-1, -2); + m = v.magnitude; + Assert.AreEqual(m, 2.236068F, "v.magnitude -1 -2"); + + v = new(0, 0); + m = v.magnitude; + Assert.AreEqual(m, 0, "v.magnitude 0 0"); + } + + [Test] + public void SqrMagnitude() { + Vector2 v = new(1, 2); + float m = 0; + + m = v.sqrMagnitude; + Assert.AreEqual(m, 5, "v.sqrMagnitude 1 2"); + + m = Vector2.SqrMagnitudeOf(v); + Assert.AreEqual(m, 5, "SqrMagnitudeOf 1 2"); + + v = new(-1, -2); + m = v.sqrMagnitude; + Assert.AreEqual(m, 5, "v.sqrMagnitude -1 -2"); + + v = new(0, 0); + m = v.sqrMagnitude; + Assert.AreEqual(m, 0, "v.sqrMagnitude 0 0"); + } + + [Test] + public void Distance() { + Vector2 v1 = new(4, 5); + Vector2 v2 = new(1, 2); + float f = 0; + + f = Vector2.Distance(v1, v2); + Assert.AreEqual(f, 4.24264002f, 1.0E-05F, "Distance(4 5, 1 2)"); + + v2 = new(-1, -2); + f = Vector2.Distance(v1, v2); + Assert.AreEqual(f, 8.602325F, "Distance(4 5, 1 2)"); + + v2 = new(0, 0); + f = Vector2.Distance(v1, v2); + Assert.AreEqual(f, 6.403124F, 1.0E-05F, "Distance(4 5, 1 2)"); + } + + [Test] + public void Normalize() { + Vector2 v = new(0, 3); + Vector2Float r; + + r = v.normalized; + Assert.AreEqual(0, r.horizontal, "normalized 0 3 H"); + Assert.AreEqual(1, r.vertical, "normalized 0 3 V"); + + r = Vector2.Normalize(v); + Assert.AreEqual(0, r.horizontal, "Normalize 0 3 H"); + Assert.AreEqual(1, r.vertical, "Normalize 0 3 V"); + + v = new(0, -3); + r = v.normalized; + Assert.AreEqual(0, r.horizontal, "normalized 0 -3 H"); + Assert.AreEqual(-1, r.vertical, "normalized 0 -3 V"); + + v = new(0, 0); + r = v.normalized; + Assert.AreEqual(0, r.horizontal, "normalized 0 0 H"); + Assert.AreEqual(0, r.vertical, "normalized 0 0 V"); + } + + [Test] + public void Negate() { + Vector2 v = new(4, 5); + Vector2 r; + + r = -v; + Assert.AreEqual(-4, r.horizontal, "- 4 5 H"); + Assert.AreEqual(-5, r.vertical, "- 4 5 V"); + + v = new(-4, -5); + r = -v; + Assert.AreEqual(4, r.horizontal, "- -4 -5 H"); + Assert.AreEqual(5, r.vertical, "- -4 -5 V"); + + v = new(0, 0); + r = -v; + Assert.AreEqual(0, r.horizontal, "- 0 0 H"); + Assert.AreEqual(0, r.vertical, "- 0 0 V"); + } + + [Test] + public void Subtract() { + Vector2 v1 = new(4, 5); + Vector2 v2 = new(1, 2); + Vector2 r = Vector2.zero; + + r = v1 - v2; + Assert.IsTrue(r == new Vector2(3, 3), "4 5 - 1 2"); + + v2 = new(-1, -2); + r = v1 - v2; + Assert.IsTrue(r == new Vector2(5, 7), "4 5 - -1 -2"); + + v2 = new(4, 5); + r = v1 - v2; + Assert.IsTrue(r == new Vector2(0, 0), "4 5 - 4 5"); + r = v1; + r -= v2; + Assert.AreEqual(r, new Vector2(0, 0), "4 5 - 4 5"); + + v2 = new(0, 0); + r = v1 - v2; + Assert.AreEqual(r, new Vector2(4, 5), "4 5 - 0 0"); + r -= v2; + Assert.AreEqual(r, new Vector2(4, 5), "4 5 - 0 0"); + } + + [Test] + public void Addition() { + Vector2 v1 = new(4, 5); + Vector2 v2 = new(1, 2); + Vector2 r = Vector2.zero; + + r = v1 + v2; + Assert.IsTrue(r == new Vector2(5, 7), "4 5 + 1 2"); + + v2 = new(-1, -2); + r = v1 + v2; + Assert.IsTrue(r == new Vector2(3, 3), "4 5 + -1 -2"); + r = v1; + r += v2; + Assert.AreEqual(r, new Vector2(3, 3), "4 5 + -1 -2"); + + v2 = new(0, 0); + r = v1 + v2; + Assert.AreEqual(r, new Vector2(4, 5), "4 5 + 0 0"); + r += v2; + Assert.AreEqual(r, new Vector2(4, 5), "4 5 + 0 0"); + } + + [Test] + public void Scale() { + Vector2 v1 = new(4, 5); + Vector2 v2 = new(1, 2); + Vector2 r; + + r = Vector2.Scale(v1, v2); + Assert.AreEqual(4, r.horizontal, "Scale 4 5 , 1 2 H"); + Assert.AreEqual(10, r.vertical, "Scale 4 5 , 1 2 V"); + + v2 = new(-1, -2); + r = Vector2.Scale(v1, v2); + Assert.AreEqual(-4, r.horizontal, "Scale 4 5 , -1 -2 H"); + Assert.AreEqual(-10, r.vertical, "Scale 4 5 , -1 -2 V"); + + v2 = new(0, 0); + r = Vector2.Scale(v1, v2); + Assert.AreEqual(0, r.horizontal, "Scale 4 5 , 0 0 H"); + Assert.AreEqual(0, r.vertical, "Scale 4 5 , 0 0 V"); + } + + [Test] + public void Multiply() { + Vector2 v1 = new(4, 5); + int f = 3; + Vector2 r; + + r = v1 * f; + Assert.AreEqual(12, r.horizontal, "4 5 * 3 H"); + Assert.AreEqual(15, r.vertical, "4 5 * 3 V"); + + r = f * v1; + Assert.AreEqual(12, r.horizontal, "3 * 4 5 H"); + Assert.AreEqual(15, r.vertical, "3 * 4 5 V"); + + f = -3; + r = v1 * f; + Assert.AreEqual(-12, r.horizontal, "4 5 * -3 H"); + Assert.AreEqual(-15, r.vertical, "4 5 * -3 V"); + + f = 0; + r = v1 * f; + Assert.AreEqual(0, r.horizontal, "4 5 * 0 H"); + Assert.AreEqual(0, r.vertical, "4 5 * 0 V"); + } + + [Test] + public void Divide() { + Vector2 v1 = new(4, 5); + float f = 2; + Vector2 r; + + r = v1 / f; + Assert.AreEqual(2, r.horizontal, "4 5 / 2 H"); + Assert.AreEqual(2.5, r.vertical, "4 5 / 2 V"); + + f = -2; + r = v1 / f; + Assert.AreEqual(-2, r.horizontal, "4 5 / -2 H"); + Assert.AreEqual(-2.5, r.vertical, "4 5 / -2 V"); + + f = 0; + r = v1 / f; + Assert.AreEqual(float.PositiveInfinity, r.horizontal, "4 5 / 0 H"); + Assert.AreEqual(float.PositiveInfinity, r.vertical, "4 5 / 0 V"); + } + + [Test] + public void Dot() { + Vector2 v1 = new(4, 5); + Vector2 v2 = new(1, 2); + float f; + + f = Vector2.Dot(v1, v2); + Assert.AreEqual(14, f, "Dot(4 5, 1 2)"); + + v2 = new(-1, -2); + f = Vector2.Dot(v1, v2); + Assert.AreEqual(-14, f, "Dot(4 5, -1 -2)"); + + v2 = new(0, 0); + f = Vector2.Dot(v1, v2); + Assert.AreEqual(0, f, "Dot(4 5, 0 0)"); + } + + [Test] + public void SignedAngle() { + Vector2 v1 = new(4, 5); + Vector2 v2 = new(1, 2); + float f; + + f = Vector2.SignedAngle(v1, v2); + Assert.AreEqual(-12.094758f, f); + + v2 = new(-1, -2); + f = Vector2.SignedAngle(v1, v2); + Assert.AreEqual(167.905228f, f); + + v2 = new(0, 0); + f = Vector2.SignedAngle(v1, v2); + Assert.AreEqual(0, f); + + v1 = new(0, 1); + v2 = new(1, 0); + f = Vector2.SignedAngle(v1, v2); + Assert.AreEqual(90, f); + + v1 = new(0, 1); + v2 = new(0, -1); + f = Vector2.SignedAngle(v1, v2); + Assert.AreEqual(180, f); + } + + [Test] + public void UnsignedAngle() { + Vector2 v1 = new(4, 5); + Vector2 v2 = new(1, 2); + float f; + + f = Vector2.UnsignedAngle(v1, v2); + Assert.AreEqual(12.094758f, f); + + v2 = new(-1, -2); + f = Vector2.UnsignedAngle(v1, v2); + Assert.AreEqual(167.905228f, f); + + v2 = new(0, 0); + f = Vector2.UnsignedAngle(v1, v2); + Assert.AreEqual(0, f); + + v1 = new(0, 1); + v2 = new(1, 0); + f = Vector2.UnsignedAngle(v1, v2); + Assert.AreEqual(90, f); + + v1 = new(0, 1); + v2 = new(0, -1); + f = Vector2.UnsignedAngle(v1, v2); + Assert.AreEqual(180, f); + } + + [Test] + public void Rotate() { + Vector2 v1 = new(1, 2); + Vector2 r; + + r = Vector2.Rotate(v1, AngleFloat.Degrees(0)); + Assert.AreEqual(0, Vector2.Distance(r, v1)); + + r = Vector2.Rotate(v1, AngleFloat.Degrees(180)); + Assert.AreEqual(0, Vector2.Distance(r, new Vector2(-1, -2)), 1.0e-06); + + r = Vector2.Rotate(v1, AngleFloat.Degrees(-90)); + Assert.AreEqual(0, Vector2.Distance(r, new Vector2(2, -1)), 1.0e-06); + + r = Vector2.Rotate(v1, AngleFloat.Degrees(270)); + Assert.AreEqual(0, Vector2.Distance(r, new Vector2(2, -1)), 1.0e-06); + } + + [Test] + public void Lerp() { + Vector2 v1 = new(4, 5); + Vector2 v2 = new(1, 2); + Vector2 r; + + r = Vector2.Lerp(v1, v2, 0); + Assert.AreEqual(0, Vector2.Distance(r, v1), 0); + + r = Vector2.Lerp(v1, v2, 1); + Assert.AreEqual(0, Vector2.Distance(r, v2), 0); + + r = Vector2.Lerp(v1, v2, 0.5f); + Assert.AreEqual(0, Vector2.Distance(r, new Vector2(2.5f, 3.5f)), 0); + + r = Vector2.Lerp(v1, v2, -1); + Assert.AreEqual(0, Vector2.Distance(r, new Vector2(7, 8)), 0); + + r = Vector2.Lerp(v1, v2, 2); + Assert.AreEqual(0, Vector2.Distance(r, new Vector2(-2, -1)), 0); + } + + } +} +#endif \ No newline at end of file diff --git a/LinearAlgebra/test/Vector2IntTest.cs b/LinearAlgebra/test/Vector2IntTest.cs new file mode 100644 index 0000000..3647ca0 --- /dev/null +++ b/LinearAlgebra/test/Vector2IntTest.cs @@ -0,0 +1,270 @@ +#if !UNITY_5_6_OR_NEWER +using NUnit.Framework; + +namespace LinearAlgebra.Test { + using Vector2 = Vector2Int; + + public class Vector2IntTest { + + [SetUp] + public void Setup() { + } + + [Test] + public void FromPolar() { + } + + [Test] + public void Equality() { + Vector2 v1 = new(4, 5); + Vector2 v2 = new(1, 2); + + Assert.IsFalse(v1 == v2, "4 5 == 1 2"); + Assert.IsTrue(v1 != v2, "4 5 != 1 2"); + + v2 = new(4, 5); + Assert.IsTrue(v1 == v2, "4 5 == 4 5"); + Assert.IsFalse(v1 != v2, "4 5 != 4 5"); + } + + [Test] + public void Magnitude() { + Vector2 v = new(1, 2); + float m = 0; + m = v.magnitude; + Assert.AreEqual(m, 2.236068F, "v.magnitude 1 2"); + + m = Vector2.MagnitudeOf(v); + Assert.AreEqual(m, 2.236068F, "MagnitudeOf 1 2"); + + v = new(-1, -2); + m = v.magnitude; + Assert.AreEqual(m, 2.236068F, "v.magnitude -1 -2"); + + v = new(0, 0); + m = v.magnitude; + Assert.AreEqual(m, 0, "v.magnitude 0 0"); + } + + [Test] + public void SqrMagnitude() { + Vector2 v = new(1, 2); + float m = 0; + + m = v.sqrMagnitude; + Assert.AreEqual(m, 5, "v.sqrMagnitude 1 2"); + + m = Vector2.SqrMagnitudeOf(v); + Assert.AreEqual(m, 5, "SqrMagnitudeOf 1 2"); + + v = new(-1, -2); + m = v.sqrMagnitude; + Assert.AreEqual(m, 5, "v.sqrMagnitude -1 -2"); + + v = new(0, 0); + m = v.sqrMagnitude; + Assert.AreEqual(m, 0, "v.sqrMagnitude 0 0"); + } + + [Test] + public void Distance() { + Vector2 v1 = new(4, 5); + Vector2 v2 = new(1, 2); + float f = 0; + + f = Vector2.Distance(v1, v2); + Assert.AreEqual(f, 4.24264002f, 1.0E-05F, "Distance(4 5, 1 2)"); + + v2 = new(-1, -2); + f = Vector2.Distance(v1, v2); + Assert.AreEqual(f, 8.602325F, "Distance(4 5, 1 2)"); + + v2 = new(0, 0); + f = Vector2.Distance(v1, v2); + Assert.AreEqual(f, 6.403124F, 1.0E-05F, "Distance(4 5, 1 2)"); + } + + [Test] + public void Normalize() { + Vector2 v = new(0, 3); + Vector2Float r; + + r = v.normalized; + Assert.AreEqual(0, r.horizontal, "normalized 0 3 H"); + Assert.AreEqual(1, r.vertical, "normalized 0 3 V"); + + r = Vector2.Normalize(v); + Assert.AreEqual(0, r.horizontal, "Normalize 0 3 H"); + Assert.AreEqual(1, r.vertical, "Normalize 0 3 V"); + + v = new(0, -3); + r = v.normalized; + Assert.AreEqual(0, r.horizontal, "normalized 0 -3 H"); + Assert.AreEqual(-1, r.vertical, "normalized 0 -3 V"); + + v = new(0, 0); + r = v.normalized; + Assert.AreEqual(0, r.horizontal, "normalized 0 0 H"); + Assert.AreEqual(0, r.vertical, "normalized 0 0 V"); + } + + [Test] + public void Negate() { + Vector2 v = new(4, 5); + Vector2 r; + + r = -v; + Assert.AreEqual(-4, r.horizontal, "- 4 5 H"); + Assert.AreEqual(-5, r.vertical, "- 4 5 V"); + + v = new(-4, -5); + r = -v; + Assert.AreEqual(4, r.horizontal, "- -4 -5 H"); + Assert.AreEqual(5, r.vertical, "- -4 -5 V"); + + v = new(0, 0); + r = -v; + Assert.AreEqual(0, r.horizontal, "- 0 0 H"); + Assert.AreEqual(0, r.vertical, "- 0 0 V"); + } + + [Test] + public void Subtract() { + Vector2 v1 = new(4, 5); + Vector2 v2 = new(1, 2); + Vector2 r = Vector2.zero; + + r = v1 - v2; + Assert.IsTrue(r == new Vector2(3, 3), "4 5 - 1 2"); + + v2 = new(-1, -2); + r = v1 - v2; + Assert.IsTrue(r == new Vector2(5, 7), "4 5 - -1 -2"); + + v2 = new(4, 5); + r = v1 - v2; + Assert.IsTrue(r == new Vector2(0, 0), "4 5 - 4 5"); + r = v1; + r -= v2; + Assert.AreEqual(r, new Vector2(0, 0), "4 5 - 4 5"); + + v2 = new(0, 0); + r = v1 - v2; + Assert.AreEqual(r, new Vector2(4, 5), "4 5 - 0 0"); + r -= v2; + Assert.AreEqual(r, new Vector2(4, 5), "4 5 - 0 0"); + } + + [Test] + public void Addition() { + Vector2 v1 = new(4, 5); + Vector2 v2 = new(1, 2); + Vector2 r = Vector2.zero; + + r = v1 + v2; + Assert.IsTrue(r == new Vector2(5, 7), "4 5 + 1 2"); + + v2 = new(-1, -2); + r = v1 + v2; + Assert.IsTrue(r == new Vector2(3, 3), "4 5 + -1 -2"); + r = v1; + r += v2; + Assert.AreEqual(r, new Vector2(3, 3), "4 5 + -1 -2"); + + v2 = new(0, 0); + r = v1 + v2; + Assert.AreEqual(r, new Vector2(4, 5), "4 5 + 0 0"); + r += v2; + Assert.AreEqual(r, new Vector2(4, 5), "4 5 + 0 0"); + } + + [Test] + public void Scale() { + Vector2 v1 = new(4, 5); + Vector2 v2 = new(1, 2); + Vector2 r; + + r = Vector2.Scale(v1, v2); + Assert.AreEqual(4, r.horizontal, "Scale 4 5 , 1 2 H"); + Assert.AreEqual(10, r.vertical, "Scale 4 5 , 1 2 V"); + + v2 = new(-1, -2); + r = Vector2.Scale(v1, v2); + Assert.AreEqual(-4, r.horizontal, "Scale 4 5 , -1 -2 H"); + Assert.AreEqual(-10, r.vertical, "Scale 4 5 , -1 -2 V"); + + v2 = new(0, 0); + r = Vector2.Scale(v1, v2); + Assert.AreEqual(0, r.horizontal, "Scale 4 5 , 0 0 H"); + Assert.AreEqual(0, r.vertical, "Scale 4 5 , 0 0 V"); + } + + [Test] + public void Multiply() { + Vector2 v1 = new(4, 5); + int f = 3; + Vector2 r; + + r = v1 * f; + Assert.AreEqual(12, r.horizontal, "4 5 * 3 H"); + Assert.AreEqual(15, r.vertical, "4 5 * 3 V"); + + r = f * v1; + Assert.AreEqual(12, r.horizontal, "3 * 4 5 H"); + Assert.AreEqual(15, r.vertical, "3 * 4 5 V"); + + f = -3; + r = v1 * f; + Assert.AreEqual(-12, r.horizontal, "4 5 * -3 H"); + Assert.AreEqual(-15, r.vertical, "4 5 * -3 V"); + + f = 0; + r = v1 * f; + Assert.AreEqual(0, r.horizontal, "4 5 * 0 H"); + Assert.AreEqual(0, r.vertical, "4 5 * 0 V"); + } + + [Test] + public void Divide() { + Vector2 v1 = new(4, 5); + int f = 2; + Vector2 r; + + r = v1 / f; + Assert.AreEqual(2, r.horizontal, "4 5 / 2 H"); + Assert.AreEqual(2, r.vertical, "4 5 / 2 V"); + + f = -2; + r = v1 / f; + Assert.AreEqual(-2, r.horizontal, "4 5 / -2 H"); + Assert.AreEqual(-2, r.vertical, "4 5 / -2 V"); + + Assert.Throws(() => { + f = 0; + r = v1 / f; + Assert.AreEqual(float.PositiveInfinity, r.horizontal, "4 5 / 0 H"); + Assert.AreEqual(float.PositiveInfinity, r.vertical, "4 5 / 0 V"); + }); + } + + [Test] + public void Dot() { + Vector2 v1 = new(4, 5); + Vector2 v2 = new(1, 2); + int f; + + f = Vector2.Dot(v1, v2); + Assert.AreEqual(14, f, "Dot(4 5, 1 2)"); + + v2 = new(-1, -2); + f = Vector2.Dot(v1, v2); + Assert.AreEqual(-14, f, "Dot(4 5, -1 -2)"); + + v2 = new(0, 0); + f = Vector2.Dot(v1, v2); + Assert.AreEqual(0, f, "Dot(4 5, 0 0)"); + } + + } +} +#endif \ No newline at end of file diff --git a/LinearAlgebra/test/Vector3FloatTest.cs b/LinearAlgebra/test/Vector3FloatTest.cs new file mode 100644 index 0000000..fd3c2dc --- /dev/null +++ b/LinearAlgebra/test/Vector3FloatTest.cs @@ -0,0 +1,581 @@ +#if !UNITY_5_6_OR_NEWER +using NUnit.Framework; + +namespace LinearAlgebra.Test { + using Vector3 = Vector3Float; + + public class Vector3FloatTest { + + [Test] + public void FromSpherical() { + Vector3 v = new(0, 0, 1); + Spherical s = Spherical.FromVector3(v); + Vector3 r = Vector3.FromSpherical(s); + + Assert.AreEqual(0, r.horizontal, "0 0 1"); + Assert.AreEqual(0, r.vertical, 1.0e-06, "0 0 1"); + Assert.AreEqual(1, r.depth, "0 0 1"); + + v = new(0, 1, 0); + s = Spherical.FromVector3(v); + r = Vector3.FromSpherical(s); + Assert.AreEqual(0, r.horizontal, "0 0 1"); + Assert.AreEqual(1, r.vertical, "0 0 1"); + Assert.AreEqual(0, r.depth, 1.0e-06, "0 0 1"); + + v = new(1, 0, 0); + s = Spherical.FromVector3(v); + r = Vector3.FromSpherical(s); + Assert.AreEqual(1, r.horizontal, "0 0 1"); + Assert.AreEqual(0, r.vertical, 1.0e-06, "0 0 1"); + Assert.AreEqual(0, r.depth, 1.0e-06, "0 0 1"); + } + + [Test] + public void Magnitude() { + Vector3 v = new(1, 2, 3); + float m = 0; + + m = v.magnitude; + Assert.AreEqual(3.7416575f, m, "magnitude 1 2 3"); + + m = Vector3.MagnitudeOf(v); + Assert.AreEqual(3.7416575f, m, "MagnitudeOf 1 2 3"); + + v = new(-1, -2, -3); + m = v.magnitude; + Assert.AreEqual(3.7416575f, m, "magnitude -1 -2 -3"); + + v = new(0, 0, 0); + m = v.magnitude; + Assert.AreEqual(0, m, "magnitude 0 0 0"); + + // Infinity tests are still missing + } + + [Test] + public void SqrMagnitude() { + Vector3 v = new(1, 2, 3); + float m = 0; + + m = v.sqrMagnitude; + Assert.AreEqual(14, m, "sqrMagnitude 1 2 3"); + + m = Vector3.SqrMagnitudeOf(v); + Assert.AreEqual(14, m, "SqrMagnitudeOf 1 2 3"); + + v = new(-1, -2, -3); + m = v.sqrMagnitude; + Assert.AreEqual(14, m, "sqrMagnitude -1 -2 -3"); + + v = new(0, 0, 0); + m = v.sqrMagnitude; + Assert.AreEqual(0, m, "sqrMagnitude 0 0 0"); + + // Infinity tests are still missing + } + + [Test] + public void Normalize() { + Vector3 v = new(0, 2, 0); + Vector3 r; + + r = v.normalized; + Assert.AreEqual(new Vector3(0, 1, 0), r, "normalized 0 2 0"); + + r = Vector3.Normalize(v); + Assert.AreEqual(new Vector3(0, 1, 0), r, "Normalize 0 2 0"); + + v = new(0, -2, 0); + r = v.normalized; + Assert.AreEqual(new Vector3(0, -1, 0), r, "normalized 0 -2 0"); + v = new(0, 0, 0); + r = v.normalized; + Assert.AreEqual(new Vector3(0, 0, 0), r, "normalized 0 0 0"); + + v = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); + r = v.normalized; + Assert.IsTrue(float.IsNaN(r.horizontal), "normalized infinity infinity infinity"); + Assert.IsTrue(float.IsNaN(r.vertical), "normalized infinity infinity infinity"); + Assert.IsTrue(float.IsNaN(r.depth), "normalized infinity infinity infinity"); + + v = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); + r = v.normalized; + Assert.IsTrue(float.IsNaN(r.horizontal), "normalized -infinity -infinity -infinity"); + Assert.IsTrue(float.IsNaN(r.vertical), "normalized -infinity -infinity -infinity"); + Assert.IsTrue(float.IsNaN(r.depth), "normalized -infinity -infinity -infinity"); + } + + [Test] + public void Negate() { + Vector3 v = new(4, 5, 6); + Vector3 r; + + r = -v; + Assert.AreEqual(-4, r.horizontal, "- 4 5 6 H"); + Assert.AreEqual(-5, r.vertical, "- 4 5 6 V"); + Assert.AreEqual(-6, r.depth, "- 4 5 6 D"); + + v = new(-4, -5, -6); + r = -v; + Assert.AreEqual(4, r.horizontal, "- -4 -5 -6 H"); + Assert.AreEqual(5, r.vertical, "- -4 -5 -6 V"); + Assert.AreEqual(6, r.depth, "- -4 -5 -6 D"); + + v = new(0, 0, 0); + r = -v; + Assert.AreEqual(new Vector3(0, 0, 0), r, "- 0 0 0"); + Assert.AreEqual(0, r.horizontal, "- 0 0 0 H"); + Assert.AreEqual(0, r.vertical, "- 0 0 0 V"); + Assert.AreEqual(0, r.depth, "- 0 0 0 D"); + + + v = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); + r = -v; + Assert.AreEqual(new Vector3(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity), r, "- inifinty infinity infinity"); + + v = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); + r = -v; + Assert.AreEqual(new Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity), r, "- -inifinty -infinity -infinity"); + } + + [Test] + public void Subtract() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + Vector3 r = Vector3.zero; + + r = v1 - v2; + Assert.IsTrue(r == new Vector3(3, 3, 3), "4 5 6 - 1 2 3"); + + v2 = new(-1, -2, -3); + r = v1 - v2; + Assert.IsTrue(r == new Vector3(5, 7, 9), "4 5 6 - -1 -2 -3"); + + v2 = new(4, 5, 6); + r = v1 - v2; + Assert.IsTrue(r == new Vector3(0, 0, 0), "4 5 6 - 4 5 6"); + r = v1; + r -= v2; + Assert.AreEqual(r, new Vector3(0, 0, 0), "4 5 6 - 4 5 6"); + + v2 = new(0, 0, 0); + r = v1 - v2; + Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 - 0 0 0"); + r -= v2; + Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 - 0 0 0"); + + // Infinity tests are still missing + } + + [Test] + public void Addition() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + Vector3 r = Vector3.zero; + + r = v1 + v2; + Assert.IsTrue(r == new Vector3(5, 7, 9), "4 5 6 + 1 2 3"); + + v2 = new(-1, -2, -3); + r = v1 + v2; + Assert.IsTrue(r == new Vector3(3, 3, 3), "4 5 6 + -1 -2 -3"); + r = v1; + r += v2; + Assert.AreEqual(r, new Vector3(3, 3, 3), "4 5 6 + -1 -2 -3"); + + v2 = new(0, 0, 0); + r = v1 + v2; + Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 + 0 0 0"); + r += v2; + Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 + 0 0 0"); + + // Infinity tests are still missing + } + + [Test] + public void Scale() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + Vector3 r; + + r = Vector3.Scale(v1, v2); + Assert.AreEqual(4, r.horizontal, "Scale 4 5 6 , 1 2 3 H"); + Assert.AreEqual(10, r.vertical, "Scale 4 5 6 , 1 2 3 V"); + Assert.AreEqual(18, r.depth, "Scale 4 5 6 , 1 2 3 D"); + + v2 = new(-1, -2, -3); + r = Vector3.Scale(v1, v2); + Assert.AreEqual(-4, r.horizontal, "Scale 4 5 6 , -1 -2 -3 H"); + Assert.AreEqual(-10, r.vertical, "Scale 4 5 6 , -1 -2 -3 V"); + Assert.AreEqual(-18, r.depth, "Scale 4 5 6 , -1 -2 -3 D"); + + v2 = new(0, 0, 0); + r = Vector3.Scale(v1, v2); + Assert.AreEqual(0, r.horizontal, "Scale 4 5 6 , 0 0 0 H"); + Assert.AreEqual(0, r.vertical, "Scale 4 5 6 , 0 0 0 V"); + Assert.AreEqual(0, r.depth, "Scale 4 5 6 , 0 0 0 D"); + + v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); + r = Vector3.Scale(v1, v2); + Assert.AreEqual(float.PositiveInfinity, r.horizontal, "Scale 4 5 6 , inf inf inf H"); + Assert.AreEqual(float.PositiveInfinity, r.vertical, "Scale 4 5 6 , inf inf inf V"); + Assert.AreEqual(float.PositiveInfinity, r.depth, "Scale 4 5 6 , inf inf inf D"); + + v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); + r = Vector3.Scale(v1, v2); + Assert.AreEqual(float.NegativeInfinity, r.horizontal, "Scale 4 5 6 , -inf -inf -inf H"); + Assert.AreEqual(float.NegativeInfinity, r.vertical, "Scale 4 5 6 , -inf -inf -inf V"); + Assert.AreEqual(float.NegativeInfinity, r.depth, "Scale 4 5 6 , -inf -inf -inf D"); + } + + [Test] + public void Multiply() { + Vector3 v1 = new(4, 5, 6); + float f = 3; + Vector3 r; + + r = v1 * f; + Assert.AreEqual(12, r.horizontal, "4 5 6 * 3 H"); + Assert.AreEqual(15, r.vertical, "4 5 6 * 3 V"); + Assert.AreEqual(18, r.depth, "4 5 6 * 3 D"); + + f = -3; + r = v1 * f; + Assert.AreEqual(-12, r.horizontal, "4 5 6 * -3 H"); + Assert.AreEqual(-15, r.vertical, "4 5 6 * -3 V"); + Assert.AreEqual(-18, r.depth, "4 5 6 * -3 D"); + + f = 0; + r = v1 * f; + Assert.AreEqual(0, r.horizontal, "4 5 6 * 0 H"); + Assert.AreEqual(0, r.vertical, "4 5 6 * 0 V"); + Assert.AreEqual(0, r.depth, "4 5 6 * 0 D"); + + f = float.PositiveInfinity; + r = v1 * f; + Assert.AreEqual(float.PositiveInfinity, r.horizontal, "4 5 6 * inf H"); + Assert.AreEqual(float.PositiveInfinity, r.vertical, "4 5 6 * inf V"); + Assert.AreEqual(float.PositiveInfinity, r.depth, "4 5 6 * inf D"); + + f = float.NegativeInfinity; + r = v1 * f; + Assert.AreEqual(float.NegativeInfinity, r.horizontal, "4 5 6 * -inf H"); + Assert.AreEqual(float.NegativeInfinity, r.vertical, "4 5 6 * -inf V"); + Assert.AreEqual(float.NegativeInfinity, r.depth, "4 5 6 * -inf D"); + } + + [Test] + public void Divide() { + Vector3 v1 = new(4, 5, 6); + float f = 2; + Vector3 r; + + r = v1 / f; + Assert.AreEqual(2, r.horizontal, "4 5 6 / 2 H"); + Assert.AreEqual(2.5, r.vertical, "4 5 6 / 2 V"); + Assert.AreEqual(3, r.depth, "4 5 6 / 2 D"); + + f = -2; + r = v1 / f; + Assert.AreEqual(-2, r.horizontal, "4 5 6 / -2 H"); + Assert.AreEqual(-2.5, r.vertical, "4 5 6 / -2 V"); + Assert.AreEqual(-3, r.depth, "4 5 6 / -2 D"); + + f = 0; + r = v1 / f; + Assert.AreEqual(float.PositiveInfinity, r.horizontal, "4 5 6 / 0 H"); + Assert.AreEqual(float.PositiveInfinity, r.vertical, "4 5 6 / 0 V"); + Assert.AreEqual(float.PositiveInfinity, r.depth, "4 5 6 / 0 D"); + + f = float.PositiveInfinity; + r = v1 / f; + Assert.AreEqual(0, r.horizontal, "4 5 6 / inf H"); + Assert.AreEqual(0, r.vertical, "4 5 6 / inf V"); + Assert.AreEqual(0, r.depth, "4 5 6 / inf D"); + + f = float.NegativeInfinity; + r = v1 / f; + Assert.AreEqual(0, r.horizontal, "4 5 6 / -inf H"); + Assert.AreEqual(0, r.vertical, "4 5 6 / -inf V"); + Assert.AreEqual(0, r.depth, "4 5 6 / -inf D"); + } + + [Test] + public void Dot() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + float f; + + f = Vector3.Dot(v1, v2); + Assert.AreEqual(32, f, "Dot(4 5 6, 1 2 3)"); + + v2 = new(-1, -2, -3); + f = Vector3.Dot(v1, v2); + Assert.AreEqual(-32, f, "Dot(4 5 6, -1 -2 -3)"); + + v2 = new(0, 0, 0); + f = Vector3.Dot(v1, v2); + Assert.AreEqual(0, f, "Dot(4 5 6, 0 0 0)"); + + v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); + f = Vector3.Dot(v1, v2); + Assert.AreEqual(float.PositiveInfinity, f, "Dot(4 5 6, inf inf inf)"); + + v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); + f = Vector3.Dot(v1, v2); + Assert.AreEqual(float.NegativeInfinity, f, "Dot(4 5 6, -inf -inf -inf)"); + } + + [Test] + public void Equality() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + bool r; + + r = v1 == v2; + Assert.IsFalse(r, "4 5 6 == 1 2 3"); + + v2 = new(4, 5, 6); + r = v1 == v2; + Assert.IsTrue(r, "4 5 6 == 4 5 6"); + + v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); + r = v1 == v2; + Assert.IsFalse(r, "4 5 6 == inf inf inf"); + + v1 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); + r = v1 == v2; + Assert.IsFalse(r, "-inf -inf -inf == inf inf inf"); + } + + [Test] + public void Distance() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + float f; + + f = Vector3.Distance(v1, v2); + Assert.AreEqual(5.19615221F, f, "Distance(4 5 6, 1 2 3)"); + + v2 = new(-1, -2, -3); + f = Vector3.Distance(v1, v2); + Assert.AreEqual(12.4498997F, f, "Distance(4 5 6, -1 -2 -3)"); + + v2 = new(0, 0, 0); + f = Vector3.Distance(v1, v2); + Assert.AreEqual(v1.magnitude, f, "Distance(4 5 6, 0 0 0)"); + + v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); + f = Vector3.Distance(v1, v2); + Assert.AreEqual(float.PositiveInfinity, f, "Distance(4 5 6, inf inf inf)"); + + v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); + f = Vector3.Distance(v1, v2); + Assert.AreEqual(float.PositiveInfinity, f, "Distance(4 5 6, -inf -inf -inf)"); + } + + [Test] + public void Cross() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + Vector3 r; + + r = Vector3.Cross(v1, v2); + Assert.AreEqual(3, r.horizontal, "Cross(4 5 6, 1 2 3) H"); + Assert.AreEqual(-6, r.vertical, "Cross(4 5 6, 1 2 3) V"); + Assert.AreEqual(3, r.depth, "Cross(4 5 6, 1 2 3) D"); + + v2 = new(-1, -2, -3); + r = Vector3.Cross(v1, v2); + Assert.AreEqual(-3, r.horizontal, "Cross(4 5 6, -1 -2 -3) H"); + Assert.AreEqual(6, r.vertical, "Cross(4 5 6, -1 -2 -3) V"); + Assert.AreEqual(-3, r.depth, "Cross(4 5 6, -1 -2 -3) D"); + + v2 = new(0, 0, 0); + r = Vector3.Cross(v1, v2); + Assert.AreEqual(0, r.horizontal, "Cross(4 5 6, 0 0 0) H"); + Assert.AreEqual(0, r.vertical, "Cross(4 5 6, 0 0 0) V"); + Assert.AreEqual(0, r.depth, "Cross(4 5 6, 0 0 0) D"); + + v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); + r = Vector3.Cross(v1, v2); + Assert.IsTrue(float.IsNaN(r.horizontal), "Cross(4 5 6, inf inf inf) H"); + Assert.IsTrue(float.IsNaN(r.vertical), "Cross(4 5 6, inf inf inf) V"); + Assert.IsTrue(float.IsNaN(r.depth), "Cross(4 5 6, inf inf inf) D"); + + v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); + r = Vector3.Cross(v1, v2); + Assert.IsTrue(float.IsNaN(r.horizontal), "Cross(4 5 6, -inf -inf -inf) H"); + Assert.IsTrue(float.IsNaN(r.vertical), "Cross(4 5 6, -inf -inf -inf) V"); + Assert.IsTrue(float.IsNaN(r.depth), "Cross(4 5 6, -inf -inf -inf) D"); + } + + [Test] + public void Project() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + Vector3 r; + + r = Vector3.Project(v1, v2); + Assert.AreEqual(2.28571439F, r.horizontal, "Project(4 5 6, 1 2 3) H"); + Assert.AreEqual(4.57142878F, r.vertical, "Project(4 5 6, 1 2 3) V"); + Assert.AreEqual(6.85714293F, r.depth, "Project(4 5 6, 1 2 3) D"); + + v2 = new(-1, -2, -3); + r = Vector3.Project(v1, v2); + Assert.AreEqual(2.28571439F, r.horizontal, "Project(4 5 6, -1 -2 -3) H"); + Assert.AreEqual(4.57142878F, r.vertical, "Project(4 5 6, -1 -2 -3) V"); + Assert.AreEqual(6.85714293F, r.depth, "Project(4 5 6, -1 -2 -3) D"); + + v2 = new(0, 0, 0); + r = Vector3.Project(v1, v2); + Assert.AreEqual(0, r.horizontal, "Project(4 5 6, 0 0 0) H"); + Assert.AreEqual(0, r.vertical, "Project(4 5 6, 0 0 0) V"); + Assert.AreEqual(0, r.depth, "Project(4 5 6, 0 0 0) D"); + + r = Vector3.Project(v2, v1); + Assert.AreEqual(0, r.horizontal, "Project(0 0 0, 4 5 6) H"); + Assert.AreEqual(0, r.vertical, "Project(0 0 0, 4 5 6) V"); + Assert.AreEqual(0, r.depth, "Project(0 0 0, 4 5 6) D"); + + v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); + r = Vector3.Project(v1, v2); + Assert.IsTrue(float.IsNaN(r.horizontal), "Project(4 5 6, inf inf inf) H"); + Assert.IsTrue(float.IsNaN(r.vertical), "Project(4 5 6, inf inf inf) V"); + Assert.IsTrue(float.IsNaN(r.depth), "Project(4 5 6, inf inf inf) D"); + + v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); + r = Vector3.Project(v1, v2); + Assert.IsTrue(float.IsNaN(r.horizontal), "Project(4 5 6, -inf -inf -inf) H"); + Assert.IsTrue(float.IsNaN(r.vertical), "Project(4 5 6, -inf -inf -inf) V"); + Assert.IsTrue(float.IsNaN(r.depth), "Project(4 5 6, -inf -inf -inf) D"); + } + + [Test] + public void ProjectOnPlane() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + Vector3 r; + + r = Vector3.ProjectOnPlane(v1, v2); + Assert.AreEqual(1.71428561F, r.horizontal, "ProjectOnPlane(4 5 6, 1 2 3) H"); + Assert.AreEqual(0.428571224F, r.vertical, "ProjectOnPlane(4 5 6, 1 2 3) V"); + Assert.AreEqual(-0.857142925F, r.depth, "ProjectOnPlane(4 5 6, 1 2 3) D"); + + v2 = new(-1, -2, -3); + r = Vector3.ProjectOnPlane(v1, v2); + Assert.AreEqual(1.71428561F, r.horizontal, "ProjectOnPlane(4 5 6, -1 -2 -3) H"); + Assert.AreEqual(0.428571224F, r.vertical, "ProjectOnPlane(4 5 6, -1 -2 -3) V"); + Assert.AreEqual(-0.857142925F, r.depth, "ProjectOnPlane(4 5 6, -1 -2 -3) D"); + + v2 = new(0, 0, 0); + r = Vector3.ProjectOnPlane(v1, v2); + Assert.AreEqual(4, r.horizontal, "ProjectOnPlane(4 5 6, 0 0 0) H"); + Assert.AreEqual(5, r.vertical, "ProjectOnPlane(4 5 6, 0 0 0) V"); + Assert.AreEqual(6, r.depth, "ProjectOnPlane(4 5 6, 0 0 0) D"); + + r = Vector3.ProjectOnPlane(v2, v1); + Assert.AreEqual(0, r.horizontal, "ProjectOnPlane(0 0 0, 4 5 6) H"); + Assert.AreEqual(0, r.vertical, "ProjectOnPlane(0 0 0, 4 5 6) V"); + Assert.AreEqual(0, r.depth, "ProjectOnPlane(0 0 0, 4 5 6) D"); + + v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); + r = Vector3.ProjectOnPlane(v1, v2); + Assert.IsTrue(float.IsNaN(r.horizontal), "ProjectOnPlane(4 5 6, inf inf inf) H"); + Assert.IsTrue(float.IsNaN(r.vertical), "ProjectOnPlane(4 5 6, inf inf inf) V"); + Assert.IsTrue(float.IsNaN(r.depth), "ProjectOnPlane(4 5 6, inf inf inf) D"); + + v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); + r = Vector3.ProjectOnPlane(v1, v2); + Assert.IsTrue(float.IsNaN(r.horizontal), "ProjectOnPlane(4 5 6, -inf -inf -inf) H"); + Assert.IsTrue(float.IsNaN(r.vertical), "ProjectOnPlane(4 5 6, -inf -inf -inf) V"); + Assert.IsTrue(float.IsNaN(r.depth), "ProjectOnPlane(4 5 6, -inf -inf -inf) D"); + } + + [Test] + public void UnsignedAngle() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + AngleFloat a; + + a = Vector3.UnsignedAngle(v1, v2); + Assert.AreEqual(12.9331379F, a.inDegrees, "Angle(4 5 6, 1 2 3)"); + + v2 = new(-1, -2, -3); + a = Vector3.UnsignedAngle(v1, v2); + Assert.AreEqual(167.066849F, a.inDegrees, "Angle(4 5 6, -1 -2 -3)"); + + v2 = new(0, 0, 0); + a = Vector3.UnsignedAngle(v1, v2); + Assert.AreEqual(0, a.inDegrees, "Angle(4 5 6, 0 0 0)"); + + v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); + a = Vector3.UnsignedAngle(v1, v2); + Assert.IsTrue(float.IsNaN(a.inDegrees), "Angle(4 5 6, inf inf inf)"); + + v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); + a = Vector3.UnsignedAngle(v1, v2); + Assert.IsTrue(float.IsNaN(a.inDegrees), "Angle(4 5 6, inf inf inf)"); + } + + [Test] + public void SignedAngle() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + Vector3 v3 = new(7, 8, -9); + AngleFloat a; + + a = Vector3.SignedAngle(v1, v2, v3); + Assert.AreEqual(-12.9331379F, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, 7 8 -9)"); + + v2 = new(-1, -2, -3); + a = Vector3.SignedAngle(v1, v2, v3); + Assert.AreEqual(167.066849F, a.inDegrees, "SignedAngle(4 5 6, -1 -2 -3, 7 8 -9)"); + + v2 = new(0, 0, 0); + a = Vector3.SignedAngle(v1, v2, v3); + Assert.AreEqual(0, a.inDegrees, "SignedAngle(4 5 6, 0 0 0, 7 8 -9)"); + + v2 = new(1, 2, 3); + v3 = new(-7, -8, 9); + a = Vector3.SignedAngle(v1, v2, v3); + Assert.AreEqual(12.9331379F, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, -7 -8 9)"); + + v3 = new(0, 0, 0); + a = Vector3.SignedAngle(v1, v2, v3); + Assert.AreEqual(0, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, 0 0 0)"); + + v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); + a = Vector3.SignedAngle(v1, v2, v3); + Assert.IsTrue(float.IsNaN(a.inDegrees), "SignedAngle(4 5 6, inf inf inf, 0 0 0)"); + + v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); + a = Vector3.SignedAngle(v1, v2, v3); + Assert.IsTrue(float.IsNaN(a.inDegrees), "SignedAngle(4 5 6, -inf -inf -inf, 0 0 0)"); + } + + [Test] + public void Lerp() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + Vector3 r; + + r = Vector3.Lerp(v1, v2, 0); + Assert.AreEqual(0, Vector3.Distance(r, v1), 0); + + r = Vector3.Lerp(v1, v2, 1); + Assert.AreEqual(0, Vector3.Distance(r, v2), 0); + + r = Vector3.Lerp(v1, v2, 0.5f); + Assert.AreEqual(0, Vector3.Distance(r, new Vector3(2.5f, 3.5f, 4.5f)), 0); + + r = Vector3.Lerp(v1, v2, -1); + Assert.AreEqual(0, Vector3.Distance(r, new Vector3(7, 8, 9)), 0); + + r = Vector3.Lerp(v1, v2, 2); + Assert.AreEqual(0, Vector3.Distance(r, new Vector3(-2, -1, 0)), 0); + } + } +} +#endif \ No newline at end of file diff --git a/LinearAlgebra/test/Vector3IntTest.cs b/LinearAlgebra/test/Vector3IntTest.cs new file mode 100644 index 0000000..b718178 --- /dev/null +++ b/LinearAlgebra/test/Vector3IntTest.cs @@ -0,0 +1,349 @@ +#if !UNITY_5_6_OR_NEWER +using NUnit.Framework; + +namespace LinearAlgebra.Test { + using Vector3 = Vector3Int; + + public class Vector3IntTest { + + [Test] + public void Equality() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + + Assert.IsFalse(v1 == v2, "4 5 6 == 1 2 3"); + Assert.IsTrue(v1 != v2, "4 5 6 != 1 2 3"); + + v2 = new(4, 5, 6); + Assert.IsTrue(v1 == v2, "4 5 6 == 4 5 6"); + Assert.IsFalse(v1 != v2, "4 5 6 != 4 5 6"); + } + + [Test] + public void Magnitude() { + Vector3 v = new(1, 2, 3); + float m = 0; + + m = v.magnitude; + Assert.AreEqual(3.7416575f, m, "magnitude 1 2 3"); + + m = Vector3.MagnitudeOf(v); + Assert.AreEqual(3.7416575f, m, "MagnitudeOf 1 2 3"); + + v = new(-1, -2, -3); + m = v.magnitude; + Assert.AreEqual(3.7416575f, m, "magnitude -1 -2 -3"); + + v = new(0, 0, 0); + m = v.magnitude; + Assert.AreEqual(0, m, "magnitude 0 0 0"); + + // Infinity tests are still missing + } + + [Test] + public void SqrMagnitude() { + Vector3 v = new(1, 2, 3); + float m = 0; + + m = v.sqrMagnitude; + Assert.AreEqual(14, m, "sqrMagnitude 1 2 3"); + + m = Vector3.SqrMagnitudeOf(v); + Assert.AreEqual(14, m, "SqrMagnitudeOf 1 2 3"); + + v = new(-1, -2, -3); + m = v.sqrMagnitude; + Assert.AreEqual(14, m, "sqrMagnitude -1 -2 -3"); + + v = new(0, 0, 0); + m = v.sqrMagnitude; + Assert.AreEqual(0, m, "sqrMagnitude 0 0 0"); + + // Infinity tests are still missing + } + + [Test] + public void Distance() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + float f; + + f = Vector3.Distance(v1, v2); + Assert.AreEqual(5.19615221F, f, "Distance(4 5 6, 1 2 3)"); + + v2 = new(-1, -2, -3); + f = Vector3.Distance(v1, v2); + Assert.AreEqual(12.4498997F, f, "Distance(4 5 6, -1 -2 -3)"); + + v2 = new(0, 0, 0); + f = Vector3.Distance(v1, v2); + Assert.AreEqual(v1.magnitude, f, "Distance(4 5 6, 0 0 0)"); + } + + [Test] + public void Normalize() { + Vector3 v = new(0, 2, 0); + Vector3Float r; + + r = v.normalized; + //Assert.AreEqual(new Vector3(0, 1, 0), r, "normalized 0 2 0"); + Assert.AreEqual(0, r.horizontal, "normalized 0 2 0"); + Assert.AreEqual(1, r.vertical, "normalized 0 2 0"); + Assert.AreEqual(0, r.depth, "normalized 0 2 0"); + + r = Vector3.Normalize(v); + Assert.AreEqual(new Vector3Float(0, 1, 0), r, "Normalize 0 2 0"); + + v = new(0, -2, 0); + r = v.normalized; + Assert.AreEqual(new Vector3Float(0, -1, 0), r, "normalized 0 -2 0"); + v = new(0, 0, 0); + r = v.normalized; + Assert.AreEqual(new Vector3Float(0, 0, 0), r, "normalized 0 0 0"); + } + + [Test] + public void Negate() { + Vector3 v = new(4, 5, 6); + Vector3 r; + + r = -v; + Assert.AreEqual(-4, r.horizontal, "- 4 5 6 H"); + Assert.AreEqual(-5, r.vertical, "- 4 5 6 V"); + Assert.AreEqual(-6, r.depth, "- 4 5 6 D"); + + v = new(-4, -5, -6); + r = -v; + Assert.AreEqual(4, r.horizontal, "- -4 -5 -6 H"); + Assert.AreEqual(5, r.vertical, "- -4 -5 -6 V"); + Assert.AreEqual(6, r.depth, "- -4 -5 -6 D"); + + v = new(0, 0, 0); + r = -v; + Assert.AreEqual(new Vector3(0, 0, 0), r, "- 0 0 0"); + Assert.AreEqual(0, r.horizontal, "- 0 0 0 H"); + Assert.AreEqual(0, r.vertical, "- 0 0 0 V"); + Assert.AreEqual(0, r.depth, "- 0 0 0 D"); + } + + [Test] + public void Subtract() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + Vector3 r = Vector3.zero; + + r = v1 - v2; + Assert.IsTrue(r == new Vector3(3, 3, 3), "4 5 6 - 1 2 3"); + + v2 = new(-1, -2, -3); + r = v1 - v2; + Assert.IsTrue(r == new Vector3(5, 7, 9), "4 5 6 - -1 -2 -3"); + + v2 = new(4, 5, 6); + r = v1 - v2; + Assert.IsTrue(r == new Vector3(0, 0, 0), "4 5 6 - 4 5 6"); + r = v1; + r -= v2; + Assert.AreEqual(r, new Vector3(0, 0, 0), "4 5 6 - 4 5 6"); + + v2 = new(0, 0, 0); + r = v1 - v2; + Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 - 0 0 0"); + r -= v2; + Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 - 0 0 0"); + + // Infinity tests are still missing + } + + [Test] + public void Addition() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + Vector3 r = Vector3.zero; + + r = v1 + v2; + Assert.IsTrue(r == new Vector3(5, 7, 9), "4 5 6 + 1 2 3"); + + v2 = new(-1, -2, -3); + r = v1 + v2; + Assert.IsTrue(r == new Vector3(3, 3, 3), "4 5 6 + -1 -2 -3"); + r = v1; + r += v2; + Assert.AreEqual(r, new Vector3(3, 3, 3), "4 5 6 + -1 -2 -3"); + + v2 = new(0, 0, 0); + r = v1 + v2; + Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 + 0 0 0"); + r += v2; + Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 + 0 0 0"); + + // Infinity tests are still missing + } + + [Test] + public void Scale() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + Vector3 r; + + r = Vector3.Scale(v1, v2); + Assert.AreEqual(4, r.horizontal, "Scale 4 5 6 , 1 2 3 H"); + Assert.AreEqual(10, r.vertical, "Scale 4 5 6 , 1 2 3 V"); + Assert.AreEqual(18, r.depth, "Scale 4 5 6 , 1 2 3 D"); + + v2 = new(-1, -2, -3); + r = Vector3.Scale(v1, v2); + Assert.AreEqual(-4, r.horizontal, "Scale 4 5 6 , -1 -2 -3 H"); + Assert.AreEqual(-10, r.vertical, "Scale 4 5 6 , -1 -2 -3 V"); + Assert.AreEqual(-18, r.depth, "Scale 4 5 6 , -1 -2 -3 D"); + + v2 = new(0, 0, 0); + r = Vector3.Scale(v1, v2); + Assert.AreEqual(0, r.horizontal, "Scale 4 5 6 , 0 0 0 H"); + Assert.AreEqual(0, r.vertical, "Scale 4 5 6 , 0 0 0 V"); + Assert.AreEqual(0, r.depth, "Scale 4 5 6 , 0 0 0 D"); + } + + [Test] + public void Multiply() { + Vector3 v1 = new(4, 5, 6); + int f = 3; + Vector3 r; + + r = v1 * f; + Assert.AreEqual(12, r.horizontal, "4 5 6 * 3 H"); + Assert.AreEqual(15, r.vertical, "4 5 6 * 3 V"); + Assert.AreEqual(18, r.depth, "4 5 6 * 3 D"); + + r = f * v1; + Assert.AreEqual(12, r.horizontal, "3 * 4 5 6 H"); + Assert.AreEqual(15, r.vertical, "3 * 4 5 6 V"); + Assert.AreEqual(18, r.depth, "3 * 4 5 6 D"); + + f = -3; + r = v1 * f; + Assert.AreEqual(-12, r.horizontal, "4 5 6 * -3 H"); + Assert.AreEqual(-15, r.vertical, "4 5 6 * -3 V"); + Assert.AreEqual(-18, r.depth, "4 5 6 * -3 D"); + + f = 0; + r = v1 * f; + Assert.AreEqual(0, r.horizontal, "4 5 6 * 0 H"); + Assert.AreEqual(0, r.vertical, "4 5 6 * 0 V"); + Assert.AreEqual(0, r.depth, "4 5 6 * 0 D"); + } + + [Test] + public void Divide() { + Vector3 v1 = new(4, 5, 6); + int f = 2; + Vector3 r; + + r = v1 / f; + Assert.AreEqual(2, r.horizontal, "4 5 6 / 2 H"); + Assert.AreEqual(2, r.vertical, "4 5 6 / 2 V"); + Assert.AreEqual(3, r.depth, "4 5 6 / 2 D"); + + f = -2; + r = v1 / f; + Assert.AreEqual(-2, r.horizontal, "4 5 6 / -2 H"); + Assert.AreEqual(-2, r.vertical, "4 5 6 / -2 V"); + Assert.AreEqual(-3, r.depth, "4 5 6 / -2 D"); + + Assert.Throws(() => { + f = 0; + r = v1 / f; + }); + } + + [Test] + public void Dot() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + float f; + + f = Vector3.Dot(v1, v2); + Assert.AreEqual(32, f, "Dot(4 5 6, 1 2 3)"); + + v2 = new(-1, -2, -3); + f = Vector3.Dot(v1, v2); + Assert.AreEqual(-32, f, "Dot(4 5 6, -1 -2 -3)"); + + v2 = new(0, 0, 0); + f = Vector3.Dot(v1, v2); + Assert.AreEqual(0, f, "Dot(4 5 6, 0 0 0)"); + } + + [Test] + public void Cross() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + Vector3 r; + + r = Vector3.Cross(v1, v2); + Assert.AreEqual(3, r.horizontal, "Cross(4 5 6, 1 2 3) H"); + Assert.AreEqual(-6, r.vertical, "Cross(4 5 6, 1 2 3) V"); + Assert.AreEqual(3, r.depth, "Cross(4 5 6, 1 2 3) D"); + + v2 = new(-1, -2, -3); + r = Vector3.Cross(v1, v2); + Assert.AreEqual(-3, r.horizontal, "Cross(4 5 6, -1 -2 -3) H"); + Assert.AreEqual(6, r.vertical, "Cross(4 5 6, -1 -2 -3) V"); + Assert.AreEqual(-3, r.depth, "Cross(4 5 6, -1 -2 -3) D"); + + v2 = new(0, 0, 0); + r = Vector3.Cross(v1, v2); + Assert.AreEqual(0, r.horizontal, "Cross(4 5 6, 0 0 0) H"); + Assert.AreEqual(0, r.vertical, "Cross(4 5 6, 0 0 0) V"); + Assert.AreEqual(0, r.depth, "Cross(4 5 6, 0 0 0) D"); + } + + [Test] + public void UnsignedAngle() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + AngleFloat a; + + a = Vector3.UnsignedAngle(v1, v2); + Assert.AreEqual(12.9331379F, a.inDegrees, "Angle(4 5 6, 1 2 3)"); + + v2 = new(-1, -2, -3); + a = Vector3.UnsignedAngle(v1, v2); + Assert.AreEqual(167.066849F, a.inDegrees, "Angle(4 5 6, -1 -2 -3)"); + + v2 = new(0, 0, 0); + a = Vector3.UnsignedAngle(v1, v2); + Assert.AreEqual(0, a.inDegrees, "Angle(4 5 6, 0 0 0)"); + } + + [Test] + public void SignedAngle() { + Vector3 v1 = new(4, 5, 6); + Vector3 v2 = new(1, 2, 3); + Vector3 v3 = new(7, 8, -9); + AngleFloat a; + + a = Vector3.SignedAngle(v1, v2, v3); + Assert.AreEqual(-12.9331379F, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, 7 8 -9)"); + + v2 = new(-1, -2, -3); + a = Vector3.SignedAngle(v1, v2, v3); + Assert.AreEqual(167.066849F, a.inDegrees, "SignedAngle(4 5 6, -1 -2 -3, 7 8 -9)"); + + v2 = new(0, 0, 0); + a = Vector3.SignedAngle(v1, v2, v3); + Assert.AreEqual(0, a.inDegrees, "SignedAngle(4 5 6, 0 0 0, 7 8 -9)"); + + v2 = new(1, 2, 3); + v3 = new(-7, -8, 9); + a = Vector3.SignedAngle(v1, v2, v3); + Assert.AreEqual(12.9331379F, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, -7 -8 9)"); + + v3 = new(0, 0, 0); + a = Vector3.SignedAngle(v1, v2, v3); + Assert.AreEqual(0, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, 0 0 0)"); + } + } +} +#endif \ No newline at end of file diff --git a/MemoryCell.cs b/MemoryCell.cs new file mode 100644 index 0000000..7b7b8e5 --- /dev/null +++ b/MemoryCell.cs @@ -0,0 +1,59 @@ +using System; +using Unity.Mathematics; + +[Serializable] +public class MemoryCell : Neuron { + + public MemoryCell(ClusterPrefab cluster, string name) : base(cluster, name) { } + public MemoryCell(Cluster parent, string name) : base(parent, name) { } + + public bool staticMemory = false; + public override bool isSleeping { + get { + if (staticMemory) + return false; + + return base.isSleeping; + } + } + + public override Nucleus ShallowCloneTo(Cluster newParent) { + MemoryCell clone = new(newParent, this.name); + CloneFields(clone); + clone.staticMemory = this.staticMemory; + return clone; + } + + #region State + + private bool initialized = false; + + private float3 _memorizedValue; + + public override void UpdateStateIsolated() { + // A memorycell does not have an activation function + float3 result = Combinator(); + + if (initialized) + // Output the previous, memorized value + this.outputValue = this._memorizedValue; + else { + // The first time, the result is directly set in output + this.outputValue = result; + this.initialized = true; + } + + // Store the result for the next time + this._memorizedValue = result; + } + + public override void UpdateNuclei() { + if (staticMemory) + // Static memory does not get stale or go to sleep + return; + + base.UpdateNuclei(); + } + + #endregion State +} diff --git a/MemoryCell.cs.meta b/MemoryCell.cs.meta new file mode 100644 index 0000000..ef74aba --- /dev/null +++ b/MemoryCell.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 29633aa3fe5cd9dcc8d886051f45d4d8 \ No newline at end of file diff --git a/NanoBrain-Unity.code-workspace b/NanoBrain-Unity.code-workspace new file mode 100644 index 0000000..5194438 --- /dev/null +++ b/NanoBrain-Unity.code-workspace @@ -0,0 +1,12 @@ +{ + "folders": [ + { + "path": "../.." + }, + { + "name": "LinearAlgebra-csharp", + "path": "LinearAlgebra-csharp" + } + ], + "settings": {} +} \ No newline at end of file diff --git a/NanoBrain-Unity.code-workspace.meta b/NanoBrain-Unity.code-workspace.meta new file mode 100644 index 0000000..65bb132 --- /dev/null +++ b/NanoBrain-Unity.code-workspace.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: cfec45da5945b94d684a763d86b0dcf8 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain.cs b/NanoBrain.cs new file mode 100644 index 0000000..5a7525e --- /dev/null +++ b/NanoBrain.cs @@ -0,0 +1,31 @@ +using System; +using UnityEngine; + +public class NanoBrain : MonoBehaviour { + public ClusterPrefab defaultBrain; + + [NonSerialized] + private Cluster brainInstance; + public Cluster brain { + get { + if (brainInstance == null && defaultBrain != null) { + brainInstance = new Cluster(defaultBrain) { + name = defaultBrain.name + " (Instance)" + }; + } + return brainInstance; + } + } + + public static void UpdateWeight(Cluster brain, string name, float weight) { + Nucleus root = brain.defaultOutput; + foreach (Synapse synapse in root.synapses) { + if (synapse.neuron.name == name) { + if (synapse.weight != weight) { + synapse.weight = weight; + // Debug.Log($"Updated weight for {name}"); + } + } + } + } +} \ No newline at end of file diff --git a/NanoBrain.cs.meta b/NanoBrain.cs.meta new file mode 100644 index 0000000..1666c60 --- /dev/null +++ b/NanoBrain.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 92f34a5e4027a1dc39efd8ce63cf6aba \ No newline at end of file diff --git a/Neuron.cs b/Neuron.cs new file mode 100644 index 0000000..05982de --- /dev/null +++ b/Neuron.cs @@ -0,0 +1,334 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using Unity.Mathematics; +using static Unity.Mathematics.math; + +[Serializable] +public class Neuron : Nucleus { + + public Neuron(Cluster parent, string name) { + this.parent = parent; + this.name = name; + this.parent?.clusterNuclei.Add(this); + } + public Neuron(ClusterPrefab prefab, string name) { + this.clusterPrefab = prefab; + this.name = name; + if (this.clusterPrefab != null) + this.clusterPrefab.nuclei.Add(this); + else + Debug.LogError("No prefab when adding neuron to prefab"); + } + + #region Serialization + + public enum CombinatorType { + Sum, + Product, + Max + } + public CombinatorType combinator = CombinatorType.Sum; + + public enum CurvePresets { + Linear, + Power, + Sqrt, + Reciprocal, + Custom + } + [SerializeField] + public CurvePresets _curvePreset; + public CurvePresets curvePreset { + get { return _curvePreset; } + set { + _curvePreset = value; + this.curve = GenerateCurve(); + } + } + public AnimationCurve curve; + public float curveMax = 1.0f; + + public AnimationCurve GenerateCurve() { + switch (this.curvePreset) { + case CurvePresets.Linear: + this.curveMax = 1; + return Presets.Linear(1); + case CurvePresets.Power: + this.curveMax = 1; + return Presets.Power(2.0f, 1); + case CurvePresets.Sqrt: + this.curveMax = 1; + return Presets.Power(0.5f, 1); + case CurvePresets.Reciprocal: + this.curveMax = 1 / 0.01f * 1; + return Presets.Reciprocal(1); + default: + this.curveMax = 1; + return this.curve; + } + } + + public static class Presets { + private const int samples = 32; + public static AnimationCurve Linear(float weight) { + return AnimationCurve.Linear(0f, 0f, 1000f, weight * 1000); + } + public static AnimationCurve Power(float exponent, float weight) { + // build keyframes + Keyframe[] keys = new Keyframe[samples]; + for (int i = 0; i < samples; i++) { + float t = i / (float)(samples - 1); + float v = Mathf.Pow(t, exponent) * weight; + keys[i] = new Keyframe(t, v); + } + + AnimationCurve curve = new(keys); + + // set tangent modes for each key to Auto (smooth). Use Linear if you prefer straight segments. + for (int i = 0; i < curve.length; i++) { + AnimationUtility.SetKeyLeftTangentMode(curve, i, AnimationUtility.TangentMode.Auto); + AnimationUtility.SetKeyRightTangentMode(curve, i, AnimationUtility.TangentMode.Auto); + } + + return curve; + } + public static AnimationCurve Reciprocal(float weight) { + int samples = 128; + float xMin = 0.001f; + float xMax = 1; + var keys = new Keyframe[samples]; + for (int i = 0; i < samples; i++) { + float t = i / (float)(samples - 1); + float x = Mathf.Lerp(xMin, xMax, t); + float y = 1f / x * weight; + keys[i] = new Keyframe(x, y); + } + var curve = new AnimationCurve(keys); + for (int i = 0; i < curve.length; i++) { + AnimationUtility.SetKeyLeftTangentMode(curve, i, AnimationUtility.TangentMode.Linear); + AnimationUtility.SetKeyRightTangentMode(curve, i, AnimationUtility.TangentMode.Linear); + } + return curve; + } + } + + #endregion Serialization + + protected float3 _outputValue; + public virtual float3 outputValue { + get { return _outputValue; } + set { + _outputValue = value; + if (this.isFiring) + WhenFiring?.Invoke(); + } + } + public bool isFiring => length(_outputValue) > 0.5f; + public Action WhenFiring; + + public virtual bool isSleeping => lengthsq(this.outputValue) == 0; + [NonSerialized] + public int stale = 1000; + public readonly int staleValueForSleep = 20; + + // this clone the nucleus without the synapses and receivers + public override Nucleus ShallowCloneTo(Cluster newParent) { + Neuron clone = new(newParent, this.name); + CloneFields(clone); + return clone; + } + + public override Nucleus Clone(ClusterPrefab prefab) { + Neuron clone = new(prefab, this.name); + CloneFields(clone); + foreach (Synapse synapse in this.synapses) { + Synapse clonedSynapse = clone.AddSynapse(synapse.neuron); + clonedSynapse.weight = synapse.weight; + } + foreach (Nucleus receiver in this.receivers) { + clone.AddReceiver(receiver); + } + return clone; + } + + protected virtual void CloneFields(Neuron clone) { + clone.clusterPrefab = this.clusterPrefab; + clone.bias = this.bias; + clone.combinator = this.combinator; + clone.curve = this.curve; + clone.curvePreset = this.curvePreset; + clone.curveMax = this.curveMax; + } + + public static void Delete(Nucleus nucleus) { + foreach (Synapse synapse in nucleus.synapses) { + if (synapse.neuron is Neuron synapse_nucleus) { + if (synapse_nucleus.receivers.Count > 1) { + // there is another nucleus feeding into this input nucleus + synapse_nucleus.receivers.RemoveAll(r => r == nucleus); + } + else { + // No other links, delete it. + Neuron.Delete(synapse_nucleus); + } + } + } + if (nucleus is Neuron neuron) { + foreach (Nucleus receiver in neuron.receivers) { + if (receiver != null && receiver.synapses != null) + receiver.synapses.RemoveAll(s => s.neuron == nucleus); + } + } + else if (nucleus is Cluster cluster) { + // remove all receivers for this cluster + foreach (Neuron output in cluster.outputs) { + foreach (Nucleus receiver in output.receivers) { + receiver.synapses.RemoveAll(s => s.neuron == output); + } + } + } + + + if (nucleus.clusterPrefab != null) { + nucleus.clusterPrefab.nuclei.RemoveAll(n => n == nucleus); + nucleus.clusterPrefab.RefreshOutputs(); + nucleus.clusterPrefab.GarbageCollection(); + } + } + + public override void UpdateStateIsolated() { + float3 result = Combinator(); + this.outputValue = Activator(result); + } + + #region Combinator + + protected Func Combinator => combinator switch { + CombinatorType.Sum => CombinatorSum, + CombinatorType.Product => CombinatorProduct, + CombinatorType.Max => CombinatorMax, + _ => CombinatorSum + }; + + public float3 CombinatorSum() { + float3 sum = this.bias; + foreach (Synapse synapse in this.synapses) + sum += synapse.weight * synapse.neuron.outputValue; + return sum; + } + + public float3 CombinatorProduct() { + float3 product = this.bias; + foreach (Synapse synapse in this.synapses) { + product *= synapse.weight * synapse.neuron.outputValue; + } + return product; + } + + public float3 CombinatorMax() { + float3 max = this.bias; + float maxLength = length(max); + + //Applying the weight factors + foreach (Synapse synapse in this.synapses) { + float3 input = synapse.weight * synapse.neuron.outputValue; + + float inputLength = length(input); + if (inputLength > maxLength) { + max = input; + maxLength = inputLength; + } + } + return max; + } + + #endregion Combinator + + #region Activator + + public Func Activator => this.curvePreset switch { + CurvePresets.Linear => ActivatorLinear, + CurvePresets.Sqrt => ActivatorSqrt, + CurvePresets.Power => ActivatorPower, + CurvePresets.Reciprocal => ActivatorReciprocal, + _ => ActivatorCustom + }; + + protected float3 ActivatorLinear(float3 input) { + return input; + } + + protected float3 ActivatorSqrt(float3 input) { + float3 result = normalize(input) * System.MathF.Sqrt(length(input)); + return result; + } + + protected float3 ActivatorPower(float3 input) { + float3 result = normalize(input) * System.MathF.Pow(length(input), 2); + return result; + } + + protected float3 ActivatorReciprocal(float3 input) { + float magnitude = length(input); + if (magnitude == 0) + return new float3(0, 0, 0); + + float3 result = normalize(input) * (1 / magnitude); + return result; + } + + protected float3 ActivatorCustom(float3 input) { + float activatedValue = this.curve.Evaluate(length(input)); + float3 result = normalize(input) * activatedValue; + return result; + } + + #endregion Activator + + #region Receivers + + [SerializeReference] + private List _receivers = new(); + public virtual List receivers { + get { return _receivers; } + set { _receivers = value; } + } + + public virtual void AddReceiver(Nucleus receiverToAdd, float weight = 1) { + this._receivers.Add(receiverToAdd); + receiverToAdd.AddSynapse(this, weight); + } + + public virtual void RemoveReceiver(Nucleus receiverToRemove) { + if (this is IReceptor receptor) { + foreach (Nucleus element in receptor.nucleiArray) { + if (element is Neuron neuron) { + neuron._receivers.RemoveAll(receiver => receiver == receiverToRemove); + receiverToRemove.synapses.RemoveAll(synapse => synapse.neuron == neuron); + } + } + } + else { + this._receivers.RemoveAll(receiver => receiver == receiverToRemove); + receiverToRemove.synapses.RemoveAll(synapse => synapse.neuron == this); + } + } + + + #endregion Receivers + + public override void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = null) { + if (this.parent is ClusterReceptor clusterReceptor) + clusterReceptor.ProcessStimulus(this, inputValue, thingId, thingName); + else + ProcessStimulusDirect(inputValue, thingId, thingName); + } + + public void ProcessStimulusDirect(Vector3 inputValue, int thingId = 0, string thingName = null) { + this.stale = 0; + this.bias = inputValue; + this.parent.UpdateFromNucleus(this); + } +} \ No newline at end of file diff --git a/Neuron.cs.meta b/Neuron.cs.meta new file mode 100644 index 0000000..e520090 --- /dev/null +++ b/Neuron.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 750748f3f0e7d472fbf88ab02987074c \ No newline at end of file diff --git a/NewVelocity.asset b/NewVelocity.asset new file mode 100644 index 0000000..87c56b4 --- /dev/null +++ b/NewVelocity.asset @@ -0,0 +1,1305 @@ +%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: NewVelocity + m_EditorClassIdentifier: Assembly-CSharp::ClusterPrefab + nuclei: + - rid: 2262690579536937007 + - rid: 2262690579536937008 + - rid: 2262690579536937009 + - rid: 2262690579536937010 + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } + - rid: 2262690579536937007 + type: {class: Neuron, ns: , asm: Assembly-CSharp} + data: + name: Proximity + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - nucleus: + rid: 2262690579536937008 + weight: 1 + combinator: 0 + _curvePreset: 3 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0.001 + value: 999.99994 + inSlope: 0 + outSlope: -112788.63 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.008866142 + value: 112.788635 + inSlope: -112788.63 + outSlope: -6740.78 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.016732283 + value: 59.76471 + inSlope: -6740.78 + outSlope: -2429.6155 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.024598425 + value: 40.653008 + inSlope: -2429.6155 + outSlope: -1252.2269 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.032464568 + value: 30.802813 + inSlope: -1252.2269 + outSlope: -763.7558 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.040330708 + value: 24.795002 + inSlope: -763.7558 + outSlope: -514.45264 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.04819685 + value: 20.748245 + inSlope: -514.45264 + outSlope: -370.0882 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.056062993 + value: 17.837078 + inSlope: -370.0882 + outSlope: -279.01324 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.06392913 + value: 15.642321 + inSlope: -279.01324 + outSlope: -217.87398 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.07179528 + value: 13.928493 + inSlope: -217.87398 + outSlope: -174.8461 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.079661414 + value: 12.553129 + inSlope: -174.8461 + outSlope: -143.41913 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.087527566 + value: 11.424973 + inSlope: -143.41913 + outSlope: -119.76661 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.0953937 + value: 10.482872 + inSlope: -119.76661 + outSlope: -101.519356 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.10325985 + value: 9.684306 + inSlope: -101.519356 + outSlope: -87.14706 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.11112598 + value: 8.9987955 + inSlope: -87.14706 + outSlope: -75.62513 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.11899213 + value: 8.403917 + inSlope: -75.62513 + outSlope: -66.24654 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.12685826 + value: 7.882813 + inSlope: -66.24654 + outSlope: -58.510654 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.13472441 + value: 7.4225597 + inSlope: -58.510654 + outSlope: -52.055042 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.14259055 + value: 7.0130873 + inSlope: -52.055042 + outSlope: -46.612007 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.1504567 + value: 6.6464305 + inSlope: -46.612007 + outSlope: -41.98024 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.15832284 + value: 6.316208 + inSlope: -41.98024 + outSlope: -38.006134 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.16618897 + value: 6.0172467 + inSlope: -38.006134 + outSlope: -34.570965 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.17405513 + value: 5.745306 + inSlope: -34.570965 + outSlope: -31.581244 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.18192126 + value: 5.496884 + inSlope: -31.581244 + outSlope: -28.963417 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.1897874 + value: 5.2690535 + inSlope: -28.963417 + outSlope: -26.658009 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.19765353 + value: 5.059358 + inSlope: -26.658009 + outSlope: -24.617418 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.20551969 + value: 4.8657136 + inSlope: -24.617418 + outSlope: -22.802412 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.21338584 + value: 4.6863465 + inSlope: -22.802412 + outSlope: -21.181019 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.22125196 + value: 4.519734 + inSlope: -21.181019 + outSlope: -19.72667 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.22911811 + value: 4.364561 + inSlope: -19.72667 + outSlope: -18.417059 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.23698425 + value: 4.21969 + inSlope: -18.417059 + outSlope: -17.233776 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.2448504 + value: 4.0841265 + inSlope: -17.233776 + outSlope: -16.160883 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.25271654 + value: 3.9570026 + inSlope: -16.160883 + outSlope: -15.185221 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.2605827 + value: 3.8375535 + inSlope: -15.185221 + outSlope: -14.295299 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.2684488 + value: 3.725105 + inSlope: -14.295299 + outSlope: -13.481375 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.27631494 + value: 3.6190586 + inSlope: -13.481375 + outSlope: -12.735047 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.28418112 + value: 3.5188825 + inSlope: -12.735047 + outSlope: -12.04901 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.29204726 + value: 3.4241033 + inSlope: -12.04901 + outSlope: -11.416967 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.2999134 + value: 3.3342957 + inSlope: -11.416967 + outSlope: -10.8334 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.30777952 + value: 3.249079 + inSlope: -10.8334 + outSlope: -10.293426 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.31564566 + value: 3.1681094 + inSlope: -10.293426 + outSlope: -9.792865 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.3235118 + value: 3.0910773 + inSlope: -9.792865 + outSlope: -9.327949 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.33137795 + value: 3.0177023 + inSlope: -9.327949 + outSlope: -8.895375 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.33924407 + value: 2.9477303 + inSlope: -8.895375 + outSlope: -8.492224 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.34711024 + value: 2.880929 + inSlope: -8.492224 + outSlope: -8.115812 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.3549764 + value: 2.8170888 + inSlope: -8.115812 + outSlope: -7.76395 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.36284253 + value: 2.7560165 + inSlope: -7.76395 + outSlope: -7.434456 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.37070867 + value: 2.697536 + inSlope: -7.434456 + outSlope: -7.1255083 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.3785748 + value: 2.641486 + inSlope: -7.1255083 + outSlope: -6.8354197 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.38644093 + value: 2.5877175 + inSlope: -6.8354197 + outSlope: -6.562695 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.39430708 + value: 2.5360944 + inSlope: -6.562695 + outSlope: -6.305974 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.40217322 + value: 2.4864907 + inSlope: -6.305974 + outSlope: -6.064021 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4100394 + value: 2.43879 + inSlope: -6.064021 + outSlope: -5.835745 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4179055 + value: 2.3928854 + inSlope: -5.835745 + outSlope: -5.6201315 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.42577165 + value: 2.3486767 + inSlope: -5.6201315 + outSlope: -5.4162097 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4336378 + value: 2.306072 + inSlope: -5.4162097 + outSlope: -5.223229 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.44150394 + value: 2.2649853 + inSlope: -5.223229 + outSlope: -5.040342 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4493701 + value: 2.2253373 + inSlope: -5.040342 + outSlope: -4.8669295 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4572362 + value: 2.1870534 + inSlope: -4.8669295 + outSlope: -4.7023005 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.46510234 + value: 2.1500645 + inSlope: -4.7023005 + outSlope: -4.5458865 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.47296852 + value: 2.1143057 + inSlope: -4.5458865 + outSlope: -4.3971753 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.48083466 + value: 2.079717 + inSlope: -4.3971753 + outSlope: -4.2555995 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4887008 + value: 2.0462418 + inSlope: -4.2555995 + outSlope: -4.1207685 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.49656692 + value: 2.0138273 + inSlope: -4.1207685 + outSlope: -3.9922712 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.5044331 + value: 1.9824234 + inSlope: -3.9922712 + outSlope: -3.8696532 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.5122992 + value: 1.9519844 + inSlope: -3.8696532 + outSlope: -3.7526293 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.5201653 + value: 1.9224657 + inSlope: -3.7526293 + outSlope: -3.6408176 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.52803147 + value: 1.8938265 + inSlope: -3.6408176 + outSlope: -3.5339315 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.5358976 + value: 1.8660281 + inSlope: -3.5339315 + outSlope: -3.4316826 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.54376376 + value: 1.839034 + inSlope: -3.4316826 + outSlope: -3.3338284 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.5516299 + value: 1.8128096 + inSlope: -3.3338284 + outSlope: -3.240066 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.55949605 + value: 1.7873228 + inSlope: -3.240066 + outSlope: -3.1502352 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.56736225 + value: 1.7625424 + inSlope: -3.1502352 + outSlope: -3.0640743 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.5752284 + value: 1.7384399 + inSlope: -3.0640743 + outSlope: -2.9814053 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.58309454 + value: 1.7149878 + inSlope: -2.9814053 + outSlope: -2.9020314 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.5909606 + value: 1.6921601 + inSlope: -2.9020314 + outSlope: -2.8257964 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.59882677 + value: 1.669932 + inSlope: -2.8257964 + outSlope: -2.7525082 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.6066929 + value: 1.6482804 + inSlope: -2.7525082 + outSlope: -2.6820538 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.61455905 + value: 1.627183 + inSlope: -2.6820538 + outSlope: -2.6142666 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.6224252 + value: 1.6066188 + inSlope: -2.6142666 + outSlope: -2.5490105 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.63029134 + value: 1.5865679 + inSlope: -2.5490105 + outSlope: -2.4861636 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.6381575 + value: 1.5670114 + inSlope: -2.4861636 + outSlope: -2.4256358 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.64602363 + value: 1.547931 + inSlope: -2.4256358 + outSlope: -2.3672597 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.6538898 + value: 1.5293097 + inSlope: -2.3672597 + outSlope: -2.3109925 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.66175586 + value: 1.5111313 + inSlope: -2.3109925 + outSlope: -2.2566907 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.669622 + value: 1.4933798 + inSlope: -2.2566907 + outSlope: -2.2042859 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.67748815 + value: 1.4760406 + inSlope: -2.2042859 + outSlope: -2.1536992 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.6853543 + value: 1.4590993 + inSlope: -2.1536992 + outSlope: -2.1048093 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.6932205 + value: 1.4425424 + inSlope: -2.1048093 + outSlope: -2.0575728 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.70108664 + value: 1.4263573 + inSlope: -2.0575728 + outSlope: -2.011927 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7089528 + value: 1.4105312 + inSlope: -2.011927 + outSlope: -1.9677659 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7168189 + value: 1.3950524 + inSlope: -1.9677659 + outSlope: -1.9250447 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7246851 + value: 1.3799098 + inSlope: -1.9250447 + outSlope: -1.8837026 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7325512 + value: 1.3650923 + inSlope: -1.8837026 + outSlope: -1.8436778 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7404173 + value: 1.3505898 + inSlope: -1.8436778 + outSlope: -1.8049132 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.74828345 + value: 1.336392 + inSlope: -1.8049132 + outSlope: -1.7673749 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7561496 + value: 1.3224896 + inSlope: -1.7673749 + outSlope: -1.7309732 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.76401573 + value: 1.3088735 + inSlope: -1.7309732 + outSlope: -1.695693 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7718819 + value: 1.295535 + inSlope: -1.695693 + outSlope: -1.6614736 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.779748 + value: 1.2824656 + inSlope: -1.6614736 + outSlope: -1.6282848 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.78761417 + value: 1.2696573 + inSlope: -1.6282848 + outSlope: -1.5960962 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7954803 + value: 1.2571021 + inSlope: -1.5960962 + outSlope: -1.564832 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.80334646 + value: 1.2447929 + inSlope: -1.564832 + outSlope: -1.5344887 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.81121254 + value: 1.2327225 + inSlope: -1.5344887 + outSlope: -1.5050048 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.81907874 + value: 1.2208838 + inSlope: -1.5050048 + outSlope: -1.4763738 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.8269449 + value: 1.2092705 + inSlope: -1.4763738 + outSlope: -1.4485649 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.83481103 + value: 1.1978759 + inSlope: -1.4485649 + outSlope: -1.4215137 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.8426772 + value: 1.186694 + inSlope: -1.4215137 + outSlope: -1.3952202 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.8505433 + value: 1.175719 + inSlope: -1.3952202 + outSlope: -1.369639 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.85840946 + value: 1.1649452 + inSlope: -1.369639 + outSlope: -1.3447852 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.8662756 + value: 1.154367 + inSlope: -1.3447852 + outSlope: -1.320568 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.87414175 + value: 1.1439792 + inSlope: -1.320568 + outSlope: -1.2970176 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.8820079 + value: 1.1337767 + inSlope: -1.2970176 + outSlope: -1.2740829 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.889874 + value: 1.1237546 + inSlope: -1.2740829 + outSlope: -1.2517655 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.8977401 + value: 1.113908 + inSlope: -1.2517655 + outSlope: -1.2300034 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.90560627 + value: 1.1042327 + inSlope: -1.2300034 + outSlope: -1.2088321 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.9134724 + value: 1.0947238 + inSlope: -1.2088321 + outSlope: -1.1881914 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.92133856 + value: 1.0853773 + inSlope: -1.1881914 + outSlope: -1.1680659 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.9292047 + value: 1.0761892 + inSlope: -1.1680659 + outSlope: -1.1484709 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.93707085 + value: 1.0671551 + inSlope: -1.1484709 + outSlope: -1.1293371 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.94493705 + value: 1.0582715 + inSlope: -1.1293371 + outSlope: -1.1106901 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.9528032 + value: 1.0495347 + inSlope: -1.1106901 + outSlope: -1.0925045 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.96066934 + value: 1.0409409 + inSlope: -1.0925045 + outSlope: -1.0747513 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.9685354 + value: 1.0324868 + inSlope: -1.0747513 + outSlope: -1.0574516 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.97640157 + value: 1.0241687 + inSlope: -1.0574516 + outSlope: -1.0405389 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.9842677 + value: 1.0159837 + inSlope: -1.0405389 + outSlope: -1.0240355 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.99213386 + value: 1.0079285 + inSlope: -1.0240355 + outSlope: -1.0079259 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: -1.0079259 + outSlope: 0 + tangentMode: 69 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 100 + _receivers: [] + - rid: 2262690579536937008 + type: {class: Neuron, ns: , asm: Assembly-CSharp} + data: + name: Position + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690579536937007 + - rid: 2262690579536937009 + - rid: 2262690579536937009 + type: {class: Neuron, ns: , asm: Assembly-CSharp} + data: + name: Velocity + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - nucleus: + rid: 2262690579536937008 + weight: 1 + - nucleus: + rid: 2262690579536937010 + weight: 1 + combinator: 0 + _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 + _receivers: [] + - rid: 2262690579536937010 + type: {class: MemoryCell, ns: , asm: Assembly-CSharp} + data: + name: New memory cell + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 1 + _receivers: + - rid: 2262690579536937009 + staticMemory: 0 diff --git a/NewVelocity.asset.meta b/NewVelocity.asset.meta new file mode 100644 index 0000000..5718f8b --- /dev/null +++ b/NewVelocity.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 61eea9f818639ec20b7a7bf4e86fff66 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Nucleus.cs b/Nucleus.cs new file mode 100644 index 0000000..2b1f5da --- /dev/null +++ b/Nucleus.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +[Serializable] +public abstract class Nucleus { + public string name; + + [SerializeReference] + public ClusterPrefab clusterPrefab; + [SerializeReference] + public Cluster parent; + + public bool trace = false; + + public abstract Nucleus ShallowCloneTo(Cluster parent); + public abstract Nucleus Clone(ClusterPrefab prefab); + + public enum Type { + None, + Neuron, + MemoryCell, + Cluster, + Receptor, + ClusterReceptor, + } + + #region Synapses + + public Vector3 bias = Vector3.zero; + + [SerializeField] + private List _synapses = new(); + public List synapses => _synapses; + + public Synapse AddSynapse(Neuron sendingNucleus, float weight = 1.0f) { + Synapse synapse = new(sendingNucleus, weight); + this.synapses.Add(synapse); + return synapse; + } + + public Synapse GetSynapse(Nucleus sender) { + foreach (Synapse synapse in this.synapses) + if (synapse.neuron == sender) + return synapse; + return null; + } + + public void RemoveSynapse(Nucleus sendingNucleus) { + this.synapses.RemoveAll(synapse => synapse.neuron == sendingNucleus); + } + + #endregion Synapses + + #region Update + + public abstract void UpdateStateIsolated(); + + public virtual void UpdateNuclei() { + } + + public virtual void SetBias(Vector3 inputValue) { + this.bias = inputValue; + this.parent.UpdateFromNucleus(this); + } + + public virtual void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = "") { + } + + #endregion Update + +} \ No newline at end of file diff --git a/Nucleus.cs.meta b/Nucleus.cs.meta new file mode 100644 index 0000000..08b3cf8 --- /dev/null +++ b/Nucleus.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4310eea6ab77628b085387a226c1c386 \ No newline at end of file diff --git a/NucleusArray.cs b/NucleusArray.cs new file mode 100644 index 0000000..9f8a172 --- /dev/null +++ b/NucleusArray.cs @@ -0,0 +1,157 @@ +using System.Linq; +using System.Collections.Generic; +using UnityEngine; +using Unity.Mathematics; +using static Unity.Mathematics.math; + +[System.Serializable] +public class NucleusArray { + [SerializeReference] + private Nucleus[] _nuclei; + public Nucleus[] nuclei { + get { + return _nuclei; + } + set { + _nuclei = value; + } + } + + public NucleusArray(Nucleus nucleus) { + this._nuclei = new Nucleus[1]; + this._nuclei[0] = nucleus; + } + public NucleusArray(ClusterPrefab cluster) { + this._nuclei = new Nucleus[0]; + } + public NucleusArray(int size, string name) { + this._nuclei = new Nucleus[size]; + } + + + public void AddNucleus(ClusterPrefab prefab) { + if (this._nuclei.Length == 0) { + Debug.LogError("Empty perceptoid array, cannot add"); + return; + } + int newLength = this._nuclei.Length + 1; + Nucleus[] newArray = new Nucleus[newLength]; + + for (int i = 0; i < this._nuclei.Length; i++) + newArray[i] = this._nuclei[i]; + if (this._nuclei[0] is Nucleus nucleus) { + newArray[newLength - 1] = nucleus.Clone(prefab); + newArray[newLength - 1].name += $": {newLength - 1}"; + } + + this._nuclei = newArray; + } + + public void RemoveNucleus() { + int newLength = this._nuclei.Length - 1; + if (newLength == 0) { + Debug.LogWarning("Perceptoid array cannot be empty"); + return; + } + Nucleus[] newPerceptei = new Nucleus[newLength]; + for (int i = 0; i < newLength; i++) + newPerceptei[i] = this._nuclei[i]; + // Delete the last perception + if (this._nuclei[newLength] is Nucleus nucleus) + Neuron.Delete(nucleus); //this._nuclei[newLength]); + + this._nuclei = newPerceptei; + } + + public Dictionary thingReceivers = new(); + + + private Nucleus FindReceiver(int thingId, float3 inputValue) { + // No existing nucleus for this thing + float inputMagnitude = length(inputValue); + Neuron selectedReceiver = null; + float selectedMagnitude = 0; + foreach (Nucleus nucleusReceiver in this._nuclei) { + if (nucleusReceiver is not Neuron receiver) + continue; + if (thingReceivers.ContainsValue(receiver) == false) { + // We found an unusued receiver + thingReceivers.Add(thingId, receiver); + return receiver; + } + else if (receiver.isSleeping) { + // A sleeping receiver is not active and can therefore always be used + thingReceivers.Add(thingId, receiver); + return receiver; + } + else if (selectedReceiver == null) { + // If we haven't found a receiver yet, just start by taking the first + selectedReceiver = receiver; + selectedMagnitude = length(selectedReceiver.outputValue); + } + // Look for the receiver with the lowest magnitude + else { + float magnitude = length(receiver.outputValue); + + if (magnitude < inputMagnitude && length(receiver.outputValue) < selectedMagnitude) { + selectedReceiver = receiver; + selectedMagnitude = length(selectedReceiver.outputValue); + } + } + } + if (selectedReceiver != null) { + // Replace the receiver + // Find the thingId current associated with the receiver + int keyToRemove = thingReceivers.FirstOrDefault(r => r.Value.Equals(selectedReceiver)).Key; + if (keyToRemove != 0 || thingReceivers.ContainsKey(keyToRemove)) + thingReceivers.Remove(keyToRemove); + // And add the new association + thingReceivers.Add(thingId, selectedReceiver); + } + return selectedReceiver; + } + + public virtual void ProcessStimulus(int thingId, Vector3 inputValue, string thingName = null) { + CleanupReceivers(); + + if (this._nuclei[0] is Neuron neuron) + inputValue = neuron.Activator(inputValue); + + if (!thingReceivers.TryGetValue(thingId, out Nucleus selectedReceiver)) { + // No existing nucleus for this thing + selectedReceiver = FindReceiver(thingId, inputValue); + } + if (selectedReceiver == null) + return; + + if (thingName != null) { + string baseName = selectedReceiver.name; + int colonPos = selectedReceiver.name.IndexOf(":"); + if (colonPos > 0) + baseName = selectedReceiver.name[..colonPos]; + selectedReceiver.name = baseName + ": " + thingName; + } + + if (selectedReceiver is Neuron selectedNucleus) + selectedNucleus.ProcessStimulusDirect(inputValue); + } + + private void CleanupReceivers() { + // Remove a thing-receiver connection when the nucleus is inactive + List receiversToRemove = new(); + foreach (KeyValuePair item in thingReceivers) { + if (item.Value != null && item.Value is Neuron neuron && neuron.isSleeping) + receiversToRemove.Add(item.Key); + } + foreach (int thingId in receiversToRemove) { + Nucleus selectedReceiver = thingReceivers[thingId]; + + thingReceivers.Remove(thingId); + + int colonPos = selectedReceiver.name.IndexOf(":"); + if (colonPos > 0) + selectedReceiver.name = selectedReceiver.name[..colonPos]; + + } + } +} \ No newline at end of file diff --git a/NucleusArray.cs.meta b/NucleusArray.cs.meta new file mode 100644 index 0000000..61e26b7 --- /dev/null +++ b/NucleusArray.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f8cac60bd79854595a8571c042f77998 \ No newline at end of file diff --git a/Receptor.cs b/Receptor.cs new file mode 100644 index 0000000..a102835 --- /dev/null +++ b/Receptor.cs @@ -0,0 +1,78 @@ +using UnityEngine; +using Unity.Mathematics; +using static Unity.Mathematics.math; + +[System.Serializable] +public class Receptor : Neuron, IReceptor { + public Receptor(Cluster parent, string name) : base(parent, name) { + this.array = new NucleusArray(this); + if (this.name.IndexOf(":") < 0) + this.name += ": 0"; + } + public Receptor(ClusterPrefab prefab, string name) : base(prefab, name) { + this.array = new NucleusArray(this); + } + + public string GetName() { + return this.name; + } + + public override Nucleus ShallowCloneTo(Cluster parent) { + Receptor clone = new(parent, name) { + + }; + CloneFields(clone); + return clone; + } + public override Nucleus Clone(ClusterPrefab prefab) { + Receptor clone = new(prefab, name) { + array = this._array + }; + CloneFields(clone); + // Adding receivers will also add synapses to the receivers + foreach (Nucleus receiver in this.receivers.ToArray()) + clone.AddReceiver(receiver); + + return clone; + } + + [SerializeReference] + private NucleusArray _array; + public NucleusArray array { + set { _array = value; } + } + + public Nucleus[] nucleiArray { + get { return _array.nuclei; } + set { _array.nuclei = value; } + } + + public void AddReceptorElement(ClusterPrefab prefab) { + IReceptorHelpers.AddReceptorElement(this, prefab); + } + + public void RemoveReceptorElement() { + IReceptorHelpers.RemoveReceptorElement(this); + } + + public virtual void AddArrayReceiver(Nucleus receiverToAdd, float weight = 1) { + IReceptorHelpers.AddArrayReceiver(this, receiverToAdd, weight); + } + + public override void UpdateStateIsolated() { + this.outputValue = this.bias; + } + + public override void UpdateNuclei() { + this.stale++; + if (this.stale > staleValueForSleep && lengthsq(this.bias) > 0) { + this.bias = new float3(0, 0, 0); + this.parent.UpdateFromNucleus(this); + } + } + + public override void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = null) { + this._array ??= new NucleusArray(this.parent); + this._array.ProcessStimulus(thingId, inputValue, thingName); + } +} \ No newline at end of file diff --git a/Receptor.cs.meta b/Receptor.cs.meta new file mode 100644 index 0000000..56793ae --- /dev/null +++ b/Receptor.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cfb9734aebc3ab85aacf87d26fb92e55 \ No newline at end of file diff --git a/Scene.meta b/Scene.meta new file mode 100644 index 0000000..d71b5e5 --- /dev/null +++ b/Scene.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bfd7dadd61c0891d8a94db0196e61a8a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scene/TestScene Boid.unity b/Scene/TestScene Boid.unity new file mode 100644 index 0000000..401756e --- /dev/null +++ b/Scene/TestScene Boid.unity @@ -0,0 +1,487 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 2 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1001 &551770709 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalPosition.x + value: 0.71 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093763, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_Name + value: Boid2 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} +--- !u!1 &968074744 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 968074747} + - component: {fileID: 968074746} + - component: {fileID: 968074745} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &968074745 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 968074744} + m_Enabled: 1 +--- !u!20 &968074746 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 968074744} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &968074747 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 968074744} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1342149740 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1342149742} + - component: {fileID: 1342149741} + m_Layer: 0 + m_Name: SwamControl + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1342149741 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1342149740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0464906885ae3494f8fd0314719fb2db, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::SwarmControl + speed: 0.5 + inertia: 0.1 + alignmentForce: 0 + cohesionForce: 1 + separationForce: 1 + avoidanceForce: 5 + separationDistance: 0.5 + perceptionDistance: 1 + spaceSize: {x: 10, y: 10, z: 10} + boundaryWidth: {x: 1, y: 1, z: 1} +--- !u!4 &1342149742 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1342149740} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.00377, y: -1.02283, z: 0.72231} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2011285159 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2011285161} + - component: {fileID: 2011285160} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &2011285160 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2011285159} + m_Enabled: 1 + serializedVersion: 12 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize2D: {x: 0.5, y: 0.5} + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!4 &2011285161 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2011285159} + serializedVersion: 2 + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1001 &4573752827112804207 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7761516481062093763, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} + propertyPath: m_Name + value: Boid1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 968074747} + - {fileID: 2011285161} + - {fileID: 4573752827112804207} + - {fileID: 551770709} + - {fileID: 1342149742} diff --git a/Scene/TestScene Boid.unity.meta b/Scene/TestScene Boid.unity.meta new file mode 100644 index 0000000..81fe061 --- /dev/null +++ b/Scene/TestScene Boid.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4f343147e37db9eeda3e98058c553c92 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scene/TestScene Experiment.unity b/Scene/TestScene Experiment.unity new file mode 100644 index 0000000..ac54ba4 --- /dev/null +++ b/Scene/TestScene Experiment.unity @@ -0,0 +1,365 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 2 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &388118692 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 388118694} + - component: {fileID: 388118693} + m_Layer: 0 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &388118693 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 388118692} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9051408e82b511584998506096af4bf0, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::SelectorBrain + defaultBrain: {fileID: 11400000, guid: d5b3a22d9bb7d13aeb3174077125967b, type: 2} + input1: {x: 0, y: 0, z: 1} + input2: {x: 0, y: -2, z: 0} + output: {x: 0, y: 0, z: 0} +--- !u!4 &388118694 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 388118692} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2.01476, y: -0, z: 0.65362} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &968074744 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 968074747} + - component: {fileID: 968074746} + - component: {fileID: 968074745} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &968074745 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 968074744} + m_Enabled: 1 +--- !u!20 &968074746 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 968074744} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &968074747 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 968074744} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2011285159 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2011285161} + - component: {fileID: 2011285160} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &2011285160 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2011285159} + m_Enabled: 1 + serializedVersion: 12 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize2D: {x: 0.5, y: 0.5} + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!4 &2011285161 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2011285159} + serializedVersion: 2 + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 968074747} + - {fileID: 2011285161} + - {fileID: 388118694} diff --git a/Scene/TestScene Experiment.unity.meta b/Scene/TestScene Experiment.unity.meta new file mode 100644 index 0000000..676153c --- /dev/null +++ b/Scene/TestScene Experiment.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1070383882ed0f5379a3b34e8ccb1f75 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts.meta b/Scripts.meta new file mode 100644 index 0000000..6083b0e --- /dev/null +++ b/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 363b69b84de0e4b729794c10e7c40ab5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/Experimental.meta b/Scripts/Experimental.meta new file mode 100644 index 0000000..7c7ad14 --- /dev/null +++ b/Scripts/Experimental.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2c1e3956a0b70ae6b8d09fb467b73621 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/NeuraalNetwerkIcoonSchets1.png b/Scripts/NeuraalNetwerkIcoonSchets1.png new file mode 100644 index 0000000000000000000000000000000000000000..82980ef9531ebefbf60dfd4bb2d8f0c0b99f2798 GIT binary patch literal 63771 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 s)rO#lD@ literal 0 HcmV?d00001 diff --git a/Scripts/NeuraalNetwerkIcoonSchets1.png.meta b/Scripts/NeuraalNetwerkIcoonSchets1.png.meta new file mode 100644 index 0000000..f31713f --- /dev/null +++ b/Scripts/NeuraalNetwerkIcoonSchets1.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: cad48149d984d2eddae5808eb1517cb5 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/NeuraalNetwerkIcoonSchets2.png b/Scripts/NeuraalNetwerkIcoonSchets2.png new file mode 100644 index 0000000000000000000000000000000000000000..35853d65078c2e6c2326da8a10e5f8d57db43a76 GIT binary patch literal 39373 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 literal 0 HcmV?d00001 diff --git a/Scripts/NeuraalNetwerkIcoonSchets2.png.meta b/Scripts/NeuraalNetwerkIcoonSchets2.png.meta new file mode 100644 index 0000000..9abd599 --- /dev/null +++ b/Scripts/NeuraalNetwerkIcoonSchets2.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 2e644ed036e8939bf94586314a4f4607 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Synapse.cs b/Synapse.cs new file mode 100644 index 0000000..424b7e6 --- /dev/null +++ b/Synapse.cs @@ -0,0 +1,15 @@ +using System; +using UnityEngine; + +[Serializable] +public class Synapse { + [SerializeReference] + public Neuron neuron; + + public float weight; + + public Synapse(Neuron nucleus, float weight = 1.0f) { + this.neuron = nucleus; + this.weight = weight; + } +} \ No newline at end of file diff --git a/Synapse.cs.meta b/Synapse.cs.meta new file mode 100644 index 0000000..e62612c --- /dev/null +++ b/Synapse.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 334a58eafccd60cbdb32f719e9e861c6 \ No newline at end of file diff --git a/Velocity.asset b/Velocity.asset new file mode 100644 index 0000000..0001385 --- /dev/null +++ b/Velocity.asset @@ -0,0 +1,128 @@ +%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: Velocity + m_EditorClassIdentifier: Assembly-CSharp::ClusterPrefab + nuclei: + - rid: 2262690551513219315 + - rid: 2262690551513219316 + - rid: 2262690551513219317 + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } + - rid: 2262690551513219315 + type: {class: Neuron, ns: , asm: Assembly-CSharp} + data: + name: Velocity + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - nucleus: + rid: 2262690551513219316 + weight: 1 + - nucleus: + rid: 2262690551513219317 + weight: 1 + combinator: 0 + _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 + _receivers: [] + - rid: 2262690551513219316 + type: {class: Neuron, ns: , asm: Assembly-CSharp} + data: + name: Position + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690551513219315 + - rid: 2262690551513219317 + type: {class: MemoryCell, ns: , asm: Assembly-CSharp} + data: + name: New memory cell + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 1 + _receivers: + - rid: 2262690551513219315 + staticMemory: 0 diff --git a/Velocity.asset.meta b/Velocity.asset.meta new file mode 100644 index 0000000..38684df --- /dev/null +++ b/Velocity.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c61aecac62c26de4aaefb2612bcc9a5d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: From 3c6f2c1f66097d39efbb0db4508a30a4be54b063 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 7 Apr 2026 09:13:31 +0200 Subject: [PATCH 02/38] Added NanoBrain subtree --- NanoBrain.meta | 8 ++++++++ NanoBrain/Cluster.cs.meta | 11 ++++++++++- NanoBrain/ClusterPrefab.cs.meta | 11 ++++++++++- NanoBrain/ClusterReceptor.cs.meta | 11 ++++++++++- NanoBrain/Editor/BrainPickerWindow.cs.meta | 11 ++++++++++- NanoBrain/Editor/ClusterInspector.cs.meta | 11 ++++++++++- NanoBrain/Editor/DAGWindow.cs.meta | 11 ++++++++++- NanoBrain/Editor/NanoBrain_Editor.cs.meta | 11 ++++++++++- NanoBrain/IReceptor.cs.meta | 11 ++++++++++- NanoBrain/LinearAlgebra/test/SphericalTest.cs | 4 ++-- NanoBrain/MemoryCell.cs.meta | 11 ++++++++++- NanoBrain/NanoBrain.cs.meta | 11 ++++++++++- NanoBrain/Neuron.cs.meta | 11 ++++++++++- NanoBrain/Nucleus.cs.meta | 11 ++++++++++- NanoBrain/NucleusArray.cs.meta | 11 ++++++++++- NanoBrain/Receptor.cs.meta | 11 ++++++++++- NanoBrain/Synapse.cs.meta | 11 ++++++++++- 17 files changed, 160 insertions(+), 17 deletions(-) create mode 100644 NanoBrain.meta diff --git a/NanoBrain.meta b/NanoBrain.meta new file mode 100644 index 0000000..2c2f132 --- /dev/null +++ b/NanoBrain.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c5f07463dfa08efc1bad0f3039a4cecc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/Cluster.cs.meta b/NanoBrain/Cluster.cs.meta index a10caff..c77fea0 100644 --- a/NanoBrain/Cluster.cs.meta +++ b/NanoBrain/Cluster.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: f13cdc4a175a9f379a00317ae68d8bea \ No newline at end of file +guid: f13cdc4a175a9f379a00317ae68d8bea +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/ClusterPrefab.cs.meta b/NanoBrain/ClusterPrefab.cs.meta index ee35e0b..d8dad7a 100644 --- a/NanoBrain/ClusterPrefab.cs.meta +++ b/NanoBrain/ClusterPrefab.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 60a957541c24c57e78018c202ebb1d9b \ No newline at end of file +guid: 60a957541c24c57e78018c202ebb1d9b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/ClusterReceptor.cs.meta b/NanoBrain/ClusterReceptor.cs.meta index 027f164..e3543da 100644 --- a/NanoBrain/ClusterReceptor.cs.meta +++ b/NanoBrain/ClusterReceptor.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 4f64f5d72a422a7c8bb9ace598432aad \ No newline at end of file +guid: 4f64f5d72a422a7c8bb9ace598432aad +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/Editor/BrainPickerWindow.cs.meta b/NanoBrain/Editor/BrainPickerWindow.cs.meta index b2de114..1468869 100644 --- a/NanoBrain/Editor/BrainPickerWindow.cs.meta +++ b/NanoBrain/Editor/BrainPickerWindow.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 9197e2d322d23b5798ab4aef729815b0 \ No newline at end of file +guid: 9197e2d322d23b5798ab4aef729815b0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/Editor/ClusterInspector.cs.meta b/NanoBrain/Editor/ClusterInspector.cs.meta index a1a18f5..a933254 100644 --- a/NanoBrain/Editor/ClusterInspector.cs.meta +++ b/NanoBrain/Editor/ClusterInspector.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 1fc1fb7db9f7ad54a87d31313e7f457d \ No newline at end of file +guid: 1fc1fb7db9f7ad54a87d31313e7f457d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/Editor/DAGWindow.cs.meta b/NanoBrain/Editor/DAGWindow.cs.meta index ea0ee9e..8765c5a 100644 --- a/NanoBrain/Editor/DAGWindow.cs.meta +++ b/NanoBrain/Editor/DAGWindow.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 95393aed582b8b30d965400672aec4d8 \ No newline at end of file +guid: 95393aed582b8b30d965400672aec4d8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/Editor/NanoBrain_Editor.cs.meta b/NanoBrain/Editor/NanoBrain_Editor.cs.meta index eaf830b..c91bea9 100644 --- a/NanoBrain/Editor/NanoBrain_Editor.cs.meta +++ b/NanoBrain/Editor/NanoBrain_Editor.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: f05072314d39990639a2dbf99f322664 \ No newline at end of file +guid: f05072314d39990639a2dbf99f322664 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/IReceptor.cs.meta b/NanoBrain/IReceptor.cs.meta index 0c0ee6f..446d88c 100644 --- a/NanoBrain/IReceptor.cs.meta +++ b/NanoBrain/IReceptor.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 73f052292ad16bb53a3c07aa1694c705 \ No newline at end of file +guid: 73f052292ad16bb53a3c07aa1694c705 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/LinearAlgebra/test/SphericalTest.cs b/NanoBrain/LinearAlgebra/test/SphericalTest.cs index b28b9d9..658ca04 100644 --- a/NanoBrain/LinearAlgebra/test/SphericalTest.cs +++ b/NanoBrain/LinearAlgebra/test/SphericalTest.cs @@ -1,4 +1,4 @@ -//#if !UNITY_5_6_OR_NEWER +#if !UNITY_5_6_OR_NEWER using System; using System.Collections.Generic; using NUnit.Framework; @@ -268,4 +268,4 @@ namespace LinearAlgebra.Test { } } -//#endif \ No newline at end of file +#endif \ No newline at end of file diff --git a/NanoBrain/MemoryCell.cs.meta b/NanoBrain/MemoryCell.cs.meta index ef74aba..24dc14d 100644 --- a/NanoBrain/MemoryCell.cs.meta +++ b/NanoBrain/MemoryCell.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 29633aa3fe5cd9dcc8d886051f45d4d8 \ No newline at end of file +guid: 29633aa3fe5cd9dcc8d886051f45d4d8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/NanoBrain.cs.meta b/NanoBrain/NanoBrain.cs.meta index 1666c60..fc8b1c9 100644 --- a/NanoBrain/NanoBrain.cs.meta +++ b/NanoBrain/NanoBrain.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 92f34a5e4027a1dc39efd8ce63cf6aba \ No newline at end of file +guid: 92f34a5e4027a1dc39efd8ce63cf6aba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/Neuron.cs.meta b/NanoBrain/Neuron.cs.meta index e520090..37266c0 100644 --- a/NanoBrain/Neuron.cs.meta +++ b/NanoBrain/Neuron.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 750748f3f0e7d472fbf88ab02987074c \ No newline at end of file +guid: 750748f3f0e7d472fbf88ab02987074c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/Nucleus.cs.meta b/NanoBrain/Nucleus.cs.meta index 08b3cf8..0868066 100644 --- a/NanoBrain/Nucleus.cs.meta +++ b/NanoBrain/Nucleus.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 4310eea6ab77628b085387a226c1c386 \ No newline at end of file +guid: 4310eea6ab77628b085387a226c1c386 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/NucleusArray.cs.meta b/NanoBrain/NucleusArray.cs.meta index 61e26b7..b03ebae 100644 --- a/NanoBrain/NucleusArray.cs.meta +++ b/NanoBrain/NucleusArray.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: f8cac60bd79854595a8571c042f77998 \ No newline at end of file +guid: f8cac60bd79854595a8571c042f77998 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/Receptor.cs.meta b/NanoBrain/Receptor.cs.meta index 56793ae..55f0467 100644 --- a/NanoBrain/Receptor.cs.meta +++ b/NanoBrain/Receptor.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: cfb9734aebc3ab85aacf87d26fb92e55 \ No newline at end of file +guid: cfb9734aebc3ab85aacf87d26fb92e55 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/Synapse.cs.meta b/NanoBrain/Synapse.cs.meta index e62612c..7c45e30 100644 --- a/NanoBrain/Synapse.cs.meta +++ b/NanoBrain/Synapse.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 334a58eafccd60cbdb32f719e9e861c6 \ No newline at end of file +guid: 334a58eafccd60cbdb32f719e9e861c6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 9fcbaa5bf84f91680d24b56dbf114bcb97de4aee Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 7 Apr 2026 14:07:27 +0200 Subject: [PATCH 03/38] Squashed 'NanoBrain/' changes from b3423b9..bef7ee2 bef7ee2 Made Unity.Mathematics optional git-subtree-dir: NanoBrain git-subtree-split: bef7ee24e549963b5cabfb91ada9289bc6dddbe0 --- Cluster.cs | 2 + ClusterReceptor.cs | 59 ++++++++++++++ Editor/ClusterInspector.cs | 30 ++++---- Editor/ConfigurationChecker.cs | 78 +++++++++++++++++++ Editor/ConfigurationChecker.cs.meta | 2 + MemoryCell.cs | 8 +- Neuron.cs | 115 +++++++++++++++++++++++++++- NucleusArray.cs | 51 ++++++++++++ Receptor.cs | 16 ++++ Runtime.meta | 8 ++ Runtime/Vector.cs | 8 ++ Runtime/Vector.cs.meta | 2 + 12 files changed, 362 insertions(+), 17 deletions(-) create mode 100644 Editor/ConfigurationChecker.cs create mode 100644 Editor/ConfigurationChecker.cs.meta create mode 100644 Runtime.meta create mode 100644 Runtime/Vector.cs create mode 100644 Runtime/Vector.cs.meta diff --git a/Cluster.cs b/Cluster.cs index 996fb2c..ba71852 100644 --- a/Cluster.cs +++ b/Cluster.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; using UnityEngine; +#if UNITY_MATHEMATICS using Unity.Mathematics; using static Unity.Mathematics.math; +#endif [Serializable] public class Cluster : Nucleus { diff --git a/ClusterReceptor.cs b/ClusterReceptor.cs index ac65e7a..fd925ed 100644 --- a/ClusterReceptor.cs +++ b/ClusterReceptor.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; using UnityEngine; +#if UNITY_MATHEMATICS using Unity.Mathematics; using static Unity.Mathematics.math; +#endif using System.Linq; [Serializable] @@ -140,6 +142,8 @@ public class ClusterReceptor : Cluster, IReceptor { selectedNeuron.ProcessStimulusDirect(inputValue); } +#if UNITY_MATHEMATICS + private ClusterReceptor FindReceiver2(int thingId, float3 inputValue, Neuron input) { // No existing nucleus for this thing ClusterReceptor selectedReceiver = null; @@ -192,6 +196,61 @@ public class ClusterReceptor : Cluster, IReceptor { return selectedReceiver; } +#else + + private ClusterReceptor FindReceiver2(int thingId, Vector3 inputValue, Neuron input) { + // No existing nucleus for this thing + ClusterReceptor selectedReceiver = null; + float selectedMagnitude = 0; + foreach (ClusterReceptor receiver in this.nucleiArray.Cast()) { + if (thingReceivers.ContainsValue(receiver) == false) { + // We found an unusued receiver + thingReceivers.Add(thingId, receiver); + return receiver; + } + else if (receiver.defaultOutput.isSleeping) { + // A sleeping receiver is not active and can therefore always be used + thingReceivers.Add(thingId, receiver); + receiver.bias = new Vector3(0, 0, 0); + return receiver; + } + else if (selectedReceiver == null) { + // If we haven't found a receiver yet, just start by taking the first + selectedReceiver = receiver; + selectedMagnitude = selectedReceiver.defaultOutput.outputValue.magnitude; + } + // Look for the receiver with the lowest output magnitude + else { + float magnitude = receiver.defaultOutput.outputValue.magnitude; + + if (receiver.defaultOutput.outputValue.magnitude < selectedMagnitude) { + selectedReceiver = receiver; + selectedMagnitude = selectedReceiver.defaultOutput.outputValue.magnitude; + } + } + } + if (selectedReceiver != null) { + // To re-initialize the cluster (esp. memory cells) + // we update the cluster neuron twice. + // Bit of a hack..... + int inputIx = GetNucleusIndex(this.clusterNuclei, input); + if (inputIx >= 0) { + if (selectedReceiver.clusterNuclei[inputIx] is Neuron selectedNeuron) + selectedNeuron.ProcessStimulusDirect(inputValue); + } + + // Replace the receiver + // Find the thingId current associated with the receiver + int keyToRemove = thingReceivers.FirstOrDefault(r => r.Value.Equals(selectedReceiver)).Key; + if (keyToRemove != 0 || thingReceivers.ContainsKey(keyToRemove)) + thingReceivers.Remove(keyToRemove); + // And add the new association + thingReceivers.Add(thingId, selectedReceiver); + } + return selectedReceiver; + } + +#endif private void CleanupReceivers() { // Remove a thing-receiver connection when the nucleus is inactive diff --git a/Editor/ClusterInspector.cs b/Editor/ClusterInspector.cs index 5aeb9c9..14e83fa 100644 --- a/Editor/ClusterInspector.cs +++ b/Editor/ClusterInspector.cs @@ -4,8 +4,10 @@ using UnityEditor; using UnityEngine; using UnityEngine.UIElements; -using Unity.Mathematics; -using static Unity.Mathematics.math; +// #if UNITY_MATHEMATICS +// using Unity.Mathematics; +// using static Unity.Mathematics.math; +// #endif [CustomEditor(typeof(ClusterPrefab))] public class ClusterInspector : Editor { @@ -263,7 +265,7 @@ public class ClusterInspector : Editor { float maxValue = 0; foreach (Nucleus nucleus in receptor1.nucleiArray) { if (nucleus is Neuron neuron) { - float value = length(neuron.outputValue); + float value = neuron.outputMagnitude; if (value > maxValue) maxValue = value; } @@ -313,9 +315,9 @@ public class ClusterInspector : Editor { Handles.DrawSolidDisc(position, Vector3.forward, size + 2); float maxValue = 1; if (this.currentNucleus is Neuron neuron) - maxValue = length(neuron.outputValue); + maxValue = neuron.outputMagnitude; else if (this.currentNucleus is Cluster cluster) - maxValue = length(cluster.defaultOutput.outputValue); + maxValue = cluster.defaultOutput.outputMagnitude; DrawNucleus(this.currentNucleus, position, maxValue, 20); @@ -327,9 +329,9 @@ public class ClusterInspector : Editor { Handles.DrawSolidDisc(position, Vector3.forward, size + 2); float maxValue = 1; if (this.currentNucleus is Neuron neuron) - maxValue = length(neuron.outputValue); + maxValue = neuron.outputMagnitude; else if (this.currentNucleus is Cluster cluster) - maxValue = length(cluster.defaultOutput.outputValue); + maxValue = cluster.defaultOutput.outputMagnitude; DrawNucleus(this.currentNucleus, position, maxValue, 20); } } @@ -350,7 +352,7 @@ public class ClusterInspector : Editor { float maxValue = 0; foreach (Nucleus receiver in receivers) { if (receiver is Neuron neuroid) { - float value = length(neuroid.outputValue); + float value = neuroid.outputMagnitude; if (value > maxValue) maxValue = value; } @@ -405,7 +407,7 @@ public class ClusterInspector : Editor { drawnArrays.Add(clusterReceptor.nucleiArray); } if (synapse.neuron is Neuron synapseNeuron) { - float value = length(synapseNeuron.outputValue) * synapse.weight; + float value = synapseNeuron.outputMagnitude * synapse.weight; // Debug.Log($"{synapse.nucleus.name}: {value} {length(synapse.nucleus.outputValue)} {synapse.weight}"); if (value > maxValue) maxValue = value; @@ -442,7 +444,7 @@ public class ClusterInspector : Editor { maxValue = 1; float brightness = 0; if (synapse.neuron is Neuron synapseNeuron) - brightness = length(synapseNeuron.outputValue * synapse.weight) / maxValue; + brightness = synapseNeuron.outputMagnitude * synapse.weight / maxValue; color = new Color(brightness, brightness, brightness, 1f); } if (synapse.neuron.parent != null && synapse.neuron.parent != this.currentNucleus.parent) { @@ -464,7 +466,7 @@ public class ClusterInspector : Editor { if (Application.isPlaying) { float brightness = 0; if (nucleus is Neuron neuron) - brightness = length(neuron.outputValue) / maxValue; + brightness = neuron.outputMagnitude / maxValue; color = new Color(brightness, brightness, brightness, 1f); } else @@ -557,7 +559,7 @@ public class ClusterInspector : Editor { if (nucleus is Neuron neuron) { tooltip = new( $"{nucleus.name}" + - $"\nValue: {length(neuron.outputValue)}"); + $"\nValue: {neuron.outputMagnitude}"); } else tooltip = new($"{nucleus.name}"); @@ -641,7 +643,7 @@ public class ClusterInspector : Editor { if (Application.isPlaying) { if (currentNucleus is Neuron currentNeuron1) { GUIContent nameLabel = new("Output", currentNeuron1.outputValue.ToString()); - EditorGUILayout.FloatField(nameLabel, length(currentNeuron1.outputValue)); + EditorGUILayout.FloatField(nameLabel, currentNeuron1.outputMagnitude); } else EditorGUILayout.LabelField(" "); @@ -723,7 +725,7 @@ public class ClusterInspector : Editor { if (synapse.neuron is Neuron synapseNeuron) { Vector3 value = synapseNeuron.outputValue * synapse.weight; GUIContent synapseValueLabel = new(synapse.neuron.name, synapseNeuron.outputValue.ToString()); - EditorGUILayout.FloatField(synapseValueLabel, length(synapseNeuron.outputValue)); + EditorGUILayout.FloatField(synapseValueLabel, synapseNeuron.outputMagnitude); } } else { diff --git a/Editor/ConfigurationChecker.cs b/Editor/ConfigurationChecker.cs new file mode 100644 index 0000000..e487d6d --- /dev/null +++ b/Editor/ConfigurationChecker.cs @@ -0,0 +1,78 @@ +using System; +using UnityEditor; +using UnityEditor.Build; +using UnityEditor.Callbacks; + +class ConfigurationChecker { + + [DidReloadScripts] + protected static void DidReloadScripts() { + CheckUnityMathematics(); + } + + public static bool CheckUnityMathematics() { + bool available = isUnityMathematicsAvailable; + UpdateDefine(available, "UNITY_MATHEMATICS"); + return available; + } + + protected static void UpdateDefine(bool enabled, string define) { + if (enabled) + GlobalDefine(define); + else + GlobalUndefine(define); + } + + + public static void GlobalDefine(string name) { + UnityEngine.Debug.Log("Define " + name); + BuildTargetGroup buildTargetGroup = EditorUserBuildSettings.selectedBuildTargetGroup; + NamedBuildTarget namedBuildTarget = UnityEditor.Build.NamedBuildTarget.FromBuildTargetGroup(buildTargetGroup); + //string scriptDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup); + string scriptDefines = PlayerSettings.GetScriptingDefineSymbols(namedBuildTarget); + if (!scriptDefines.Contains(name)) { + string newScriptDefines = scriptDefines + " " + name; + if (EditorUserBuildSettings.selectedBuildTargetGroup != 0) + PlayerSettings.SetScriptingDefineSymbols(namedBuildTarget, newScriptDefines); + //PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, newScriptDefines); + } + } + + public static void GlobalUndefine(string name) { + UnityEngine.Debug.Log("Undefine " + name); + BuildTargetGroup buildTargetGroup = EditorUserBuildSettings.selectedBuildTargetGroup; + NamedBuildTarget namedBuildTarget = UnityEditor.Build.NamedBuildTarget.FromBuildTargetGroup(buildTargetGroup); + // string scriptDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup); + string scriptDefines = PlayerSettings.GetScriptingDefineSymbols(namedBuildTarget); + if (scriptDefines.Contains(name)) { + int playMakerIndex = scriptDefines.IndexOf(name); + string newScriptDefines = scriptDefines.Remove(playMakerIndex, name.Length); + PlayerSettings.SetScriptingDefineSymbols(namedBuildTarget, newScriptDefines); + // PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, newScriptDefines); + } + + } + + #region Availability + + #region Packages + + private static bool isUnityMathematicsAvailable { + get => DoesTypeExist("Unity.Mathematics.float3"); + // { + // return DoesTypeExist("Passer.Tracking.HydraBaseStation"); + // } + } + #endregion Packages + + public static bool DoesTypeExist(string className) { + System.Reflection.Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (System.Reflection.Assembly assembly in assemblies) { + if (assembly.GetType(className) != null) + return true; + } + return false; + } + + #endregion Availability +} diff --git a/Editor/ConfigurationChecker.cs.meta b/Editor/ConfigurationChecker.cs.meta new file mode 100644 index 0000000..b8bea95 --- /dev/null +++ b/Editor/ConfigurationChecker.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c7539a20f7894542ca347730cd8417b1 \ No newline at end of file diff --git a/MemoryCell.cs b/MemoryCell.cs index 7b7b8e5..6b49084 100644 --- a/MemoryCell.cs +++ b/MemoryCell.cs @@ -1,5 +1,7 @@ using System; +#if UNITY_MATHEMATICS using Unity.Mathematics; +#endif [Serializable] public class MemoryCell : Neuron { @@ -28,11 +30,15 @@ public class MemoryCell : Neuron { private bool initialized = false; +#if UNITY_MATHEMATICS private float3 _memorizedValue; +#else + private UnityEngine.Vector3 _memorizedValue; +#endif public override void UpdateStateIsolated() { // A memorycell does not have an activation function - float3 result = Combinator(); + var result = Combinator(); if (initialized) // Output the previous, memorized value diff --git a/Neuron.cs b/Neuron.cs index 05982de..e1a0052 100644 --- a/Neuron.cs +++ b/Neuron.cs @@ -2,8 +2,10 @@ using System; using System.Collections.Generic; using UnityEngine; using UnityEditor; +#if UNITY_MATHEMATICS using Unity.Mathematics; using static Unity.Mathematics.math; +#endif [Serializable] public class Neuron : Nucleus { @@ -116,6 +118,8 @@ public class Neuron : Nucleus { #endregion Serialization +#if UNITY_MATHEMATICS + protected float3 _outputValue; public virtual float3 outputValue { get { return _outputValue; } @@ -125,10 +129,30 @@ public class Neuron : Nucleus { WhenFiring?.Invoke(); } } + public float outputMagnitude => length(_outputValue); + public bool isFiring => length(_outputValue) > 0.5f; + public virtual bool isSleeping => lengthsq(this.outputValue) == 0; + +#else + + protected Vector3 _outputValue; + public virtual Vector3 outputValue { + get { return _outputValue; } + set { + _outputValue = value; + if (this.isFiring) + WhenFiring?.Invoke(); + } + } + public float outputMagnitude => _outputValue.magnitude; + + public bool isFiring => _outputValue.magnitude > 0.5f; + public virtual bool isSleeping => this.outputValue.sqrMagnitude == 0; + +#endif public Action WhenFiring; - public virtual bool isSleeping => lengthsq(this.outputValue) == 0; [NonSerialized] public int stale = 1000; public readonly int staleValueForSleep = 20; @@ -199,12 +223,14 @@ public class Neuron : Nucleus { } public override void UpdateStateIsolated() { - float3 result = Combinator(); + var result = Combinator(); this.outputValue = Activator(result); } #region Combinator +#if UNITY_MATHEMATICS + protected Func Combinator => combinator switch { CombinatorType.Sum => CombinatorSum, CombinatorType.Product => CombinatorProduct, @@ -244,10 +270,54 @@ public class Neuron : Nucleus { return max; } +#else + + protected Func Combinator => combinator switch { + CombinatorType.Sum => CombinatorSum, + CombinatorType.Product => CombinatorProduct, + CombinatorType.Max => CombinatorMax, + _ => CombinatorSum + }; + + public Vector3 CombinatorSum() { + Vector3 sum = this.bias; + foreach (Synapse synapse in this.synapses) + sum += synapse.weight * synapse.neuron.outputValue; + return sum; + } + + public Vector3 CombinatorProduct() { + Vector3 product = this.bias; + foreach (Synapse synapse in this.synapses) { + //product *= synapse.weight * synapse.neuron.outputValue; + product = Vector3.Scale(product, synapse.weight * synapse.neuron.outputValue); + } + return product; + } + + public Vector3 CombinatorMax() { + Vector3 max = this.bias; + float maxLength = max.magnitude; + + //Applying the weight factors + foreach (Synapse synapse in this.synapses) { + Vector3 input = synapse.weight * synapse.neuron.outputValue; + + float inputLength = input.magnitude; + if (inputLength > maxLength) { + max = input; + maxLength = inputLength; + } + } + return max; + } +#endif #endregion Combinator #region Activator +#if UNITY_MATHEMATICS + public Func Activator => this.curvePreset switch { CurvePresets.Linear => ActivatorLinear, CurvePresets.Sqrt => ActivatorSqrt, @@ -285,6 +355,47 @@ public class Neuron : Nucleus { return result; } +#else + + public Func Activator => this.curvePreset switch { + CurvePresets.Linear => ActivatorLinear, + CurvePresets.Sqrt => ActivatorSqrt, + CurvePresets.Power => ActivatorPower, + CurvePresets.Reciprocal => ActivatorReciprocal, + _ => ActivatorCustom + }; + + protected Vector3 ActivatorLinear(Vector3 input) { + return input; + } + + protected Vector3 ActivatorSqrt(Vector3 input) { + Vector3 result = input.normalized * System.MathF.Sqrt(input.magnitude); + return result; + } + + protected Vector3 ActivatorPower(Vector3 input) { + Vector3 result = input.normalized * System.MathF.Pow(input.magnitude, 2); + return result; + } + + protected Vector3 ActivatorReciprocal(Vector3 input) { + float magnitude = input.magnitude; + if (magnitude == 0) + return new Vector3(0, 0, 0); + + Vector3 result = input.normalized * (1 / magnitude); + return result; + } + + protected Vector3 ActivatorCustom(Vector3 input) { + float activatedValue = this.curve.Evaluate(input.magnitude); + Vector3 result = input.normalized * activatedValue; + return result; + } + +#endif + #endregion Activator #region Receivers diff --git a/NucleusArray.cs b/NucleusArray.cs index 9f8a172..6e48950 100644 --- a/NucleusArray.cs +++ b/NucleusArray.cs @@ -1,8 +1,10 @@ using System.Linq; using System.Collections.Generic; using UnityEngine; +#if UNITY_MATHEMATICS using Unity.Mathematics; using static Unity.Mathematics.math; +#endif [System.Serializable] public class NucleusArray { @@ -65,6 +67,7 @@ public class NucleusArray { public Dictionary thingReceivers = new(); +#if UNITY_MATHEMATICS private Nucleus FindReceiver(int thingId, float3 inputValue) { // No existing nucleus for this thing @@ -111,6 +114,54 @@ public class NucleusArray { return selectedReceiver; } +#else + + private Nucleus FindReceiver(int thingId, Vector3 inputValue) { + // No existing nucleus for this thing + float inputMagnitude = inputValue.magnitude; + Neuron selectedReceiver = null; + float selectedMagnitude = 0; + foreach (Nucleus nucleusReceiver in this._nuclei) { + if (nucleusReceiver is not Neuron receiver) + continue; + if (thingReceivers.ContainsValue(receiver) == false) { + // We found an unusued receiver + thingReceivers.Add(thingId, receiver); + return receiver; + } + else if (receiver.isSleeping) { + // A sleeping receiver is not active and can therefore always be used + thingReceivers.Add(thingId, receiver); + return receiver; + } + else if (selectedReceiver == null) { + // If we haven't found a receiver yet, just start by taking the first + selectedReceiver = receiver; + selectedMagnitude = selectedReceiver.outputMagnitude; + } + // Look for the receiver with the lowest magnitude + else { + float magnitude = receiver.outputMagnitude; + + if (magnitude < inputMagnitude && receiver.outputMagnitude < selectedMagnitude) { + selectedReceiver = receiver; + selectedMagnitude = selectedReceiver.outputMagnitude; + } + } + } + if (selectedReceiver != null) { + // Replace the receiver + // Find the thingId current associated with the receiver + int keyToRemove = thingReceivers.FirstOrDefault(r => r.Value.Equals(selectedReceiver)).Key; + if (keyToRemove != 0 || thingReceivers.ContainsKey(keyToRemove)) + thingReceivers.Remove(keyToRemove); + // And add the new association + thingReceivers.Add(thingId, selectedReceiver); + } + return selectedReceiver; + } +#endif + public virtual void ProcessStimulus(int thingId, Vector3 inputValue, string thingName = null) { CleanupReceivers(); diff --git a/Receptor.cs b/Receptor.cs index a102835..15ce3c6 100644 --- a/Receptor.cs +++ b/Receptor.cs @@ -1,6 +1,8 @@ using UnityEngine; +#if UNITY_MATHEMATICS using Unity.Mathematics; using static Unity.Mathematics.math; +#endif [System.Serializable] public class Receptor : Neuron, IReceptor { @@ -63,6 +65,8 @@ public class Receptor : Neuron, IReceptor { this.outputValue = this.bias; } +#if UNITY_MATHEMATICS + public override void UpdateNuclei() { this.stale++; if (this.stale > staleValueForSleep && lengthsq(this.bias) > 0) { @@ -71,6 +75,18 @@ public class Receptor : Neuron, IReceptor { } } +#else + + public override void UpdateNuclei() { + this.stale++; + if (this.stale > staleValueForSleep && this.bias.sqrMagnitude > 0) { + this.bias = new Vector3(0, 0, 0); + this.parent.UpdateFromNucleus(this); + } + } + + +#endif public override void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = null) { this._array ??= new NucleusArray(this.parent); this._array.ProcessStimulus(thingId, inputValue, thingName); diff --git a/Runtime.meta b/Runtime.meta new file mode 100644 index 0000000..1fe660e --- /dev/null +++ b/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5a33d0cc40bc19fe98b76f6aed80a38e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Vector.cs b/Runtime/Vector.cs new file mode 100644 index 0000000..40855b3 --- /dev/null +++ b/Runtime/Vector.cs @@ -0,0 +1,8 @@ +using UnityEngine; + +#if UNITY_MATHEMATICS +using Unity.Mathematics; +using static Unity.Mathematics.math; +//#endif + +#endif diff --git a/Runtime/Vector.cs.meta b/Runtime/Vector.cs.meta new file mode 100644 index 0000000..aa9e666 --- /dev/null +++ b/Runtime/Vector.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 76e9f0d4925b7ac278baa9932582ed10 \ No newline at end of file From 611055cdcd58b01f2f19991ad35eb8fe8e573ebb Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 7 Apr 2026 17:32:37 +0200 Subject: [PATCH 04/38] Squashed 'NanoBrain/' changes from bef7ee2..fbca658 fbca658 Reorganizing the package and added documentation git-subtree-dir: NanoBrain git-subtree-split: fbca658b5975ade4aa5c0ef1294dc12ead936495 --- .gitignore | 1 + ClusterPrefab.cs | 116 - ClusterPrefab.cs.meta | 2 - Editor/BrainEditorWindow.cs | 674 +++--- Editor/BrainPickerWindow.cs | 106 +- Editor/ClusterInspector.cs | 1886 ++++++++--------- Editor/DAGWindow.cs | 657 +++--- Icons.meta => Editor/Icons.meta | 0 .../Icons}/NeuraalNetwerkIcoonSchets1.png | Bin .../NeuraalNetwerkIcoonSchets1.png.meta | 2 +- .../Icons}/NeuraalNetwerkIcoonSchets2.png | Bin .../NeuraalNetwerkIcoonSchets2.png.meta | 2 +- .../Icons}/NeuraalNetwerkIcoonSchets3.png | Bin .../NeuraalNetwerkIcoonSchets3.png.meta | 0 Editor/NanoBrain_Editor.cs | 68 +- IReceptor.cs | 73 - MemoryCell.cs | 65 - NanoBrain.cs | 31 - Neuron.cs | 445 ---- Nucleus.cs | 72 - NucleusArray.cs | 208 -- Receptor.cs | 94 - .../LinearAlgebra.meta | 0 .../LinearAlgebra}/.editorconfig | 0 .../.gitea/workflows/unit_tests.yaml | 0 .../LinearAlgebra}/.gitignore | 0 .../LinearAlgebra}/LinearAlgebra-csharp.sln | 0 .../LinearAlgebra}/src/Angle.cs | 0 .../LinearAlgebra}/src/Decomposition.cs | 0 .../LinearAlgebra}/src/Direction.cs | 0 .../LinearAlgebra}/src/Float.cs | 0 .../LinearAlgebra}/src/LinearAlgebra.csproj | 0 .../LinearAlgebra}/src/Matrix.cs | 0 .../LinearAlgebra}/src/Quat32.cs | 0 .../LinearAlgebra}/src/Quaternion.cs | 0 .../LinearAlgebra}/src/Spherical.cs | 0 .../LinearAlgebra}/src/SwingTwist.cs | 0 .../LinearAlgebra}/src/Vector2Float.cs | 0 .../LinearAlgebra}/src/Vector2Int.cs | 0 .../LinearAlgebra}/src/Vector3Float.cs | 0 .../LinearAlgebra}/src/Vector3Int.cs | 0 .../LinearAlgebra}/src/float16.cs | 0 .../LinearAlgebra}/test/AngleTest.cs | 0 .../LinearAlgebra}/test/DirectionTest.cs | 0 .../test/LinearAlgebra_Test.csproj | 0 .../LinearAlgebra}/test/QuaternionTest.cs | 0 .../LinearAlgebra}/test/SphericalTest.cs | 0 .../LinearAlgebra}/test/SwingTwistTest.cs | 0 .../LinearAlgebra}/test/Vector2FloatTest.cs | 0 .../LinearAlgebra}/test/Vector2IntTest.cs | 0 .../LinearAlgebra}/test/Vector3FloatTest.cs | 0 .../LinearAlgebra}/test/Vector3IntTest.cs | 0 Scripts.meta => Runtime/Scripts.meta | 2 +- Cluster.cs => Runtime/Scripts/Cluster.cs | 36 +- .../Scripts/Cluster.cs.meta | 0 Runtime/Scripts/ClusterPrefab.cs | 140 ++ Runtime/Scripts/ClusterPrefab.cs.meta | 11 + .../Scripts/ClusterReceptor.cs | 4 + .../Scripts/ClusterReceptor.cs.meta | 0 Runtime/Scripts/IReceptor.cs | 123 ++ .../Scripts/IReceptor.cs.meta | 0 Runtime/Scripts/MemoryCell.cs | 73 + .../Scripts/MemoryCell.cs.meta | 0 Runtime/Scripts/NanoBrain.cs | 51 + .../Scripts/NanoBrain.cs.meta | 0 Runtime/Scripts/Neuron.cs | 476 +++++ .../Scripts/Neuron.cs.meta | 0 Runtime/Scripts/Nucleus.cs | 147 ++ .../Scripts/Nucleus.cs.meta | 0 Runtime/Scripts/NucleusArray.cs | 197 ++ .../Scripts/NucleusArray.cs.meta | 0 Runtime/Scripts/Receptor.cs | 113 + .../Scripts/Receptor.cs.meta | 0 Runtime/Scripts/Synapse.cs | 33 + .../Scripts/Synapse.cs.meta | 0 Runtime/Vector.cs | 8 - Runtime/Vector.cs.meta | 2 - Scene.meta => Samples.meta | 2 +- .../Clusters.meta | 2 +- .../Clusters/Identity.asset | 0 .../Clusters/Identity.asset.meta | 0 .../Clusters/NewVelocity.asset | 0 .../Clusters/NewVelocity.asset.meta | 0 .../Clusters/Velocity.asset | 0 .../Clusters/Velocity.asset.meta | 0 Scene/TestScene Boid.unity | 487 ----- Scene/TestScene Experiment.unity | 365 ---- Scene/TestScene Experiment.unity.meta | 7 - Scripts/NeuraalNetwerkIcoonSchets1.png | Bin 63771 -> 0 bytes Scripts/NeuraalNetwerkIcoonSchets1.png.meta | 117 - Scripts/NeuraalNetwerkIcoonSchets2.png | Bin 39373 -> 0 bytes Scripts/NeuraalNetwerkIcoonSchets2.png.meta | 117 - Synapse.cs | 15 - .../TestScene Boid.unity.meta => doxygen.meta | 3 +- 94 files changed, 3093 insertions(+), 3940 deletions(-) create mode 100644 .gitignore delete mode 100644 ClusterPrefab.cs delete mode 100644 ClusterPrefab.cs.meta rename Icons.meta => Editor/Icons.meta (100%) rename {Icons => Editor/Icons}/NeuraalNetwerkIcoonSchets1.png (100%) rename {Icons => Editor/Icons}/NeuraalNetwerkIcoonSchets1.png.meta (99%) rename {Icons => Editor/Icons}/NeuraalNetwerkIcoonSchets2.png (100%) rename {Icons => Editor/Icons}/NeuraalNetwerkIcoonSchets2.png.meta (99%) rename {Icons => Editor/Icons}/NeuraalNetwerkIcoonSchets3.png (100%) rename {Icons => Editor/Icons}/NeuraalNetwerkIcoonSchets3.png.meta (100%) delete mode 100644 IReceptor.cs delete mode 100644 MemoryCell.cs delete mode 100644 NanoBrain.cs delete mode 100644 Neuron.cs delete mode 100644 Nucleus.cs delete mode 100644 NucleusArray.cs delete mode 100644 Receptor.cs rename LinearAlgebra.meta => Runtime/LinearAlgebra.meta (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/.editorconfig (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/.gitea/workflows/unit_tests.yaml (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/.gitignore (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/LinearAlgebra-csharp.sln (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/src/Angle.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/src/Decomposition.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/src/Direction.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/src/Float.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/src/LinearAlgebra.csproj (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/src/Matrix.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/src/Quat32.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/src/Quaternion.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/src/Spherical.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/src/SwingTwist.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/src/Vector2Float.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/src/Vector2Int.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/src/Vector3Float.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/src/Vector3Int.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/src/float16.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/test/AngleTest.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/test/DirectionTest.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/test/LinearAlgebra_Test.csproj (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/test/QuaternionTest.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/test/SphericalTest.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/test/SwingTwistTest.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/test/Vector2FloatTest.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/test/Vector2IntTest.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/test/Vector3FloatTest.cs (100%) rename {LinearAlgebra => Runtime/LinearAlgebra}/test/Vector3IntTest.cs (100%) rename Scripts.meta => Runtime/Scripts.meta (77%) rename Cluster.cs => Runtime/Scripts/Cluster.cs (90%) rename Cluster.cs.meta => Runtime/Scripts/Cluster.cs.meta (100%) create mode 100644 Runtime/Scripts/ClusterPrefab.cs create mode 100644 Runtime/Scripts/ClusterPrefab.cs.meta rename ClusterReceptor.cs => Runtime/Scripts/ClusterReceptor.cs (97%) rename ClusterReceptor.cs.meta => Runtime/Scripts/ClusterReceptor.cs.meta (100%) create mode 100644 Runtime/Scripts/IReceptor.cs rename IReceptor.cs.meta => Runtime/Scripts/IReceptor.cs.meta (100%) create mode 100644 Runtime/Scripts/MemoryCell.cs rename MemoryCell.cs.meta => Runtime/Scripts/MemoryCell.cs.meta (100%) create mode 100644 Runtime/Scripts/NanoBrain.cs rename NanoBrain.cs.meta => Runtime/Scripts/NanoBrain.cs.meta (100%) create mode 100644 Runtime/Scripts/Neuron.cs rename Neuron.cs.meta => Runtime/Scripts/Neuron.cs.meta (100%) create mode 100644 Runtime/Scripts/Nucleus.cs rename Nucleus.cs.meta => Runtime/Scripts/Nucleus.cs.meta (100%) create mode 100644 Runtime/Scripts/NucleusArray.cs rename NucleusArray.cs.meta => Runtime/Scripts/NucleusArray.cs.meta (100%) create mode 100644 Runtime/Scripts/Receptor.cs rename Receptor.cs.meta => Runtime/Scripts/Receptor.cs.meta (100%) create mode 100644 Runtime/Scripts/Synapse.cs rename Synapse.cs.meta => Runtime/Scripts/Synapse.cs.meta (100%) delete mode 100644 Runtime/Vector.cs delete mode 100644 Runtime/Vector.cs.meta rename Scene.meta => Samples.meta (77%) rename Scripts/Experimental.meta => Samples/Clusters.meta (77%) rename Identity.asset => Samples/Clusters/Identity.asset (100%) rename Identity.asset.meta => Samples/Clusters/Identity.asset.meta (100%) rename NewVelocity.asset => Samples/Clusters/NewVelocity.asset (100%) rename NewVelocity.asset.meta => Samples/Clusters/NewVelocity.asset.meta (100%) rename Velocity.asset => Samples/Clusters/Velocity.asset (100%) rename Velocity.asset.meta => Samples/Clusters/Velocity.asset.meta (100%) delete mode 100644 Scene/TestScene Boid.unity delete mode 100644 Scene/TestScene Experiment.unity delete mode 100644 Scene/TestScene Experiment.unity.meta delete mode 100644 Scripts/NeuraalNetwerkIcoonSchets1.png delete mode 100644 Scripts/NeuraalNetwerkIcoonSchets1.png.meta delete mode 100644 Scripts/NeuraalNetwerkIcoonSchets2.png delete mode 100644 Scripts/NeuraalNetwerkIcoonSchets2.png.meta delete mode 100644 Synapse.cs rename Scene/TestScene Boid.unity.meta => doxygen.meta (67%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a761032 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +doxygen \ No newline at end of file diff --git a/ClusterPrefab.cs b/ClusterPrefab.cs deleted file mode 100644 index 760e8bb..0000000 --- a/ClusterPrefab.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -[CreateAssetMenu(menuName = "Passer/Cluster")] -public class ClusterPrefab : ScriptableObject { - // The ScriptableObject asset from which the runtime object has been created - - [SerializeReference] - public List nuclei = new(); - - - public virtual Nucleus output => this.nuclei[0] as Nucleus; - - public List _inputs = null; - public virtual List inputs { - get { - if (this._inputs == null) { - this._inputs = new(); - foreach (Nucleus receptor in this.nuclei) { - if (receptor is Nucleus nucleus) { - // inputs have no incoming synapses yet. - if (nucleus.synapses.Count == 0) - this._inputs.Add(nucleus); - } - } - } - return this._inputs; - } - } - private List _outputs = null; - public List outputs { - get { - if (this._outputs == null) - RefreshOutputs(); - return this._outputs; - } - } - public void RefreshOutputs() { - this._outputs = new(); - foreach (Nucleus nucleus in this.nuclei) { - if (nucleus is Neuron neuron && neuron.receivers.Count == 0) - this._outputs.Add(nucleus); - } - } - - public Nucleus GetNucleus(string nucleusName) { - foreach (Nucleus nucleus in this.nuclei) { - if (nucleus.name == nucleusName) - return nucleus; - } - return null; - } - - // Call this function to ensure that there is at least one nucleus - // This is an invariant and should be ensured before the nucleus is used - // because output requires it. - public void EnsureInitialization() { - nuclei ??= new List(); - if (nuclei.Count == 0) - new Neuron(this, "Output"); // Every cluster should have at least 1 neuron - } - - public void GarbageCollection() { - HashSet visitedNuclei = new(); - foreach (Nucleus output in this.outputs) - MarkNuclei(visitedNuclei, output); - //Debug.Log($"Garbage collection found {visitedNuclei.Count} Nuclei"); - this.nuclei.RemoveAll(nucleus => visitedNuclei.Contains(nucleus) == false); - } - - public void MarkNuclei(HashSet visitedNuclei, Nucleus nucleus) { - if (nucleus is null) - return; - - if (nucleus.parent != null && nucleus.parent.prefab != this) - visitedNuclei.Add(nucleus.parent); - else - visitedNuclei.Add(nucleus); - if (nucleus.synapses != null) { - HashSet visitedSynapses = new(); - foreach (Synapse synapse in nucleus.synapses) { - if (synapse != null && synapse.neuron != null) { - visitedSynapses.Add(synapse); - if (synapse.neuron is Nucleus synapse_nucleus) - MarkNuclei(visitedNuclei, synapse_nucleus); - } - } - nucleus.synapses.RemoveAll(synapse => visitedSynapses.Contains(synapse) == false); - } - if (nucleus is Neuron neuron && neuron.receivers != null) { - HashSet visitedReceivers = new(); - foreach (Nucleus receiver in neuron.receivers) { - if (receiver != null && receiver != null) { - visitedReceivers.Add(receiver); - visitedNuclei.Add(receiver); - } - } - neuron.receivers.RemoveAll(receiver => visitedReceivers.Contains(receiver) == false); - } - } - - public virtual void UpdateNuclei() { - foreach (Nucleus nucleus in this.nuclei) - nucleus.UpdateNuclei(); - } - - public int GetNucleusIndex(Nucleus receiver) { - int ix = 0; - foreach (Nucleus nucleus in this.nuclei) { - if (receiver == nucleus) - return ix; - ix++; - } - return -1; - } -} diff --git a/ClusterPrefab.cs.meta b/ClusterPrefab.cs.meta deleted file mode 100644 index ee35e0b..0000000 --- a/ClusterPrefab.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 60a957541c24c57e78018c202ebb1d9b \ No newline at end of file diff --git a/Editor/BrainEditorWindow.cs b/Editor/BrainEditorWindow.cs index 11bba19..195ac6a 100644 --- a/Editor/BrainEditorWindow.cs +++ b/Editor/BrainEditorWindow.cs @@ -3,363 +3,367 @@ using UnityEditor; using System.Collections.Generic; using System.Linq; -// Simple DAG data model -[System.Serializable] -public class DagNode { - public int id; - public string title; - public Vector2 position; - public float radius = 20f; // circle radius -} +namespace NanoBrain { -[System.Serializable] -public class DagEdge { - public int fromId; - public int toId; -} - -public class BrainEditorWindow : EditorWindow { - readonly List nodes = new(); - readonly List edges = new(); - - Vector2 pan = Vector2.zero; - float zoom = 1.0f; - const float minZoom = 0.5f; - const float maxZoom = 2.0f; - - // Vector2 dragStart; - // bool draggingNode = false; - // int draggingNodeId = -1; - - private readonly System.Type acceptedType = typeof(ClusterPrefab); - - [MenuItem("Window/Brain Viewer")] - public static void ShowWindow() { - var w = GetWindow("Brain Viewer"); - w.minSize = new Vector2(500, 300); + // Simple DAG data model + [System.Serializable] + public class DagNode { + public int id; + public string title; + public Vector2 position; + public float radius = 20f; // circle radius } - void OnEnable() { - // if (nodes.Count == 0) - // CreateSampleGraph(); - - - // Register callback so window updates when selection changes - Selection.selectionChanged += OnSelectionChanged; - RefreshSelection(); - ComputeLeftToRightLayout(); + [System.Serializable] + public class DagEdge { + public int fromId; + public int toId; } - private void OnDisable() { - Selection.selectionChanged -= OnSelectionChanged; - } + public class BrainEditorWindow : EditorWindow { + readonly List nodes = new(); + readonly List edges = new(); - private void OnSelectionChanged() { - RefreshSelection(); - ComputeLeftToRightLayout(); - Repaint(); - } + Vector2 pan = Vector2.zero; + float zoom = 1.0f; + const float minZoom = 0.5f; + const float maxZoom = 2.0f; - private void RefreshSelection() { - ClusterPrefab prefab = Selection.activeObject as ClusterPrefab; - if (prefab != null && acceptedType.IsAssignableFrom(prefab.GetType())) { - GenerateGraph(prefab); + // Vector2 dragStart; + // bool draggingNode = false; + // int draggingNodeId = -1; + + private readonly System.Type acceptedType = typeof(ClusterPrefab); + + [MenuItem("Window/Brain Viewer")] + public static void ShowWindow() { + var w = GetWindow("Brain Viewer"); + w.minSize = new Vector2(500, 300); } - } - private void GenerateGraph(ClusterPrefab prefab) { - nodes.Clear(); - edges.Clear(); + void OnEnable() { + // if (nodes.Count == 0) + // CreateSampleGraph(); - int ix = 0; - foreach (Nucleus nucleus in prefab.nuclei) { - nodes.Add(new DagNode() { id = ix, title = nucleus.name }); - if (nucleus is Neuron neuron) { - foreach (Nucleus receiver in neuron.receivers) { - int receiverIx = prefab.GetNucleusIndex(receiver); - edges.Add(new DagEdge() { fromId = ix, toId = receiverIx }); + + // Register callback so window updates when selection changes + Selection.selectionChanged += OnSelectionChanged; + RefreshSelection(); + ComputeLeftToRightLayout(); + } + + private void OnDisable() { + Selection.selectionChanged -= OnSelectionChanged; + } + + private void OnSelectionChanged() { + RefreshSelection(); + ComputeLeftToRightLayout(); + Repaint(); + } + + private void RefreshSelection() { + ClusterPrefab prefab = Selection.activeObject as ClusterPrefab; + if (prefab != null && acceptedType.IsAssignableFrom(prefab.GetType())) { + GenerateGraph(prefab); + } + } + + private void GenerateGraph(ClusterPrefab prefab) { + nodes.Clear(); + edges.Clear(); + + int ix = 0; + foreach (Nucleus nucleus in prefab.nuclei) { + nodes.Add(new DagNode() { id = ix, title = nucleus.name }); + if (nucleus is Neuron neuron) { + foreach (Nucleus receiver in neuron.receivers) { + int receiverIx = prefab.GetNucleusIndex(receiver); + edges.Add(new DagEdge() { fromId = ix, toId = receiverIx }); + } + } + ix++; + } + } + + + // void CreateSampleGraph() { + // nodes.Clear(); + // edges.Clear(); + + // nodes.Add(new DagNode() { id = 0, title = "In1" }); + // nodes.Add(new DagNode() { id = 1, title = "In2" }); + // nodes.Add(new DagNode() { id = 2, title = "A" }); + // nodes.Add(new DagNode() { id = 3, title = "B" }); + // nodes.Add(new DagNode() { id = 4, title = "C" }); + // nodes.Add(new DagNode() { id = 5, title = "Out1" }); + // nodes.Add(new DagNode() { id = 6, title = "Out2" }); + + // edges.Add(new DagEdge() { fromId = 0, toId = 2 }); + // edges.Add(new DagEdge() { fromId = 1, toId = 2 }); + // edges.Add(new DagEdge() { fromId = 2, toId = 3 }); + // edges.Add(new DagEdge() { fromId = 2, toId = 4 }); + // edges.Add(new DagEdge() { fromId = 3, toId = 5 }); + // edges.Add(new DagEdge() { fromId = 4, toId = 6 }); + // } + + void OnGUI() { + HandleInput(); + + Rect rect = new(0, 0, position.width, position.height); + EditorGUI.DrawRect(rect, new Color(0.11f, 0.11f, 0.11f)); + + // compute window center + Vector2 windowCenter = new(position.width / 2f, position.height / 2f); + + // compute graph bounds center (in graph space) + Rect bounds = GetGraphBounds(); + Vector2 graphCenter = bounds.center; + + // compute autoPan that recenters the graph (does not modify node positions) + Vector2 autoPan = -graphCenter; // moves graph center to origin + // total translation = windowCenter + autoPan + user pan + Matrix4x4 oldMatrix = GUI.matrix; + GUI.matrix = Matrix4x4.TRS(windowCenter + autoPan + pan, Quaternion.identity, Vector3.one * zoom) * + Matrix4x4.TRS(-windowCenter, Quaternion.identity, Vector3.one); + + + // Draw edges first + foreach (DagEdge e in edges) { + DagNode from = GetNodeById(e.fromId); + DagNode to = GetNodeById(e.toId); + if (from == null || to == null) continue; + DrawEdgeCircleNodes(from, to); + } + + // Draw nodes (circles) + foreach (DagNode n in nodes) + DrawNucleus(n); + + GUI.matrix = oldMatrix; + + // Footer toolbar + GUILayout.FlexibleSpace(); + EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); + if (GUILayout.Button("Fit", EditorStyles.toolbarButton)) FitToView(); + if (GUILayout.Button("Layout LR", EditorStyles.toolbarButton)) ComputeLeftToRightLayout(); + EditorGUILayout.EndHorizontal(); + } + + void HandleInput() { + Event e = Event.current; + + // Zoom with scroll + if (e.type == EventType.ScrollWheel) { + float oldZoom = zoom; + float delta = -e.delta.y * 0.01f; + zoom = Mathf.Clamp(zoom + delta, minZoom, maxZoom); + Vector2 mouse = e.mousePosition; + pan += (mouse - new Vector2(position.width / 2, position.height / 2)) * (1 - zoom / oldZoom); + e.Use(); + } + + // Pan with middle or right+ctrl drag + if (e.type == EventType.MouseDrag && (e.button == 2 || (e.button == 1 && e.control))) { + pan += e.delta; + e.Use(); + } + } + + DagNode GetNodeById(int id) => nodes.FirstOrDefault(x => x.id == id); + List GetIncomingEdges(DagNode node) { + List incoming = new(); + foreach (DagEdge e in edges) { + if (e.toId == node.id) + incoming.Add(e); + } + return incoming; + } + List GetOutgoingEdges(DagNode node) { + List outgoing = new(); + foreach (DagEdge e in edges) { + if (e.fromId == node.id) + outgoing.Add(e); + } + return outgoing; + } + + void DrawNucleus(DagNode n) { + Vector3 position = n.position; + + Handles.color = Color.white * 0.9f; + Handles.DrawSolidDisc(n.position, Vector3.forward, n.radius); + + if (GetIncomingEdges(n).Count == 0) + DrawArrowHead(n.position - new Vector2(n.radius + 10, 0), n.position - new Vector2(n.radius + 5, 0), 10f / zoom, 12f / zoom, Color.white); + if (GetOutgoingEdges(n).Count == 0) + DrawArrowHead(n.position + new Vector2(n.radius + 10, 0), n.position + new Vector2(n.radius + 15, 0), 10f / zoom, 12f / zoom, Color.white); + + Handles.color = Color.white; + GUIStyle style = new(EditorStyles.label) { + alignment = TextAnchor.UpperCenter, + normal = { textColor = Color.white }, + fontStyle = FontStyle.Bold, + }; + Vector3 labelPos = position - Vector3.down * (n.radius + 10f); // below disc along up axis + Handles.Label(labelPos, n.title, style); + } + + void DrawEdgeCircleNodes(DagNode from, DagNode to) { + Vector2 a = from.position; + Vector2 b = to.position; + if (a == b) return; + + Handles.color = Color.white * 0.9f; + Handles.DrawLine(from.position, to.position); + + // Vector2 dir = (b - a).normalized; + // Vector2 start = a + dir * from.radius; + // Vector2 end = b - dir * to.radius; + + //DrawArrowHead(end - dir * 2f, end, 10f / zoom, 12f / zoom, Color.white); + + } + + void DrawArrowHead(Vector2 from, Vector2 to, float headWidth, float headLength, Color color) { + Vector2 dir = (to - from).normalized; + if (dir == Vector2.zero) return; + Vector2 right = new Vector2(-dir.y, dir.x); + + Vector3 p1 = to; + Vector3 p2 = to - dir * headLength + right * headWidth * 0.5f; + Vector3 p3 = to - dir * headLength - right * headWidth * 0.5f; + + Handles.color = color; + Handles.DrawAAConvexPolygon(p1, p2, p3); + } + + // Left-to-right layered layout (sources on the left, sinks on the right) + void ComputeLeftToRightLayout() { + // build adjacency and indegree + var adj = nodes.ToDictionary(n => n.id, n => new List()); + var indeg = nodes.ToDictionary(n => n.id, n => 0); + foreach (var e in edges) { + if (!adj.ContainsKey(e.fromId) || !adj.ContainsKey(e.toId)) continue; + adj[e.fromId].Add(e.toId); + indeg[e.toId]++; + } + + // Kahn's algorithm to compute topological layers (horizontal layers) + Dictionary layer = new(); + Queue q = new(indeg.Where(kv => kv.Value == 0).Select(kv => kv.Key)); + foreach (var id in q) layer[id] = 0; + + while (q.Count > 0) { + int u = q.Dequeue(); + int l = layer[u]; + foreach (var v in adj[u]) { + // prefer placing v at least one layer after u + if (!layer.ContainsKey(v) || layer[v] < l + 1) layer[v] = l + 1; + indeg[v]--; + if (indeg[v] == 0) q.Enqueue(v); } } - ix++; - } - } - - // void CreateSampleGraph() { - // nodes.Clear(); - // edges.Clear(); - - // nodes.Add(new DagNode() { id = 0, title = "In1" }); - // nodes.Add(new DagNode() { id = 1, title = "In2" }); - // nodes.Add(new DagNode() { id = 2, title = "A" }); - // nodes.Add(new DagNode() { id = 3, title = "B" }); - // nodes.Add(new DagNode() { id = 4, title = "C" }); - // nodes.Add(new DagNode() { id = 5, title = "Out1" }); - // nodes.Add(new DagNode() { id = 6, title = "Out2" }); - - // edges.Add(new DagEdge() { fromId = 0, toId = 2 }); - // edges.Add(new DagEdge() { fromId = 1, toId = 2 }); - // edges.Add(new DagEdge() { fromId = 2, toId = 3 }); - // edges.Add(new DagEdge() { fromId = 2, toId = 4 }); - // edges.Add(new DagEdge() { fromId = 3, toId = 5 }); - // edges.Add(new DagEdge() { fromId = 4, toId = 6 }); - // } - - void OnGUI() { - HandleInput(); - - Rect rect = new(0, 0, position.width, position.height); - EditorGUI.DrawRect(rect, new Color(0.11f, 0.11f, 0.11f)); - - // compute window center - Vector2 windowCenter = new(position.width / 2f, position.height / 2f); - - // compute graph bounds center (in graph space) - Rect bounds = GetGraphBounds(); - Vector2 graphCenter = bounds.center; - - // compute autoPan that recenters the graph (does not modify node positions) - Vector2 autoPan = -graphCenter; // moves graph center to origin - // total translation = windowCenter + autoPan + user pan - Matrix4x4 oldMatrix = GUI.matrix; - GUI.matrix = Matrix4x4.TRS(windowCenter + autoPan + pan, Quaternion.identity, Vector3.one * zoom) * - Matrix4x4.TRS(-windowCenter, Quaternion.identity, Vector3.one); - - - // Draw edges first - foreach (DagEdge e in edges) { - DagNode from = GetNodeById(e.fromId); - DagNode to = GetNodeById(e.toId); - if (from == null || to == null) continue; - DrawEdgeCircleNodes(from, to); - } - - // Draw nodes (circles) - foreach (DagNode n in nodes) - DrawNucleus(n); - - GUI.matrix = oldMatrix; - - // Footer toolbar - GUILayout.FlexibleSpace(); - EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); - if (GUILayout.Button("Fit", EditorStyles.toolbarButton)) FitToView(); - if (GUILayout.Button("Layout LR", EditorStyles.toolbarButton)) ComputeLeftToRightLayout(); - EditorGUILayout.EndHorizontal(); - } - - void HandleInput() { - Event e = Event.current; - - // Zoom with scroll - if (e.type == EventType.ScrollWheel) { - float oldZoom = zoom; - float delta = -e.delta.y * 0.01f; - zoom = Mathf.Clamp(zoom + delta, minZoom, maxZoom); - Vector2 mouse = e.mousePosition; - pan += (mouse - new Vector2(position.width / 2, position.height / 2)) * (1 - zoom / oldZoom); - e.Use(); - } - - // Pan with middle or right+ctrl drag - if (e.type == EventType.MouseDrag && (e.button == 2 || (e.button == 1 && e.control))) { - pan += e.delta; - e.Use(); - } - } - - DagNode GetNodeById(int id) => nodes.FirstOrDefault(x => x.id == id); - List GetIncomingEdges(DagNode node) { - List incoming = new(); - foreach (DagEdge e in edges) { - if (e.toId == node.id) - incoming.Add(e); - } - return incoming; - } - List GetOutgoingEdges(DagNode node) { - List outgoing = new(); - foreach (DagEdge e in edges) { - if (e.fromId == node.id) - outgoing.Add(e); - } - return outgoing; - } - - void DrawNucleus(DagNode n) { - Vector3 position = n.position; - - Handles.color = Color.white * 0.9f; - Handles.DrawSolidDisc(n.position, Vector3.forward, n.radius); - - if (GetIncomingEdges(n).Count == 0) - DrawArrowHead(n.position - new Vector2(n.radius + 10, 0), n.position - new Vector2(n.radius + 5, 0), 10f / zoom, 12f / zoom, Color.white); - if (GetOutgoingEdges(n).Count == 0) - DrawArrowHead(n.position + new Vector2(n.radius + 10, 0), n.position + new Vector2(n.radius + 15, 0), 10f / zoom, 12f / zoom, Color.white); - - Handles.color = Color.white; - GUIStyle style = new(EditorStyles.label) { - alignment = TextAnchor.UpperCenter, - normal = { textColor = Color.white }, - fontStyle = FontStyle.Bold, - }; - Vector3 labelPos = position - Vector3.down * (n.radius + 10f); // below disc along up axis - Handles.Label(labelPos, n.title, style); - } - - void DrawEdgeCircleNodes(DagNode from, DagNode to) { - Vector2 a = from.position; - Vector2 b = to.position; - if (a == b) return; - - Handles.color = Color.white * 0.9f; - Handles.DrawLine(from.position, to.position); - - // Vector2 dir = (b - a).normalized; - // Vector2 start = a + dir * from.radius; - // Vector2 end = b - dir * to.radius; - - //DrawArrowHead(end - dir * 2f, end, 10f / zoom, 12f / zoom, Color.white); - - } - - void DrawArrowHead(Vector2 from, Vector2 to, float headWidth, float headLength, Color color) { - Vector2 dir = (to - from).normalized; - if (dir == Vector2.zero) return; - Vector2 right = new Vector2(-dir.y, dir.x); - - Vector3 p1 = to; - Vector3 p2 = to - dir * headLength + right * headWidth * 0.5f; - Vector3 p3 = to - dir * headLength - right * headWidth * 0.5f; - - Handles.color = color; - Handles.DrawAAConvexPolygon(p1, p2, p3); - } - - // Left-to-right layered layout (sources on the left, sinks on the right) - void ComputeLeftToRightLayout() { - // build adjacency and indegree - var adj = nodes.ToDictionary(n => n.id, n => new List()); - var indeg = nodes.ToDictionary(n => n.id, n => 0); - foreach (var e in edges) { - if (!adj.ContainsKey(e.fromId) || !adj.ContainsKey(e.toId)) continue; - adj[e.fromId].Add(e.toId); - indeg[e.toId]++; - } - - // Kahn's algorithm to compute topological layers (horizontal layers) - Dictionary layer = new(); - Queue q = new(indeg.Where(kv => kv.Value == 0).Select(kv => kv.Key)); - foreach (var id in q) layer[id] = 0; - - while (q.Count > 0) { - int u = q.Dequeue(); - int l = layer[u]; - foreach (var v in adj[u]) { - // prefer placing v at least one layer after u - if (!layer.ContainsKey(v) || layer[v] < l + 1) layer[v] = l + 1; - indeg[v]--; - if (indeg[v] == 0) q.Enqueue(v); + // Any unreachable nodes -> assign next layers + int maxLayer = layer.Count > 0 ? layer.Values.Max() : 0; + foreach (var n in nodes) { + if (!layer.ContainsKey(n.id)) { + maxLayer++; + layer[n.id] = maxLayer; + } } - } - // Any unreachable nodes -> assign next layers - int maxLayer = layer.Count > 0 ? layer.Values.Max() : 0; - foreach (var n in nodes) { - if (!layer.ContainsKey(n.id)) { - maxLayer++; - layer[n.id] = maxLayer; + // Group nodes by layer (left to right) + var layers = layer.GroupBy(kv => kv.Value).OrderBy(g => g.Key).Select(g => g.Select(x => x.Key).ToList()).ToList(); + + // Layout parameters (horizontal spacing drives left->right) + float hSpacing = 150f; + float vSpacing = 100f; + + // Place nodes: x increases with layer index, y spaced within layer + for (int li = 0; li < layers.Count; li++) { + var lst = layers[li]; + float totalHeight = (lst.Count - 1) * vSpacing; + for (int i = 0; i < lst.Count; i++) { + int id = lst[i]; + var n = GetNodeById(id); + if (n == null) continue; + float x = hSpacing + li * hSpacing; + float y = 400 - totalHeight / 2f + i * vSpacing; + // Debug.Log($"({li}, {i}) -> {x}, {y}"); + n.position = new Vector2(x, y); + } } + + Repaint(); } - // Group nodes by layer (left to right) - var layers = layer.GroupBy(kv => kv.Value).OrderBy(g => g.Key).Select(g => g.Select(x => x.Key).ToList()).ToList(); + void FitToView() { + if (nodes.Count == 0) return; + // compute bounds including radii + Rect bounds = new Rect(nodes[0].position - Vector2.one * nodes[0].radius, Vector2.one * nodes[0].radius * 2f); + foreach (var n in nodes) + bounds = RectUnion(bounds, new Rect(n.position - Vector2.one * n.radius, Vector2.one * n.radius * 2f)); - // Layout parameters (horizontal spacing drives left->right) - float hSpacing = 150f; - float vSpacing = 100f; + // center graph at origin (0,0) then set pan so it appears centered in window + Vector2 graphCenter = bounds.center; + // move nodes so center is at origin + for (int i = 0; i < nodes.Count; i++) + nodes[i].position -= graphCenter; - // Place nodes: x increases with layer index, y spaced within layer - for (int li = 0; li < layers.Count; li++) { - var lst = layers[li]; - float totalHeight = (lst.Count - 1) * vSpacing; - for (int i = 0; i < lst.Count; i++) { - int id = lst[i]; - var n = GetNodeById(id); - if (n == null) continue; - float x = hSpacing + li * hSpacing; - float y = 400 - totalHeight / 2f + i * vSpacing; - // Debug.Log($"({li}, {i}) -> {x}, {y}"); - n.position = new Vector2(x, y); + // reset pan/zoom so centered + pan = Vector2.zero; + zoom = 1.0f; + Repaint(); + } + + + static Rect RectUnion(Rect a, Rect b) { + float xMin = Mathf.Min(a.xMin, b.xMin); + float xMax = Mathf.Max(a.xMax, b.xMax); + float yMin = Mathf.Min(a.yMin, b.yMin); + float yMax = Mathf.Max(a.yMax, b.yMax); + return Rect.MinMaxRect(xMin, yMin, xMax, yMax); + } + + Vector2 ScreenToGraph_old(Vector2 screenPos) { + Vector2 origin = new Vector2(position.width / 2, position.height / 2); + // invert the GUI.matrix transform (approx for current simple transforms) + return (screenPos - (origin + pan)) / zoom + origin * (1 - 1 / zoom); + } + Vector2 ScreenToGraph(Vector2 screenPos) { + Vector2 windowCenter = new Vector2(position.width / 2f, position.height / 2f); + Rect bounds = GetGraphBounds(); + Vector2 graphCenter = bounds.center; + Vector2 autoPan = -graphCenter; + // inverse of: screen -> translate by -(windowCenter+autoPan+pan), scale by 1/zoom, translate by windowCenter + return (screenPos - (windowCenter + autoPan + pan)) / zoom + windowCenter; + } + + + Rect GetGraphBounds() { + if (nodes == null || nodes.Count == 0) return new Rect(Vector2.zero, Vector2.one); + Rect bounds = new( + nodes[0].position - Vector2.one * nodes[0].radius, + 2f * nodes[0].radius * Vector2.one); + foreach (var n in nodes) + bounds = RectUnion(bounds, + new Rect(n.position - Vector2.one * n.radius, 2f * n.radius * Vector2.one)); + return bounds; + } + + + + int HitTestNode(Vector2 graphPos) { + // returns node id under point or -1 + for (int i = nodes.Count - 1; i >= 0; i--) { + var n = nodes[i]; + if ((graphPos - n.position).sqrMagnitude <= n.radius * n.radius) return n.id; } + return -1; } - Repaint(); } - void FitToView() { - if (nodes.Count == 0) return; - // compute bounds including radii - Rect bounds = new Rect(nodes[0].position - Vector2.one * nodes[0].radius, Vector2.one * nodes[0].radius * 2f); - foreach (var n in nodes) - bounds = RectUnion(bounds, new Rect(n.position - Vector2.one * n.radius, Vector2.one * n.radius * 2f)); - - // center graph at origin (0,0) then set pan so it appears centered in window - Vector2 graphCenter = bounds.center; - // move nodes so center is at origin - for (int i = 0; i < nodes.Count; i++) - nodes[i].position -= graphCenter; - - // reset pan/zoom so centered - pan = Vector2.zero; - zoom = 1.0f; - Repaint(); - } - - - static Rect RectUnion(Rect a, Rect b) { - float xMin = Mathf.Min(a.xMin, b.xMin); - float xMax = Mathf.Max(a.xMax, b.xMax); - float yMin = Mathf.Min(a.yMin, b.yMin); - float yMax = Mathf.Max(a.yMax, b.yMax); - return Rect.MinMaxRect(xMin, yMin, xMax, yMax); - } - - Vector2 ScreenToGraph_old(Vector2 screenPos) { - Vector2 origin = new Vector2(position.width / 2, position.height / 2); - // invert the GUI.matrix transform (approx for current simple transforms) - return (screenPos - (origin + pan)) / zoom + origin * (1 - 1 / zoom); - } - Vector2 ScreenToGraph(Vector2 screenPos) { - Vector2 windowCenter = new Vector2(position.width / 2f, position.height / 2f); - Rect bounds = GetGraphBounds(); - Vector2 graphCenter = bounds.center; - Vector2 autoPan = -graphCenter; - // inverse of: screen -> translate by -(windowCenter+autoPan+pan), scale by 1/zoom, translate by windowCenter - return (screenPos - (windowCenter + autoPan + pan)) / zoom + windowCenter; - } - - - Rect GetGraphBounds() { - if (nodes == null || nodes.Count == 0) return new Rect(Vector2.zero, Vector2.one); - Rect bounds = new( - nodes[0].position - Vector2.one * nodes[0].radius, - 2f * nodes[0].radius * Vector2.one); - foreach (var n in nodes) - bounds = RectUnion(bounds, - new Rect(n.position - Vector2.one * n.radius, 2f * n.radius * Vector2.one)); - return bounds; - } - - - - int HitTestNode(Vector2 graphPos) { - // returns node id under point or -1 - for (int i = nodes.Count - 1; i >= 0; i--) { - var n = nodes[i]; - if ((graphPos - n.position).sqrMagnitude <= n.radius * n.radius) return n.id; - } - return -1; - } - -} +} \ No newline at end of file diff --git a/Editor/BrainPickerWindow.cs b/Editor/BrainPickerWindow.cs index 503bd10..1a9aa6a 100644 --- a/Editor/BrainPickerWindow.cs +++ b/Editor/BrainPickerWindow.cs @@ -3,64 +3,68 @@ using UnityEngine; using System; using System.Linq; -public class ClusterPickerWindow : EditorWindow { - private Vector2 scroll; - private ClusterPrefab[] items = new ClusterPrefab[0]; - private Action onPicked; - private string search = ""; +namespace NanoBrain { - public static void ShowPicker(Action onPicked, string title = "Select Cluster") { - var w = CreateInstance(); - w.titleContent = new GUIContent(title); - w.minSize = new Vector2(360, 320); - w.onPicked = onPicked; - w.RefreshList(); - w.ShowModalUtility(); // modal dialog - } + public class ClusterPickerWindow : EditorWindow { + private Vector2 scroll; + private ClusterPrefab[] items = new ClusterPrefab[0]; + private Action onPicked; + private string search = ""; - private void OnEnable() => RefreshList(); + public static void ShowPicker(Action onPicked, string title = "Select Cluster") { + var w = CreateInstance(); + w.titleContent = new GUIContent(title); + w.minSize = new Vector2(360, 320); + w.onPicked = onPicked; + w.RefreshList(); + w.ShowModalUtility(); // modal dialog + } - private void RefreshList() { - var guids = AssetDatabase.FindAssets("t:ClusterPrefab"); - items = guids - .Select(g => AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(g))) - .Where(b => b != null) - .OrderBy(b => b.name) - .ToArray(); - } + private void OnEnable() => RefreshList(); - private void OnGUI() { - EditorGUILayout.Space(); - EditorGUILayout.BeginHorizontal(); - EditorGUILayout.LabelField("Choose Cluster:", EditorStyles.boldLabel); - if (GUILayout.Button("Refresh", GUILayout.Width(80))) RefreshList(); - GUILayout.FlexibleSpace(); - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.Space(); - search = EditorGUILayout.TextField(search); - - EditorGUILayout.Space(); - scroll = EditorGUILayout.BeginScrollView(scroll); - foreach (var it in items) { - if (!string.IsNullOrEmpty(search) && it.name.IndexOf(search, StringComparison.OrdinalIgnoreCase) < 0) - continue; + private void RefreshList() { + var guids = AssetDatabase.FindAssets("t:ClusterPrefab"); + items = guids + .Select(g => AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(g))) + .Where(b => b != null) + .OrderBy(b => b.name) + .ToArray(); + } + private void OnGUI() { + EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(); - EditorGUILayout.LabelField(EditorGUIUtility.ObjectContent(it, typeof(ClusterPrefab)), GUILayout.Height(20)); - if (GUILayout.Button("Select", GUILayout.Width(70))) { - onPicked?.Invoke(it); - Close(); - return; + EditorGUILayout.LabelField("Choose Cluster:", EditorStyles.boldLabel); + if (GUILayout.Button("Refresh", GUILayout.Width(80))) RefreshList(); + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.Space(); + search = EditorGUILayout.TextField(search); + + EditorGUILayout.Space(); + scroll = EditorGUILayout.BeginScrollView(scroll); + foreach (var it in items) { + if (!string.IsNullOrEmpty(search) && it.name.IndexOf(search, StringComparison.OrdinalIgnoreCase) < 0) + continue; + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(EditorGUIUtility.ObjectContent(it, typeof(ClusterPrefab)), GUILayout.Height(20)); + if (GUILayout.Button("Select", GUILayout.Width(70))) { + onPicked?.Invoke(it); + Close(); + return; + } + EditorGUILayout.EndHorizontal(); } + EditorGUILayout.EndScrollView(); + + EditorGUILayout.Space(); + EditorGUILayout.BeginHorizontal(); + if (GUILayout.Button("Cancel")) { onPicked?.Invoke(null); Close(); } + GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); } - EditorGUILayout.EndScrollView(); - - EditorGUILayout.Space(); - EditorGUILayout.BeginHorizontal(); - if (GUILayout.Button("Cancel")) { onPicked?.Invoke(null); Close(); } - GUILayout.FlexibleSpace(); - EditorGUILayout.EndHorizontal(); } -} + +} \ No newline at end of file diff --git a/Editor/ClusterInspector.cs b/Editor/ClusterInspector.cs index 14e83fa..14b4f66 100644 --- a/Editor/ClusterInspector.cs +++ b/Editor/ClusterInspector.cs @@ -4,310 +4,322 @@ using UnityEditor; using UnityEngine; using UnityEngine.UIElements; -// #if UNITY_MATHEMATICS -// using Unity.Mathematics; -// using static Unity.Mathematics.math; -// #endif -[CustomEditor(typeof(ClusterPrefab))] -public class ClusterInspector : Editor { - protected static VisualElement mainContainer; - protected static VisualElement inspectorContainer; +namespace NanoBrain { - protected bool breakOnWake = false; + [CustomEditor(typeof(ClusterPrefab))] + public class ClusterInspector : Editor { + protected static VisualElement mainContainer; + protected static VisualElement inspectorContainer; - #region Start + protected bool breakOnWake = false; - public override VisualElement CreateInspectorGUI() { - ClusterPrefab prefab = target as ClusterPrefab; + #region Start - if (prefab != null) - prefab.EnsureInitialization(); + public override VisualElement CreateInspectorGUI() { + ClusterPrefab prefab = target as ClusterPrefab; - serializedObject.Update(); + if (prefab != null) + prefab.EnsureInitialization(); - VisualElement root = new(); - CreateInspector(root, prefab, prefab.output, null); + serializedObject.Update(); - serializedObject.ApplyModifiedProperties(); - return root; - } + VisualElement root = new(); + CreateInspector(root, prefab, prefab.output, null); - public static GraphView CreateInspector(VisualElement root, ClusterPrefab cluster, Nucleus output, GameObject gameObject) { - root.style.paddingLeft = 0; - root.style.paddingRight = 0; - root.style.paddingTop = 0; - root.style.paddingBottom = 0; + serializedObject.ApplyModifiedProperties(); + return root; + } - root.styleSheets.Add(Resources.Load("GraphStyles")); + public static GraphView CreateInspector(VisualElement root, ClusterPrefab cluster, Nucleus output, GameObject gameObject) { + root.style.paddingLeft = 0; + root.style.paddingRight = 0; + root.style.paddingTop = 0; + root.style.paddingBottom = 0; - // does the main container have added value? - // is just is like the root - mainContainer = new() { - style = { + root.styleSheets.Add(Resources.Load("GraphStyles")); + + // does the main container have added value? + // is just is like the root + mainContainer = new() { + style = { height = 450, flexDirection = FlexDirection.Row } - }; - GraphView graph = new(cluster); - graph.style.flexGrow = 1; + }; + GraphView graph = new(cluster); + graph.style.flexGrow = 1; - inspectorContainer = new VisualElement { - name = "inspector", - style = { + inspectorContainer = new VisualElement { + name = "inspector", + style = { width = 300, flexGrow = 0 } - }; + }; - mainContainer.Add(graph); - mainContainer.Add(inspectorContainer); - root.Add(mainContainer); + mainContainer.Add(graph); + mainContainer.Add(inspectorContainer); + root.Add(mainContainer); - graph.SetGraph(gameObject, output, inspectorContainer); + graph.SetGraph(gameObject, output, inspectorContainer); - return graph; - } + return graph; + } - public class GraphView : VisualElement { - readonly ClusterPrefab prefab; - SerializedObject serializedBrain; - Nucleus currentNucleus; - GameObject gameObject; - private List layers = new(); - private readonly Dictionary neuroidPositions = new(); - private bool expandArray = false; + public class GraphView : VisualElement { + readonly ClusterPrefab prefab; + SerializedObject serializedBrain; + Nucleus currentNucleus; + GameObject gameObject; + private List layers = new(); + private readonly Dictionary neuroidPositions = new(); + private bool expandArray = false; - ClusterPrefab prefabAsset; - readonly PopupField outputsField; + ClusterPrefab prefabAsset; + readonly PopupField outputsField; - public GraphView(ClusterPrefab prefab) { - this.prefab = prefab; + public GraphView(ClusterPrefab prefab) { + this.prefab = prefab; - name = "content"; - style.flexGrow = 1; + name = "content"; + style.flexGrow = 1; - IMGUIContainer graphContainer = new(OnIMGUI); - graphContainer.style.position = Position.Absolute; - graphContainer.style.left = 0; graphContainer.style.top = 0; - graphContainer.style.right = 0; graphContainer.style.bottom = 0; - graphContainer.pickingMode = PickingMode.Position; - graphContainer.focusable = true; - Add(graphContainer); + IMGUIContainer graphContainer = new(OnIMGUI); + graphContainer.style.position = Position.Absolute; + graphContainer.style.left = 0; graphContainer.style.top = 0; + graphContainer.style.right = 0; graphContainer.style.bottom = 0; + graphContainer.pickingMode = PickingMode.Position; + graphContainer.focusable = true; + Add(graphContainer); - VisualElement outputContainer = new() { - style = { + VisualElement outputContainer = new() { + style = { flexDirection = FlexDirection.Row, alignItems = Align.Center, } - }; - - List names = this.prefab.outputs.Select(output => output.name).ToList(); - if (names.Count > 0 && names.First() != null) { - outputsField = new(names, names.First()) { - style = { flexGrow = 1 } }; - outputsField.RegisterValueChangedCallback(evt => OnOutputChanged(evt.newValue)); - outputContainer.Add(outputsField); - } - Button addButton = new(() => OnAddClusterOutput()) { - text = "Add" - }; - outputContainer.Add(addButton); - - Add(outputContainer); - - // Subscribe when added to panel (editor UI ready) - RegisterCallback(evt => Subscribe()); - RegisterCallback(evt => Unsubscribe()); - } - - void OnOutputChanged(string outputName) { - if (this.currentNucleus.parent != null) - // Get nucleus in the parent instance - this.currentNucleus = this.currentNucleus.parent.GetNucleus(outputName); - else - // Get nucleus in the prefab - this.currentNucleus = this.prefab.GetNucleus(outputName); - } - - void OnAddClusterOutput() { - Nucleus newOutput = new Neuron(this.prefab, "New Output"); - this.prefab.RefreshOutputs(); - outputsField.choices = this.prefab.outputs.Select(output => output.name).ToList(); - outputsField.value = newOutput.name; - - this.currentNucleus = newOutput; - } - - bool subscribed = false; - void Subscribe() { - if (subscribed) return; - SceneView.duringSceneGui += OnSceneGUI; - subscribed = true; - SceneView.RepaintAll(); - } - - void Unsubscribe() { - if (!subscribed) return; - SceneView.duringSceneGui -= OnSceneGUI; - subscribed = false; - } - - public void SetGraph(GameObject gameObject, Nucleus nucleus, VisualElement inspectorContainer) { - this.gameObject = gameObject; - //this.cluster = brain; - if (Application.isPlaying == false) - this.serializedBrain = new SerializedObject(this.prefab); - this.currentNucleus = nucleus; - Rebuild(inspectorContainer); - } - - void Rebuild(VisualElement inspectorContainer) { - BuildLayers(); - - if (this.currentNucleus == null) { - inspectorContainer.Clear(); - return; - } - - string path = AssetDatabase.GetAssetPath(this.prefab); // or known path - this.prefabAsset = AssetDatabase.LoadAssetAtPath(path); - if (this.prefabAsset == null) { - // create in memory save if it doesn't exist - this.prefabAsset = CreateInstance(); - //Debug.LogError("Cluster Prefab is not found on disk"); - } - DrawInspector(inspectorContainer); - } - - private void BuildLayers() { - // A temporary list to track what's been added to layers - this.layers = new(); - int layerIx = 0; - - Nucleus selectedNucleus = this.currentNucleus; - if (selectedNucleus == null) - return; - NeuroidLayer currentLayer = new() { ix = layerIx }; - - if (selectedNucleus is Neuron selectedNeuron && selectedNeuron.receivers != null) { - foreach (Nucleus receiver in selectedNeuron.receivers) { - Nucleus outputNeuroid = receiver; - if (outputNeuroid != null) { - AddToLayer(currentLayer, outputNeuroid); - // Debug.Log($"layer {layerIx} nucleus {outputNeuroid.name}"); - } + List names = this.prefab.outputs.Select(output => output.name).ToList(); + if (names.Count > 0 && names.First() != null) { + outputsField = new(names, names.First()) { + style = { flexGrow = 1 } + }; + outputsField.RegisterValueChangedCallback(evt => OnOutputChanged(evt.newValue)); + outputContainer.Add(outputsField); } - } - if (currentLayer.neuroids.Count > 0) { - this.layers.Add(currentLayer); - layerIx++; - currentLayer = new() { ix = layerIx }; + + Button addButton = new(() => OnAddClusterOutput()) { + text = "Add" + }; + outputContainer.Add(addButton); + + Add(outputContainer); + + // Subscribe when added to panel (editor UI ready) + RegisterCallback(evt => Subscribe()); + RegisterCallback(evt => Unsubscribe()); } - AddToLayer(currentLayer, selectedNucleus); - this.layers.Add(currentLayer); - // Debug.Log($"layer {layerIx} nucleus {selectedNucleus.name}"); + void OnOutputChanged(string outputName) { + if (this.currentNucleus.parent != null) + // Get nucleus in the parent instance + this.currentNucleus = this.currentNucleus.parent.GetNucleus(outputName); + else + // Get nucleus in the prefab + this.currentNucleus = this.prefab.GetNucleus(outputName); + } - layerIx++; - currentLayer = new() { ix = layerIx }; + void OnAddClusterOutput() { + Nucleus newOutput = new Neuron(this.prefab, "New Output"); + this.prefab.RefreshOutputs(); + outputsField.choices = this.prefab.outputs.Select(output => output.name).ToList(); + outputsField.value = newOutput.name; - if (selectedNucleus.synapses != null) { - foreach (Synapse synapse in selectedNucleus.synapses) { - Nucleus input = synapse.neuron; - AddToLayer(currentLayer, input); - // Debug.Log($"layer {layerIx} nucleus {input.name}"); + this.currentNucleus = newOutput; + } + + bool subscribed = false; + void Subscribe() { + if (subscribed) return; + SceneView.duringSceneGui += OnSceneGUI; + subscribed = true; + SceneView.RepaintAll(); + } + + void Unsubscribe() { + if (!subscribed) return; + SceneView.duringSceneGui -= OnSceneGUI; + subscribed = false; + } + + public void SetGraph(GameObject gameObject, Nucleus nucleus, VisualElement inspectorContainer) { + this.gameObject = gameObject; + //this.cluster = brain; + if (Application.isPlaying == false) + this.serializedBrain = new SerializedObject(this.prefab); + this.currentNucleus = nucleus; + Rebuild(inspectorContainer); + } + + void Rebuild(VisualElement inspectorContainer) { + BuildLayers(); + + if (this.currentNucleus == null) { + inspectorContainer.Clear(); + return; } + + string path = AssetDatabase.GetAssetPath(this.prefab); // or known path + this.prefabAsset = AssetDatabase.LoadAssetAtPath(path); + if (this.prefabAsset == null) { + // create in memory save if it doesn't exist + this.prefabAsset = CreateInstance(); + //Debug.LogError("Cluster Prefab is not found on disk"); + } + DrawInspector(inspectorContainer); } - if (currentLayer.neuroids.Count > 0) { - this.layers.Add(currentLayer); - } - } - private void AddToLayer(NeuroidLayer layer, Nucleus nucleus) { - if (nucleus == null) - return; - layer.neuroids.Add(nucleus); - //nucleus.layerIx = layer.ix; - // Store its position - Vector2Int neuroidPosition = new(layer.ix, layer.neuroids.Count - 1); - neuroidPositions[nucleus] = neuroidPosition; + private void BuildLayers() { + // A temporary list to track what's been added to layers + this.layers = new(); + int layerIx = 0; - } + Nucleus selectedNucleus = this.currentNucleus; + if (selectedNucleus == null) + return; + NeuroidLayer currentLayer = new() { ix = layerIx }; - - public void OnIMGUI() { - if (currentNucleus == null) - return; - - if (Application.isPlaying == false) - serializedBrain.Update(); - - Handles.BeginGUI(); - DrawGraph(); - Handles.EndGUI(); - - } - - private void DrawGraph() { - float size = 20; - Vector3 position = new(150, 210, 0); - - DrawReceivers(this.currentNucleus, position, size); - DrawSynapses(this.currentNucleus, position, size); - - // Draw selected Nucleus - if (expandArray) { - if (this.currentNucleus is IReceptor receptor1) { - float maxValue = 0; - foreach (Nucleus nucleus in receptor1.nucleiArray) { - if (nucleus is Neuron neuron) { - float value = neuron.outputMagnitude; - if (value > maxValue) - maxValue = value; + if (selectedNucleus is Neuron selectedNeuron && selectedNeuron.receivers != null) { + foreach (Nucleus receiver in selectedNeuron.receivers) { + Nucleus outputNeuroid = receiver; + if (outputNeuroid != null) { + AddToLayer(currentLayer, outputNeuroid); + // Debug.Log($"layer {layerIx} nucleus {outputNeuroid.name}"); } } + } + if (currentLayer.neuroids.Count > 0) { + this.layers.Add(currentLayer); + layerIx++; + currentLayer = new() { ix = layerIx }; + } - float spacing = 400f / receptor1.nucleiArray.Count(); - float margin = 10 + spacing / 2; - float xMin = 150 - size; - float xMax = 150 + size; - float yMin = 10 + margin - size / 2; - float yMax = 400 - margin + size; - Vector3[] verts = new Vector3[4] { + AddToLayer(currentLayer, selectedNucleus); + this.layers.Add(currentLayer); + // Debug.Log($"layer {layerIx} nucleus {selectedNucleus.name}"); + + layerIx++; + currentLayer = new() { ix = layerIx }; + + if (selectedNucleus.synapses != null) { + foreach (Synapse synapse in selectedNucleus.synapses) { + Nucleus input = synapse.neuron; + AddToLayer(currentLayer, input); + // Debug.Log($"layer {layerIx} nucleus {input.name}"); + } + } + if (currentLayer.neuroids.Count > 0) { + this.layers.Add(currentLayer); + } + } + + private void AddToLayer(NeuroidLayer layer, Nucleus nucleus) { + if (nucleus == null) + return; + layer.neuroids.Add(nucleus); + //nucleus.layerIx = layer.ix; + // Store its position + Vector2Int neuroidPosition = new(layer.ix, layer.neuroids.Count - 1); + neuroidPositions[nucleus] = neuroidPosition; + + } + + + public void OnIMGUI() { + if (currentNucleus == null) + return; + + if (Application.isPlaying == false) + serializedBrain.Update(); + + Handles.BeginGUI(); + DrawGraph(); + Handles.EndGUI(); + + } + + private void DrawGraph() { + float size = 20; + Vector3 position = new(150, 210, 0); + + DrawReceivers(this.currentNucleus, position, size); + DrawSynapses(this.currentNucleus, position, size); + + // Draw selected Nucleus + if (expandArray) { + if (this.currentNucleus is IReceptor receptor1) { + float maxValue = 0; + foreach (Nucleus nucleus in receptor1.nucleiArray) { + if (nucleus is Neuron neuron) { + float value = neuron.outputMagnitude; + if (value > maxValue) + maxValue = value; + } + } + + float spacing = 400f / receptor1.nucleiArray.Count(); + float margin = 10 + spacing / 2; + float xMin = 150 - size; + float xMax = 150 + size; + float yMin = 10 + margin - size / 2; + float yMax = 400 - margin + size; + Vector3[] verts = new Vector3[4] { new(xMin, yMin, 0), new(xMax, yMin, 0), new(xMax, yMax, 0), new(xMin, yMax, 0) }; - Handles.color = Color.black; - Handles.DrawAAConvexPolygon(verts); - int row = 0; - foreach (Nucleus nucleus in receptor1.nucleiArray) { - Vector3 pos = new(150, margin + row * spacing, 0.0f); + Handles.color = Color.black; + Handles.DrawAAConvexPolygon(verts); + int row = 0; + foreach (Nucleus nucleus in receptor1.nucleiArray) { + Vector3 pos = new(150, margin + row * spacing, 0.0f); + Handles.color = Color.white; + // The selected nucleus highlight ring + Handles.DrawSolidDisc(pos, Vector3.forward, size + 2); + DrawNucleus(nucleus, pos, maxValue, size); + row++; + } + GUIStyle style = new(EditorStyles.label) { + alignment = TextAnchor.UpperCenter, + normal = { textColor = Color.white }, + fontStyle = FontStyle.Bold, + }; + Vector3 labelPos = new(150, yMax + size + 5, 0); + string receptorName = receptor1.GetName(); + int colonPos = receptorName.IndexOf(":"); + if (colonPos > 0) { + string baseName = receptorName[..colonPos]; + Handles.Label(labelPos, baseName, style); + } + else + Handles.Label(labelPos, receptorName, style); + } + else { Handles.color = Color.white; // The selected nucleus highlight ring - Handles.DrawSolidDisc(pos, Vector3.forward, size + 2); - DrawNucleus(nucleus, pos, maxValue, size); - row++; + Handles.DrawSolidDisc(position, Vector3.forward, size + 2); + float maxValue = 1; + if (this.currentNucleus is Neuron neuron) + maxValue = neuron.outputMagnitude; + else if (this.currentNucleus is Cluster cluster) + maxValue = cluster.defaultOutput.outputMagnitude; + + DrawNucleus(this.currentNucleus, position, maxValue, 20); + } - GUIStyle style = new(EditorStyles.label) { - alignment = TextAnchor.UpperCenter, - normal = { textColor = Color.white }, - fontStyle = FontStyle.Bold, - }; - Vector3 labelPos = new(150, yMax + size + 5, 0); - string receptorName = receptor1.GetName(); - int colonPos = receptorName.IndexOf(":"); - if (colonPos > 0) { - string baseName = receptorName[..colonPos]; - Handles.Label(labelPos, baseName, style); - } - else - Handles.Label(labelPos, receptorName, style); } else { Handles.color = Color.white; @@ -318,785 +330,773 @@ public class ClusterInspector : Editor { maxValue = neuron.outputMagnitude; else if (this.currentNucleus is Cluster cluster) maxValue = cluster.defaultOutput.outputMagnitude; - DrawNucleus(this.currentNucleus, position, maxValue, 20); - - } - } - else { - Handles.color = Color.white; - // The selected nucleus highlight ring - Handles.DrawSolidDisc(position, Vector3.forward, size + 2); - float maxValue = 1; - if (this.currentNucleus is Neuron neuron) - maxValue = neuron.outputMagnitude; - else if (this.currentNucleus is Cluster cluster) - maxValue = cluster.defaultOutput.outputMagnitude; - DrawNucleus(this.currentNucleus, position, maxValue, 20); - } - } - - private void DrawReceivers(Nucleus nucleus, Vector3 parentPos, float size) { - List receivers; - if (nucleus is Neuron neuron) - receivers = neuron.receivers; - else if (nucleus is Cluster cluster) - receivers = cluster.CollectReceivers(); - else - return; - - int nodeCount = receivers.Count(); //neuron != null ? neuron.receivers.Count() : 1; - - // Determine the maximum value in this layer - // This is used to 'scale' the output value colors of the nuclei - float maxValue = 0; - foreach (Nucleus receiver in receivers) { - if (receiver is Neuron neuroid) { - float value = neuroid.outputMagnitude; - if (value > maxValue) - maxValue = value; } } - // Determine the spacing of the nuclei in the layer - float spacing = 400f / nodeCount; - float margin = 10 + spacing / 2; - - int row = 0; - List drawnArrays = new(); - foreach (Nucleus receiver in receivers) { - if (receiver is Receptor receptor) { - if (drawnArrays.Contains(receptor.nucleiArray)) - continue; - drawnArrays.Add(receptor.nucleiArray); - } - - Nucleus receiverNucleus = receiver; - if (receiverNucleus == null) - continue; - - Vector3 pos = new(50, margin + row * spacing, 0.0f); - Handles.color = Color.white; - Handles.DrawLine(parentPos, pos); - - DrawNucleus(receiverNucleus, pos, maxValue, size); - row++; - } - } - - private void DrawSynapses(Nucleus nucleus, Vector3 parentPos, float size) { - int nodeCount = nucleus.synapses.Count; - - // Determine the maximum value in this layer - // This is used to 'scale' the output value colors of the nuclei - float maxValue = 0; - int neuronCount = 0; - List drawnArrays = new(); - foreach (Synapse synapse in nucleus.synapses) { - if (synapse.neuron == null) - continue; - - if (synapse.neuron is Receptor receptor) { - if (drawnArrays.Contains(receptor.nucleiArray)) - continue; - drawnArrays.Add(receptor.nucleiArray); - } - else if (synapse.neuron.parent is ClusterReceptor clusterReceptor) { - if (drawnArrays.Contains(clusterReceptor.nucleiArray)) - continue; - drawnArrays.Add(clusterReceptor.nucleiArray); - } - if (synapse.neuron is Neuron synapseNeuron) { - float value = synapseNeuron.outputMagnitude * synapse.weight; - // Debug.Log($"{synapse.nucleus.name}: {value} {length(synapse.nucleus.outputValue)} {synapse.weight}"); - if (value > maxValue) - maxValue = value; - } - neuronCount++; - } - - // Determine the spacing of the nuclei in the layer - float spacing = 400f / neuronCount; - float margin = 10 + spacing / 2; - - int row = 0; - drawnArrays = new(); - 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); - } - Vector3 pos = new(250, margin + row * spacing, 0.0f); - Handles.color = Color.white; - Handles.DrawLine(parentPos, pos); - Color color = Color.black; - if (Application.isPlaying) { - if (maxValue == 0 || !float.IsFinite(maxValue)) - maxValue = 1; - float brightness = 0; - if (synapse.neuron is Neuron synapseNeuron) - brightness = synapseNeuron.outputMagnitude * synapse.weight / maxValue; - color = new Color(brightness, brightness, brightness, 1f); - } - if (synapse.neuron.parent != null && synapse.neuron.parent != this.currentNucleus.parent) { - // the synapse nucleus is part of a subcluster - DrawNucleus(synapse.neuron.parent, pos, maxValue, size, color); - } - // else if (synapse.nucleus.cluster != null && synapse.nucleus.cluster != this.currentNucleus.cluster) { - // DrawNucleus(synapse.nucleus.parent, pos, maxValue, size, color); - // } - else { - DrawNucleus(synapse.neuron, pos, maxValue, size, color); - } - row++; - } - } - - private void DrawNucleus(Nucleus nucleus, Vector3 position, float maxValue, float size) { - Color color; - if (Application.isPlaying) { - float brightness = 0; + private void DrawReceivers(Nucleus nucleus, Vector3 parentPos, float size) { + List receivers; if (nucleus is Neuron neuron) - brightness = neuron.outputMagnitude / maxValue; - color = new Color(brightness, brightness, brightness, 1f); - } - else - color = Color.black; - DrawNucleus(nucleus, position, maxValue, size, color); - } + receivers = neuron.receivers; + else if (nucleus is Cluster cluster) + receivers = cluster.CollectReceivers(); + else + return; - private void DrawNucleus(Nucleus nucleus, Vector3 position, float maxValue, float size, Color color) { - if (nucleus is MemoryCell) { - Handles.color = Color.white; - Handles.DrawWireDisc(position + Vector3.right * 10, Vector3.forward, size); - } + int nodeCount = receivers.Count(); //neuron != null ? neuron.receivers.Count() : 1; - Handles.color = color; - Handles.DrawSolidDisc(position, Vector3.forward, size); - - Handles.color = Color.white; - // Position the label in front of the disc - Vector3 labelPosition = position + (Vector3.forward * 0.1f); - - GUIStyle style = new(EditorStyles.label) { - alignment = TextAnchor.MiddleCenter, - normal = { textColor = Color.white }, - fontStyle = FontStyle.Bold, - }; - - if (nucleus is IReceptor receptor1) { - if (expandArray) { - // Put array indices above elements - style.alignment = TextAnchor.LowerCenter; - Vector3 labelPos1 = position + Vector3.down * (size + 5); // below disc - int colonPos1 = nucleus.name.IndexOf(":"); - if (colonPos1 > 0) { - string extName = nucleus.name[(colonPos1 + 2)..]; - Handles.Label(labelPos1, extName, style); + // Determine the maximum value in this layer + // This is used to 'scale' the output value colors of the nuclei + float maxValue = 0; + foreach (Nucleus receiver in receivers) { + if (receiver is Neuron neuroid) { + float value = neuroid.outputMagnitude; + if (value > maxValue) + maxValue = value; } } - else { - // draw the array size label - if (color.grayscale > 0.5f) - style.normal.textColor = Color.black; - else - style.normal.textColor = Color.white; - Handles.Label(labelPosition, receptor1.nucleiArray.Length.ToString(), style); - style.normal.textColor = Color.white; + + // Determine the spacing of the nuclei in the layer + float spacing = 400f / nodeCount; + float margin = 10 + spacing / 2; + + int row = 0; + List drawnArrays = new(); + foreach (Nucleus receiver in receivers) { + if (receiver is Receptor receptor) { + if (drawnArrays.Contains(receptor.nucleiArray)) + continue; + drawnArrays.Add(receptor.nucleiArray); + } + + Nucleus receiverNucleus = receiver; + if (receiverNucleus == null) + continue; + + Vector3 pos = new(50, margin + row * spacing, 0.0f); + Handles.color = Color.white; + Handles.DrawLine(parentPos, pos); + + DrawNucleus(receiverNucleus, pos, maxValue, size); + row++; } } - if (expandArray == false || nucleus is not IReceptor) { - // put name below nucleus - Vector3 labelPos = position - Vector3.down * (size + 5); // below neuron - style.alignment = TextAnchor.UpperCenter; + private void DrawSynapses(Nucleus nucleus, Vector3 parentPos, float size) { + int nodeCount = nucleus.synapses.Count; - int colonPos = nucleus.name.IndexOf(":"); - if (colonPos > 0 && colonPos < nucleus.name.Length - 2) { - // if it is an array, we should not show the :0 of the first element - string baseName = nucleus.name[..colonPos]; - Handles.Label(labelPos, baseName, style); + // Determine the maximum value in this layer + // This is used to 'scale' the output value colors of the nuclei + float maxValue = 0; + int neuronCount = 0; + List drawnArrays = new(); + foreach (Synapse synapse in nucleus.synapses) { + if (synapse.neuron == null) + continue; + + if (synapse.neuron is Receptor receptor) { + if (drawnArrays.Contains(receptor.nucleiArray)) + continue; + drawnArrays.Add(receptor.nucleiArray); + } + else if (synapse.neuron.parent is ClusterReceptor clusterReceptor) { + if (drawnArrays.Contains(clusterReceptor.nucleiArray)) + continue; + drawnArrays.Add(clusterReceptor.nucleiArray); + } + if (synapse.neuron is Neuron synapseNeuron) { + float value = synapseNeuron.outputMagnitude * synapse.weight; + // Debug.Log($"{synapse.nucleus.name}: {value} {length(synapse.nucleus.outputValue)} {synapse.weight}"); + if (value > maxValue) + maxValue = value; + } + neuronCount++; + } + + // Determine the spacing of the nuclei in the layer + float spacing = 400f / neuronCount; + float margin = 10 + spacing / 2; + + int row = 0; + drawnArrays = new(); + 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); + } + Vector3 pos = new(250, margin + row * spacing, 0.0f); + Handles.color = Color.white; + Handles.DrawLine(parentPos, pos); + Color color = Color.black; + if (Application.isPlaying) { + if (maxValue == 0 || !float.IsFinite(maxValue)) + maxValue = 1; + float brightness = 0; + if (synapse.neuron is Neuron synapseNeuron) + brightness = synapseNeuron.outputMagnitude * synapse.weight / maxValue; + color = new Color(brightness, brightness, brightness, 1f); + } + if (synapse.neuron.parent != null && synapse.neuron.parent != this.currentNucleus.parent) { + // the synapse nucleus is part of a subcluster + DrawNucleus(synapse.neuron.parent, pos, maxValue, size, color); + } + // else if (synapse.nucleus.cluster != null && synapse.nucleus.cluster != this.currentNucleus.cluster) { + // DrawNucleus(synapse.nucleus.parent, pos, maxValue, size, color); + // } + else { + DrawNucleus(synapse.neuron, pos, maxValue, size, color); + } + row++; + } + } + + private void DrawNucleus(Nucleus nucleus, Vector3 position, float maxValue, float size) { + Color color; + if (Application.isPlaying) { + float brightness = 0; + if (nucleus is Neuron neuron) + brightness = neuron.outputMagnitude / maxValue; + color = new Color(brightness, brightness, brightness, 1f); } else - Handles.Label(labelPos, nucleus.name, style); - + color = Color.black; + DrawNucleus(nucleus, position, maxValue, size, color); } - // Draw Cluster ring - if (nucleus is Cluster) { + private void DrawNucleus(Nucleus nucleus, Vector3 position, float maxValue, float size, Color color) { + if (nucleus is MemoryCell) { + Handles.color = Color.white; + Handles.DrawWireDisc(position + Vector3.right * 10, Vector3.forward, size); + } + + Handles.color = color; + Handles.DrawSolidDisc(position, Vector3.forward, size); + Handles.color = Color.white; - Handles.DrawWireDisc(position, Vector3.forward, size + 5); - } + // Position the label in front of the disc + Vector3 labelPosition = position + (Vector3.forward * 0.1f); - // Tooltip - Rect neuronRect = new(position.x - size, position.y - size, size * 2, size * 2); - int id = GUIUtility.GetControlID(FocusType.Passive); - Event e = Event.current; - EventType et = e.GetTypeForControl(id); - if (e != null && neuronRect.Contains(e.mousePosition)) { - // Process Hover - HandleMouseHover(nucleus, neuronRect); - // Process click - if (e.type == EventType.MouseDown && e.button == 0) { - // Consume the event so the scene doesn't also handle it - e.Use(); - HandleClicked(nucleus); + GUIStyle style = new(EditorStyles.label) { + alignment = TextAnchor.MiddleCenter, + normal = { textColor = Color.white }, + fontStyle = FontStyle.Bold, + }; + + if (nucleus is IReceptor receptor1) { + if (expandArray) { + // Put array indices above elements + style.alignment = TextAnchor.LowerCenter; + Vector3 labelPos1 = position + Vector3.down * (size + 5); // below disc + int colonPos1 = nucleus.name.IndexOf(":"); + if (colonPos1 > 0) { + string extName = nucleus.name[(colonPos1 + 2)..]; + Handles.Label(labelPos1, extName, style); + } + } + else { + // draw the array size label + if (color.grayscale > 0.5f) + style.normal.textColor = Color.black; + else + style.normal.textColor = Color.white; + Handles.Label(labelPosition, receptor1.nucleiArray.Length.ToString(), style); + style.normal.textColor = Color.white; + } + } + + if (expandArray == false || nucleus is not IReceptor) { + // put name below nucleus + Vector3 labelPos = position - Vector3.down * (size + 5); // below neuron + style.alignment = TextAnchor.UpperCenter; + + int colonPos = nucleus.name.IndexOf(":"); + if (colonPos > 0 && colonPos < nucleus.name.Length - 2) { + // if it is an array, we should not show the :0 of the first element + string baseName = nucleus.name[..colonPos]; + Handles.Label(labelPos, baseName, style); + } + else + Handles.Label(labelPos, nucleus.name, style); + + } + + // Draw Cluster ring + if (nucleus is Cluster) { + Handles.color = Color.white; + Handles.DrawWireDisc(position, Vector3.forward, size + 5); + } + + // Tooltip + Rect neuronRect = new(position.x - size, position.y - size, size * 2, size * 2); + int id = GUIUtility.GetControlID(FocusType.Passive); + Event e = Event.current; + EventType et = e.GetTypeForControl(id); + if (e != null && neuronRect.Contains(e.mousePosition)) { + // Process Hover + HandleMouseHover(nucleus, neuronRect); + // Process click + if (e.type == EventType.MouseDown && e.button == 0) { + // Consume the event so the scene doesn't also handle it + e.Use(); + HandleClicked(nucleus); + } } } - } - private void HandleMouseHover(Nucleus nucleus, Rect rect) { - GUIContent tooltip; - if (nucleus is Neuron neuron) { - tooltip = new( - $"{nucleus.name}" + - $"\nValue: {neuron.outputMagnitude}"); - } - else - tooltip = new($"{nucleus.name}"); - - Vector2 mousePosition = Event.current.mousePosition; - - // Display tooltip with some offset - Vector2 tooltipSize = GUI.skin.box.CalcSize(tooltip); - Rect tooltipRect = new Rect(mousePosition.x + 10, mousePosition.y + 10, tooltipSize.x, tooltipSize.y); - - GUI.Box(tooltipRect, tooltip); - } - - private void HandleClicked(Nucleus nucleus) { - if (nucleus == this.currentNucleus) { - if (nucleus is Receptor || nucleus is ClusterReceptor) - expandArray = !expandArray; + private void HandleMouseHover(Nucleus nucleus, Rect rect) { + GUIContent tooltip; + if (nucleus is Neuron neuron) { + tooltip = new( + $"{nucleus.name}" + + $"\nValue: {neuron.outputMagnitude}"); + } else + tooltip = new($"{nucleus.name}"); + + Vector2 mousePosition = Event.current.mousePosition; + + // Display tooltip with some offset + Vector2 tooltipSize = GUI.skin.box.CalcSize(tooltip); + Rect tooltipRect = new Rect(mousePosition.x + 10, mousePosition.y + 10, tooltipSize.x, tooltipSize.y); + + GUI.Box(tooltipRect, tooltip); + } + + private void HandleClicked(Nucleus nucleus) { + if (nucleus == this.currentNucleus) { + if (nucleus is Receptor || nucleus is ClusterReceptor) + expandArray = !expandArray; + else + expandArray = false; + } + // else if (nucleus is ReceptorInstance receptor) { + // this.currentNucleus = receptor.receptor; + // expandArray = false; + // BuildLayers(); + // } + else { + this.currentNucleus = nucleus; expandArray = false; - } - // else if (nucleus is ReceptorInstance receptor) { - // this.currentNucleus = receptor.receptor; - // expandArray = false; - // BuildLayers(); - // } - else { - this.currentNucleus = nucleus; - expandArray = false; - BuildLayers(); - } - } - - private VisualElement inspectorIMGUIContainer; - private bool showSynapses = true; - private bool showActivation = true; - protected bool breakOnWake = false; - protected bool trace = false; - void DrawInspector(VisualElement inspectorContainer) { - if (inspectorContainer == null) - return; - - inspectorContainer.Clear(); - if (this.currentNucleus == null) - return; - - // create a SerializedObject wrapper so Unity inspector controls work (and Undo) - SerializedObject so = new(prefabAsset); - this.inspectorIMGUIContainer = new IMGUIContainer(() => InspectorHandler(so)); - - inspectorContainer.Add(inspectorIMGUIContainer); - } - - void InspectorHandler(SerializedObject serializedObject) { - bool anythingChanged = false; - - if (serializedObject == null || serializedObject.targetObject == null) - return; - - if (this.currentNucleus == null) - return; - - serializedObject.Update(); - - GUIStyle headerStyle = new(EditorStyles.boldLabel) { - alignment = TextAnchor.MiddleLeft, - margin = new RectOffset(10, 0, 4, 4) - }; - GUIStyle boldTextFieldStyle = new(EditorStyles.textField) { - fontStyle = FontStyle.Bold - }; - - GUILayout.Label(this.currentNucleus.GetType().ToString(), headerStyle); - string newName = EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); - if (newName != this.currentNucleus.name) { - this.currentNucleus.name = newName; - this.prefab.RefreshOutputs(); - outputsField.choices = this.prefab.outputs.Select(output => output.name).ToList(); - anythingChanged = true; + BuildLayers(); + } } - if (Application.isPlaying) { - if (currentNucleus is Neuron currentNeuron1) { - GUIContent nameLabel = new("Output", currentNeuron1.outputValue.ToString()); - EditorGUILayout.FloatField(nameLabel, currentNeuron1.outputMagnitude); + private VisualElement inspectorIMGUIContainer; + private bool showSynapses = true; + private bool showActivation = true; + protected bool breakOnWake = false; + protected bool trace = false; + void DrawInspector(VisualElement inspectorContainer) { + if (inspectorContainer == null) + return; + + inspectorContainer.Clear(); + if (this.currentNucleus == null) + return; + + // create a SerializedObject wrapper so Unity inspector controls work (and Undo) + SerializedObject so = new(prefabAsset); + this.inspectorIMGUIContainer = new IMGUIContainer(() => InspectorHandler(so)); + + inspectorContainer.Add(inspectorIMGUIContainer); + } + + void InspectorHandler(SerializedObject serializedObject) { + bool anythingChanged = false; + + if (serializedObject == null || serializedObject.targetObject == null) + return; + + if (this.currentNucleus == null) + return; + + serializedObject.Update(); + + GUIStyle headerStyle = new(EditorStyles.boldLabel) { + alignment = TextAnchor.MiddleLeft, + margin = new RectOffset(10, 0, 4, 4) + }; + GUIStyle boldTextFieldStyle = new(EditorStyles.textField) { + fontStyle = FontStyle.Bold + }; + + GUILayout.Label(this.currentNucleus.GetType().ToString(), headerStyle); + string newName = EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); + if (newName != this.currentNucleus.name) { + this.currentNucleus.name = newName; + this.prefab.RefreshOutputs(); + outputsField.choices = this.prefab.outputs.Select(output => output.name).ToList(); + anythingChanged = true; + } + + if (Application.isPlaying) { + if (currentNucleus is Neuron currentNeuron1) { + GUIContent nameLabel = new("Output", currentNeuron1.outputValue.ToString()); + EditorGUILayout.FloatField(nameLabel, currentNeuron1.outputMagnitude); + } + else + EditorGUILayout.LabelField(" "); } else EditorGUILayout.LabelField(" "); - } - else - EditorGUILayout.LabelField(" "); - if (this.currentNucleus is MemoryCell memory) { - memory.staticMemory = EditorGUILayout.Toggle("Static Memory", memory.staticMemory); - } - - if (this.currentNucleus is IReceptor receptor1) { - EditorGUILayout.BeginHorizontal(); - EditorGUILayout.IntField("Array size", receptor1.nucleiArray.Count()); - if (GUILayout.Button("Add")) { - Undo.RecordObject(prefabAsset, "Array add " + prefabAsset.name); - receptor1.AddReceptorElement(this.prefab); - anythingChanged = true; + if (this.currentNucleus is MemoryCell memory) { + memory.staticMemory = EditorGUILayout.Toggle("Static Memory", memory.staticMemory); } - if (GUILayout.Button("Del")) { - Undo.RecordObject(prefabAsset, "Array delete " + prefabAsset.name); - receptor1.RemoveReceptorElement(); - anythingChanged = true; - } - EditorGUILayout.EndHorizontal(); - } - // Synapses - - if (this.currentNucleus is not Receptor && this.currentNucleus is not ClusterReceptor) { - showSynapses = EditorGUILayout.BeginFoldoutHeaderGroup(showSynapses, "Synapses"); - if (showSynapses) { - if (this.currentNucleus is Neuron neuron2) { - Neuron.CombinatorType newCombinator = (Neuron.CombinatorType)EditorGUILayout.EnumPopup("Combinator", neuron2.combinator); - anythingChanged |= newCombinator != neuron2.combinator; - neuron2.combinator = newCombinator; + if (this.currentNucleus is IReceptor receptor1) { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.IntField("Array size", receptor1.nucleiArray.Count()); + if (GUILayout.Button("Add")) { + Undo.RecordObject(prefabAsset, "Array add " + prefabAsset.name); + receptor1.AddReceptorElement(this.prefab); + anythingChanged = true; } + if (GUILayout.Button("Del")) { + Undo.RecordObject(prefabAsset, "Array delete " + prefabAsset.name); + receptor1.RemoveReceptorElement(); + anythingChanged = true; + } + EditorGUILayout.EndHorizontal(); + } - EditorGUIUtility.wideMode = true; - EditorGUIUtility.labelWidth = 100; - Vector3 newBias = EditorGUILayout.Vector3Field("Bias", this.currentNucleus.bias); - anythingChanged |= newBias != this.currentNucleus.bias; - this.currentNucleus.bias = newBias; + // Synapses - Nucleus[] array = null; - int elementIx = -1; - if (this.currentNucleus.synapses.Count > 0) { - Synapse[] synapses = this.currentNucleus.synapses.ToArray(); - foreach (Synapse synapse in synapses) { - if (synapse.neuron == null) - continue; + if (this.currentNucleus is not Receptor && this.currentNucleus is not ClusterReceptor) { + showSynapses = EditorGUILayout.BeginFoldoutHeaderGroup(showSynapses, "Synapses"); + if (showSynapses) { + if (this.currentNucleus is Neuron neuron2) { + Neuron.CombinatorType newCombinator = (Neuron.CombinatorType)EditorGUILayout.EnumPopup("Combinator", neuron2.combinator); + anythingChanged |= newCombinator != neuron2.combinator; + neuron2.combinator = newCombinator; + } - if (array != null) { - if (synapse.neuron.parent is Cluster iCluster && elementIx > 0) { - int thisElementIx = Cluster.GetNucleusIndex(iCluster.clusterNuclei, synapse.neuron); - if (thisElementIx == elementIx) - continue; - else - elementIx = thisElementIx; - } - // if (array.Contains(synapse.nucleus)) - // continue; - else if (array.Contains(synapse.neuron.parent)) + EditorGUIUtility.wideMode = true; + EditorGUIUtility.labelWidth = 100; + Vector3 newBias = EditorGUILayout.Vector3Field("Bias", this.currentNucleus.bias); + anythingChanged |= newBias != this.currentNucleus.bias; + this.currentNucleus.bias = newBias; + + Nucleus[] array = null; + int elementIx = -1; + if (this.currentNucleus.synapses.Count > 0) { + Synapse[] synapses = this.currentNucleus.synapses.ToArray(); + foreach (Synapse synapse in synapses) { + if (synapse.neuron == null) continue; - } - else { - if (synapse.neuron.parent is IReceptor iReceptor) { - array = iReceptor.nucleiArray; - if (iReceptor is Cluster iCluster) - elementIx = Cluster.GetNucleusIndex(iCluster.clusterNuclei, synapse.neuron); - } - // else if (synapse.nucleus is Receptor receptor2) // && receptor2.array != null && receptor2.array.nuclei.Length > 1) - // array = receptor2.nucleiArray; - } - EditorGUILayout.Space(); - - if (Application.isPlaying) { - if (synapse.neuron is Neuron synapseNeuron) { - Vector3 value = synapseNeuron.outputValue * synapse.weight; - GUIContent synapseValueLabel = new(synapse.neuron.name, synapseNeuron.outputValue.ToString()); - EditorGUILayout.FloatField(synapseValueLabel, synapseNeuron.outputMagnitude); - } - } - else { - EditorGUILayout.BeginHorizontal(); - - if (synapse.neuron.parent != null && synapse.neuron.parent != this.currentNucleus) { - // If it is a cluster - GUIStyle labelStyle = new(GUI.skin.label); - float labelWidth = 200; - if (synapse.neuron.clusterPrefab != null) { - labelWidth = labelStyle.CalcSize(new GUIContent($"{synapse.neuron.parent.baseName}.")).x; - GUILayout.Label($"{synapse.neuron.parent.baseName}", GUILayout.Width(labelWidth)); + if (array != null) { + if (synapse.neuron.parent is Cluster iCluster && elementIx > 0) { + int thisElementIx = Cluster.GetNucleusIndex(iCluster.clusterNuclei, synapse.neuron); + if (thisElementIx == elementIx) + continue; + else + elementIx = thisElementIx; } - string[] options = synapse.neuron.parent.clusterNuclei.Select(n => n.name).ToArray(); - int selectedIndex = System.Array.IndexOf(options, synapse.neuron.name); - int newIndex = EditorGUILayout.Popup(selectedIndex, options); - if (newIndex != selectedIndex && synapse.neuron.parent.clusterNuclei[newIndex] is Neuron newNeuron) - ChangeSynapse(synapse, newNeuron); + // if (array.Contains(synapse.nucleus)) + // continue; + else if (array.Contains(synapse.neuron.parent)) + continue; + } + else { + if (synapse.neuron.parent is IReceptor iReceptor) { + array = iReceptor.nucleiArray; + if (iReceptor is Cluster iCluster) + elementIx = Cluster.GetNucleusIndex(iCluster.clusterNuclei, synapse.neuron); + } + // else if (synapse.nucleus is Receptor receptor2) // && receptor2.array != null && receptor2.array.nuclei.Length > 1) + // array = receptor2.nucleiArray; } - else - GUILayout.Label(synapse.neuron.name); - bool disconnecting = GUILayout.Button("Disconnect", GUILayout.Width(80)); - if (disconnecting && synapse.neuron is Neuron synapseNeuron) { - synapseNeuron.RemoveReceiver(this.currentNucleus); - this.prefab.GarbageCollection(); + EditorGUILayout.Space(); + + if (Application.isPlaying) { + if (synapse.neuron is Neuron synapseNeuron) { + Vector3 value = synapseNeuron.outputValue * synapse.weight; + GUIContent synapseValueLabel = new(synapse.neuron.name, synapseNeuron.outputValue.ToString()); + EditorGUILayout.FloatField(synapseValueLabel, synapseNeuron.outputMagnitude); + } + } + else { + EditorGUILayout.BeginHorizontal(); + + if (synapse.neuron.parent != null && synapse.neuron.parent != this.currentNucleus) { + // If it is a cluster + GUIStyle labelStyle = new(GUI.skin.label); + float labelWidth = 200; + if (synapse.neuron.clusterPrefab != null) { + labelWidth = labelStyle.CalcSize(new GUIContent($"{synapse.neuron.parent.baseName}.")).x; + GUILayout.Label($"{synapse.neuron.parent.baseName}", GUILayout.Width(labelWidth)); + } + string[] options = synapse.neuron.parent.clusterNuclei.Select(n => n.name).ToArray(); + int selectedIndex = System.Array.IndexOf(options, synapse.neuron.name); + int newIndex = EditorGUILayout.Popup(selectedIndex, options); + if (newIndex != selectedIndex && synapse.neuron.parent.clusterNuclei[newIndex] is Neuron newNeuron) + ChangeSynapse(synapse, newNeuron); + } + else + GUILayout.Label(synapse.neuron.name); + + bool disconnecting = GUILayout.Button("Disconnect", GUILayout.Width(80)); + if (disconnecting && synapse.neuron is Neuron synapseNeuron) { + synapseNeuron.RemoveReceiver(this.currentNucleus); + this.prefab.GarbageCollection(); + anythingChanged = true; + } + EditorGUILayout.EndHorizontal(); + + } + + EditorGUI.indentLevel++; + float newWeight = EditorGUILayout.FloatField("Weight", synapse.weight); + if (newWeight != synapse.weight) { + if (synapse.neuron.parent is IReceptor receptor) { + Nucleus[] receptorArray = receptor.nucleiArray; + foreach (Synapse s in this.currentNucleus.synapses) { + if (s.neuron.parent is IReceptor r && r.nucleiArray == receptorArray) + s.weight = newWeight; + } + } + else + synapse.weight = newWeight; anythingChanged = true; } - EditorGUILayout.EndHorizontal(); - + EditorGUI.indentLevel--; } + } - EditorGUI.indentLevel++; - float newWeight = EditorGUILayout.FloatField("Weight", synapse.weight); - if (newWeight != synapse.weight) { - if (synapse.neuron.parent is IReceptor receptor) { - Nucleus[] receptorArray = receptor.nucleiArray; - foreach (Synapse s in this.currentNucleus.synapses) { - if (s.neuron.parent is IReceptor r && r.nucleiArray == receptorArray) - s.weight = newWeight; - } - } + EditorGUILayout.Space(); + anythingChanged |= ConnectNucleus(this.prefab, this.currentNucleus); + anythingChanged |= AddSynapse(this.prefab, this.currentNucleus); + } + EditorGUILayout.EndFoldoutHeaderGroup(); + } + + // Activation + + if (this.currentNucleus is not Cluster) { + EditorGUILayout.Space(); + showActivation = EditorGUILayout.BeginFoldoutHeaderGroup(showActivation, "Activation"); + if (showActivation) { + if (this.currentNucleus is Neuron neuron) { + if (this.currentNucleus is not MemoryCell) { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Activation Curve", GUILayout.Width(150)); + if (neuron.curveMax > 0) + EditorGUILayout.CurveField(neuron.curve, Color.cyan, new Rect(0, 0, 1, neuron.curveMax)); else - synapse.weight = newWeight; - anythingChanged = true; + EditorGUILayout.CurveField(neuron.curve, Color.cyan, new Rect(0, neuron.curveMax, 1, -neuron.curveMax)); + Neuron.CurvePresets newPreset = (Neuron.CurvePresets)EditorGUILayout.EnumPopup(neuron.curvePreset, GUILayout.Width(100)); + anythingChanged |= newPreset != neuron.curvePreset; + neuron.curvePreset = newPreset; + EditorGUILayout.EndHorizontal(); + } + if (neuron is Receptor receptor2) { + if (receptor2.nucleiArray == null || receptor2.nucleiArray.Count() == 0) + receptor2.array = new NucleusArray(neuron); } - EditorGUI.indentLevel--; } + + EditorGUILayout.Space(); } - - EditorGUILayout.Space(); - anythingChanged |= ConnectNucleus(this.prefab, this.currentNucleus); - anythingChanged |= AddSynapse(this.prefab, this.currentNucleus); + EditorGUILayout.EndFoldoutHeaderGroup(); } - EditorGUILayout.EndFoldoutHeaderGroup(); - } - // Activation + if (GUILayout.Button("Delete this neuron")) + DeleteNucleus(this.currentNucleus); + + if (this.currentNucleus is Cluster subCluster) { + if (GUILayout.Button("Edit Cluster")) + EditCluster(subCluster); + } - if (this.currentNucleus is not Cluster) { EditorGUILayout.Space(); - showActivation = EditorGUILayout.BeginFoldoutHeaderGroup(showActivation, "Activation"); - if (showActivation) { - if (this.currentNucleus is Neuron neuron) { - if (this.currentNucleus is not MemoryCell) { - EditorGUILayout.BeginHorizontal(); - EditorGUILayout.LabelField("Activation Curve", GUILayout.Width(150)); - if (neuron.curveMax > 0) - EditorGUILayout.CurveField(neuron.curve, Color.cyan, new Rect(0, 0, 1, neuron.curveMax)); - else - EditorGUILayout.CurveField(neuron.curve, Color.cyan, new Rect(0, neuron.curveMax, 1, -neuron.curveMax)); - Neuron.CurvePresets newPreset = (Neuron.CurvePresets)EditorGUILayout.EnumPopup(neuron.curvePreset, GUILayout.Width(100)); - anythingChanged |= newPreset != neuron.curvePreset; - neuron.curvePreset = newPreset; - EditorGUILayout.EndHorizontal(); - } - if (neuron is Receptor receptor2) { - if (receptor2.nucleiArray == null || receptor2.nucleiArray.Count() == 0) - receptor2.array = new NucleusArray(neuron); + breakOnWake = EditorGUILayout.Toggle("Break on wake", breakOnWake); + if (breakOnWake && this.currentNucleus is Neuron currentNeuron) { + if (currentNeuron.isSleeping == false) + Debug.Break(); + } + trace = EditorGUILayout.Toggle("Trace", trace); + this.currentNucleus.trace = trace; + + serializedObject.ApplyModifiedProperties(); + if (anythingChanged) { + EditorUtility.SetDirty(prefabAsset); + AssetDatabase.SaveAssets(); + } + } + + void OnSceneGUI(SceneView sceneView) { + if (this.gameObject != null) { + if (this.currentNucleus is IReceptor receptor) { + foreach (Nucleus nucleus in receptor.nucleiArray) { + if (nucleus is Neuron neuron) { + Vector3 worldVector = this.gameObject.transform.TransformVector(neuron.outputValue); + Handles.color = Color.yellow; + Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); + } } } - - EditorGUILayout.Space(); - } - EditorGUILayout.EndFoldoutHeaderGroup(); - } - - if (GUILayout.Button("Delete this neuron")) - DeleteNucleus(this.currentNucleus); - - if (this.currentNucleus is Cluster subCluster) { - if (GUILayout.Button("Edit Cluster")) - EditCluster(subCluster); - } - - EditorGUILayout.Space(); - breakOnWake = EditorGUILayout.Toggle("Break on wake", breakOnWake); - if (breakOnWake && this.currentNucleus is Neuron currentNeuron) { - if (currentNeuron.isSleeping == false) - Debug.Break(); - } - trace = EditorGUILayout.Toggle("Trace", trace); - this.currentNucleus.trace = trace; - - serializedObject.ApplyModifiedProperties(); - if (anythingChanged) { - EditorUtility.SetDirty(prefabAsset); - AssetDatabase.SaveAssets(); - } - } - - void OnSceneGUI(SceneView sceneView) { - if (this.gameObject != null) { - if (this.currentNucleus is IReceptor receptor) { - foreach (Nucleus nucleus in receptor.nucleiArray) { - if (nucleus is Neuron neuron) { - Vector3 worldVector = this.gameObject.transform.TransformVector(neuron.outputValue); + else { + if (this.currentNucleus is Neuron currentNeuron) { + Vector3 worldVector = this.gameObject.transform.TransformVector(currentNeuron.outputValue); Handles.color = Color.yellow; Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); } } } - else { - if (this.currentNucleus is Neuron currentNeuron) { - Vector3 worldVector = this.gameObject.transform.TransformVector(currentNeuron.outputValue); - Handles.color = Color.yellow; - Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); - } - } } - } - #region Synapses + #region Synapses - protected virtual void AddInput(Nucleus.Type selectedType, Nucleus nucleus) { - switch (selectedType) { - case Nucleus.Type.Neuron: - AddNeuronInput(nucleus); - break; - case Nucleus.Type.MemoryCell: - AddMemoryCellInput(nucleus); - break; - // case Nucleus.Type.Selector: - // AddSelectorInput(nucleus); - // break; - case Nucleus.Type.Cluster: - AddClusterInput(nucleus); - break; - // case Nucleus.Type.Pulsar: - // AddPulsarInput(nucleus); - // break; - case Nucleus.Type.Receptor: - AddReceptorInput(nucleus); - break; - // case Nucleus.Type.ReceptorArray: - // AddReceptorArrayInput(nucleus); - // break; - case Nucleus.Type.ClusterReceptor: - AddClusterReceptorInput(nucleus); - break; - default: - break; - } - } - - protected virtual void AddNeuronInput(Nucleus nucleus) { - Neuron newNeuroid = new(this.prefab, "New neuron"); - newNeuroid.AddReceiver(nucleus); - this.currentNucleus = newNeuroid; - BuildLayers(); - } - - // protected void AddSelectorInput(Nucleus nucleus) { - // Selector newSelector = new(this.prefab, "New Selector"); - // newSelector.AddReceiver(nucleus); - // this.currentNucleus = newSelector; - // BuildLayers(); - // } - - // protected void AddPulsarInput(Nucleus nucleus) { - // Pulsar newPulsar = new(this.prefab, "New Pulsar"); - // newPulsar.AddReceiver(nucleus); - // this.currentNucleus = newPulsar; - // BuildLayers(); - // } - - protected virtual void AddMemoryCellInput(Nucleus nucleus) { - MemoryCell newMemory = new(this.prefab, "New memory cell"); - newMemory.AddReceiver(nucleus); - this.currentNucleus = newMemory; - BuildLayers(); - } - - protected virtual void AddClusterInput(Nucleus nucleus) { - ClusterPickerWindow.ShowPicker(brain => OnClusterPicked(nucleus, brain), "Select Cluster"); - } - private void OnClusterPicked(Nucleus nucleus, ClusterPrefab prefab) { - Cluster subclusterInstance = new(prefab, this.prefab); - subclusterInstance.defaultOutput.AddReceiver(nucleus); - } - - protected virtual void AddReceptorInput(Nucleus nucleus) { - Receptor newReceptor = new(this.prefab, "New Receptor"); - newReceptor.AddReceiver(nucleus); - this.currentNucleus = newReceptor; - BuildLayers(); - } - - protected virtual void AddClusterReceptorInput(Nucleus nucleus) { - ClusterPickerWindow.ShowPicker(prefab => OnClusterReceptorPicked(nucleus, prefab), "Select Cluster"); - } - private void OnClusterReceptorPicked(Nucleus nucleus, ClusterPrefab selectedPrefab) { - ClusterReceptor clusterInstance = new(selectedPrefab, this.prefab, "New " + selectedPrefab.name); - clusterInstance.defaultOutput.AddReceiver(nucleus); - this.currentNucleus = clusterInstance; - BuildLayers(); - } - - private void EditCluster(Cluster subCluster) { - // May be used with storedPrefab... - Selection.activeObject = subCluster.prefab; - EditorGUIUtility.PingObject(subCluster.prefab); - var editor = Editor.CreateEditor(subCluster.prefab); - } - - int selectedConnectNucleus = -1; - // Connect to another nucleus in the same cluster - protected virtual bool ConnectNucleus(ClusterPrefab cluster, Nucleus nucleusToConnect) { - if (cluster == null) - return false; - - IEnumerable synapseNuclei = this.currentNucleus.synapses - .Where(synapse => synapse.neuron != null) - .Select(synapse => synapse.neuron); - - IEnumerable nuclei = cluster.nuclei - .Except(synapseNuclei); - IEnumerable nucleiNames = nuclei - .Select(n => { - int idx = n.name.IndexOf(':'); - return idx < 0 ? n.name : n.name[..idx]; - }) - .Distinct(); - - string[] names = nucleiNames.ToArray(); - EditorGUILayout.BeginHorizontal(); - selectedConnectNucleus = EditorGUILayout.Popup(selectedConnectNucleus, names); - bool connecting = GUILayout.Button("Connect", GUILayout.Width(80)); - EditorGUILayout.EndHorizontal(); - if (connecting) { - Nucleus nucleus = nuclei.ElementAt(selectedConnectNucleus); - if (nucleus is IReceptor receptor) - receptor.AddArrayReceiver(this.currentNucleus); - else if (nucleus is Neuron neuron) - neuron.AddReceiver(this.currentNucleus); - else if (nucleus is Cluster subCluster) - subCluster.defaultOutput.AddReceiver(this.currentNucleus); - - } - return connecting; - } - - protected virtual void DeleteNucleus(Nucleus nucleus) { - if (nucleus == null) - return; - - if (nucleus is Neuron neuron) { - foreach (Nucleus receiver in neuron.receivers) { - if (receiver != null) { - this.currentNucleus = receiver; + protected virtual void AddInput(Nucleus.Type selectedType, Nucleus nucleus) { + switch (selectedType) { + case Nucleus.Type.Neuron: + AddNeuronInput(nucleus); + break; + case Nucleus.Type.MemoryCell: + AddMemoryCellInput(nucleus); + break; + // case Nucleus.Type.Selector: + // AddSelectorInput(nucleus); + // break; + case Nucleus.Type.Cluster: + AddClusterInput(nucleus); + break; + // case Nucleus.Type.Pulsar: + // AddPulsarInput(nucleus); + // break; + case Nucleus.Type.Receptor: + AddReceptorInput(nucleus); + break; + // case Nucleus.Type.ReceptorArray: + // AddReceptorArrayInput(nucleus); + // break; + case Nucleus.Type.ClusterReceptor: + AddClusterReceptorInput(nucleus); + break; + default: break; - } } } - this.prefab.nuclei.Remove(nucleus); - if (outputsField.value == nucleus.name) { - this.prefab.RefreshOutputs(); - outputsField.choices = this.prefab.outputs.Select(output => output.name).ToList(); - outputsField.index = 0; + protected virtual void AddNeuronInput(Nucleus nucleus) { + Neuron newNeuroid = new(this.prefab, "New neuron"); + newNeuroid.AddReceiver(nucleus); + this.currentNucleus = newNeuroid; + BuildLayers(); } - Neuron.Delete(nucleus); + // protected void AddSelectorInput(Nucleus nucleus) { + // Selector newSelector = new(this.prefab, "New Selector"); + // newSelector.AddReceiver(nucleus); + // this.currentNucleus = newSelector; + // BuildLayers(); + // } - this.currentNucleus = this.prefab.output; - BuildLayers(); - } + // protected void AddPulsarInput(Nucleus nucleus) { + // Pulsar newPulsar = new(this.prefab, "New Pulsar"); + // newPulsar.AddReceiver(nucleus); + // this.currentNucleus = newPulsar; + // BuildLayers(); + // } - Nucleus.Type selectedType = Nucleus.Type.None; - protected virtual bool AddSynapse(ClusterPrefab cluster, Nucleus nucleus) { - if (cluster == null) - return false; - - EditorGUILayout.BeginHorizontal(); - selectedType = (Nucleus.Type)EditorGUILayout.EnumPopup(selectedType); - bool connecting = GUILayout.Button("Add", GUILayout.Width(80)); - EditorGUILayout.EndHorizontal(); - - if (connecting) { - AddInput(selectedType, this.currentNucleus); + protected virtual void AddMemoryCellInput(Nucleus nucleus) { + MemoryCell newMemory = new(this.prefab, "New memory cell"); + newMemory.AddReceiver(nucleus); + this.currentNucleus = newMemory; + BuildLayers(); } - return connecting; - // if (selectedType == Nucleus.Type.None) - // return false; - // AddInput(selectedType, this.currentNucleus); - // return true; - } + protected virtual void AddClusterInput(Nucleus nucleus) { + ClusterPickerWindow.ShowPicker(brain => OnClusterPicked(nucleus, brain), "Select Cluster"); + } + private void OnClusterPicked(Nucleus nucleus, ClusterPrefab prefab) { + Cluster subclusterInstance = new(prefab, this.prefab); + subclusterInstance.defaultOutput.AddReceiver(nucleus); + } - protected virtual void ChangeSynapse(Synapse synapse, Neuron newNucleus) { - Neuron synapseNeuron = synapse.neuron as Neuron; - if (synapse.neuron.parent is Cluster subCluster && subCluster.prefab != this.prefab) { - if (synapse.neuron.parent is ClusterReceptor receptor) { - // the new nucleus is part of a (cluster) receptor, - // so we have to change all synapses to this nucleus array elements - int oldNucleusIx = Cluster.GetNucleusIndex(subCluster.clusterNuclei, synapse.neuron); - int newNucleusIx = Cluster.GetNucleusIndex(subCluster.clusterNuclei, newNucleus); - foreach (Nucleus element in receptor.nucleiArray) { - if (element is not ClusterReceptor clusterReceptor) - continue; - // Get the same neuron as the synapse.nucleus in a different element - // of the ClusterReceptor array - Nucleus oldElementNucleus = clusterReceptor.clusterNuclei[oldNucleusIx]; - if (oldElementNucleus is not Neuron oldElementNeuron) - continue; - // Get the same neuron as newNucleus in a different element - // of the ClusterReceptor array - Nucleus newElementNucleus = clusterReceptor.clusterNuclei[newNucleusIx]; - if (newElementNucleus is not Neuron newElementNeuron) - continue; + protected virtual void AddReceptorInput(Nucleus nucleus) { + Receptor newReceptor = new(this.prefab, "New Receptor"); + newReceptor.AddReceiver(nucleus); + this.currentNucleus = newReceptor; + BuildLayers(); + } - oldElementNeuron.RemoveReceiver(this.currentNucleus); - newElementNeuron.AddReceiver(this.currentNucleus); - // Now find the synapse which pointed to the old Neuron - // Synapse synapseForUpdate = this.currentNucleus.GetSynapse(oldElementNeuron); - // synapseForUpdate.nucleus = newElementNeuron; + protected virtual void AddClusterReceptorInput(Nucleus nucleus) { + ClusterPickerWindow.ShowPicker(prefab => OnClusterReceptorPicked(nucleus, prefab), "Select Cluster"); + } + private void OnClusterReceptorPicked(Nucleus nucleus, ClusterPrefab selectedPrefab) { + ClusterReceptor clusterInstance = new(selectedPrefab, this.prefab, "New " + selectedPrefab.name); + clusterInstance.defaultOutput.AddReceiver(nucleus); + this.currentNucleus = clusterInstance; + BuildLayers(); + } + + private void EditCluster(Cluster subCluster) { + // May be used with storedPrefab... + Selection.activeObject = subCluster.prefab; + EditorGUIUtility.PingObject(subCluster.prefab); + var editor = Editor.CreateEditor(subCluster.prefab); + } + + int selectedConnectNucleus = -1; + // Connect to another nucleus in the same cluster + protected virtual bool ConnectNucleus(ClusterPrefab cluster, Nucleus nucleusToConnect) { + if (cluster == null) + return false; + + IEnumerable synapseNuclei = this.currentNucleus.synapses + .Where(synapse => synapse.neuron != null) + .Select(synapse => synapse.neuron); + + IEnumerable nuclei = cluster.nuclei + .Except(synapseNuclei); + IEnumerable nucleiNames = nuclei + .Select(n => { + int idx = n.name.IndexOf(':'); + return idx < 0 ? n.name : n.name[..idx]; + }) + .Distinct(); + + string[] names = nucleiNames.ToArray(); + EditorGUILayout.BeginHorizontal(); + selectedConnectNucleus = EditorGUILayout.Popup(selectedConnectNucleus, names); + bool connecting = GUILayout.Button("Connect", GUILayout.Width(80)); + EditorGUILayout.EndHorizontal(); + if (connecting) { + Nucleus nucleus = nuclei.ElementAt(selectedConnectNucleus); + if (nucleus is IReceptor receptor) + receptor.AddArrayReceiver(this.currentNucleus); + else if (nucleus is Neuron neuron) + neuron.AddReceiver(this.currentNucleus); + else if (nucleus is Cluster subCluster) + subCluster.defaultOutput.AddReceiver(this.currentNucleus); + + } + return connecting; + } + + protected virtual void DeleteNucleus(Nucleus nucleus) { + if (nucleus == null) + return; + + if (nucleus is Neuron neuron) { + foreach (Nucleus receiver in neuron.receivers) { + if (receiver != null) { + this.currentNucleus = receiver; + break; + } + } + } + this.prefab.nuclei.Remove(nucleus); + + if (outputsField.value == nucleus.name) { + this.prefab.RefreshOutputs(); + outputsField.choices = this.prefab.outputs.Select(output => output.name).ToList(); + outputsField.index = 0; + } + + Neuron.Delete(nucleus); + + this.currentNucleus = this.prefab.output; + BuildLayers(); + } + + Nucleus.Type selectedType = Nucleus.Type.None; + protected virtual bool AddSynapse(ClusterPrefab cluster, Nucleus nucleus) { + if (cluster == null) + return false; + + EditorGUILayout.BeginHorizontal(); + selectedType = (Nucleus.Type)EditorGUILayout.EnumPopup(selectedType); + bool connecting = GUILayout.Button("Add", GUILayout.Width(80)); + EditorGUILayout.EndHorizontal(); + + if (connecting) { + AddInput(selectedType, this.currentNucleus); + } + return connecting; + // if (selectedType == Nucleus.Type.None) + // return false; + + // AddInput(selectedType, this.currentNucleus); + // return true; + } + + protected virtual void ChangeSynapse(Synapse synapse, Neuron newNucleus) { + Neuron synapseNeuron = synapse.neuron as Neuron; + if (synapse.neuron.parent is Cluster subCluster && subCluster.prefab != this.prefab) { + if (synapse.neuron.parent is ClusterReceptor receptor) { + // the new nucleus is part of a (cluster) receptor, + // so we have to change all synapses to this nucleus array elements + int oldNucleusIx = Cluster.GetNucleusIndex(subCluster.clusterNuclei, synapse.neuron); + int newNucleusIx = Cluster.GetNucleusIndex(subCluster.clusterNuclei, newNucleus); + foreach (Nucleus element in receptor.nucleiArray) { + if (element is not ClusterReceptor clusterReceptor) + continue; + // Get the same neuron as the synapse.nucleus in a different element + // of the ClusterReceptor array + Nucleus oldElementNucleus = clusterReceptor.clusterNuclei[oldNucleusIx]; + if (oldElementNucleus is not Neuron oldElementNeuron) + continue; + // Get the same neuron as newNucleus in a different element + // of the ClusterReceptor array + Nucleus newElementNucleus = clusterReceptor.clusterNuclei[newNucleusIx]; + if (newElementNucleus is not Neuron newElementNeuron) + continue; + + oldElementNeuron.RemoveReceiver(this.currentNucleus); + newElementNeuron.AddReceiver(this.currentNucleus); + // Now find the synapse which pointed to the old Neuron + // Synapse synapseForUpdate = this.currentNucleus.GetSynapse(oldElementNeuron); + // synapseForUpdate.nucleus = newElementNeuron; + } + } + else { + // it is a neuron in a subcluster + synapseNeuron.RemoveReceiver(this.currentNucleus); + newNucleus.AddReceiver(this.currentNucleus); } } else { - // it is a neuron in a subcluster synapseNeuron.RemoveReceiver(this.currentNucleus); newNucleus.AddReceiver(this.currentNucleus); } } - else { - synapseNeuron.RemoveReceiver(this.currentNucleus); - newNucleus.AddReceiver(this.currentNucleus); + + protected virtual void DisconnectNucleus(Neuron nucleus) { + if (this.currentNucleus.clusterPrefab == null) + return; + string[] names = this.currentNucleus.synapses.Select(synapse => synapse.neuron.name).ToArray(); + int selectedIndex = -1; + selectedIndex = EditorGUILayout.Popup("Disconnect from", selectedIndex, names); + if (selectedIndex >= 0 && selectedIndex < this.currentNucleus.clusterPrefab.nuclei.Count) { + Synapse synapse = this.currentNucleus.synapses[selectedIndex]; + Neuron synapseNeuron = synapse.neuron as Neuron; + synapseNeuron.RemoveReceiver(this.currentNucleus); + } } + + #endregion Synapses } - protected virtual void DisconnectNucleus(Neuron nucleus) { - if (this.currentNucleus.clusterPrefab == null) - return; - string[] names = this.currentNucleus.synapses.Select(synapse => synapse.neuron.name).ToArray(); - int selectedIndex = -1; - selectedIndex = EditorGUILayout.Popup("Disconnect from", selectedIndex, names); - if (selectedIndex >= 0 && selectedIndex < this.currentNucleus.clusterPrefab.nuclei.Count) { - Synapse synapse = this.currentNucleus.synapses[selectedIndex]; - Neuron synapseNeuron = synapse.neuron as Neuron; - synapseNeuron.RemoveReceiver(this.currentNucleus); - } - } + #endregion Start - #endregion Synapses } - #endregion Start + public class NeuroidLayer { + public int ix = 0; + public List neuroids = new(); + } -} - -public class NeuroidLayer { - public int ix = 0; - public List neuroids = new(); -} +} \ No newline at end of file diff --git a/Editor/DAGWindow.cs b/Editor/DAGWindow.cs index aaf5aa3..1cb590e 100644 --- a/Editor/DAGWindow.cs +++ b/Editor/DAGWindow.cs @@ -4,390 +4,353 @@ using UnityEditor; using System.Collections.Generic; using System.Linq; -// Simple DAG data model -// [System.Serializable] -// public class DagNode -// { -// public int id; -// public string title; -// public Vector2 position; -// public float radius = 36f; // circle radius -// } +namespace NanoBrain { -// [System.Serializable] -// public class DagEdge -// { -// public int fromId; -// public int toId; -// } + // Simple DAG data model + // [System.Serializable] + // public class DagNode + // { + // public int id; + // public string title; + // public Vector2 position; + // public float radius = 36f; // circle radius + // } -public class DAGEditorWindow : EditorWindow -{ - List nodes = new List(); - List edges = new List(); + // [System.Serializable] + // public class DagEdge + // { + // public int fromId; + // public int toId; + // } - Vector2 pan = Vector2.zero; - float zoom = 1.0f; - const float minZoom = 0.5f; - const float maxZoom = 2.0f; + public class DAGEditorWindow : EditorWindow { + List nodes = new List(); + List edges = new List(); - GUIStyle labelStyle; - int selectedNodeId = -1; + Vector2 pan = Vector2.zero; + float zoom = 1.0f; + const float minZoom = 0.5f; + const float maxZoom = 2.0f; - Vector2 dragStart; - bool draggingNode = false; - int draggingNodeId = -1; + GUIStyle labelStyle; + int selectedNodeId = -1; - [MenuItem("Window/DAG Viewer (LR, Circles)")] - public static void ShowWindow() - { - var w = GetWindow("DAG Viewer (LR)"); - w.minSize = new Vector2(500, 300); - } + Vector2 dragStart; + bool draggingNode = false; + int draggingNodeId = -1; - void OnEnable() - { - labelStyle = new GUIStyle(EditorStyles.label); - labelStyle.alignment = TextAnchor.MiddleCenter; - labelStyle.normal.textColor = Color.white; - labelStyle.fontStyle = FontStyle.Bold; - - if (nodes.Count == 0) - CreateSampleGraph(); - - ComputeLeftToRightLayout(); - } - - void CreateSampleGraph() - { - nodes.Clear(); - edges.Clear(); - - nodes.Add(new DagNode() { id = 0, title = "In1" }); - nodes.Add(new DagNode() { id = 1, title = "In2" }); - nodes.Add(new DagNode() { id = 2, title = "A" }); - nodes.Add(new DagNode() { id = 3, title = "B" }); - nodes.Add(new DagNode() { id = 4, title = "C" }); - nodes.Add(new DagNode() { id = 5, title = "Out1" }); - nodes.Add(new DagNode() { id = 6, title = "Out2" }); - - edges.Add(new DagEdge() { fromId = 0, toId = 2 }); - edges.Add(new DagEdge() { fromId = 1, toId = 2 }); - edges.Add(new DagEdge() { fromId = 2, toId = 3 }); - edges.Add(new DagEdge() { fromId = 2, toId = 4 }); - edges.Add(new DagEdge() { fromId = 3, toId = 5 }); - edges.Add(new DagEdge() { fromId = 4, toId = 6 }); - } - - void OnGUI() - { - HandleInput(); - - Rect rect = new Rect(0, 0, position.width, position.height); - EditorGUI.DrawRect(rect, new Color(0.11f, 0.11f, 0.11f)); - - Matrix4x4 oldMatrix = GUI.matrix; - Vector2 origin = new Vector2(position.width / 2, position.height / 2); - GUI.matrix = Matrix4x4.TRS(origin + pan, Quaternion.identity, Vector3.one * zoom) * - Matrix4x4.TRS(-origin, Quaternion.identity, Vector3.one); - - // Draw edges first - foreach (var e in edges) - { - var from = GetNodeById(e.fromId); - var to = GetNodeById(e.toId); - if (from == null || to == null) continue; - DrawEdgeCircleNodes(from, to); + [MenuItem("Window/DAG Viewer (LR, Circles)")] + public static void ShowWindow() { + var w = GetWindow("DAG Viewer (LR)"); + w.minSize = new Vector2(500, 300); } - // Draw nodes (circles) - foreach (var n in nodes) - { - DrawNodeCircle(n); - } + void OnEnable() { + labelStyle = new GUIStyle(EditorStyles.label); + labelStyle.alignment = TextAnchor.MiddleCenter; + labelStyle.normal.textColor = Color.white; + labelStyle.fontStyle = FontStyle.Bold; - GUI.matrix = oldMatrix; + if (nodes.Count == 0) + CreateSampleGraph(); - // Footer toolbar - GUILayout.FlexibleSpace(); - EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); - if (GUILayout.Button("Fit", EditorStyles.toolbarButton)) FitToView(); - if (GUILayout.Button("Layout LR", EditorStyles.toolbarButton)) ComputeLeftToRightLayout(); - if (GUILayout.Button("Add Node", EditorStyles.toolbarButton)) - { - AddNode("N" + nodes.Count); ComputeLeftToRightLayout(); } - if (GUILayout.Button("Add Edge (selected->new)", EditorStyles.toolbarButton)) - { - if (selectedNodeId != -1) - { - var newNode = AddNode("N" + nodes.Count); - edges.Add(new DagEdge() { fromId = selectedNodeId, toId = newNode.id }); + + void CreateSampleGraph() { + nodes.Clear(); + edges.Clear(); + + nodes.Add(new DagNode() { id = 0, title = "In1" }); + nodes.Add(new DagNode() { id = 1, title = "In2" }); + nodes.Add(new DagNode() { id = 2, title = "A" }); + nodes.Add(new DagNode() { id = 3, title = "B" }); + nodes.Add(new DagNode() { id = 4, title = "C" }); + nodes.Add(new DagNode() { id = 5, title = "Out1" }); + nodes.Add(new DagNode() { id = 6, title = "Out2" }); + + edges.Add(new DagEdge() { fromId = 0, toId = 2 }); + edges.Add(new DagEdge() { fromId = 1, toId = 2 }); + edges.Add(new DagEdge() { fromId = 2, toId = 3 }); + edges.Add(new DagEdge() { fromId = 2, toId = 4 }); + edges.Add(new DagEdge() { fromId = 3, toId = 5 }); + edges.Add(new DagEdge() { fromId = 4, toId = 6 }); + } + + void OnGUI() { + HandleInput(); + + Rect rect = new Rect(0, 0, position.width, position.height); + EditorGUI.DrawRect(rect, new Color(0.11f, 0.11f, 0.11f)); + + Matrix4x4 oldMatrix = GUI.matrix; + Vector2 origin = new Vector2(position.width / 2, position.height / 2); + GUI.matrix = Matrix4x4.TRS(origin + pan, Quaternion.identity, Vector3.one * zoom) * + Matrix4x4.TRS(-origin, Quaternion.identity, Vector3.one); + + // Draw edges first + foreach (var e in edges) { + var from = GetNodeById(e.fromId); + var to = GetNodeById(e.toId); + if (from == null || to == null) continue; + DrawEdgeCircleNodes(from, to); + } + + // Draw nodes (circles) + foreach (var n in nodes) { + DrawNodeCircle(n); + } + + GUI.matrix = oldMatrix; + + // Footer toolbar + GUILayout.FlexibleSpace(); + EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); + if (GUILayout.Button("Fit", EditorStyles.toolbarButton)) FitToView(); + if (GUILayout.Button("Layout LR", EditorStyles.toolbarButton)) ComputeLeftToRightLayout(); + if (GUILayout.Button("Add Node", EditorStyles.toolbarButton)) { + AddNode("N" + nodes.Count); ComputeLeftToRightLayout(); } - } - EditorGUILayout.EndHorizontal(); - } - - void HandleInput() - { - Event e = Event.current; - - // Zoom with scroll - if (e.type == EventType.ScrollWheel) - { - float oldZoom = zoom; - float delta = -e.delta.y * 0.01f; - zoom = Mathf.Clamp(zoom + delta, minZoom, maxZoom); - Vector2 mouse = e.mousePosition; - pan += (mouse - new Vector2(position.width / 2, position.height / 2)) * (1 - zoom / oldZoom); - e.Use(); + if (GUILayout.Button("Add Edge (selected->new)", EditorStyles.toolbarButton)) { + if (selectedNodeId != -1) { + var newNode = AddNode("N" + nodes.Count); + edges.Add(new DagEdge() { fromId = selectedNodeId, toId = newNode.id }); + ComputeLeftToRightLayout(); + } + } + EditorGUILayout.EndHorizontal(); } - // Pan with middle or right+ctrl drag - if (e.type == EventType.MouseDrag && (e.button == 2 || (e.button == 1 && e.control))) - { - pan += e.delta; - e.Use(); - } + void HandleInput() { + Event e = Event.current; - // Node dragging & selection (convert mouse to graph space) - Vector2 graphMouse = ScreenToGraph(e.mousePosition); - if (e.type == EventType.MouseDown && e.button == 0) - { - int hit = HitTestNode(graphMouse); - if (hit != -1) - { - selectedNodeId = hit; - draggingNode = true; - draggingNodeId = hit; - dragStart = graphMouse; + // Zoom with scroll + if (e.type == EventType.ScrollWheel) { + float oldZoom = zoom; + float delta = -e.delta.y * 0.01f; + zoom = Mathf.Clamp(zoom + delta, minZoom, maxZoom); + Vector2 mouse = e.mousePosition; + pan += (mouse - new Vector2(position.width / 2, position.height / 2)) * (1 - zoom / oldZoom); e.Use(); } - else - { - selectedNodeId = -1; - } - } - if (draggingNode && draggingNodeId != -1) - { - if (e.type == EventType.MouseDrag && e.button == 0) - { - Vector2 graphDelta = e.delta / zoom; - var n = GetNodeById(draggingNodeId); - if (n != null) - { - n.position += graphDelta; - Repaint(); + // Pan with middle or right+ctrl drag + if (e.type == EventType.MouseDrag && (e.button == 2 || (e.button == 1 && e.control))) { + pan += e.delta; + e.Use(); + } + + // Node dragging & selection (convert mouse to graph space) + Vector2 graphMouse = ScreenToGraph(e.mousePosition); + if (e.type == EventType.MouseDown && e.button == 0) { + int hit = HitTestNode(graphMouse); + if (hit != -1) { + selectedNodeId = hit; + draggingNode = true; + draggingNodeId = hit; + dragStart = graphMouse; + e.Use(); + } + else { + selectedNodeId = -1; + } + } + + if (draggingNode && draggingNodeId != -1) { + if (e.type == EventType.MouseDrag && e.button == 0) { + Vector2 graphDelta = e.delta / zoom; + var n = GetNodeById(draggingNodeId); + if (n != null) { + n.position += graphDelta; + Repaint(); + e.Use(); + } + } + if (e.type == EventType.MouseUp && e.button == 0) { + draggingNode = false; + draggingNodeId = -1; e.Use(); } } - if (e.type == EventType.MouseUp && e.button == 0) - { - draggingNode = false; - draggingNodeId = -1; - e.Use(); + } + + DagNode AddNode(string title) { + int nextId = nodes.Count > 0 ? nodes.Max(n => n.id) + 1 : 0; + var n = new DagNode() { id = nextId, title = title, position = Vector2.zero }; + nodes.Add(n); + return n; + } + + DagNode GetNodeById(int id) => nodes.FirstOrDefault(x => x.id == id); + + void DrawNodeCircle(DagNode n) { + Vector2 center = n.position; + float r = n.radius; + Rect nodeRect = new Rect(center.x - r, center.y - r, r * 2, r * 2); + + // circle background + Color bg = (n.id == selectedNodeId) ? new Color(0.15f, 0.5f, 0.9f) : new Color(0.2f, 0.2f, 0.2f); + EditorGUI.DrawRect(nodeRect, bg); + + // anti-aliased circle outline + Handles.color = Color.white * 0.9f; + Handles.DrawAAPolyLine(3f / zoom, GetCircleOutlinePoints(center, r, 48).ToArray()); + + // label + Vector2 labelPos = center - new Vector2(0, 8); + GUI.Label(new Rect(labelPos.x - r, labelPos.y - 8, r * 2, 18), n.title, labelStyle); + } + + List GetCircleOutlinePoints(Vector2 center, float radius, int segments) { + var pts = new List(segments + 1); + for (int i = 0; i <= segments; i++) { + float a = (float)i / segments * Mathf.PI * 2f; + pts.Add(new Vector3(center.x + Mathf.Cos(a) * radius, center.y + Mathf.Sin(a) * radius, 0)); } - } - } - - DagNode AddNode(string title) - { - int nextId = nodes.Count > 0 ? nodes.Max(n => n.id) + 1 : 0; - var n = new DagNode() { id = nextId, title = title, position = Vector2.zero }; - nodes.Add(n); - return n; - } - - DagNode GetNodeById(int id) => nodes.FirstOrDefault(x => x.id == id); - - void DrawNodeCircle(DagNode n) - { - Vector2 center = n.position; - float r = n.radius; - Rect nodeRect = new Rect(center.x - r, center.y - r, r * 2, r * 2); - - // circle background - Color bg = (n.id == selectedNodeId) ? new Color(0.15f, 0.5f, 0.9f) : new Color(0.2f, 0.2f, 0.2f); - EditorGUI.DrawRect(nodeRect, bg); - - // anti-aliased circle outline - Handles.color = Color.white * 0.9f; - Handles.DrawAAPolyLine(3f / zoom, GetCircleOutlinePoints(center, r, 48).ToArray()); - - // label - Vector2 labelPos = center - new Vector2(0, 8); - GUI.Label(new Rect(labelPos.x - r, labelPos.y - 8, r * 2, 18), n.title, labelStyle); - } - - List GetCircleOutlinePoints(Vector2 center, float radius, int segments) - { - var pts = new List(segments + 1); - for (int i = 0; i <= segments; i++) - { - float a = (float)i / segments * Mathf.PI * 2f; - pts.Add(new Vector3(center.x + Mathf.Cos(a) * radius, center.y + Mathf.Sin(a) * radius, 0)); - } - return pts; - } - - void DrawEdgeCircleNodes(DagNode from, DagNode to) - { - Vector2 a = from.position; - Vector2 b = to.position; - if (a == b) return; - - // Compute edge line that starts/ends at circle circumferences - Vector2 dir = (b - a).normalized; - Vector2 start = a + dir * from.radius; - Vector2 end = b - dir * to.radius; - - // Use a simple curved line: start -> control -> end (bezier) - Vector2 control = new Vector2((start.x + end.x) / 2f, (start.y + end.y) / 2f); - // Slight vertical offset to separate overlapping lines based on node ids - float offset = ((from.id * 7 + to.id * 11) % 7 - 3) * 6f / zoom; - control += new Vector2(0, offset); - - Handles.color = Color.white * 0.9f; - Handles.DrawAAPolyLine(3f / zoom, 20, GetBezierPoints(start, control, end, 24).ToArray()); - - // Arrow at end pointing towards 'b' - DrawArrowHead(end - dir * 2f, end, 10f / zoom, 12f / zoom, Color.white); - } - - List GetBezierPoints(Vector2 p0, Vector2 p1, Vector2 p2, int seg) - { - var pts = new List(seg + 1); - for (int i = 0; i <= seg; i++) - { - float t = (float)i / seg; - Vector2 p = (1 - t) * (1 - t) * p0 + 2 * (1 - t) * t * p1 + t * t * p2; - pts.Add(new Vector3(p.x, p.y, 0)); - } - return pts; - } - - void DrawArrowHead(Vector2 from, Vector2 to, float headWidth, float headLength, Color color) - { - Vector2 dir = (to - from).normalized; - if (dir == Vector2.zero) return; - Vector2 right = new Vector2(-dir.y, dir.x); - - Vector3 p1 = to; - Vector3 p2 = to - dir * headLength + right * headWidth * 0.5f; - Vector3 p3 = to - dir * headLength - right * headWidth * 0.5f; - - Handles.color = color; - Handles.DrawAAConvexPolygon(p1, p2, p3); - } - - // Left-to-right layered layout (sources on the left, sinks on the right) - void ComputeLeftToRightLayout() - { - // build adjacency and indegree - var adj = nodes.ToDictionary(n => n.id, n => new List()); - var indeg = nodes.ToDictionary(n => n.id, n => 0); - foreach (var e in edges) - { - if (!adj.ContainsKey(e.fromId) || !adj.ContainsKey(e.toId)) continue; - adj[e.fromId].Add(e.toId); - indeg[e.toId]++; + return pts; } - // Kahn's algorithm to compute topological layers (horizontal layers) - Dictionary layer = new Dictionary(); - Queue q = new Queue(indeg.Where(kv => kv.Value == 0).Select(kv => kv.Key)); - foreach (var id in q) layer[id] = 0; + void DrawEdgeCircleNodes(DagNode from, DagNode to) { + Vector2 a = from.position; + Vector2 b = to.position; + if (a == b) return; - while (q.Count > 0) - { - int u = q.Dequeue(); - int l = layer[u]; - foreach (var v in adj[u]) - { - // prefer placing v at least one layer after u - if (!layer.ContainsKey(v) || layer[v] < l + 1) layer[v] = l + 1; - indeg[v]--; - if (indeg[v] == 0) q.Enqueue(v); + // Compute edge line that starts/ends at circle circumferences + Vector2 dir = (b - a).normalized; + Vector2 start = a + dir * from.radius; + Vector2 end = b - dir * to.radius; + + // Use a simple curved line: start -> control -> end (bezier) + Vector2 control = new Vector2((start.x + end.x) / 2f, (start.y + end.y) / 2f); + // Slight vertical offset to separate overlapping lines based on node ids + float offset = ((from.id * 7 + to.id * 11) % 7 - 3) * 6f / zoom; + control += new Vector2(0, offset); + + Handles.color = Color.white * 0.9f; + Handles.DrawAAPolyLine(3f / zoom, 20, GetBezierPoints(start, control, end, 24).ToArray()); + + // Arrow at end pointing towards 'b' + DrawArrowHead(end - dir * 2f, end, 10f / zoom, 12f / zoom, Color.white); + } + + List GetBezierPoints(Vector2 p0, Vector2 p1, Vector2 p2, int seg) { + var pts = new List(seg + 1); + for (int i = 0; i <= seg; i++) { + float t = (float)i / seg; + Vector2 p = (1 - t) * (1 - t) * p0 + 2 * (1 - t) * t * p1 + t * t * p2; + pts.Add(new Vector3(p.x, p.y, 0)); } + return pts; } - // Any unreachable nodes -> assign next layers - int maxLayer = layer.Count > 0 ? layer.Values.Max() : 0; - foreach (var n in nodes) - { - if (!layer.ContainsKey(n.id)) - { - maxLayer++; - layer[n.id] = maxLayer; + void DrawArrowHead(Vector2 from, Vector2 to, float headWidth, float headLength, Color color) { + Vector2 dir = (to - from).normalized; + if (dir == Vector2.zero) return; + Vector2 right = new Vector2(-dir.y, dir.x); + + Vector3 p1 = to; + Vector3 p2 = to - dir * headLength + right * headWidth * 0.5f; + Vector3 p3 = to - dir * headLength - right * headWidth * 0.5f; + + Handles.color = color; + Handles.DrawAAConvexPolygon(p1, p2, p3); + } + + // Left-to-right layered layout (sources on the left, sinks on the right) + void ComputeLeftToRightLayout() { + // build adjacency and indegree + var adj = nodes.ToDictionary(n => n.id, n => new List()); + var indeg = nodes.ToDictionary(n => n.id, n => 0); + foreach (var e in edges) { + if (!adj.ContainsKey(e.fromId) || !adj.ContainsKey(e.toId)) continue; + adj[e.fromId].Add(e.toId); + indeg[e.toId]++; } - } - // Group nodes by layer (left to right) - var layers = layer.GroupBy(kv => kv.Value).OrderBy(g => g.Key).Select(g => g.Select(x => x.Key).ToList()).ToList(); + // Kahn's algorithm to compute topological layers (horizontal layers) + Dictionary layer = new Dictionary(); + Queue q = new Queue(indeg.Where(kv => kv.Value == 0).Select(kv => kv.Key)); + foreach (var id in q) layer[id] = 0; - // Layout parameters (horizontal spacing drives left->right) - float hSpacing = 220f; - float vSpacing = 120f; - - // Place nodes: x increases with layer index, y spaced within layer - for (int li = 0; li < layers.Count; li++) - { - var lst = layers[li]; - float totalHeight = (lst.Count - 1) * vSpacing; - for (int i = 0; i < lst.Count; i++) - { - int id = lst[i]; - var n = GetNodeById(id); - if (n == null) continue; - float x = li * hSpacing; - float y = -totalHeight / 2f + i * vSpacing; - n.position = new Vector2(x, y); + while (q.Count > 0) { + int u = q.Dequeue(); + int l = layer[u]; + foreach (var v in adj[u]) { + // prefer placing v at least one layer after u + if (!layer.ContainsKey(v) || layer[v] < l + 1) layer[v] = l + 1; + indeg[v]--; + if (indeg[v] == 0) q.Enqueue(v); + } } + + // Any unreachable nodes -> assign next layers + int maxLayer = layer.Count > 0 ? layer.Values.Max() : 0; + foreach (var n in nodes) { + if (!layer.ContainsKey(n.id)) { + maxLayer++; + layer[n.id] = maxLayer; + } + } + + // Group nodes by layer (left to right) + var layers = layer.GroupBy(kv => kv.Value).OrderBy(g => g.Key).Select(g => g.Select(x => x.Key).ToList()).ToList(); + + // Layout parameters (horizontal spacing drives left->right) + float hSpacing = 220f; + float vSpacing = 120f; + + // Place nodes: x increases with layer index, y spaced within layer + for (int li = 0; li < layers.Count; li++) { + var lst = layers[li]; + float totalHeight = (lst.Count - 1) * vSpacing; + for (int i = 0; i < lst.Count; i++) { + int id = lst[i]; + var n = GetNodeById(id); + if (n == null) continue; + float x = li * hSpacing; + float y = -totalHeight / 2f + i * vSpacing; + n.position = new Vector2(x, y); + } + } + + Repaint(); } - Repaint(); - } + void FitToView() { + if (nodes.Count == 0) return; + Rect bounds = new Rect(nodes[0].position - Vector2.one * nodes[0].radius, Vector2.one * nodes[0].radius * 2f); + foreach (var n in nodes) + bounds = RectUnion(bounds, new Rect(n.position - Vector2.one * n.radius, Vector2.one * n.radius * 2f)); - void FitToView() - { - if (nodes.Count == 0) return; - Rect bounds = new Rect(nodes[0].position - Vector2.one * nodes[0].radius, Vector2.one * nodes[0].radius * 2f); - foreach (var n in nodes) - bounds = RectUnion(bounds, new Rect(n.position - Vector2.one * n.radius, Vector2.one * n.radius * 2f)); - - Vector2 center = bounds.center; - pan = -center; - zoom = 1.0f; - Repaint(); - } - - static Rect RectUnion(Rect a, Rect b) - { - float xMin = Mathf.Min(a.xMin, b.xMin); - float xMax = Mathf.Max(a.xMax, b.xMax); - float yMin = Mathf.Min(a.yMin, b.yMin); - float yMax = Mathf.Max(a.yMax, b.yMax); - return Rect.MinMaxRect(xMin, yMin, xMax, yMax); - } - - Vector2 ScreenToGraph(Vector2 screenPos) - { - Vector2 origin = new Vector2(position.width / 2, position.height / 2); - // invert the GUI.matrix transform (approx for current simple transforms) - return (screenPos - (origin + pan)) / zoom + origin * (1 - 1 / zoom); - } - - int HitTestNode(Vector2 graphPos) - { - // returns node id under point or -1 - for (int i = nodes.Count - 1; i >= 0; i--) - { - var n = nodes[i]; - if ((graphPos - n.position).sqrMagnitude <= n.radius * n.radius) return n.id; + Vector2 center = bounds.center; + pan = -center; + zoom = 1.0f; + Repaint(); + } + + static Rect RectUnion(Rect a, Rect b) { + float xMin = Mathf.Min(a.xMin, b.xMin); + float xMax = Mathf.Max(a.xMax, b.xMax); + float yMin = Mathf.Min(a.yMin, b.yMin); + float yMax = Mathf.Max(a.yMax, b.yMax); + return Rect.MinMaxRect(xMin, yMin, xMax, yMax); + } + + Vector2 ScreenToGraph(Vector2 screenPos) { + Vector2 origin = new Vector2(position.width / 2, position.height / 2); + // invert the GUI.matrix transform (approx for current simple transforms) + return (screenPos - (origin + pan)) / zoom + origin * (1 - 1 / zoom); + } + + int HitTestNode(Vector2 graphPos) { + // returns node id under point or -1 + for (int i = nodes.Count - 1; i >= 0; i--) { + var n = nodes[i]; + if ((graphPos - n.position).sqrMagnitude <= n.radius * n.radius) return n.id; + } + return -1; } - return -1; } -} + +} \ No newline at end of file diff --git a/Icons.meta b/Editor/Icons.meta similarity index 100% rename from Icons.meta rename to Editor/Icons.meta diff --git a/Icons/NeuraalNetwerkIcoonSchets1.png b/Editor/Icons/NeuraalNetwerkIcoonSchets1.png similarity index 100% rename from Icons/NeuraalNetwerkIcoonSchets1.png rename to Editor/Icons/NeuraalNetwerkIcoonSchets1.png diff --git a/Icons/NeuraalNetwerkIcoonSchets1.png.meta b/Editor/Icons/NeuraalNetwerkIcoonSchets1.png.meta similarity index 99% rename from Icons/NeuraalNetwerkIcoonSchets1.png.meta rename to Editor/Icons/NeuraalNetwerkIcoonSchets1.png.meta index 1ea36b8..c03e0ea 100644 --- a/Icons/NeuraalNetwerkIcoonSchets1.png.meta +++ b/Editor/Icons/NeuraalNetwerkIcoonSchets1.png.meta @@ -52,7 +52,7 @@ TextureImporter: spriteBorder: {x: 0, y: 0, z: 0, w: 0} spriteGenerateFallbackPhysicsShape: 1 alphaUsage: 1 - alphaIsTransparency: 0 + alphaIsTransparency: 1 spriteTessellationDetail: -1 textureType: 0 textureShape: 1 diff --git a/Icons/NeuraalNetwerkIcoonSchets2.png b/Editor/Icons/NeuraalNetwerkIcoonSchets2.png similarity index 100% rename from Icons/NeuraalNetwerkIcoonSchets2.png rename to Editor/Icons/NeuraalNetwerkIcoonSchets2.png diff --git a/Icons/NeuraalNetwerkIcoonSchets2.png.meta b/Editor/Icons/NeuraalNetwerkIcoonSchets2.png.meta similarity index 99% rename from Icons/NeuraalNetwerkIcoonSchets2.png.meta rename to Editor/Icons/NeuraalNetwerkIcoonSchets2.png.meta index 524e4c8..7ea5b05 100644 --- a/Icons/NeuraalNetwerkIcoonSchets2.png.meta +++ b/Editor/Icons/NeuraalNetwerkIcoonSchets2.png.meta @@ -52,7 +52,7 @@ TextureImporter: spriteBorder: {x: 0, y: 0, z: 0, w: 0} spriteGenerateFallbackPhysicsShape: 1 alphaUsage: 1 - alphaIsTransparency: 0 + alphaIsTransparency: 1 spriteTessellationDetail: -1 textureType: 0 textureShape: 1 diff --git a/Icons/NeuraalNetwerkIcoonSchets3.png b/Editor/Icons/NeuraalNetwerkIcoonSchets3.png similarity index 100% rename from Icons/NeuraalNetwerkIcoonSchets3.png rename to Editor/Icons/NeuraalNetwerkIcoonSchets3.png diff --git a/Icons/NeuraalNetwerkIcoonSchets3.png.meta b/Editor/Icons/NeuraalNetwerkIcoonSchets3.png.meta similarity index 100% rename from Icons/NeuraalNetwerkIcoonSchets3.png.meta rename to Editor/Icons/NeuraalNetwerkIcoonSchets3.png.meta diff --git a/Editor/NanoBrain_Editor.cs b/Editor/NanoBrain_Editor.cs index 164e1db..3288dac 100644 --- a/Editor/NanoBrain_Editor.cs +++ b/Editor/NanoBrain_Editor.cs @@ -4,46 +4,50 @@ using UnityEditor.UIElements; using UnityEngine; using UnityEngine.UIElements; -[CustomEditor(typeof(NanoBrain))] -public class NanoBrainComponent_Editor : Editor { - protected static VisualElement mainContainer; - protected static VisualElement inspectorContainer; +namespace NanoBrain { - protected NanoBrain component; - private SerializedProperty brainProp; + [CustomEditor(typeof(NanoBrain))] + public class NanoBrainComponent_Editor : Editor { + protected static VisualElement mainContainer; + protected static VisualElement inspectorContainer; - ClusterInspector.GraphView board; + protected NanoBrain component; + private SerializedProperty brainProp; - public void OnEnable() { - component = target as NanoBrain; + ClusterInspector.GraphView board; - if (Application.isPlaying == false && serializedObject != null) { - string propertyName = nameof(NanoBrain.defaultBrain); - brainProp = serializedObject.FindProperty(propertyName); - } - } + public void OnEnable() { + component = target as NanoBrain; - public override VisualElement CreateInspectorGUI() { - Cluster brain = component.brain; - - if (Application.isPlaying == false) - serializedObject.Update(); - - - VisualElement root = new(); - if (Application.isPlaying == false) { - PropertyField brainField = new(brainProp) { - label = "Nano Brain" - }; - root.Add(brainField); + if (Application.isPlaying == false && serializedObject != null) { + string propertyName = nameof(NanoBrain.defaultBrain); + brainProp = serializedObject.FindProperty(propertyName); + } } - if (brain != null) - ClusterInspector.CreateInspector(root, brain.prefab, brain.defaultOutput, component.gameObject); + public override VisualElement CreateInspectorGUI() { + Cluster brain = component.brain; + + if (Application.isPlaying == false) + serializedObject.Update(); + + + VisualElement root = new(); + if (Application.isPlaying == false) { + PropertyField brainField = new(brainProp) { + label = "Nano Brain" + }; + root.Add(brainField); + } + + if (brain != null) + ClusterInspector.CreateInspector(root, brain.prefab, brain.defaultOutput, component.gameObject); + + if (Application.isPlaying == false) + serializedObject.ApplyModifiedProperties(); + return root; + } - if (Application.isPlaying == false) - serializedObject.ApplyModifiedProperties(); - return root; } } \ No newline at end of file diff --git a/IReceptor.cs b/IReceptor.cs deleted file mode 100644 index b56a360..0000000 --- a/IReceptor.cs +++ /dev/null @@ -1,73 +0,0 @@ -using UnityEngine; - -public interface IReceptor { - public string GetName(); - - public Nucleus[] nucleiArray { get; set; } - - public void AddReceptorElement(ClusterPrefab prefab); - public void RemoveReceptorElement(); - - public void AddArrayReceiver(Nucleus receiverToAdd, float weight = 1); - - public void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = null); -} - -public static class IReceptorHelpers { - - public static void AddReceptorElement(IReceptor receptor, ClusterPrefab prefab) { - if (receptor.nucleiArray.Length == 0) { - Debug.LogError("Empty perceptoid array, cannot add"); - } - int newLength = receptor.nucleiArray.Length + 1; - Nucleus[] newArray = new Nucleus[newLength]; - - string baseName = receptor.GetName(); - int colonPos = baseName.IndexOf(":"); - if (colonPos > 0) - baseName = baseName[..colonPos]; - - for (int i = 0; i < receptor.nucleiArray.Length; i++) - newArray[i] = receptor.nucleiArray[i]; - if (receptor.nucleiArray[0] is Nucleus nucleus) { - newArray[newLength - 1] = nucleus.Clone(prefab); - newArray[newLength - 1].name = $"{baseName}: {newLength - 1}"; - } - - foreach (Nucleus element in receptor.nucleiArray) { - if (element is IReceptor receptorElement) { - receptorElement.nucleiArray = newArray; - } - } - } - - public static void RemoveReceptorElement(IReceptor receptor) { - int newLength = receptor.nucleiArray.Length - 1; - if (newLength == 0) { - Debug.LogWarning("Perceptoid array cannot be empty"); - } - Nucleus[] newArray = new Nucleus[newLength]; - for (int i = 0; i < newLength; i++) - newArray[i] = receptor.nucleiArray[i]; - // Delete the last perception - if (receptor.nucleiArray[newLength] is Nucleus nucleus) - Neuron.Delete(nucleus); - - foreach (Nucleus element in receptor.nucleiArray) { - if (element is IReceptor receptorElement) { - receptorElement.nucleiArray = newArray; - } - } - - } - - public static void AddArrayReceiver(IReceptor receptor, Nucleus receiverToAdd, float weight = 1) { - foreach (Nucleus element in receptor.nucleiArray) { - if (element is Cluster cluster) - cluster.defaultOutput.AddReceiver(receiverToAdd, weight); - if (element is Neuron neuron) - neuron.AddReceiver(receiverToAdd, weight); - } - - } -} \ No newline at end of file diff --git a/MemoryCell.cs b/MemoryCell.cs deleted file mode 100644 index 6b49084..0000000 --- a/MemoryCell.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -#if UNITY_MATHEMATICS -using Unity.Mathematics; -#endif - -[Serializable] -public class MemoryCell : Neuron { - - public MemoryCell(ClusterPrefab cluster, string name) : base(cluster, name) { } - public MemoryCell(Cluster parent, string name) : base(parent, name) { } - - public bool staticMemory = false; - public override bool isSleeping { - get { - if (staticMemory) - return false; - - return base.isSleeping; - } - } - - public override Nucleus ShallowCloneTo(Cluster newParent) { - MemoryCell clone = new(newParent, this.name); - CloneFields(clone); - clone.staticMemory = this.staticMemory; - return clone; - } - - #region State - - private bool initialized = false; - -#if UNITY_MATHEMATICS - private float3 _memorizedValue; -#else - private UnityEngine.Vector3 _memorizedValue; -#endif - - public override void UpdateStateIsolated() { - // A memorycell does not have an activation function - var result = Combinator(); - - if (initialized) - // Output the previous, memorized value - this.outputValue = this._memorizedValue; - else { - // The first time, the result is directly set in output - this.outputValue = result; - this.initialized = true; - } - - // Store the result for the next time - this._memorizedValue = result; - } - - public override void UpdateNuclei() { - if (staticMemory) - // Static memory does not get stale or go to sleep - return; - - base.UpdateNuclei(); - } - - #endregion State -} diff --git a/NanoBrain.cs b/NanoBrain.cs deleted file mode 100644 index 5a7525e..0000000 --- a/NanoBrain.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using UnityEngine; - -public class NanoBrain : MonoBehaviour { - public ClusterPrefab defaultBrain; - - [NonSerialized] - private Cluster brainInstance; - public Cluster brain { - get { - if (brainInstance == null && defaultBrain != null) { - brainInstance = new Cluster(defaultBrain) { - name = defaultBrain.name + " (Instance)" - }; - } - return brainInstance; - } - } - - public static void UpdateWeight(Cluster brain, string name, float weight) { - Nucleus root = brain.defaultOutput; - foreach (Synapse synapse in root.synapses) { - if (synapse.neuron.name == name) { - if (synapse.weight != weight) { - synapse.weight = weight; - // Debug.Log($"Updated weight for {name}"); - } - } - } - } -} \ No newline at end of file diff --git a/Neuron.cs b/Neuron.cs deleted file mode 100644 index e1a0052..0000000 --- a/Neuron.cs +++ /dev/null @@ -1,445 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; -using UnityEditor; -#if UNITY_MATHEMATICS -using Unity.Mathematics; -using static Unity.Mathematics.math; -#endif - -[Serializable] -public class Neuron : Nucleus { - - public Neuron(Cluster parent, string name) { - this.parent = parent; - this.name = name; - this.parent?.clusterNuclei.Add(this); - } - public Neuron(ClusterPrefab prefab, string name) { - this.clusterPrefab = prefab; - this.name = name; - if (this.clusterPrefab != null) - this.clusterPrefab.nuclei.Add(this); - else - Debug.LogError("No prefab when adding neuron to prefab"); - } - - #region Serialization - - public enum CombinatorType { - Sum, - Product, - Max - } - public CombinatorType combinator = CombinatorType.Sum; - - public enum CurvePresets { - Linear, - Power, - Sqrt, - Reciprocal, - Custom - } - [SerializeField] - public CurvePresets _curvePreset; - public CurvePresets curvePreset { - get { return _curvePreset; } - set { - _curvePreset = value; - this.curve = GenerateCurve(); - } - } - public AnimationCurve curve; - public float curveMax = 1.0f; - - public AnimationCurve GenerateCurve() { - switch (this.curvePreset) { - case CurvePresets.Linear: - this.curveMax = 1; - return Presets.Linear(1); - case CurvePresets.Power: - this.curveMax = 1; - return Presets.Power(2.0f, 1); - case CurvePresets.Sqrt: - this.curveMax = 1; - return Presets.Power(0.5f, 1); - case CurvePresets.Reciprocal: - this.curveMax = 1 / 0.01f * 1; - return Presets.Reciprocal(1); - default: - this.curveMax = 1; - return this.curve; - } - } - - public static class Presets { - private const int samples = 32; - public static AnimationCurve Linear(float weight) { - return AnimationCurve.Linear(0f, 0f, 1000f, weight * 1000); - } - public static AnimationCurve Power(float exponent, float weight) { - // build keyframes - Keyframe[] keys = new Keyframe[samples]; - for (int i = 0; i < samples; i++) { - float t = i / (float)(samples - 1); - float v = Mathf.Pow(t, exponent) * weight; - keys[i] = new Keyframe(t, v); - } - - AnimationCurve curve = new(keys); - - // set tangent modes for each key to Auto (smooth). Use Linear if you prefer straight segments. - for (int i = 0; i < curve.length; i++) { - AnimationUtility.SetKeyLeftTangentMode(curve, i, AnimationUtility.TangentMode.Auto); - AnimationUtility.SetKeyRightTangentMode(curve, i, AnimationUtility.TangentMode.Auto); - } - - return curve; - } - public static AnimationCurve Reciprocal(float weight) { - int samples = 128; - float xMin = 0.001f; - float xMax = 1; - var keys = new Keyframe[samples]; - for (int i = 0; i < samples; i++) { - float t = i / (float)(samples - 1); - float x = Mathf.Lerp(xMin, xMax, t); - float y = 1f / x * weight; - keys[i] = new Keyframe(x, y); - } - var curve = new AnimationCurve(keys); - for (int i = 0; i < curve.length; i++) { - AnimationUtility.SetKeyLeftTangentMode(curve, i, AnimationUtility.TangentMode.Linear); - AnimationUtility.SetKeyRightTangentMode(curve, i, AnimationUtility.TangentMode.Linear); - } - return curve; - } - } - - #endregion Serialization - -#if UNITY_MATHEMATICS - - protected float3 _outputValue; - public virtual float3 outputValue { - get { return _outputValue; } - set { - _outputValue = value; - if (this.isFiring) - WhenFiring?.Invoke(); - } - } - public float outputMagnitude => length(_outputValue); - - public bool isFiring => length(_outputValue) > 0.5f; - public virtual bool isSleeping => lengthsq(this.outputValue) == 0; - -#else - - protected Vector3 _outputValue; - public virtual Vector3 outputValue { - get { return _outputValue; } - set { - _outputValue = value; - if (this.isFiring) - WhenFiring?.Invoke(); - } - } - public float outputMagnitude => _outputValue.magnitude; - - public bool isFiring => _outputValue.magnitude > 0.5f; - public virtual bool isSleeping => this.outputValue.sqrMagnitude == 0; - -#endif - public Action WhenFiring; - - [NonSerialized] - public int stale = 1000; - public readonly int staleValueForSleep = 20; - - // this clone the nucleus without the synapses and receivers - public override Nucleus ShallowCloneTo(Cluster newParent) { - Neuron clone = new(newParent, this.name); - CloneFields(clone); - return clone; - } - - public override Nucleus Clone(ClusterPrefab prefab) { - Neuron clone = new(prefab, this.name); - CloneFields(clone); - foreach (Synapse synapse in this.synapses) { - Synapse clonedSynapse = clone.AddSynapse(synapse.neuron); - clonedSynapse.weight = synapse.weight; - } - foreach (Nucleus receiver in this.receivers) { - clone.AddReceiver(receiver); - } - return clone; - } - - protected virtual void CloneFields(Neuron clone) { - clone.clusterPrefab = this.clusterPrefab; - clone.bias = this.bias; - clone.combinator = this.combinator; - clone.curve = this.curve; - clone.curvePreset = this.curvePreset; - clone.curveMax = this.curveMax; - } - - public static void Delete(Nucleus nucleus) { - foreach (Synapse synapse in nucleus.synapses) { - if (synapse.neuron is Neuron synapse_nucleus) { - if (synapse_nucleus.receivers.Count > 1) { - // there is another nucleus feeding into this input nucleus - synapse_nucleus.receivers.RemoveAll(r => r == nucleus); - } - else { - // No other links, delete it. - Neuron.Delete(synapse_nucleus); - } - } - } - if (nucleus is Neuron neuron) { - foreach (Nucleus receiver in neuron.receivers) { - if (receiver != null && receiver.synapses != null) - receiver.synapses.RemoveAll(s => s.neuron == nucleus); - } - } - else if (nucleus is Cluster cluster) { - // remove all receivers for this cluster - foreach (Neuron output in cluster.outputs) { - foreach (Nucleus receiver in output.receivers) { - receiver.synapses.RemoveAll(s => s.neuron == output); - } - } - } - - - if (nucleus.clusterPrefab != null) { - nucleus.clusterPrefab.nuclei.RemoveAll(n => n == nucleus); - nucleus.clusterPrefab.RefreshOutputs(); - nucleus.clusterPrefab.GarbageCollection(); - } - } - - public override void UpdateStateIsolated() { - var result = Combinator(); - this.outputValue = Activator(result); - } - - #region Combinator - -#if UNITY_MATHEMATICS - - protected Func Combinator => combinator switch { - CombinatorType.Sum => CombinatorSum, - CombinatorType.Product => CombinatorProduct, - CombinatorType.Max => CombinatorMax, - _ => CombinatorSum - }; - - public float3 CombinatorSum() { - float3 sum = this.bias; - foreach (Synapse synapse in this.synapses) - sum += synapse.weight * synapse.neuron.outputValue; - return sum; - } - - public float3 CombinatorProduct() { - float3 product = this.bias; - foreach (Synapse synapse in this.synapses) { - product *= synapse.weight * synapse.neuron.outputValue; - } - return product; - } - - public float3 CombinatorMax() { - float3 max = this.bias; - float maxLength = length(max); - - //Applying the weight factors - foreach (Synapse synapse in this.synapses) { - float3 input = synapse.weight * synapse.neuron.outputValue; - - float inputLength = length(input); - if (inputLength > maxLength) { - max = input; - maxLength = inputLength; - } - } - return max; - } - -#else - - protected Func Combinator => combinator switch { - CombinatorType.Sum => CombinatorSum, - CombinatorType.Product => CombinatorProduct, - CombinatorType.Max => CombinatorMax, - _ => CombinatorSum - }; - - public Vector3 CombinatorSum() { - Vector3 sum = this.bias; - foreach (Synapse synapse in this.synapses) - sum += synapse.weight * synapse.neuron.outputValue; - return sum; - } - - public Vector3 CombinatorProduct() { - Vector3 product = this.bias; - foreach (Synapse synapse in this.synapses) { - //product *= synapse.weight * synapse.neuron.outputValue; - product = Vector3.Scale(product, synapse.weight * synapse.neuron.outputValue); - } - return product; - } - - public Vector3 CombinatorMax() { - Vector3 max = this.bias; - float maxLength = max.magnitude; - - //Applying the weight factors - foreach (Synapse synapse in this.synapses) { - Vector3 input = synapse.weight * synapse.neuron.outputValue; - - float inputLength = input.magnitude; - if (inputLength > maxLength) { - max = input; - maxLength = inputLength; - } - } - return max; - } -#endif - #endregion Combinator - - #region Activator - -#if UNITY_MATHEMATICS - - public Func Activator => this.curvePreset switch { - CurvePresets.Linear => ActivatorLinear, - CurvePresets.Sqrt => ActivatorSqrt, - CurvePresets.Power => ActivatorPower, - CurvePresets.Reciprocal => ActivatorReciprocal, - _ => ActivatorCustom - }; - - protected float3 ActivatorLinear(float3 input) { - return input; - } - - protected float3 ActivatorSqrt(float3 input) { - float3 result = normalize(input) * System.MathF.Sqrt(length(input)); - return result; - } - - protected float3 ActivatorPower(float3 input) { - float3 result = normalize(input) * System.MathF.Pow(length(input), 2); - return result; - } - - protected float3 ActivatorReciprocal(float3 input) { - float magnitude = length(input); - if (magnitude == 0) - return new float3(0, 0, 0); - - float3 result = normalize(input) * (1 / magnitude); - return result; - } - - protected float3 ActivatorCustom(float3 input) { - float activatedValue = this.curve.Evaluate(length(input)); - float3 result = normalize(input) * activatedValue; - return result; - } - -#else - - public Func Activator => this.curvePreset switch { - CurvePresets.Linear => ActivatorLinear, - CurvePresets.Sqrt => ActivatorSqrt, - CurvePresets.Power => ActivatorPower, - CurvePresets.Reciprocal => ActivatorReciprocal, - _ => ActivatorCustom - }; - - protected Vector3 ActivatorLinear(Vector3 input) { - return input; - } - - protected Vector3 ActivatorSqrt(Vector3 input) { - Vector3 result = input.normalized * System.MathF.Sqrt(input.magnitude); - return result; - } - - protected Vector3 ActivatorPower(Vector3 input) { - Vector3 result = input.normalized * System.MathF.Pow(input.magnitude, 2); - return result; - } - - protected Vector3 ActivatorReciprocal(Vector3 input) { - float magnitude = input.magnitude; - if (magnitude == 0) - return new Vector3(0, 0, 0); - - Vector3 result = input.normalized * (1 / magnitude); - return result; - } - - protected Vector3 ActivatorCustom(Vector3 input) { - float activatedValue = this.curve.Evaluate(input.magnitude); - Vector3 result = input.normalized * activatedValue; - return result; - } - -#endif - - #endregion Activator - - #region Receivers - - [SerializeReference] - private List _receivers = new(); - public virtual List receivers { - get { return _receivers; } - set { _receivers = value; } - } - - public virtual void AddReceiver(Nucleus receiverToAdd, float weight = 1) { - this._receivers.Add(receiverToAdd); - receiverToAdd.AddSynapse(this, weight); - } - - public virtual void RemoveReceiver(Nucleus receiverToRemove) { - if (this is IReceptor receptor) { - foreach (Nucleus element in receptor.nucleiArray) { - if (element is Neuron neuron) { - neuron._receivers.RemoveAll(receiver => receiver == receiverToRemove); - receiverToRemove.synapses.RemoveAll(synapse => synapse.neuron == neuron); - } - } - } - else { - this._receivers.RemoveAll(receiver => receiver == receiverToRemove); - receiverToRemove.synapses.RemoveAll(synapse => synapse.neuron == this); - } - } - - - #endregion Receivers - - public override void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = null) { - if (this.parent is ClusterReceptor clusterReceptor) - clusterReceptor.ProcessStimulus(this, inputValue, thingId, thingName); - else - ProcessStimulusDirect(inputValue, thingId, thingName); - } - - public void ProcessStimulusDirect(Vector3 inputValue, int thingId = 0, string thingName = null) { - this.stale = 0; - this.bias = inputValue; - this.parent.UpdateFromNucleus(this); - } -} \ No newline at end of file diff --git a/Nucleus.cs b/Nucleus.cs deleted file mode 100644 index 2b1f5da..0000000 --- a/Nucleus.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -[Serializable] -public abstract class Nucleus { - public string name; - - [SerializeReference] - public ClusterPrefab clusterPrefab; - [SerializeReference] - public Cluster parent; - - public bool trace = false; - - public abstract Nucleus ShallowCloneTo(Cluster parent); - public abstract Nucleus Clone(ClusterPrefab prefab); - - public enum Type { - None, - Neuron, - MemoryCell, - Cluster, - Receptor, - ClusterReceptor, - } - - #region Synapses - - public Vector3 bias = Vector3.zero; - - [SerializeField] - private List _synapses = new(); - public List synapses => _synapses; - - public Synapse AddSynapse(Neuron sendingNucleus, float weight = 1.0f) { - Synapse synapse = new(sendingNucleus, weight); - this.synapses.Add(synapse); - return synapse; - } - - public Synapse GetSynapse(Nucleus sender) { - foreach (Synapse synapse in this.synapses) - if (synapse.neuron == sender) - return synapse; - return null; - } - - public void RemoveSynapse(Nucleus sendingNucleus) { - this.synapses.RemoveAll(synapse => synapse.neuron == sendingNucleus); - } - - #endregion Synapses - - #region Update - - public abstract void UpdateStateIsolated(); - - public virtual void UpdateNuclei() { - } - - public virtual void SetBias(Vector3 inputValue) { - this.bias = inputValue; - this.parent.UpdateFromNucleus(this); - } - - public virtual void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = "") { - } - - #endregion Update - -} \ No newline at end of file diff --git a/NucleusArray.cs b/NucleusArray.cs deleted file mode 100644 index 6e48950..0000000 --- a/NucleusArray.cs +++ /dev/null @@ -1,208 +0,0 @@ -using System.Linq; -using System.Collections.Generic; -using UnityEngine; -#if UNITY_MATHEMATICS -using Unity.Mathematics; -using static Unity.Mathematics.math; -#endif - -[System.Serializable] -public class NucleusArray { - [SerializeReference] - private Nucleus[] _nuclei; - public Nucleus[] nuclei { - get { - return _nuclei; - } - set { - _nuclei = value; - } - } - - public NucleusArray(Nucleus nucleus) { - this._nuclei = new Nucleus[1]; - this._nuclei[0] = nucleus; - } - public NucleusArray(ClusterPrefab cluster) { - this._nuclei = new Nucleus[0]; - } - public NucleusArray(int size, string name) { - this._nuclei = new Nucleus[size]; - } - - - public void AddNucleus(ClusterPrefab prefab) { - if (this._nuclei.Length == 0) { - Debug.LogError("Empty perceptoid array, cannot add"); - return; - } - int newLength = this._nuclei.Length + 1; - Nucleus[] newArray = new Nucleus[newLength]; - - for (int i = 0; i < this._nuclei.Length; i++) - newArray[i] = this._nuclei[i]; - if (this._nuclei[0] is Nucleus nucleus) { - newArray[newLength - 1] = nucleus.Clone(prefab); - newArray[newLength - 1].name += $": {newLength - 1}"; - } - - this._nuclei = newArray; - } - - public void RemoveNucleus() { - int newLength = this._nuclei.Length - 1; - if (newLength == 0) { - Debug.LogWarning("Perceptoid array cannot be empty"); - return; - } - Nucleus[] newPerceptei = new Nucleus[newLength]; - for (int i = 0; i < newLength; i++) - newPerceptei[i] = this._nuclei[i]; - // Delete the last perception - if (this._nuclei[newLength] is Nucleus nucleus) - Neuron.Delete(nucleus); //this._nuclei[newLength]); - - this._nuclei = newPerceptei; - } - - public Dictionary thingReceivers = new(); - -#if UNITY_MATHEMATICS - - private Nucleus FindReceiver(int thingId, float3 inputValue) { - // No existing nucleus for this thing - float inputMagnitude = length(inputValue); - Neuron selectedReceiver = null; - float selectedMagnitude = 0; - foreach (Nucleus nucleusReceiver in this._nuclei) { - if (nucleusReceiver is not Neuron receiver) - continue; - if (thingReceivers.ContainsValue(receiver) == false) { - // We found an unusued receiver - thingReceivers.Add(thingId, receiver); - return receiver; - } - else if (receiver.isSleeping) { - // A sleeping receiver is not active and can therefore always be used - thingReceivers.Add(thingId, receiver); - return receiver; - } - else if (selectedReceiver == null) { - // If we haven't found a receiver yet, just start by taking the first - selectedReceiver = receiver; - selectedMagnitude = length(selectedReceiver.outputValue); - } - // Look for the receiver with the lowest magnitude - else { - float magnitude = length(receiver.outputValue); - - if (magnitude < inputMagnitude && length(receiver.outputValue) < selectedMagnitude) { - selectedReceiver = receiver; - selectedMagnitude = length(selectedReceiver.outputValue); - } - } - } - if (selectedReceiver != null) { - // Replace the receiver - // Find the thingId current associated with the receiver - int keyToRemove = thingReceivers.FirstOrDefault(r => r.Value.Equals(selectedReceiver)).Key; - if (keyToRemove != 0 || thingReceivers.ContainsKey(keyToRemove)) - thingReceivers.Remove(keyToRemove); - // And add the new association - thingReceivers.Add(thingId, selectedReceiver); - } - return selectedReceiver; - } - -#else - - private Nucleus FindReceiver(int thingId, Vector3 inputValue) { - // No existing nucleus for this thing - float inputMagnitude = inputValue.magnitude; - Neuron selectedReceiver = null; - float selectedMagnitude = 0; - foreach (Nucleus nucleusReceiver in this._nuclei) { - if (nucleusReceiver is not Neuron receiver) - continue; - if (thingReceivers.ContainsValue(receiver) == false) { - // We found an unusued receiver - thingReceivers.Add(thingId, receiver); - return receiver; - } - else if (receiver.isSleeping) { - // A sleeping receiver is not active and can therefore always be used - thingReceivers.Add(thingId, receiver); - return receiver; - } - else if (selectedReceiver == null) { - // If we haven't found a receiver yet, just start by taking the first - selectedReceiver = receiver; - selectedMagnitude = selectedReceiver.outputMagnitude; - } - // Look for the receiver with the lowest magnitude - else { - float magnitude = receiver.outputMagnitude; - - if (magnitude < inputMagnitude && receiver.outputMagnitude < selectedMagnitude) { - selectedReceiver = receiver; - selectedMagnitude = selectedReceiver.outputMagnitude; - } - } - } - if (selectedReceiver != null) { - // Replace the receiver - // Find the thingId current associated with the receiver - int keyToRemove = thingReceivers.FirstOrDefault(r => r.Value.Equals(selectedReceiver)).Key; - if (keyToRemove != 0 || thingReceivers.ContainsKey(keyToRemove)) - thingReceivers.Remove(keyToRemove); - // And add the new association - thingReceivers.Add(thingId, selectedReceiver); - } - return selectedReceiver; - } -#endif - - public virtual void ProcessStimulus(int thingId, Vector3 inputValue, string thingName = null) { - CleanupReceivers(); - - if (this._nuclei[0] is Neuron neuron) - inputValue = neuron.Activator(inputValue); - - if (!thingReceivers.TryGetValue(thingId, out Nucleus selectedReceiver)) { - // No existing nucleus for this thing - selectedReceiver = FindReceiver(thingId, inputValue); - } - if (selectedReceiver == null) - return; - - if (thingName != null) { - string baseName = selectedReceiver.name; - int colonPos = selectedReceiver.name.IndexOf(":"); - if (colonPos > 0) - baseName = selectedReceiver.name[..colonPos]; - selectedReceiver.name = baseName + ": " + thingName; - } - - if (selectedReceiver is Neuron selectedNucleus) - selectedNucleus.ProcessStimulusDirect(inputValue); - } - - private void CleanupReceivers() { - // Remove a thing-receiver connection when the nucleus is inactive - List receiversToRemove = new(); - foreach (KeyValuePair item in thingReceivers) { - if (item.Value != null && item.Value is Neuron neuron && neuron.isSleeping) - receiversToRemove.Add(item.Key); - } - foreach (int thingId in receiversToRemove) { - Nucleus selectedReceiver = thingReceivers[thingId]; - - thingReceivers.Remove(thingId); - - int colonPos = selectedReceiver.name.IndexOf(":"); - if (colonPos > 0) - selectedReceiver.name = selectedReceiver.name[..colonPos]; - - } - } -} \ No newline at end of file diff --git a/Receptor.cs b/Receptor.cs deleted file mode 100644 index 15ce3c6..0000000 --- a/Receptor.cs +++ /dev/null @@ -1,94 +0,0 @@ -using UnityEngine; -#if UNITY_MATHEMATICS -using Unity.Mathematics; -using static Unity.Mathematics.math; -#endif - -[System.Serializable] -public class Receptor : Neuron, IReceptor { - public Receptor(Cluster parent, string name) : base(parent, name) { - this.array = new NucleusArray(this); - if (this.name.IndexOf(":") < 0) - this.name += ": 0"; - } - public Receptor(ClusterPrefab prefab, string name) : base(prefab, name) { - this.array = new NucleusArray(this); - } - - public string GetName() { - return this.name; - } - - public override Nucleus ShallowCloneTo(Cluster parent) { - Receptor clone = new(parent, name) { - - }; - CloneFields(clone); - return clone; - } - public override Nucleus Clone(ClusterPrefab prefab) { - Receptor clone = new(prefab, name) { - array = this._array - }; - CloneFields(clone); - // Adding receivers will also add synapses to the receivers - foreach (Nucleus receiver in this.receivers.ToArray()) - clone.AddReceiver(receiver); - - return clone; - } - - [SerializeReference] - private NucleusArray _array; - public NucleusArray array { - set { _array = value; } - } - - public Nucleus[] nucleiArray { - get { return _array.nuclei; } - set { _array.nuclei = value; } - } - - public void AddReceptorElement(ClusterPrefab prefab) { - IReceptorHelpers.AddReceptorElement(this, prefab); - } - - public void RemoveReceptorElement() { - IReceptorHelpers.RemoveReceptorElement(this); - } - - public virtual void AddArrayReceiver(Nucleus receiverToAdd, float weight = 1) { - IReceptorHelpers.AddArrayReceiver(this, receiverToAdd, weight); - } - - public override void UpdateStateIsolated() { - this.outputValue = this.bias; - } - -#if UNITY_MATHEMATICS - - public override void UpdateNuclei() { - this.stale++; - if (this.stale > staleValueForSleep && lengthsq(this.bias) > 0) { - this.bias = new float3(0, 0, 0); - this.parent.UpdateFromNucleus(this); - } - } - -#else - - public override void UpdateNuclei() { - this.stale++; - if (this.stale > staleValueForSleep && this.bias.sqrMagnitude > 0) { - this.bias = new Vector3(0, 0, 0); - this.parent.UpdateFromNucleus(this); - } - } - - -#endif - public override void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = null) { - this._array ??= new NucleusArray(this.parent); - this._array.ProcessStimulus(thingId, inputValue, thingName); - } -} \ No newline at end of file diff --git a/LinearAlgebra.meta b/Runtime/LinearAlgebra.meta similarity index 100% rename from LinearAlgebra.meta rename to Runtime/LinearAlgebra.meta diff --git a/LinearAlgebra/.editorconfig b/Runtime/LinearAlgebra/.editorconfig similarity index 100% rename from LinearAlgebra/.editorconfig rename to Runtime/LinearAlgebra/.editorconfig diff --git a/LinearAlgebra/.gitea/workflows/unit_tests.yaml b/Runtime/LinearAlgebra/.gitea/workflows/unit_tests.yaml similarity index 100% rename from LinearAlgebra/.gitea/workflows/unit_tests.yaml rename to Runtime/LinearAlgebra/.gitea/workflows/unit_tests.yaml diff --git a/LinearAlgebra/.gitignore b/Runtime/LinearAlgebra/.gitignore similarity index 100% rename from LinearAlgebra/.gitignore rename to Runtime/LinearAlgebra/.gitignore diff --git a/LinearAlgebra/LinearAlgebra-csharp.sln b/Runtime/LinearAlgebra/LinearAlgebra-csharp.sln similarity index 100% rename from LinearAlgebra/LinearAlgebra-csharp.sln rename to Runtime/LinearAlgebra/LinearAlgebra-csharp.sln diff --git a/LinearAlgebra/src/Angle.cs b/Runtime/LinearAlgebra/src/Angle.cs similarity index 100% rename from LinearAlgebra/src/Angle.cs rename to Runtime/LinearAlgebra/src/Angle.cs diff --git a/LinearAlgebra/src/Decomposition.cs b/Runtime/LinearAlgebra/src/Decomposition.cs similarity index 100% rename from LinearAlgebra/src/Decomposition.cs rename to Runtime/LinearAlgebra/src/Decomposition.cs diff --git a/LinearAlgebra/src/Direction.cs b/Runtime/LinearAlgebra/src/Direction.cs similarity index 100% rename from LinearAlgebra/src/Direction.cs rename to Runtime/LinearAlgebra/src/Direction.cs diff --git a/LinearAlgebra/src/Float.cs b/Runtime/LinearAlgebra/src/Float.cs similarity index 100% rename from LinearAlgebra/src/Float.cs rename to Runtime/LinearAlgebra/src/Float.cs diff --git a/LinearAlgebra/src/LinearAlgebra.csproj b/Runtime/LinearAlgebra/src/LinearAlgebra.csproj similarity index 100% rename from LinearAlgebra/src/LinearAlgebra.csproj rename to Runtime/LinearAlgebra/src/LinearAlgebra.csproj diff --git a/LinearAlgebra/src/Matrix.cs b/Runtime/LinearAlgebra/src/Matrix.cs similarity index 100% rename from LinearAlgebra/src/Matrix.cs rename to Runtime/LinearAlgebra/src/Matrix.cs diff --git a/LinearAlgebra/src/Quat32.cs b/Runtime/LinearAlgebra/src/Quat32.cs similarity index 100% rename from LinearAlgebra/src/Quat32.cs rename to Runtime/LinearAlgebra/src/Quat32.cs diff --git a/LinearAlgebra/src/Quaternion.cs b/Runtime/LinearAlgebra/src/Quaternion.cs similarity index 100% rename from LinearAlgebra/src/Quaternion.cs rename to Runtime/LinearAlgebra/src/Quaternion.cs diff --git a/LinearAlgebra/src/Spherical.cs b/Runtime/LinearAlgebra/src/Spherical.cs similarity index 100% rename from LinearAlgebra/src/Spherical.cs rename to Runtime/LinearAlgebra/src/Spherical.cs diff --git a/LinearAlgebra/src/SwingTwist.cs b/Runtime/LinearAlgebra/src/SwingTwist.cs similarity index 100% rename from LinearAlgebra/src/SwingTwist.cs rename to Runtime/LinearAlgebra/src/SwingTwist.cs diff --git a/LinearAlgebra/src/Vector2Float.cs b/Runtime/LinearAlgebra/src/Vector2Float.cs similarity index 100% rename from LinearAlgebra/src/Vector2Float.cs rename to Runtime/LinearAlgebra/src/Vector2Float.cs diff --git a/LinearAlgebra/src/Vector2Int.cs b/Runtime/LinearAlgebra/src/Vector2Int.cs similarity index 100% rename from LinearAlgebra/src/Vector2Int.cs rename to Runtime/LinearAlgebra/src/Vector2Int.cs diff --git a/LinearAlgebra/src/Vector3Float.cs b/Runtime/LinearAlgebra/src/Vector3Float.cs similarity index 100% rename from LinearAlgebra/src/Vector3Float.cs rename to Runtime/LinearAlgebra/src/Vector3Float.cs diff --git a/LinearAlgebra/src/Vector3Int.cs b/Runtime/LinearAlgebra/src/Vector3Int.cs similarity index 100% rename from LinearAlgebra/src/Vector3Int.cs rename to Runtime/LinearAlgebra/src/Vector3Int.cs diff --git a/LinearAlgebra/src/float16.cs b/Runtime/LinearAlgebra/src/float16.cs similarity index 100% rename from LinearAlgebra/src/float16.cs rename to Runtime/LinearAlgebra/src/float16.cs diff --git a/LinearAlgebra/test/AngleTest.cs b/Runtime/LinearAlgebra/test/AngleTest.cs similarity index 100% rename from LinearAlgebra/test/AngleTest.cs rename to Runtime/LinearAlgebra/test/AngleTest.cs diff --git a/LinearAlgebra/test/DirectionTest.cs b/Runtime/LinearAlgebra/test/DirectionTest.cs similarity index 100% rename from LinearAlgebra/test/DirectionTest.cs rename to Runtime/LinearAlgebra/test/DirectionTest.cs diff --git a/LinearAlgebra/test/LinearAlgebra_Test.csproj b/Runtime/LinearAlgebra/test/LinearAlgebra_Test.csproj similarity index 100% rename from LinearAlgebra/test/LinearAlgebra_Test.csproj rename to Runtime/LinearAlgebra/test/LinearAlgebra_Test.csproj diff --git a/LinearAlgebra/test/QuaternionTest.cs b/Runtime/LinearAlgebra/test/QuaternionTest.cs similarity index 100% rename from LinearAlgebra/test/QuaternionTest.cs rename to Runtime/LinearAlgebra/test/QuaternionTest.cs diff --git a/LinearAlgebra/test/SphericalTest.cs b/Runtime/LinearAlgebra/test/SphericalTest.cs similarity index 100% rename from LinearAlgebra/test/SphericalTest.cs rename to Runtime/LinearAlgebra/test/SphericalTest.cs diff --git a/LinearAlgebra/test/SwingTwistTest.cs b/Runtime/LinearAlgebra/test/SwingTwistTest.cs similarity index 100% rename from LinearAlgebra/test/SwingTwistTest.cs rename to Runtime/LinearAlgebra/test/SwingTwistTest.cs diff --git a/LinearAlgebra/test/Vector2FloatTest.cs b/Runtime/LinearAlgebra/test/Vector2FloatTest.cs similarity index 100% rename from LinearAlgebra/test/Vector2FloatTest.cs rename to Runtime/LinearAlgebra/test/Vector2FloatTest.cs diff --git a/LinearAlgebra/test/Vector2IntTest.cs b/Runtime/LinearAlgebra/test/Vector2IntTest.cs similarity index 100% rename from LinearAlgebra/test/Vector2IntTest.cs rename to Runtime/LinearAlgebra/test/Vector2IntTest.cs diff --git a/LinearAlgebra/test/Vector3FloatTest.cs b/Runtime/LinearAlgebra/test/Vector3FloatTest.cs similarity index 100% rename from LinearAlgebra/test/Vector3FloatTest.cs rename to Runtime/LinearAlgebra/test/Vector3FloatTest.cs diff --git a/LinearAlgebra/test/Vector3IntTest.cs b/Runtime/LinearAlgebra/test/Vector3IntTest.cs similarity index 100% rename from LinearAlgebra/test/Vector3IntTest.cs rename to Runtime/LinearAlgebra/test/Vector3IntTest.cs diff --git a/Scripts.meta b/Runtime/Scripts.meta similarity index 77% rename from Scripts.meta rename to Runtime/Scripts.meta index 6083b0e..72d634e 100644 --- a/Scripts.meta +++ b/Runtime/Scripts.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 363b69b84de0e4b729794c10e7c40ab5 +guid: cfd403fd558edec539ab9d0a1bed0c72 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Cluster.cs b/Runtime/Scripts/Cluster.cs similarity index 90% rename from Cluster.cs rename to Runtime/Scripts/Cluster.cs index ba71852..f8ef85a 100644 --- a/Cluster.cs +++ b/Runtime/Scripts/Cluster.cs @@ -6,9 +6,19 @@ using Unity.Mathematics; using static Unity.Mathematics.math; #endif +namespace NanoBrain { + +/// +/// A Cluster combines a collection of Nuclei to implement reusable behaviour +/// +/// A Cluster is an instantiation of a ClusterPrefab. +/// Clusters can be nested inside other clusters. [Serializable] public class Cluster : Nucleus { + /// + /// The base name of the cluster. I don't think this is actively used at this moment + /// public string baseName { get { int colonPositon = this.name.IndexOf(':'); @@ -20,6 +30,11 @@ public class Cluster : Nucleus { #region Init + /// + /// Instantiate a new copy of a ClusterPrefab in the given parent + /// + /// The prefab to use + /// The cluster in which this new cluster will be placed public Cluster(ClusterPrefab prefab, Cluster parent) { this.prefab = prefab; this.name = prefab.name; @@ -32,6 +47,11 @@ public class Cluster : Nucleus { this.sortedNuclei = TopologicalSort(this.clusterNuclei); } + /// + /// Add a new cluster to a ClusterPrefab + /// + /// The prefab to copy + /// The prefab in which the new copy is placed public Cluster(ClusterPrefab prefab, ClusterPrefab parent = null) { this.prefab = prefab; this.name = prefab.name; @@ -45,6 +65,11 @@ public class Cluster : Nucleus { this.sortedNuclei = TopologicalSort(this.clusterNuclei); } + /// + /// Clone a prefab. + /// + /// Strange that this does not take any parameters or return values. + /// Where which the clone be found??? private void ClonePrefab() { Nucleus[] prefabNuclei = this.prefab.nuclei.ToArray(); // first clone the nuclei without their connections @@ -99,7 +124,7 @@ public class Cluster : Nucleus { IReceptor clonedNucleus = clonedNuclei[nucleusIx] as IReceptor; if (prefabReceptor == prefabReceptor.nucleiArray[0]) { // We clone the array only for the first entry - NucleusArray clonedArray = new(prefabReceptor.nucleiArray.Length, "array"); + NucleusArray clonedArray = new(prefabReceptor.nucleiArray.Length); int arrayIx = 0; foreach (Nucleus prefabArrayNucleus in prefabReceptor.nucleiArray) { int arrayNucleusIx = GetNucleusIndex(prefabNuclei, prefabArrayNucleus); @@ -129,7 +154,12 @@ public class Cluster : Nucleus { } } - // Sort the nuclei in a correct evaluation order + /// + /// Sort the nuclei in a correct evaluation order + /// + /// + /// + /// private List TopologicalSort(List nodes) { Dictionary inDegree = new(); foreach (Nucleus node in nodes) @@ -508,3 +538,5 @@ public class Cluster : Nucleus { #endregion Update } + +} \ No newline at end of file diff --git a/Cluster.cs.meta b/Runtime/Scripts/Cluster.cs.meta similarity index 100% rename from Cluster.cs.meta rename to Runtime/Scripts/Cluster.cs.meta diff --git a/Runtime/Scripts/ClusterPrefab.cs b/Runtime/Scripts/ClusterPrefab.cs new file mode 100644 index 0000000..e50093f --- /dev/null +++ b/Runtime/Scripts/ClusterPrefab.cs @@ -0,0 +1,140 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace NanoBrain { + + /// + /// The Unity ScriptableObject to implement re-usable Cluster Prefabs + /// + [CreateAssetMenu(menuName = "Passer/Cluster")] + public class ClusterPrefab : ScriptableObject { + /// The nuclei in this cluster + [SerializeReference] + public List nuclei = new(); + + /// + /// The output of this cluster + /// + /// This only returens the first(default) nucleus. Use outputs[0] instead + public virtual Nucleus output => this.nuclei[0] as Nucleus; + + /// + /// The nuclei in this cluster which are meant for receiving signals from outside the cluster + /// + /// This is currently the nuclei which do not have any incoming synapse + public List _inputs = null; + public virtual List inputs { + get { + if (this._inputs == null) { + this._inputs = new(); + foreach (Nucleus receptor in this.nuclei) { + if (receptor is Nucleus nucleus) { + // inputs have no incoming synapses yet. + if (nucleus.synapses.Count == 0) + this._inputs.Add(nucleus); + } + } + } + return this._inputs; + } + } + /// + /// The nuclei in this cluster which are meant for sending signals onward + /// + private List _outputs = null; + public List outputs { + get { + if (this._outputs == null) + RefreshOutputs(); + return this._outputs; + } + } + /// + /// Redetermine the outpus in the cluster + /// + public void RefreshOutputs() { + this._outputs = new(); + foreach (Nucleus nucleus in this.nuclei) { + if (nucleus is Neuron neuron && neuron.receivers.Count == 0) + this._outputs.Add(nucleus); + } + } + + /// + /// Retrieve a nucleus in this cluster + /// + /// The name of the nucleus + /// The Nucleus with the given name or null if no such Nucleus could be found + public Nucleus GetNucleus(string nucleusName) { + foreach (Nucleus nucleus in this.nuclei) { + if (nucleus.name == nucleusName) + return nucleus; + } + return null; + } + + // Call this function to ensure that there is at least one nucleus + // This is an invariant and should be ensured before the nucleus is used + // because output requires it. + public void EnsureInitialization() { + nuclei ??= new List(); + if (nuclei.Count == 0) + new Neuron(this, "Output"); // Every cluster should have at least 1 neuron + } + + public void GarbageCollection() { + HashSet visitedNuclei = new(); + foreach (Nucleus output in this.outputs) + MarkNuclei(visitedNuclei, output); + //Debug.Log($"Garbage collection found {visitedNuclei.Count} Nuclei"); + this.nuclei.RemoveAll(nucleus => visitedNuclei.Contains(nucleus) == false); + } + + public void MarkNuclei(HashSet visitedNuclei, Nucleus nucleus) { + if (nucleus is null) + return; + + if (nucleus.parent != null && nucleus.parent.prefab != this) + visitedNuclei.Add(nucleus.parent); + else + visitedNuclei.Add(nucleus); + if (nucleus.synapses != null) { + HashSet visitedSynapses = new(); + foreach (Synapse synapse in nucleus.synapses) { + if (synapse != null && synapse.neuron != null) { + visitedSynapses.Add(synapse); + if (synapse.neuron is Nucleus synapse_nucleus) + MarkNuclei(visitedNuclei, synapse_nucleus); + } + } + nucleus.synapses.RemoveAll(synapse => visitedSynapses.Contains(synapse) == false); + } + if (nucleus is Neuron neuron && neuron.receivers != null) { + HashSet visitedReceivers = new(); + foreach (Nucleus receiver in neuron.receivers) { + if (receiver != null && receiver != null) { + visitedReceivers.Add(receiver); + visitedNuclei.Add(receiver); + } + } + neuron.receivers.RemoveAll(receiver => visitedReceivers.Contains(receiver) == false); + } + } + + public virtual void UpdateNuclei() { + foreach (Nucleus nucleus in this.nuclei) + nucleus.UpdateNuclei(); + } + + public int GetNucleusIndex(Nucleus receiver) { + int ix = 0; + foreach (Nucleus nucleus in this.nuclei) { + if (receiver == nucleus) + return ix; + ix++; + } + return -1; + } + } + +} diff --git a/Runtime/Scripts/ClusterPrefab.cs.meta b/Runtime/Scripts/ClusterPrefab.cs.meta new file mode 100644 index 0000000..aa5253e --- /dev/null +++ b/Runtime/Scripts/ClusterPrefab.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 60a957541c24c57e78018c202ebb1d9b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 288088fdc016525a59f83f1c608e514d, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ClusterReceptor.cs b/Runtime/Scripts/ClusterReceptor.cs similarity index 97% rename from ClusterReceptor.cs rename to Runtime/Scripts/ClusterReceptor.cs index fd925ed..0dcd8ec 100644 --- a/ClusterReceptor.cs +++ b/Runtime/Scripts/ClusterReceptor.cs @@ -7,6 +7,8 @@ using static Unity.Mathematics.math; #endif using System.Linq; +namespace NanoBrain { + [Serializable] public class ClusterReceptor : Cluster, IReceptor { public ClusterReceptor(ClusterPrefab prefab, Cluster parent, string name) : base(prefab, parent) { @@ -270,4 +272,6 @@ public class ClusterReceptor : Cluster, IReceptor { } } +} + } \ No newline at end of file diff --git a/ClusterReceptor.cs.meta b/Runtime/Scripts/ClusterReceptor.cs.meta similarity index 100% rename from ClusterReceptor.cs.meta rename to Runtime/Scripts/ClusterReceptor.cs.meta diff --git a/Runtime/Scripts/IReceptor.cs b/Runtime/Scripts/IReceptor.cs new file mode 100644 index 0000000..4c4b373 --- /dev/null +++ b/Runtime/Scripts/IReceptor.cs @@ -0,0 +1,123 @@ +using UnityEngine; + +namespace NanoBrain { + + /// + /// A Receptor is a Nucleus which can receive input (called Stimulus) from outside the the cluster/brain + /// + /// It has the ability to distinguish stimuli from different things using an array of Nuclei + public interface IReceptor { + /// + /// Get the name of the receptor + /// + /// The name of the receptor + public string GetName(); + + /// + /// The array of nuclei used to track multiple things sending stimuli + /// + /// The size of the array determines the maximum number of things which can be distinguished + public Nucleus[] nucleiArray { get; set; } + + /// + /// Extends the nucleiArray with an additional element + /// + /// A prefab of the nucleus to add? + public void AddReceptorElement(ClusterPrefab prefab); + /// + /// Removes the last element from the nucleiArray + /// + public void RemoveReceptorElement(); + + /// + /// Add a receiver for this receptor array + /// + /// The receiving Nucleus + /// The initial weight to use for the synapses + /// This function will add a synapse to the receiver for each element in the nucleiArray. + public void AddArrayReceiver(Nucleus receiverToAdd, float weight = 1); + + /// + /// Process an external stimulus + /// + /// The value of the stimulus + /// The id of the thing causing the stimulus + /// The name of the thing causing the stimulus + public void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = null); + } + + public static class IReceptorHelpers { + + /// + /// Implementation for the NanoBrain::IReceptor::AddReceptorElement which can be used for all implementations of IReceptor + /// + /// The IReceptor which needs to extend its nucleiArray + /// A prefab of the nucleus to add? + public static void AddReceptorElement(IReceptor receptor, ClusterPrefab prefab) { + if (receptor.nucleiArray.Length == 0) { + Debug.LogError("Empty perceptoid array, cannot add"); + } + int newLength = receptor.nucleiArray.Length + 1; + Nucleus[] newArray = new Nucleus[newLength]; + + string baseName = receptor.GetName(); + int colonPos = baseName.IndexOf(":"); + if (colonPos > 0) + baseName = baseName[..colonPos]; + + for (int i = 0; i < receptor.nucleiArray.Length; i++) + newArray[i] = receptor.nucleiArray[i]; + if (receptor.nucleiArray[0] is Nucleus nucleus) { + newArray[newLength - 1] = nucleus.Clone(prefab); + newArray[newLength - 1].name = $"{baseName}: {newLength - 1}"; + } + + foreach (Nucleus element in receptor.nucleiArray) { + if (element is IReceptor receptorElement) { + receptorElement.nucleiArray = newArray; + } + } + } + + /// + /// Implementation for the NanoBrain::IReceptor::RemoteReceptorElement which can be used for all implementations of IReceptor + /// + /// The IReceptor which needs to shorten its nucleiArray + public static void RemoveReceptorElement(IReceptor receptor) { + int newLength = receptor.nucleiArray.Length - 1; + if (newLength == 0) { + Debug.LogWarning("Perceptoid array cannot be empty"); + } + Nucleus[] newArray = new Nucleus[newLength]; + for (int i = 0; i < newLength; i++) + newArray[i] = receptor.nucleiArray[i]; + // Delete the last perception + if (receptor.nucleiArray[newLength] is Nucleus nucleus) + Neuron.Delete(nucleus); + + foreach (Nucleus element in receptor.nucleiArray) { + if (element is IReceptor receptorElement) { + receptorElement.nucleiArray = newArray; + } + } + + } + + /// + /// Implementation for the NanoBreain::IRceptor::AddArrayReceiver which can be used for all implementations of IReceptor + /// + /// The IReceptor for which a receiving nuclues needs to be added + /// The nucleus to receive input from the receptor + /// The initial weight for the synapses + public static void AddArrayReceiver(IReceptor receptor, Nucleus receiverToAdd, float weight = 1) { + foreach (Nucleus element in receptor.nucleiArray) { + if (element is Cluster cluster) + cluster.defaultOutput.AddReceiver(receiverToAdd, weight); + if (element is Neuron neuron) + neuron.AddReceiver(receiverToAdd, weight); + } + + } + } + +} \ No newline at end of file diff --git a/IReceptor.cs.meta b/Runtime/Scripts/IReceptor.cs.meta similarity index 100% rename from IReceptor.cs.meta rename to Runtime/Scripts/IReceptor.cs.meta diff --git a/Runtime/Scripts/MemoryCell.cs b/Runtime/Scripts/MemoryCell.cs new file mode 100644 index 0000000..7f9fe6e --- /dev/null +++ b/Runtime/Scripts/MemoryCell.cs @@ -0,0 +1,73 @@ +using System; +#if UNITY_MATHEMATICS +using Unity.Mathematics; +#endif + +namespace NanoBrain { + + /// + /// A MemoryCell stored its value for one update + /// + /// When the input for a Memory Cell changes, it will output the previous value + [Serializable] + public class MemoryCell : Neuron { + + public MemoryCell(ClusterPrefab cluster, string name) : base(cluster, name) { } + public MemoryCell(Cluster parent, string name) : base(parent, name) { } + + public bool staticMemory = false; + public override bool isSleeping { + get { + if (staticMemory) + return false; + + return base.isSleeping; + } + } + + public override Nucleus ShallowCloneTo(Cluster newParent) { + MemoryCell clone = new(newParent, this.name); + CloneFields(clone); + clone.staticMemory = this.staticMemory; + return clone; + } + + #region State + + private bool initialized = false; + +#if UNITY_MATHEMATICS + private float3 _memorizedValue; +#else + private UnityEngine.Vector3 _memorizedValue; +#endif + + public override void UpdateStateIsolated() { + // A memorycell does not have an activation function + var result = Combinator(); + + if (initialized) + // Output the previous, memorized value + this.outputValue = this._memorizedValue; + else { + // The first time, the result is directly set in output + this.outputValue = result; + this.initialized = true; + } + + // Store the result for the next time + this._memorizedValue = result; + } + + public override void UpdateNuclei() { + if (staticMemory) + // Static memory does not get stale or go to sleep + return; + + base.UpdateNuclei(); + } + + #endregion State + } + +} \ No newline at end of file diff --git a/MemoryCell.cs.meta b/Runtime/Scripts/MemoryCell.cs.meta similarity index 100% rename from MemoryCell.cs.meta rename to Runtime/Scripts/MemoryCell.cs.meta diff --git a/Runtime/Scripts/NanoBrain.cs b/Runtime/Scripts/NanoBrain.cs new file mode 100644 index 0000000..5c3e091 --- /dev/null +++ b/Runtime/Scripts/NanoBrain.cs @@ -0,0 +1,51 @@ +using System; +using UnityEngine; + +namespace NanoBrain { + + /// + /// The NanoBrain Unity Componnent + /// + /// This implements the top-level NanoBrain Cluster + public class NanoBrain : MonoBehaviour { + /// + /// The Cluster prefab from which the cluster is created + /// + public ClusterPrefab defaultBrain; + + [NonSerialized] + private Cluster brainInstance; + /// + /// The cluster isntance + /// + public Cluster brain { + get { + if (brainInstance == null && defaultBrain != null) { + brainInstance = new Cluster(defaultBrain) { + name = defaultBrain.name + " (Instance)" + }; + } + return brainInstance; + } + } + + /// + /// Update the weight for all Synapses coming from the Neuron with the given name + /// + /// The cluster in which the synapses are updated + /// The name of the Neuron for which the weights are updated + /// The new Synapse weight + public static void UpdateWeight(Cluster brain, string name, float weight) { + Nucleus root = brain.defaultOutput; + foreach (Synapse synapse in root.synapses) { + if (synapse.neuron.name == name) { + if (synapse.weight != weight) { + synapse.weight = weight; + // Debug.Log($"Updated weight for {name}"); + } + } + } + } + } + +} \ No newline at end of file diff --git a/NanoBrain.cs.meta b/Runtime/Scripts/NanoBrain.cs.meta similarity index 100% rename from NanoBrain.cs.meta rename to Runtime/Scripts/NanoBrain.cs.meta diff --git a/Runtime/Scripts/Neuron.cs b/Runtime/Scripts/Neuron.cs new file mode 100644 index 0000000..fcadfea --- /dev/null +++ b/Runtime/Scripts/Neuron.cs @@ -0,0 +1,476 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +#if UNITY_MATHEMATICS +using Unity.Mathematics; +using static Unity.Mathematics.math; +#endif + +namespace NanoBrain { + + /// + /// A neuron is a basic Nucleus + /// + [Serializable] + public class Neuron : Nucleus { + + /// + /// Create a new Neuron in a Cluster instance + /// + /// The parent cluster in which the new Neuron should be created + /// The name of the new Neuron + public Neuron(Cluster parent, string name) { + this.parent = parent; + this.name = name; + this.parent?.clusterNuclei.Add(this); + } + /// + /// Create a new Neuron in a Cluster Prefab + /// + /// The Cluster Preafb in which the new Neuron should be created + /// The name of the new Neuron + public Neuron(ClusterPrefab prefab, string name) { + this.clusterPrefab = prefab; + this.name = name; + if (this.clusterPrefab != null) + this.clusterPrefab.nuclei.Add(this); + else + Debug.LogError("No prefab when adding neuron to prefab"); + } + + #region Serialization + + /// + /// The type of combinators + /// + /// A combinator combines the weighted values of the synapses to a single value + public enum CombinatorType { + /// Add the weighted values together + Sum, + /// Multiply the weighted values + Product, + /// Take the maximum of all the weighted values + Max, + } + /// + /// The type of combinator used for this Neuron + /// + public CombinatorType combinator = CombinatorType.Sum; + + /// + /// The type of + /// + public enum CurvePresets { + Linear, + Power, + Sqrt, + Reciprocal, + Custom + } + [SerializeField] + public CurvePresets _curvePreset; + public CurvePresets curvePreset { + get { return _curvePreset; } + set { + _curvePreset = value; + this.curve = GenerateCurve(); + } + } + public AnimationCurve curve; + public float curveMax = 1.0f; + + public AnimationCurve GenerateCurve() { + switch (this.curvePreset) { + case CurvePresets.Linear: + this.curveMax = 1; + return Presets.Linear(1); + case CurvePresets.Power: + this.curveMax = 1; + return Presets.Power(2.0f, 1); + case CurvePresets.Sqrt: + this.curveMax = 1; + return Presets.Power(0.5f, 1); + case CurvePresets.Reciprocal: + this.curveMax = 1 / 0.01f * 1; + return Presets.Reciprocal(1); + default: + this.curveMax = 1; + return this.curve; + } + } + + public static class Presets { + private const int samples = 32; + public static AnimationCurve Linear(float weight) { + return AnimationCurve.Linear(0f, 0f, 1000f, weight * 1000); + } + public static AnimationCurve Power(float exponent, float weight) { + // build keyframes + Keyframe[] keys = new Keyframe[samples]; + for (int i = 0; i < samples; i++) { + float t = i / (float)(samples - 1); + float v = Mathf.Pow(t, exponent) * weight; + keys[i] = new Keyframe(t, v); + } + + AnimationCurve curve = new(keys); + + // set tangent modes for each key to Auto (smooth). Use Linear if you prefer straight segments. + for (int i = 0; i < curve.length; i++) { + AnimationUtility.SetKeyLeftTangentMode(curve, i, AnimationUtility.TangentMode.Auto); + AnimationUtility.SetKeyRightTangentMode(curve, i, AnimationUtility.TangentMode.Auto); + } + + return curve; + } + public static AnimationCurve Reciprocal(float weight) { + int samples = 128; + float xMin = 0.001f; + float xMax = 1; + var keys = new Keyframe[samples]; + for (int i = 0; i < samples; i++) { + float t = i / (float)(samples - 1); + float x = Mathf.Lerp(xMin, xMax, t); + float y = 1f / x * weight; + keys[i] = new Keyframe(x, y); + } + var curve = new AnimationCurve(keys); + for (int i = 0; i < curve.length; i++) { + AnimationUtility.SetKeyLeftTangentMode(curve, i, AnimationUtility.TangentMode.Linear); + AnimationUtility.SetKeyRightTangentMode(curve, i, AnimationUtility.TangentMode.Linear); + } + return curve; + } + } + + #endregion Serialization + +#if UNITY_MATHEMATICS + + protected float3 _outputValue; + public virtual float3 outputValue { + get { return _outputValue; } + set { + _outputValue = value; + if (this.isFiring) + WhenFiring?.Invoke(); + } + } + public float outputMagnitude => length(_outputValue); + public float outputSqrMagnitude => lengthsq(_outputValue); + +#else + + protected Vector3 _outputValue; + public virtual Vector3 outputValue { + get { return _outputValue; } + set { + _outputValue = value; + if (this.isFiring) + WhenFiring?.Invoke(); + } + } + public float outputMagnitude => _outputValue.magnitude; + public float outputSqrMagnitude => _outputValue.sqrMagnitude; + +#endif + public bool isFiring => this.outputMagnitude > 0.5f; + public Action WhenFiring; + + + public virtual bool isSleeping => this.outputMagnitude == 0; + + [NonSerialized] + public int stale = 1000; + public readonly int staleValueForSleep = 20; + + /// \copydoc NanoBrain::Nucleus::ShallowCloneTo + public override Nucleus ShallowCloneTo(Cluster newParent) { + Neuron clone = new(newParent, this.name); + CloneFields(clone); + return clone; + } + + /// \copydoc NanoBrain::Nucleus::Clone + public override Nucleus Clone(ClusterPrefab prefab) { + Neuron clone = new(prefab, this.name); + CloneFields(clone); + foreach (Synapse synapse in this.synapses) { + Synapse clonedSynapse = clone.AddSynapse(synapse.neuron); + clonedSynapse.weight = synapse.weight; + } + foreach (Nucleus receiver in this.receivers) { + clone.AddReceiver(receiver); + } + return clone; + } + + protected virtual void CloneFields(Neuron clone) { + clone.clusterPrefab = this.clusterPrefab; + clone.bias = this.bias; + clone.combinator = this.combinator; + clone.curve = this.curve; + clone.curvePreset = this.curvePreset; + clone.curveMax = this.curveMax; + } + + public static void Delete(Nucleus nucleus) { + foreach (Synapse synapse in nucleus.synapses) { + if (synapse.neuron is Neuron synapse_nucleus) { + if (synapse_nucleus.receivers.Count > 1) { + // there is another nucleus feeding into this input nucleus + synapse_nucleus.receivers.RemoveAll(r => r == nucleus); + } + else { + // No other links, delete it. + Neuron.Delete(synapse_nucleus); + } + } + } + if (nucleus is Neuron neuron) { + foreach (Nucleus receiver in neuron.receivers) { + if (receiver != null && receiver.synapses != null) + receiver.synapses.RemoveAll(s => s.neuron == nucleus); + } + } + else if (nucleus is Cluster cluster) { + // remove all receivers for this cluster + foreach (Neuron output in cluster.outputs) { + foreach (Nucleus receiver in output.receivers) { + receiver.synapses.RemoveAll(s => s.neuron == output); + } + } + } + + + if (nucleus.clusterPrefab != null) { + nucleus.clusterPrefab.nuclei.RemoveAll(n => n == nucleus); + nucleus.clusterPrefab.RefreshOutputs(); + nucleus.clusterPrefab.GarbageCollection(); + } + } + + public override void UpdateStateIsolated() { + var result = Combinator(); + this.outputValue = Activator(result); + } + + #region Combinator + +#if UNITY_MATHEMATICS + + protected Func Combinator => combinator switch { + CombinatorType.Sum => CombinatorSum, + CombinatorType.Product => CombinatorProduct, + CombinatorType.Max => CombinatorMax, + _ => CombinatorSum + }; + + public float3 CombinatorSum() { + float3 sum = this.bias; + foreach (Synapse synapse in this.synapses) + sum += synapse.weight * synapse.neuron.outputValue; + return sum; + } + + public float3 CombinatorProduct() { + float3 product = this.bias; + foreach (Synapse synapse in this.synapses) { + product *= synapse.weight * synapse.neuron.outputValue; + } + return product; + } + + public float3 CombinatorMax() { + float3 max = this.bias; + float maxLength = length(max); + + //Applying the weight factors + foreach (Synapse synapse in this.synapses) { + float3 input = synapse.weight * synapse.neuron.outputValue; + + float inputLength = length(input); + if (inputLength > maxLength) { + max = input; + maxLength = inputLength; + } + } + return max; + } + +#else + + protected Func Combinator => combinator switch { + CombinatorType.Sum => CombinatorSum, + CombinatorType.Product => CombinatorProduct, + CombinatorType.Max => CombinatorMax, + _ => CombinatorSum + }; + + public Vector3 CombinatorSum() { + Vector3 sum = this.bias; + foreach (Synapse synapse in this.synapses) + sum += synapse.weight * synapse.neuron.outputValue; + return sum; + } + + public Vector3 CombinatorProduct() { + Vector3 product = this.bias; + foreach (Synapse synapse in this.synapses) { + //product *= synapse.weight * synapse.neuron.outputValue; + product = Vector3.Scale(product, synapse.weight * synapse.neuron.outputValue); + } + return product; + } + + public Vector3 CombinatorMax() { + Vector3 max = this.bias; + float maxLength = max.magnitude; + + //Applying the weight factors + foreach (Synapse synapse in this.synapses) { + Vector3 input = synapse.weight * synapse.neuron.outputValue; + + float inputLength = input.magnitude; + if (inputLength > maxLength) { + max = input; + maxLength = inputLength; + } + } + return max; + } +#endif + #endregion Combinator + + #region Activator + +#if UNITY_MATHEMATICS + + public Func Activator => this.curvePreset switch { + CurvePresets.Linear => ActivatorLinear, + CurvePresets.Sqrt => ActivatorSqrt, + CurvePresets.Power => ActivatorPower, + CurvePresets.Reciprocal => ActivatorReciprocal, + _ => ActivatorCustom + }; + + protected float3 ActivatorLinear(float3 input) { + return input; + } + + protected float3 ActivatorSqrt(float3 input) { + float3 result = normalize(input) * System.MathF.Sqrt(length(input)); + return result; + } + + protected float3 ActivatorPower(float3 input) { + float3 result = normalize(input) * System.MathF.Pow(length(input), 2); + return result; + } + + protected float3 ActivatorReciprocal(float3 input) { + float magnitude = length(input); + if (magnitude == 0) + return new float3(0, 0, 0); + + float3 result = normalize(input) * (1 / magnitude); + return result; + } + + protected float3 ActivatorCustom(float3 input) { + float activatedValue = this.curve.Evaluate(length(input)); + float3 result = normalize(input) * activatedValue; + return result; + } + +#else + + public Func Activator => this.curvePreset switch { + CurvePresets.Linear => ActivatorLinear, + CurvePresets.Sqrt => ActivatorSqrt, + CurvePresets.Power => ActivatorPower, + CurvePresets.Reciprocal => ActivatorReciprocal, + _ => ActivatorCustom + }; + + protected Vector3 ActivatorLinear(Vector3 input) { + return input; + } + + protected Vector3 ActivatorSqrt(Vector3 input) { + Vector3 result = input.normalized * System.MathF.Sqrt(input.magnitude); + return result; + } + + protected Vector3 ActivatorPower(Vector3 input) { + Vector3 result = input.normalized * System.MathF.Pow(input.magnitude, 2); + return result; + } + + protected Vector3 ActivatorReciprocal(Vector3 input) { + float magnitude = input.magnitude; + if (magnitude == 0) + return new Vector3(0, 0, 0); + + Vector3 result = input.normalized * (1 / magnitude); + return result; + } + + protected Vector3 ActivatorCustom(Vector3 input) { + float activatedValue = this.curve.Evaluate(input.magnitude); + Vector3 result = input.normalized * activatedValue; + return result; + } + +#endif + + #endregion Activator + + #region Receivers + + [SerializeReference] + private List _receivers = new(); + public virtual List receivers { + get { return _receivers; } + set { _receivers = value; } + } + + public virtual void AddReceiver(Nucleus receiverToAdd, float weight = 1) { + this._receivers.Add(receiverToAdd); + receiverToAdd.AddSynapse(this, weight); + } + + public virtual void RemoveReceiver(Nucleus receiverToRemove) { + if (this is IReceptor receptor) { + foreach (Nucleus element in receptor.nucleiArray) { + if (element is Neuron neuron) { + neuron._receivers.RemoveAll(receiver => receiver == receiverToRemove); + receiverToRemove.synapses.RemoveAll(synapse => synapse.neuron == neuron); + } + } + } + else { + this._receivers.RemoveAll(receiver => receiver == receiverToRemove); + receiverToRemove.synapses.RemoveAll(synapse => synapse.neuron == this); + } + } + + + #endregion Receivers + + public override void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = null) { + if (this.parent is ClusterReceptor clusterReceptor) + clusterReceptor.ProcessStimulus(this, inputValue, thingId, thingName); + else + ProcessStimulusDirect(inputValue, thingId, thingName); + } + + public void ProcessStimulusDirect(Vector3 inputValue, int thingId = 0, string thingName = null) { + this.stale = 0; + this.bias = inputValue; + this.parent.UpdateFromNucleus(this); + } + } + +} \ No newline at end of file diff --git a/Neuron.cs.meta b/Runtime/Scripts/Neuron.cs.meta similarity index 100% rename from Neuron.cs.meta rename to Runtime/Scripts/Neuron.cs.meta diff --git a/Runtime/Scripts/Nucleus.cs b/Runtime/Scripts/Nucleus.cs new file mode 100644 index 0000000..d6a0952 --- /dev/null +++ b/Runtime/Scripts/Nucleus.cs @@ -0,0 +1,147 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +/// +/// The Nanobrain namespace +/// +namespace NanoBrain { + +/// +/// A Nucleus is a basic element in a brain cluster +/// +[Serializable] +public abstract class Nucleus { + /// + /// The name of the Nucleus + /// + public string name; + + /// + /// The cluster prefab in which the nucleus is located + /// + [SerializeReference] + public ClusterPrefab clusterPrefab; + /// + /// The cluster instance in which the nucleus is located + /// + [SerializeReference] + public Cluster parent; + + /// + /// Toggle for printing debugging trace data + /// + public bool trace = false; + + /// + /// Function to make a partial clone of this nucleus + /// + /// The cluster in which the cloned nucleus should be placed + /// + public abstract Nucleus ShallowCloneTo(Cluster parent); + /// + /// Function to clone a nucleus to a Cluster prefab + /// + /// + /// + public abstract Nucleus Clone(ClusterPrefab prefab); + + /// + /// The types of Nucleus + /// + public enum Type { + None, + Neuron, + MemoryCell, + Cluster, + Receptor, + ClusterReceptor, + } + + #region Synapses + + /// + /// The bias of the nucleus + /// + /// The bias which a value which is always added to the combined value of the nucleus + /// It does not have a synapse and therefore no weight of source nucleus + public Vector3 bias = Vector3.zero; + + [SerializeField] + private List _synapses = new(); + /// + /// The synapses of the nucleus + /// + public List synapses => _synapses; + + /// + /// Add a new synapse to this nuclues + /// + /// The nucleus from which the signals may originate + /// The weight applied to the input. Default value = 1 + /// The created Synapse + /// This will add a new input to this nucleus with the given weight. + public Synapse AddSynapse(Neuron sendingNucleus, float weight = 1) { + Synapse synapse = new(sendingNucleus, weight); + this.synapses.Add(synapse); + return synapse; + } + + /// + /// Find a synapse + /// + /// The sender of the input to the Synapse + /// The found Synapse or null when the sender has no synapse to this nucleus. + public Synapse GetSynapse(Nucleus sender) { + foreach (Synapse synapse in this.synapses) + if (synapse.neuron == sender) + return synapse; + return null; + } + + /// + /// Remove a synapse from a Nucleus + /// + /// Remote the synapse connecting to this Nucleus + public void RemoveSynapse(Nucleus sendingNucleus) { + this.synapses.RemoveAll(synapse => synapse.neuron == sendingNucleus); + } + + #endregion Synapses + + #region Update + + /// + /// Update the state without updating other Nuclei + /// + public abstract void UpdateStateIsolated(); + + /// + /// Update the state and recursively all Nuclei receiving data from this Nucleus + /// + public virtual void UpdateNuclei() { + } + + /// + /// Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus + /// + /// + public virtual void SetBias(Vector3 inputValue) { + this.bias = inputValue; + this.parent.UpdateFromNucleus(this); + } + + /// + /// Process an external stimulus + /// + /// The value of the stimulus + /// The id of the thing causing the stimulus + /// The name of the thing causing the stimulus + public virtual void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = "") { + } + + #endregion Update + +} + +} \ No newline at end of file diff --git a/Nucleus.cs.meta b/Runtime/Scripts/Nucleus.cs.meta similarity index 100% rename from Nucleus.cs.meta rename to Runtime/Scripts/Nucleus.cs.meta diff --git a/Runtime/Scripts/NucleusArray.cs b/Runtime/Scripts/NucleusArray.cs new file mode 100644 index 0000000..60a4a21 --- /dev/null +++ b/Runtime/Scripts/NucleusArray.cs @@ -0,0 +1,197 @@ +using System.Linq; +using System.Collections.Generic; +using UnityEngine; +#if UNITY_MATHEMATICS +using Unity.Mathematics; +using static Unity.Mathematics.math; +#endif + +namespace NanoBrain { + + /// + /// Class to manage an array of nuclei for an IReceptor + /// + /// Would love to get rid of this class. + [System.Serializable] + public class NucleusArray { + /// + /// The nuclei in this array + /// + [SerializeReference] + private Nucleus[] _nuclei; + public Nucleus[] nuclei { + get { + return _nuclei; + } + set { + _nuclei = value; + } + } + + /// + /// Create a new NucleusArray with the given nucleus + /// + /// The Nucleus to put in the NucleusArray + /// This results in an nucleus array of size 1 + public NucleusArray(Nucleus nucleus) { + this._nuclei = new Nucleus[1]; + this._nuclei[0] = nucleus; + } + /// + /// Create a new NucleusArray of the given size + /// + /// The size of the nucluesArray + public NucleusArray(int size) { + this._nuclei = new Nucleus[size]; + } + + + // public void AddNucleus(ClusterPrefab prefab) { + // if (this._nuclei.Length == 0) { + // Debug.LogError("Empty perceptoid array, cannot add"); + // return; + // } + // int newLength = this._nuclei.Length + 1; + // Nucleus[] newArray = new Nucleus[newLength]; + + // for (int i = 0; i < this._nuclei.Length; i++) + // newArray[i] = this._nuclei[i]; + // if (this._nuclei[0] is Nucleus nucleus) { + // newArray[newLength - 1] = nucleus.Clone(prefab); + // newArray[newLength - 1].name += $": {newLength - 1}"; + // } + + // this._nuclei = newArray; + // } + + // public void RemoveNucleus() { + // int newLength = this._nuclei.Length - 1; + // if (newLength == 0) { + // Debug.LogWarning("Perceptoid array cannot be empty"); + // return; + // } + // Nucleus[] newPerceptei = new Nucleus[newLength]; + // for (int i = 0; i < newLength; i++) + // newPerceptei[i] = this._nuclei[i]; + // // Delete the last perception + // if (this._nuclei[newLength] is Nucleus nucleus) + // Neuron.Delete(nucleus); //this._nuclei[newLength]); + + // this._nuclei = newPerceptei; + // } + + public Dictionary thingReceivers = new(); + +#if UNITY_MATHEMATICS + + private Nucleus FindReceiver(int thingId, float3 inputValue) { + float inputMagnitude = length(inputValue); + return FindReceiverMagnitude(thingId, inputMagnitude); + } + +#else + + private Nucleus FindReceiver(int thingId, Vector3 inputValue) { + float inputMagnitude = inputValue.magnitude; + return FindReceiverMagnitude(thingId, inputMagnitude); + } + +#endif + + private Nucleus FindReceiverMagnitude(int thingId, float inputMagnitude) { + Neuron selectedReceiver = null; + float selectedMagnitude = 0; + foreach (Nucleus nucleusReceiver in this._nuclei) { + if (nucleusReceiver is not Neuron receiver) + continue; + if (thingReceivers.ContainsValue(receiver) == false) { + // We found an unusued receiver + thingReceivers.Add(thingId, receiver); + return receiver; + } + else if (receiver.isSleeping) { + // A sleeping receiver is not active and can therefore always be used + thingReceivers.Add(thingId, receiver); + return receiver; + } + else if (selectedReceiver == null) { + // If we haven't found a receiver yet, just start by taking the first + selectedReceiver = receiver; + selectedMagnitude = selectedReceiver.outputMagnitude; + } + // Look for the receiver with the lowest magnitude + else { + float magnitude = receiver.outputMagnitude; + + if (magnitude < inputMagnitude && receiver.outputMagnitude < selectedMagnitude) { + selectedReceiver = receiver; + selectedMagnitude = selectedReceiver.outputMagnitude; + } + } + } + if (selectedReceiver != null) { + // Replace the receiver + // Find the thingId current associated with the receiver + int keyToRemove = thingReceivers.FirstOrDefault(r => r.Value.Equals(selectedReceiver)).Key; + if (keyToRemove != 0 || thingReceivers.ContainsKey(keyToRemove)) + thingReceivers.Remove(keyToRemove); + // And add the new association + thingReceivers.Add(thingId, selectedReceiver); + } + return selectedReceiver; + } + + /// + /// Process an external stimulus + /// + /// The value of the stimulus + /// The id of the thing causing the stimulus + /// The name of the thing causing the stimulus + public virtual void ProcessStimulus(int thingId, Vector3 inputValue, string thingName = null) { + CleanupReceivers(); + + if (this._nuclei[0] is Neuron neuron) + inputValue = neuron.Activator(inputValue); + + if (!thingReceivers.TryGetValue(thingId, out Nucleus selectedReceiver)) { + // No existing nucleus for this thing + selectedReceiver = FindReceiver(thingId, inputValue); + } + if (selectedReceiver == null) + return; + + if (thingName != null) { + string baseName = selectedReceiver.name; + int colonPos = selectedReceiver.name.IndexOf(":"); + if (colonPos > 0) + baseName = selectedReceiver.name[..colonPos]; + selectedReceiver.name = baseName + ": " + thingName; + } + + if (selectedReceiver is Neuron selectedNucleus) + selectedNucleus.ProcessStimulusDirect(inputValue); + } + + /// + /// Remove a thing-receiver connection when the nucleus is inactive + /// + private void CleanupReceivers() { + List receiversToRemove = new(); + foreach (KeyValuePair item in thingReceivers) { + if (item.Value != null && item.Value is Neuron neuron && neuron.isSleeping) + receiversToRemove.Add(item.Key); + } + foreach (int thingId in receiversToRemove) { + Nucleus selectedReceiver = thingReceivers[thingId]; + + thingReceivers.Remove(thingId); + + int colonPos = selectedReceiver.name.IndexOf(":"); + if (colonPos > 0) + selectedReceiver.name = selectedReceiver.name[..colonPos]; + + } + } + } + +} \ No newline at end of file diff --git a/NucleusArray.cs.meta b/Runtime/Scripts/NucleusArray.cs.meta similarity index 100% rename from NucleusArray.cs.meta rename to Runtime/Scripts/NucleusArray.cs.meta diff --git a/Runtime/Scripts/Receptor.cs b/Runtime/Scripts/Receptor.cs new file mode 100644 index 0000000..38a9cdf --- /dev/null +++ b/Runtime/Scripts/Receptor.cs @@ -0,0 +1,113 @@ +using UnityEngine; +#if UNITY_MATHEMATICS +using Unity.Mathematics; +using static Unity.Mathematics.math; +#endif + +namespace NanoBrain { + + /// + /// Basic IReceptor to receive external input + /// + [System.Serializable] + public class Receptor : Neuron, IReceptor { + /// + /// Create a new Receptor in a Cluster instance + /// + /// The Cluster in which the Receptor is created + /// The name of the new Receptor + public Receptor(Cluster parent, string name) : base(parent, name) { + this.array = new NucleusArray(this); + if (this.name.IndexOf(":") < 0) + this.name += ": 0"; + } + /// + /// Create a new Receptor in a Cluster Prefab + /// + /// The Cluster Prefab in which the Receptor is created + /// The name of the new Receptor + public Receptor(ClusterPrefab prefab, string name) : base(prefab, name) { + this.array = new NucleusArray(this); + } + + public string GetName() { + return this.name; + } + + /// \copydoc NanoBrain::Neuron::ShallowCloneTo + public override Nucleus ShallowCloneTo(Cluster parent) { + Receptor clone = new(parent, name) { + + }; + CloneFields(clone); + return clone; + } + /// \copydoc NanoBrain::Neuron::Clone + public override Nucleus Clone(ClusterPrefab prefab) { + Receptor clone = new(prefab, name) { + array = this._array + }; + CloneFields(clone); + // Adding receivers will also add synapses to the receivers + foreach (Nucleus receiver in this.receivers.ToArray()) + clone.AddReceiver(receiver); + + return clone; + } + + [SerializeReference] + private NucleusArray _array; + public NucleusArray array { + set { _array = value; } + } + + public Nucleus[] nucleiArray { + get { return _array.nuclei; } + set { _array.nuclei = value; } + } + + public void AddReceptorElement(ClusterPrefab prefab) { + IReceptorHelpers.AddReceptorElement(this, prefab); + } + + public void RemoveReceptorElement() { + IReceptorHelpers.RemoveReceptorElement(this); + } + + public virtual void AddArrayReceiver(Nucleus receiverToAdd, float weight = 1) { + IReceptorHelpers.AddArrayReceiver(this, receiverToAdd, weight); + } + + public override void UpdateStateIsolated() { + this.outputValue = this.bias; + } + +#if UNITY_MATHEMATICS + + public override void UpdateNuclei() { + this.stale++; + if (this.stale > staleValueForSleep && lengthsq(this.bias) > 0) { + this.bias = new float3(0, 0, 0); + this.parent.UpdateFromNucleus(this); + } + } + +#else + + public override void UpdateNuclei() { + this.stale++; + if (this.stale > staleValueForSleep && this.bias.sqrMagnitude > 0) { + this.bias = new Vector3(0, 0, 0); + this.parent.UpdateFromNucleus(this); + } + } + + +#endif + public override void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = null) { + this._array ??= new NucleusArray(this.parent); + this._array.ProcessStimulus(thingId, inputValue, thingName); + } + } + +} \ No newline at end of file diff --git a/Receptor.cs.meta b/Runtime/Scripts/Receptor.cs.meta similarity index 100% rename from Receptor.cs.meta rename to Runtime/Scripts/Receptor.cs.meta diff --git a/Runtime/Scripts/Synapse.cs b/Runtime/Scripts/Synapse.cs new file mode 100644 index 0000000..63bacf7 --- /dev/null +++ b/Runtime/Scripts/Synapse.cs @@ -0,0 +1,33 @@ +using System; +using UnityEngine; + +namespace NanoBrain { + + /// + /// A Synapse connects the ouput of a Neuron to another Neuron + /// + [Serializable] + public class Synapse { + /// + /// The neuron from which input is received + /// + [SerializeReference] + public Neuron neuron; + + /// + /// The weight value to apply to the Neuron input + /// + public float weight; + + /// + /// Create a new Synapse + /// + /// The neuron from which input is received + /// The weight value to apply to the Neuron input + public Synapse(Neuron nucleus, float weight = 1.0f) { + this.neuron = nucleus; + this.weight = weight; + } + } + +} \ No newline at end of file diff --git a/Synapse.cs.meta b/Runtime/Scripts/Synapse.cs.meta similarity index 100% rename from Synapse.cs.meta rename to Runtime/Scripts/Synapse.cs.meta diff --git a/Runtime/Vector.cs b/Runtime/Vector.cs deleted file mode 100644 index 40855b3..0000000 --- a/Runtime/Vector.cs +++ /dev/null @@ -1,8 +0,0 @@ -using UnityEngine; - -#if UNITY_MATHEMATICS -using Unity.Mathematics; -using static Unity.Mathematics.math; -//#endif - -#endif diff --git a/Runtime/Vector.cs.meta b/Runtime/Vector.cs.meta deleted file mode 100644 index aa9e666..0000000 --- a/Runtime/Vector.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 76e9f0d4925b7ac278baa9932582ed10 \ No newline at end of file diff --git a/Scene.meta b/Samples.meta similarity index 77% rename from Scene.meta rename to Samples.meta index d71b5e5..43351c2 100644 --- a/Scene.meta +++ b/Samples.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: bfd7dadd61c0891d8a94db0196e61a8a +guid: 9499e0c167c60f8eba614e29833d1bf3 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Scripts/Experimental.meta b/Samples/Clusters.meta similarity index 77% rename from Scripts/Experimental.meta rename to Samples/Clusters.meta index 7c7ad14..78d2b3c 100644 --- a/Scripts/Experimental.meta +++ b/Samples/Clusters.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 2c1e3956a0b70ae6b8d09fb467b73621 +guid: c95a1d65d635791c3b05c8fa281b4b94 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Identity.asset b/Samples/Clusters/Identity.asset similarity index 100% rename from Identity.asset rename to Samples/Clusters/Identity.asset diff --git a/Identity.asset.meta b/Samples/Clusters/Identity.asset.meta similarity index 100% rename from Identity.asset.meta rename to Samples/Clusters/Identity.asset.meta diff --git a/NewVelocity.asset b/Samples/Clusters/NewVelocity.asset similarity index 100% rename from NewVelocity.asset rename to Samples/Clusters/NewVelocity.asset diff --git a/NewVelocity.asset.meta b/Samples/Clusters/NewVelocity.asset.meta similarity index 100% rename from NewVelocity.asset.meta rename to Samples/Clusters/NewVelocity.asset.meta diff --git a/Velocity.asset b/Samples/Clusters/Velocity.asset similarity index 100% rename from Velocity.asset rename to Samples/Clusters/Velocity.asset diff --git a/Velocity.asset.meta b/Samples/Clusters/Velocity.asset.meta similarity index 100% rename from Velocity.asset.meta rename to Samples/Clusters/Velocity.asset.meta diff --git a/Scene/TestScene Boid.unity b/Scene/TestScene Boid.unity deleted file mode 100644 index 401756e..0000000 --- a/Scene/TestScene Boid.unity +++ /dev/null @@ -1,487 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 10 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 13 - m_BakeOnSceneLoad: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 2 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 512 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 256 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 1 - m_PVRDenoiserTypeDirect: 1 - m_PVRDenoiserTypeIndirect: 1 - m_PVRDenoiserTypeAO: 1 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 1 - m_PVRFilteringGaussRadiusAO: 1 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 - m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} - m_LightingSettings: {fileID: 0} ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 3 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - buildHeightMesh: 0 - maxJobWorkers: 0 - preserveTilesOutsideBounds: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1001 &551770709 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalPosition.x - value: 0.71 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093763, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_Name - value: Boid2 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} ---- !u!1 &968074744 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 968074747} - - component: {fileID: 968074746} - - component: {fileID: 968074745} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!81 &968074745 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 968074744} - m_Enabled: 1 ---- !u!20 &968074746 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 968074744} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_Iso: 200 - m_ShutterSpeed: 0.005 - m_Aperture: 16 - m_FocusDistance: 10 - m_FocalLength: 50 - m_BladeCount: 5 - m_Curvature: {x: 2, y: 11} - m_BarrelClipping: 0.25 - m_Anamorphism: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &968074747 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 968074744} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1342149740 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1342149742} - - component: {fileID: 1342149741} - m_Layer: 0 - m_Name: SwamControl - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1342149741 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1342149740} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0464906885ae3494f8fd0314719fb2db, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::SwarmControl - speed: 0.5 - inertia: 0.1 - alignmentForce: 0 - cohesionForce: 1 - separationForce: 1 - avoidanceForce: 5 - separationDistance: 0.5 - perceptionDistance: 1 - spaceSize: {x: 10, y: 10, z: 10} - boundaryWidth: {x: 1, y: 1, z: 1} ---- !u!4 &1342149742 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1342149740} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -1.00377, y: -1.02283, z: 0.72231} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2011285159 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2011285161} - - component: {fileID: 2011285160} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &2011285160 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2011285159} - m_Enabled: 1 - serializedVersion: 12 - m_Type: 1 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize2D: {x: 0.5, y: 0.5} - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_UseViewFrustumForShadowCasterCull: 1 - m_ForceVisible: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 - m_LightUnit: 1 - m_LuxAtDistance: 1 - m_EnableSpotReflector: 1 ---- !u!4 &2011285161 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2011285159} - serializedVersion: 2 - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1001 &4573752827112804207 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093762, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7761516481062093763, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} - propertyPath: m_Name - value: Boid1 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 6860355b30724b5ddb35781dcaf3b57e, type: 3} ---- !u!1660057539 &9223372036854775807 -SceneRoots: - m_ObjectHideFlags: 0 - m_Roots: - - {fileID: 968074747} - - {fileID: 2011285161} - - {fileID: 4573752827112804207} - - {fileID: 551770709} - - {fileID: 1342149742} diff --git a/Scene/TestScene Experiment.unity b/Scene/TestScene Experiment.unity deleted file mode 100644 index ac54ba4..0000000 --- a/Scene/TestScene Experiment.unity +++ /dev/null @@ -1,365 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 10 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 13 - m_BakeOnSceneLoad: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 2 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 512 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 256 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 1 - m_PVRDenoiserTypeDirect: 1 - m_PVRDenoiserTypeIndirect: 1 - m_PVRDenoiserTypeAO: 1 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 1 - m_PVRFilteringGaussRadiusAO: 1 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 - m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} - m_LightingSettings: {fileID: 0} ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 3 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - buildHeightMesh: 0 - maxJobWorkers: 0 - preserveTilesOutsideBounds: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &388118692 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 388118694} - - component: {fileID: 388118693} - m_Layer: 0 - m_Name: GameObject - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &388118693 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 388118692} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9051408e82b511584998506096af4bf0, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::SelectorBrain - defaultBrain: {fileID: 11400000, guid: d5b3a22d9bb7d13aeb3174077125967b, type: 2} - input1: {x: 0, y: 0, z: 1} - input2: {x: 0, y: -2, z: 0} - output: {x: 0, y: 0, z: 0} ---- !u!4 &388118694 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 388118692} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -2.01476, y: -0, z: 0.65362} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &968074744 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 968074747} - - component: {fileID: 968074746} - - component: {fileID: 968074745} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!81 &968074745 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 968074744} - m_Enabled: 1 ---- !u!20 &968074746 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 968074744} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_Iso: 200 - m_ShutterSpeed: 0.005 - m_Aperture: 16 - m_FocusDistance: 10 - m_FocalLength: 50 - m_BladeCount: 5 - m_Curvature: {x: 2, y: 11} - m_BarrelClipping: 0.25 - m_Anamorphism: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &968074747 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 968074744} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2011285159 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2011285161} - - component: {fileID: 2011285160} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &2011285160 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2011285159} - m_Enabled: 1 - serializedVersion: 12 - m_Type: 1 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize2D: {x: 0.5, y: 0.5} - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_UseViewFrustumForShadowCasterCull: 1 - m_ForceVisible: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 - m_LightUnit: 1 - m_LuxAtDistance: 1 - m_EnableSpotReflector: 1 ---- !u!4 &2011285161 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2011285159} - serializedVersion: 2 - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1660057539 &9223372036854775807 -SceneRoots: - m_ObjectHideFlags: 0 - m_Roots: - - {fileID: 968074747} - - {fileID: 2011285161} - - {fileID: 388118694} diff --git a/Scene/TestScene Experiment.unity.meta b/Scene/TestScene Experiment.unity.meta deleted file mode 100644 index 676153c..0000000 --- a/Scene/TestScene Experiment.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 1070383882ed0f5379a3b34e8ccb1f75 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Scripts/NeuraalNetwerkIcoonSchets1.png b/Scripts/NeuraalNetwerkIcoonSchets1.png deleted file mode 100644 index 82980ef9531ebefbf60dfd4bb2d8f0c0b99f2798..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63771 zcmV)~KzhH4P)jy-meN~;;_eQ?69^FkL?CYe`<}_t00~4kB*^zL*=2Wj=FBbJv|-y`T1~ga4^?#baaHXvokzAJkYRV zLxhEep=r~m2n`K|zB>c;cLvT7fcm>Obvm+r`}Se|`t?|_U;(C1or<+<*Fv9FMqu>z z_D1KJp%7Ubgy?ghXF=!mQxw$ARDl+$%l+m(fOSEm<)^5*!+(Dg! zC!8SwC&8lT<>eW~N=;2gTwEM>?AU>=Tesri!GneX`1<-HC@2Vx8#hK|WTZh1y{{^) zTD1xve)u82`|dmFUIITqKXmBO0exCDLWD;)yj>mO;Zy|Yq8vCCWSRRry8EEW#S=Nj zPDszn$NK#an6_d&Hg4Q#uFq9xpU{5-|AVV zek3F$AT2HJu+v3|+O=zk!Gi}IDWg}fUT|}BJM5e@|2h5)oFM?mpQ96YMovx+;^X77 zdGlt2;NpJT_~M4ryM>fOh{VK1NCG$##9@W_(b3U{GxqM?8~ytAGkW=v=a&7yuJz}i zf8yC^pT*+Ei_KTk50H}qXc(3C7s)p0;*1QJ zP^?UI$A`P4Fk{hbL%ei-jV(Mp934A$G-HzVB3pxqki>j}qy~xiF)`8T8tQ@QybbWk zjE7_HeiR2pV~a~me7AC+krr$!hps6?aQ^w{hEt?)d(fKa6x^BW$u0h^tG=5eSK| zyY?EKACZlKgcjLSta>I1|G#lfRif^HxxNgJa+IvmRB=u4mt}TOy7jR zX~^5Vcb_qy3DJb)5~qbEGU}~cx6T;a!f8~yZ$uQX58DBctYnJ%N2?gso+=Rnjxo>0 z7ke5H!k-15@xvc8v3k{NWYB0RNypvYot}eE`1i$qF*NggxaCsaC?El%gjAvAp?Prg zK{kiF*QX6W-`5%+{X88zcO@7?AbZI8@#AshjW<@w09ozlJPChzh5(%4MU(FO*kg}j z5;?y(w6~`RdUol6%SR8u$bdxnrLBe2-pz0-A?tOZ%q;}hdmVz~iQz&vM<@Q)8ToKR zQeaPfksOJyew~S3Nqdl+UjRuTWg)z26a3$x#<(MNB^(QmfpBGiRGs%`Y|eZHClvUE zAt`(mHs%Im)7~O9_bWyhj}$bD{R|EwY{z@fviH|@9UM{Q2LJu`f7r7x z-4NDMqedC~MvE3L&Ug&U&YPy~j2rNX8L6fJ%3vj9n2`VT&p$W1ecKkzaLKJ7;yc?6$+`l+$t zcj?jvPmgMXQTe}~IK&gOxzS=D)ExW5&qhjv<_O%k9F5kzLs9z#O~i@14TYe@sEhFS zmWKH3`zgkiD3##(=btx5La9S%;EV)tLiT`Mc;fu;zyH3`cjcOUVq{|sp{{#~>(&M* zJl50cemcZ;?ZtVIb-%j!j#0?PU9QFlD{}GHAL~qHqoNX@e)?%#dg-NSyaZg6GZH{8 zZ%kSCUwP#f!+GSUQ$*ZDgM%<||5p~`DO6r6ei_x*)%o?~~hU#l_(jxuys{TezzH_VVG&%K!G;ZyV(A)TtBh>*E9wT9rz}e2C4*L z9V2dcWgf1Ad(*4ej|AZQcEANKN(XwXis^P*hvQy`)OBddR57B8A$*a zUwrXt>m4{F0UUSd9DRcP_J92G2jnXn0#Jp8lMes=_uu1(AAT_Dv9jz7 z;T63mH&aYZ4E@e72=ORJL)U!x6{ez5@?7{7?L$+yT)elk2(PUK;>qznD0>a;*$J0i zeIq(|?FnB$Un7d<=VoK(FW=zF=U&3Dv|RWS@gMF9Oz6f~8rciZNCH(@vGPwXadE|5 zx3loX+&s*jITMNxkff$Og3}Go5P(XoxKdn|A@}8%Ut-OgHIUdZWFI|jAjUN-L0C~d zJPI=4n$3v4ybL%w6vJ7{d>xYkU+uaked2a!N8TtD1K;X*OJjrIcFLVBxw^f`0&S5c$z*MK9czoJk z6N;_yXoW>9m*8}QGX$W5)mGq+5@jSNPMkOqt5>gPRB9nwHH*N63wmLU!+f|iImOvg zh)xC57O|)6*|;<}8gU;lGtTFE2BqXMWVLU&3toHkZFCxaEfK$B6HHOg0sQgKL%8YT zw~$1l(J>hKa2U|739m0};Tfpe3~+5qX#AVvJO+>dx(#dAu0z+ZUGdddU!i&P<~6(a zN%ZS81fZP7Qf&H`En7_Fn8bZ2#+g$U^rHfv^65I@ z{<**b>iffp{BOMU7-G(QfbzUc#Xr~BQdbk2Ut37r!gMxW`bP% zhLycQ9iAtHr4Ayk=3+k)I*rJj%&gxe9;wXiU6BIpph0vm-z%dpkLPA_nvdl8fyp`y>jlTXLHv{gR;T!1B@7LO!$?nWeXO>>&!2yl| z;cy8j^}tRe8k^rr^sNk*RQ^WxIaA{jH|E%qiP&2?2b(GV%ui&z1B0D*@-uPvyrLr? zz=0_W9&mGag&$oVt}G_v$^Sdikm^)$fJHzuQ9|laM1pdVL?V?0B#Q*&w;hzSm_v1E zXW-_Jlm4lO zRM`o)-;7&=*B~H%PPGhf(qR+GsrQhxwGIG=gtLZ)D|fF`)w9szlJ{fg+MVWkL20W7(UYC_{f6O#2jaV* ze>Ks9S6_X#she>0_)ncr>f?4g;j^nEl!^*dFptFly8{=(bH^Xm=O%mtn~hLN>n^US z>N*A7tyKVx=bd-n#nR=g%&*#VbB9y^HLk!aT&Gq~EoJ75h@(FdDW}DQML{hczwCX5 z+%m4J1e)?8uDId~sE}u+E$#;{24cA;i~mc#YB@$k0I#e7zTIT04j-?xRE($klIRBU z&Ll=v1*hC}+|bz#zx?iI+`S7IE;OaZs(PK1>HO240I2r8GWAr5^Wldd#@#+M;kkWg zjYMn}s_|ukS{E|?IC8*E6oWfN=>uApmj8|paRH0b41y5z* z7Cn7I-ELlZ;RVc|Jsbb}*S~P9$6xSHs2TEWHbnqpXrb;KY8k)8sg`Y_1uQeJ(vz(s znJ>Nc(xF117sLP;wV*0ds$*CBLbY`wcg{YlIRBnU*W?0V6>}PF$gi?va;JUv*=NR} zrqE~=`;_-b+S|=c@lo#4!pLUMn!rM zj1ltCZ!7VJRhJs%rJ_%duEq|e((4%+8I}0q$$QFaO8{i?m!U@yekzvvP{?A0>}RwN zH&IQ2+Z18s)OU9Qn$n#to%o91iZJoDcdG;Oe$?5prAy3Ycg`wcuwOV5YKM#FEt1j6_W0REE=*0H_rA zTW`H(YUV%M=>S?g$J+(@ZJR}$dQ3F%-cXnvD*T;v-EbYAr(~$MXbFsgmD35f$J!$cJyI2;H;g<+`b$c zTNa^sI~D1*ld*H-N*3$PF*XD?;=wgMcYH@HI7WW&RovX!G$mANN7rDk%Ko&NShSo- z|M2{OkY6IdkXxnB%0qtrUitR5g8a6@HSR!T%k6Mv1YeIvB$(mW7wMd*1tb7DR8Oij zU(D-pD`HOq_F+)@b|r$H%5d6A09sHL=2V#Hh0*!w;6e6E@x0c7*6}VOJR0+M+?1&~ z6#My^zgs>68yr9p3B`@+z((rUG9X^jhGI66Ux71tCpHDB=$?MfA!T@O$VYAF@_57(e+AFrAhG2S&!kI8|L;HH|z=$OsNBM zz*Ks^nAGLWeguj`kcxJO08}{ZC*Kz`{HX!voH=vQvt2aCv~i~?n>+hNfsmF5>wlQT zaHi7Flo)s()dgk!4W`)Nfy6=vNjDeZvX;O?arD-_?W2&;4wC*!)h0z;l{g z>VT47CX>5;Pf5TQXk>m{i+?1gNZ)^rHVhg31Pb7J>Zzydp7UG7vHrFm14q9mCjKIX z>XSf8MUnt2&HeQwssIiQ2$F;&kay!$hSQ1w$mpl&u4dt(7~6*mc4k`rT3ZIyfZX;l zS0tqXKYFF^=wxNUNmWqb%|34KD(SY>d{WggP*T&*1J(u9HCXu)DxguXz%PvA)5Y-M zjyBPf99%vLmXeQ5Q>CilG0(MS0@_~d)w9}hFsBs(knvA}9j%-AAjWy;;fQ9(Nwxc> zNEo6i_TSXrN`F-);UBix{VqpcP{PSJsvW;=|K}@N^+%5$UH>?vICbmMrqo(!sRW== zC(^#7)Z0XhFTssf{;tU-TB zDL`qowJ8Ni&5+8W^j(3Hc9bStFNi3DV=t>2Ub+>H`V$uGD`aR$yM@M9AKxTAHM;63jl;KutFY zRHECJC7>d`h)rrceX;?E+&vUHH`=mmeYdGpzb$}Lj)@GyOZ^t(}n;@0#Gix zkB1XH_pPf2ORPUjtj<9%4Pa<6?Eq6KqATG@2{5XyC(E}EaXonq^s1;h6(tqY%SRqS zf}r3c9cn%zx0%wHefXUZUroj#34l}#W!O3KhfSI^F{!=vXBNsC36ZzNGl&nv2P?5e z7tKjkT&CF$4Y2S)Bgkdkp+g7LN3fhboiZPtHUvOP9U=g3!h)=nlYRj^aGyWg3wUfk zBL|sx^TRoowcA!8Q;4rRd$NKnPhS#)q6w4ve^t>@p;95YDac7qNzKSu&^0}JFHn}B zKqb-qb2p4kiIf59*5leZRS} zzfyZe4C-@mObN@a7rXi$3Z14Bc43~2uVez5}?MtP*p-%$@=s(58 zE{2sNTkN(Jn{;0y+Myj<*>RL}p85myB;v~su!$VLb#Upmb#5skIP|J}@>wGMcu-;( z!f7xBjGyOlIz#}}t56nmCH_p^!Sv-t4zwkdn8X;R^Im!7mAZ1hhGORbW`jhabd)yR zMr8(_+H5S|`S5FF=v2ed>ZUI%;Y{V+#B`KUBy~b<<+KNNs5pv@s;;iC#?zpJDKa)H zxk^b$wVFJ2#6+An1VDKJ;$Cnf*7%1pMs(W|Q&Hx>LJl21l(YR>VQaP*R_@q`#AFvF z75O1CEem^?wYMj&n29|O=DN!1_hbz)Kh~>m+RzhWf!+vd;7<cW zeDVhGkfRAe>BdKsc1ZQ^jAh&RW5xPCh@+UiY5xK2+_lHJ5w(zILD$tG>0%FU3|eFx zD2hxAtc6xcsfdKmyQE^pqSlFOf+@9BY7rV1(#ZfwF`_zvKVSbQqU_ zMc~A>P6jxblaJVheTRnHiqekhq;%+$a^8^Otq;2rpTGHsQFVlj@)(IrR|dr4SFBip zpMLtuw33s(NrYZ&?aEFj9;|Zg<>3ZjA8$Cjgc*jR`BYSDZuUVIhsifVN1HZnGR;aQ z1*lrGg05tTh>D6jl$%hQ@l@rU(}n=3gRc;BA4T^}zxME9Z$E=5+UX6vk=yPH{I)p{ z(`UybcJCG>rluh=G0}){now9(S}eUk^+)IA;caamtI%0?&lU;e)|#4c-5ksUs>hH9Ss2}G1YwK z7e5&wBP$zgwk8}JYHJclH4&+hD02Pty5EeKe$PhS&Rr%^Ok7+<`&b}Cufj4y^k07Y z1uB82ZqaHQ+pkSiMEFt~WZI{vV*$LJ3gB6i%`)ftaHBZl=I#L(_eLnDG+N}~ioJzC zh~JY*>0<}h?kU7}Ha^fb6}qlwrK(psWXOSq z@_uSN@H@2{mBo@P?~oE)rK|mOvM-sRxEGBVMshhBD&xq@6Q7WTZM!XECF0ne5`e<{ zDcwFsM~e{OooSUVHajtc~4j zIK5)OqoboSdgwr$+tLNm`{tlQ)_gQ5oDJtpBDj#eNUxb%!&)OyOCAPS zSFz4~W3*BrReguNoNTOJz8G1`VJ4`sO4-DqqsCACOKEp2zJG5KQc_Zklqcjr@4WMl zI#nNt>#K@wHzJW^YV1jcT=b@3`X*V;?Bz64m^Zz)j~o- zjQBk-$%$NgI9`AIMWfgI`ugDPp@VS!*ghDV{U=-gKc#P@@jQ9KS)HV1L9@92M77-vrq|D&mYa zdjk9X`rv^~%$oMwp^K@9qNxpFL%u`b@Qt$zQag^vlYj5S^qI4bjYi`3bI(0zkh<)t zG9F6;`ugjy&G(WL)##*QU;r)|(2^C2oe-We4-QFt$RN1h<=wCB1N5y z;E74AM9EctT+w^V7;Mb=fNE{T(#KUm&<5{*Sh6vmQ(>tAij0$vTOXl>QrY^otMDp& zDP&PKlZWJ5mVB_)2rN7166Oq~wY>^&Y;K6x-+03qhgIJ|RicmVR3zk=4QJA%Nv2PO z>_T4T`rW&9#KV{N#Wg`|5tuv+4mk|4(4Mgu@V?HJB7$Ag(Ke(39D|kJ&w9cH9wG4z+wgwg`06xR3dH|+7_WrLNImeRETfO z_8{r3CU7FRX-&pi~kJ-rzq)t*H0FykNRBO!b&-q_vBw1ZQ?P9v6P7c!~Fp}aI@LC7z$ zU;Pe50A&<@@aBKvzvneXm(4FTta25(e%W8t!h1smiqSNG6RwZgi91HLM)T+>;~~(v zfB*e=!_caGXKt5M8)O+)XBthG#Q)ZRX5qD!+@oTlD^slyUvGH>Y5+dj3ApIO3$b_+OP7-XsGzFy z0YpG+DtgvnSmplo+xK3=rrl}gI~g!#6b(>iAe&S!HS zJF@hbBKTzRdxI*%mMvQ#H}YNAUW}_lH;kI;|DzS_|w?Klt(51bYq;?gsxT|gb@iS zg{8N<3KO@5IDWAtYc0zxB^kne*PD_0pep@^B{Q>t3Q=#(V@3aU`oUl9O_a*C{a zu~#-m`fjGOURAUH;Y+3jlQrbB>X5UTMBtogivIm*bP~spWYG?8K&1j~U^uOcYRsl# zE+xwf+f{PTAvyK%%hvdR6950E_`iXHaEb^V-Hb>~gs2wicUh@u&~7BM8MHF}?`h^T z>XoNWCX2ZuAnO`7tz3wE@4OYuwx*b&sNTUXod5+yDep^aP)6q)@xsPNhMP<5m+S8K z+i%Bx_uY3?yuS#XkpH#UUNaJp5bKh0XXDlm#RyIKALqo9GV1KPx%u1*(h=!?01X>A zK_VKH2&{xuT*V@^ZQJ%JY35jCJtYZ%j5TWY{o{{6nkY8)t$VT8K@9WW@{dS(tXVnE zcWGn*56@%Z%??Y%e`O$}@yK!24qOoIWmWK1gq~7w)zN1O3Bh_IW@qZ9jU<}Z0yq;N zSMolKc*q8z<{}Cdsx}m`OOdl1f_j{XWoy=BcS3?u1r(SfP>C?bPSh3bj9ra~@4FL! zELdx3s#2lPYYyDs-AZj1@@MzB4KJ+q#hY)vZA4{>$yZ%sCgh(uaiVDr zE?3{^;X`m|Zy&VY`zJG|EFx1^&wJ>;Bm%C52NCI-hOp2^*jm&WYuB!Yq?O3XNVI6t z;wXE@q2C_y=9D7<@{_*(_S=T@%dm6Zwb$Ubprz>VM$T^s9bDXh9TE8%8v7a((VyuH z^a$mwO4sCf2KeemylBnItnu$z*=SV{~gL8bI`yS?x}DF;|7Xcyy; zNTh~_|5GBny7zF%*a_dJtq{~<2xiQhWspdSqS$vy0wMx+VGr05yN1YrH-7wUp0VLd z?UMR6aR7b)-qzEWbp98f-_Q_mzWc$U*#1i|z0`CmF0Zti>>FwqFWp+tG^l?++%r59 zJq}KTLk1_+w!YP!Ond&0V{s|UMU?w~1UHSux(rW40MuDp$wV@4Rt8Qf0-${VzyA6Q zN?nbLio*Rvn&47QL3rLaBENlBPgjYh6!;Zwh#kqzZ>6|dVXQe%_Vr-vIuZfZ)mN*k z)Lg3rkh0Wj15^V0_c%%(ypPI&**fM{`(F9ka7v9ubcdc4ZCYZ%;-x6$Jc|g(C@4e` z5jfI_R_*&$;)fg7ti=8QcNZp4n`4Ta=qCz?eq%77nXiV>d--6}CT~pqc9x0Jm!zTy zzZYM8v0UVki&Mz2z7cw+?%liLk&AnwfA-&SO50j7^C00d-j*`2vJYvW=pzGsbLhS8 zGdsOH7UmWA8y=vp`jAj z{sHY9CEX|jP;O3njoP$ofhTSphvCJu;FP?Q&4NlyOqgmW#AQ+f+-p@?l3F*L+iUtx z>vbhH1leCi>=O=JYoOOurijQxq_Mhiee`Nig5Z?78_j9_Nb_oe4cm879av{78Yyt= zcq&@mDRBR+L5<%jP(`7tx88cI3H9yQvn#IY+YnBPwDt>Q?F6FiLjFk`tjam6p7RTt z!!U~4{^azwQd&peu8@nLL6KZSh!$RjH);!11k^|*yg?E-o+6p;vf0v;;5qMk+}EfL zat1fU$1^wK0E?l>!1~|+{uk@lug3!qJb?cF`jzU{4r z^(VI%0@@Zfi<@D7yk#)d=Fo;3GqPHReT(Z+QOs=P_;C zG=n7VW5O`ux(hHccNX?-nq|1Tyf`|f_Q{hYLasWB6@hFKntKs@6=$_c0`qoThRNoB zmZWk{3~fgw2J+VEH#LR=?s?~pxV~!_5~!9~wl3DBD65#OVi+m{du@%1u3syk%h0Dh zdx>ibf_U`NM=^c+bR&XZHl#DI3SB_Qubpm9DlNTQ?Xmtn*Q%$dGTRroV)!j7y6W+% z9re^WTE(dfoZXBI%U5ks?g6YI$9R2(WjNG``ZlpV1bSa9!12nyz!zf&NTLWD&2idO z5>l$L3X+D=*!I>c%OzS&DJ+Ft`ajP;i=SB-W9-5R^Q)$ zQ^%*y->!KC?(X4^0r|5rf5{TejI(kpV)v7f=GyLT5q*CWSa%YCH%_t;$dw2zZmz&E zUdp_R0OXQTu%endScbxsSXY5o5tCJvCN63LT*@Pq(t%yphwkmZf$130+!q^ncp98g zcB9lDJ!5%rQV{^9q|Tc+&%{8lUcK5FqSWj|VVVL(L*3httFfM|W)I+^<`Vh8-e6VV z6*X6u+?}1R4n1gt=YT#iTL>ciZ$+B~%hQ5>Ue z0S9>R&FLfnv{Tq+gV_enO)c^J#!gl$^2^ID0%&_qxubL_gjSK4UAuOLT(Lq(C9o(6 zM+8By@+3%w6Sr5kq1IDA?I}~Hm<_C;oU$M>TGH0d9a;B)gvb`@mlr)8pJxuHI`XJF zUDuv4VS?EcWq+@GNuqeP;imTri*(^ zd~d_orj+7>_&nYL!SMF+hX+%53mx52$i9MESqG7^cMlHiPeyL?Hl(E&VH5Yx>V1~& zK(-^rkElTFZql{eIgib>M%*_w0#H%gsE>7I35lWV_EvK>$Sk z<)ZoKn{SMjUslc|Vc4)?c)V8$d^db)pUut@zeFd&s#0dCQc}j(N69{9Rd~4Q2jea)`=L{3SmkYSBWgu)Dw{xL6?YL z78-lfecH_8{Acl=M#SO$4S0Cri-LiNl6zFW>Dp_rHMRY8Pa8;Ll$S`HU)Fv>yEd&b zvXu`KcCE#G8?sEShV6XCP)L7Q3HDArx^k^sG;u?tRz2X+tS20zxETVXNF8WcbmxiA z6b)^VolMbT8#l!~8W0v?@5cEoE0>C?yV%QNhgGIs>eEN-EE~eT-2oA9L#S)AH)O>0 zOvUiC>qv^-zbWu+U%rNO0Je>1MpOES1j8u)oXtyq zwes@yjr#bhNQd$QRG!K}ZO%By9-jdW`kq#35~PcH@6SeCqH5{g?f=4iN==ejJ2j3L z@m&sBvCon7Mk-W%I3ic|=2B-yMFQtHx8nPKNeB*$xge6xa2bx9zTS*&+v5z8k=UzP z5GC)}Km*o5Il8smX{+kGV-Y5a{B5g?A*B%UwrWezWnk_BNA$q;usf> z9*T=2GN5!%_q<&wjNF4DDurGdl+*3R<#MV6-mRW)oX>M5S*a2#1p0GO+`}d`?P!1=zT;R?v1sTzzd`e6Y#F3nPsZK#c49#(& z?JT|$|271V!;`=4rMoZQi1Si6lps?U`6WSq|NZxP`Q?|5YN9KMft=I7Bi1jOg+JG& z8H>I~(8P;j#1SMoB%ECua?g3P^jq`(H1J$U_D|&Zq8M0JXg~_m?tD^}{_u{Of}!)? zW4pFx#vrVYPU+lZlPC!UQ-HXQ>ZLFDO|^k*;Xrk&g?~2Fp#$+Zb$>|!ix)38jPpo4 zOuZuj5*w9;CF73C?45gci8@xtTv&?MEl_Tr6 zBK?H?<6@`+aQ!9fm&^If{8n$Zi8^t^N^E4OY3l=R+#(()3iu2|!mYRi*(HA70zAm^ z)GF|vdPcdwA_H_3Gu|N^=}z(3@82HDfkTnv(iADV&PYg1L44c}B*bq={=qc3p?itMP07OJF{J|c*!5ej-YyZGWyB=Wdp@1 zh>?8w;fE%xPsT9C%U?FUCpIpdhrd_tG{~>>RY~cdZr0p2BoaD!QvB$57m@!4iu%oL zm#qG)7b!~DtKsAyiB8Us;ePi8Xuv)4@p`L$n`%=^%^V(SZJX-fhzuud8~Qc$$8XHs zRG6@go#pj9tTzO}7LXx-t)jAIHD9a`ghif6G)zQ?bNGfYDi zov#KfFObmpqZDHd=0Owz&U=&Mem{ygBn0*XCq5ii2*)80AS&_*d!H{hfWJ2I^w17yt*v(>8(ZGOe%%Qr536nCx&^t<;~Q`BEXy^P%E0;+gQ z@(CvwsuuU={p$>PZ{;A!fTbRQ%3YYfi}rxFoC7`Ri2~aksHcDqq`*0KD_v%eXdt$( z{N?gCx_)=8ank2Dzql(tT9^!}iV|zjKKpFk#25r|cp3XvGDA*Y2-WJBcR^l(!F_w; z`d$G@T09xwtzh>a4oQ1L>BGjp)0F$fl}3h6mrxIQoLCrMJ2U0P4cTmj$|w|7l8szgDjinN z6x8mJkKD;z_i6*(hPy(?VA5)T<|TY$E@O(kF!fuResUYi!Y@fuu_5v>1O@uzyb%L& z-&su%H}f-mwmRQL^J!SD!i|S|&}bS)&%~M zad4sW4lPfyq71iF!<8CYQDo`S7c1uzB8CH-;CfR{_Hc7CxTU!fajX{vK*%m%zH+kV z+ZW|-!K8*O#}2^l?egKX;cH9xE9cp4A7vIfVSBm*zTD!5pSF}BF};AkcNSBmBI@Q? zY>HXR625W|@cBk2?sTO8xC0Tpj6|2mi~SS}Jifrv`Q>Vo&To*vV!C4+LcM)eEP_H- z1qxD8G~4x4`JBD2Tm;V(P6e#7)aWm*gE_wG()lfsF z-phZU zS?AmRuQ%CzSWkFuTxenp)Xza3on?DcfnaCZkZJ%9?0ey^1}6^L#;vMYiz7p{>tq{< z3W++4^DDR9R$$`ZLBSY}Ul_m26fL7H&pnjqS+*4&D&1SztBqDPyvmJgY4jnInLN?{c9rplHGJO z#aUvc;sQF8qo{tt<-ao?p^vrkJzY7HlZeO_Ik?b|?u-w9`pj@N>GbmVE6Y#DV~P7J z7cKi12 zCNO05sFC>h&_-w*`}%S9ZD|AR=wp6pnHPTBl0}1238S2%O`wCUz-nUY!b&wBp49mQ z_oMyp?=gMZW=vd0J(x(L&|T@q_x7USI*H+=P)8pSVds`~#Ipx&cpH?lVznh%8Urm4nOCCM$FVyS5nP{XklJ9;3?CkDBBD-E8BIo7EJ zAWN)_eXqXysxeBa9P?E)c}_Un8v$!7hx{A%JK&y0Uif=k9wNgU8Go+A9A)H@O+iNy z^}dY#d+}FEBRIAgk1>JYA;N1BuBHgQYOj^cAH{W7O0R0^kBnrC?SVvoKh8K8;G_i- zclI>J{c~wdN}*0mr0LZdY+ONmmIqy2-7U%I>4lbUK!ol-epaInDqpTL<_(Ag5AYmga^`R99q_p}G#ZEJ z7CJF0=tna=1^GPj#1kgfRndJi_(|+n39n(jI~l!xNQ3oolPj6ey@ML1N~J5(Pi{s9 z_?#0#!q<5?Lp$#=?#a4)Zc^#iqtPJdJLZV|YP?tC{xWXY6qFsgX=k#rm8iC%!my8o z6GHanhEcT@8E1t2iq?AM>}cHFn7UdPEi%XBx}1z6T4fje4#Q7d=|N%2@1Q}04f4y% zD*{j+IMe5vzGpZ7-js<0gP+0Ze_e@2N zOd5_}r+EJZ#ayKwD^u?|61KDWjECHq{9FruTPMZ^P%6-QZ?7y3TRtH>p^7s>%=hcmmf{c^Rt5C{UE$ z5EA_sox9N0_ar}PVtrAUf8G4y8r1`C9vmFuSn0-<9ws}YmP8Lm{LTdP6N&%jl|ifZ zWtUH1izLo3LyeIC;d9&KLbthaDL7auE(zk^57wPf0ZjWI76n5Hf%& zTv@*6-CTlqS2N972vY02;i%D6`~i`FYs6)EY)*l(?2E_?`K9yA->(ECMO?&E>;z9wgPI=2#`#mCqsLz6fJq`a(U!sp~SuCbi&yDDR9ZJo&PH%|K?M7 z);wu8ba0~_I{3D}!w#x63SyG`NFuKE`U_iFk5H~u!+BTI$zwExDz{$tg7?>OPP86+ z_PPcle_Yswcy?h4CQtd*`0}-RZ@J|b!~GR3_S92PnTSy_0Tsc#tv{v0l0|UI+4Il7 z;#|a15Ln9RlTPi*|M#Tvr}f!4Q0yLC*H3xa{hj@qz|qYj0Qy3?71ai=VQOGEd^2~G z>3S^A->q9WlPGoMHJy+Az@GnC3a^SVO8=L^@80u!;DX$5*d05oa^f}@4Q^!99WG#b zD<|wpPBL-aavL70^B-&6vV6+>uypYvstrL57RfMpp&D;XXaroB%4Cf7OrY^+piF?3 z<1SBu;suncrK&AHL=>Bys6OC`?RllwP9Y(ivCH~ocm!}|o6-%W`Kt){oq}JK^rBQ= z6**NugNs}92jZS}1w_)M@N@9$#sGZ%!>7i7tuSA4{Rba>(5R5lFr8O>OUSPvpj(Hv z#4yZ(M>ZGJ_RL%)b?9DCqp!-i34Glh(UZ+!gU_Bosm~I(t#9i7ubY?up(385!;(;| z3q`(R_$xgcQ|DP_&QujieH@N-0qXj-MgUY0LasiQDGp>C<-0HJkLwD*h9f)8RvNUJ z4FXWoxIH#6h&5ba4^iC=W+g-@SVROtR8f&*NlY=$W~%6x^b#lpb84K$MHNY>L#d&D zBmiL~&Wa?IRb50vHQn6!oq}v+ZLbRuS6fDg_XhQN=}$rK9smF!07*naRP(A-bW2By zd*tqwk*+lU8`}YY?En&~3aE0CsvLD7A*c%?P(rZ`9djI+G!)d~Sn$u66Irh*Jt zkLZR8j$c)4QGh8u2RMA_$< z{pT-8*%i+MAjPH*fO>`IQ&T7*ch#O!B_LIT{VU!g3MvVuGSsR=FE4^}$CdgkVsRpg zfojyfyNc>dhP7d?BIj4#g2NEu7?Y&2Dr-@>=r1m{jAb9K2cF>6s>o?&uXBuBRQju8 zBL5c8E_gek9gW5B7zEckU3S@Jrhtcn$7DxRZ3x+tWYHdf(MVk8w+=o@8;`yZpG{3! zWc(9CQ42)d7SU)u;;N(1tp}gDxO*~ihZ~EaLN2N&C<0w2;4@2w%gD&2Au+&ke8t8n z`|(KszwNrULID2w;}7T%()H=n8_%_%X*$z(%c{L*Ie6jj2Oh>BbC;7UIxwy~(Bu!u zo?t5{b-XL;;iZNsK|~u#;iH2F4KnSZ)e<^kTsN$EmqkUlr(p|`X&>E<2Y6^9#646Q zNaeK@rkTsnXir2Ek?+qq%iyN$EkzNk-k++!suzIKrMdC!hD2K2G9W|Il#-PH5|GS34F_doZ>P%v%-C^UZw)@-uubbKncLEB6<)FB<=b&7GiUp`L0Wi{OUbsrSHVby z*y@lZFfx)Q!=mY`~VxiSqdqfoJn79znDdBwtw*Q+kaXd8!K1)hq zFHGFsjoqByGMAIosE)l7_ob?-1-5+sGX81(h7MxBNT(7s-7|~xqRA--I1h@bD<~af z1Ez&GYSzA-6YIxE>GA84nYPy~x3X7dq^>fU-;^NGmFf|tIN^sf05xwFf!zs!N^`5m zy5OoSuRyod$=tcbrs@DUo=;W+0z51%lIW+VpNeP_VprtsZ z4jB;(iNWiCBa0{N7xM6)&fN3?1-mg8`+G{NkX%l&u9#3yncwM zMI7{8?pl@#@Q>ddANZUJe!cN>at|W^o929*&aXfp)eW3AYnF*2QJ|03vul^mxN~q5 zv`y!lv1`#G3FU~p2^UnR>=3X!OMT`38e{D8`G`x{W4t)3N>n}WZ#`{;!o6taxQnj8 z#zyj8z_NOyMvXFI@`vW5^o?B!fHM4)g(XfazvI}@18_-6s&J8x987ut_h2W~Q4s-H zwu6yjgA;uNX_r;Ve^LK>SyM|BBqLdnF_mol?p%}>PSpNZVu z^+Ha8jr!VNtxpYti750X67&t{Y5a+*?kd|*;oR`=0Cdd14lm=$NMt!G_dNM9aDkfm5jK63k+uES+FJTF%jP@1%=?MkB1 z_+<=yZxzF(*IUmfyNEz;M#a&e#phSrbT6tshvv(iQOQ5NPGY08@a$$b8JYC1A?9-R zsdt~sylekxFUgCf4J>Hit}Q)D-7&cEcQ~?h@v-i!c{h``DL<*gaNF z76g5J_d@g3>11V@N8Yna|EJL(H^yXQew+)YZ7nbcK(%mE`Dm3pR)rHSsH6egtBiyy z1*Ph;>KG)$pT1M6sJ89eqfu}pM7U>>jXn!3{D?|EH&bOM+=i&7PawBoOCm!{BJ}w& zR?h%=5+oVex&f<2mx^-e_S~mja(`u%wCOO;ibY zx%9=-UKz(b{n+1=5XpP+bUy~pBv_J+Yz!g@+Kf@;N&=M_6T#D=mRR?6Wf$Vs)_0Zu z%Xv#{HU@8Q4#$^Ye}2f-cjc8=nvz~xQ%P+?etB+Ww~;mb)^mH|9LJe(-Wzv(Nv9Nv zY}WJw8coDNbglYE0G7`B1Ha8$jBKu@iw=&xCT>89J`oM`&^^=%GrSrYsd?_)xrX^2 z*%8^U1R#knHHBr$I5(teAp)GaTg2gN0-TU04GQr>UkAh&gkp32Zd2h!+(8H~E2nG? z(i?^7>R&JWgQO6JAlpDhxva!Th^fjdIP|C`NVCL(Un(0|5bE>P7!+<40pnJ&DDQV7Q< z5U0PHl0owT{)fX-=A@*8zjrdRiuYCtbd7%urGZMVHHlVUt8?*rYDawZ<+~<8Ow!uL z7hh~#eG>bX)FUs_|Ni$sqpB%}F zEcfS!Ygs#CnUz!V<|?+kBJl~N6mu-GTq1d4%y4{PI0!GjJ<$+qd1%ze{aJPtvLXL7 z4D?ZMzt%G{G7>jlFdWx~Y=B>~){Xb5B&ZFWLcMugBmOJ>T)hkx|4|YWKt4XN;Tu&*_K2hH9$n*)#X+KP(x2%vZheqw}r6 z85tIz=mU)JP$pHljD11HMddY6H{8kFEW3wNZHG7GeaoE3{~ZoZI^%oB>^=OSR}bx# zAw!0ka@`X9CDl!wIMF2j$VjVwbmJwXaZ_Xxg5nle>6vt6A-{^D%;DVUGZ;VwKoVlv zlHrFB@WlL2>Z)+%i_bpA7oUHMAX@ERxN+re(%h>W6_=!}38U%*qsz!UdnbAYI-^6& zW|+5Poe7{)NU%buZD2P7APGQGe}VuaUw{iOV7Yn>`+;}yL5y-+3-=EF(Xz#*h~t84 zQ4gf;gSSH#TDoVj51s=Skb@Pu6ylk-3Fzvz3hqT&aI*Qa>^GdsU&%HNwpadADgz~F z%4(iivYE&BWD~4$IlBdqQ@ zB7~KN-4xU&E~WYr&*5+bKG>b*(}?^H+<1lZ2nj!P=isFt{1In)CKPi&Ji6jL7CX6N zQL-bR{e6;&;}GZ9W|VtRTwX~%()lI!%dp#&YTY##jKWPU4;K{sCr$dagjNMOAIkez z)TUwp@`(_#3#kUB?pv220Lv-=jhsIPJmE|fB0g#P|({mUTF<(~kk5hgg zI(eotDJ&4nH@KT-sH&Y16BBdDBVac^D1BQhfFQh~H-hDyF0@|XK0{7`el zV|$hlCdav=C@;&nCso?IT;w;`;jZX)Gj~ad(Ogvfe?pgkbVlU`{IrEGN!lMO%RUrP zB$wt7+GG5%{Z*FDaHSSc}lF!4#a))T#bG&h(CQ`V?P_gA1%uh#!BxDP zT~BwUG#llbfty<$#3N+J;`pf~!UCx+HEIlEUB>)%AffRqO2dfA5)A3t!4TFTe)s{i zX3a7xv`(^{1R#-36RgE;rn9#T#BaAvSQYncQWVo;q3`>r+s@>>!^EfS% z2!j4m^Nx8rMLH@MK;3B+-mE$S{@jp?c{m;@E`g6=^jC$hmP>TFA9lI7#MAL@v0&kk z=8_WarStdh-P^dRlrApsQ8CrIsHTl@NlzO6Vv^Bh*Gw+tp5qOp;_peE6q%_U3C)QD z!eV1%jp0$vN$Uz6(|4dn?E8obqoJDfrXVxfa|G?UcNJ1@FXrh)*Jo?DBwXIg6Du|~ zVpEnxsC=55gqV05b5}e3k>O1fEMuI{0kWZk33hvkst!-dJBox_l}gG=y{cCA{i+VG z%=rrUjAPt!T3RM8{_Z9;S(g7}0xP|u`7ly7XCo$xdng3i2I9mDQ|7s)TW?*210|s_$Wn7?=0OI1}%(d;N0@y|>7mITaElPRx zchwOzCim+RVuj0Y%ith5vGoxYrkWw29;vi4CPP9v=*mF!KoT{II{dx3g*xZjK%v6Q z?5ivRP_&#P7=^@&R-^->a!AMX*K*^U&}5E59fA+zTKqmMYyjRWIv+2+^pX+n73Fv9 zt+(R3>#j2eJrwFIn4d(^q~;(ez^@dy5t*a7+?_Kh+_g>?YQb7;p^hVGcC??4Qni_&}0Z{Z48VIIn>7yA;Hu!2r}4<@Y zHv(^d@QI1olwC+AyB>f1apU`c_~D05f{(2IG6vpp;XsV_TnFE@)mAKYWyVn1ha=v% z=Tx;1DmG)4s-dhFdh*_M%s-4NcWfZT3jrpkj)<*sf5=Ra6%Q<8by(IA@$q6G;o>K zudDG?a9@>uiuPqzo3BMURj)t<^thmY^9Pa*!(Blend%hSKplUSg;-evpz{>!s|{J9 zAiEh`+pN_WkX6_l{bQYSuEh|+>8i3_syI`y0+YI3hq(vhT{B{DlYLeng+jH z&+CT^yw|~h&(f;9`buwkyccik+GmAXhEeTLMUeh7`DYx=*2XwNFzaO+rG6xlo=R4Ff%jD4kr=g%kQcS!8~ulycU68go?6O|w3~MtW}p~; z*#H#frwl*!fHcS-6^RFjHOAGR^WmSefMUPIv|0j=O~qRjfF+RH@%xWo%-doyZSp)#W$!T(bUhmRc(pMTNU)2Vu^#bq2{~)Rcc;O*~}n|MuH&4cCc| zj>ZE6{P3@!t?qJgsWo>}67MFic zafx~wu}$`w`JCr3`Pgbxr-knyYSoZX=uBnTt;$2CH$CxP|cGptjpQ;FU=M-K9(+DP4`iWG2Yn*BOP8@dD`T9U)hbMhLq>@t2{;kQ zS3=LQVZ)%x&?@DnknPaWCb+JJ_nh;f|q8;<>B?2 zNoW`|1<~Cur(uakwe2Ng2q@4LWJmvoUg}71XQ~~oc@I+R(fzL(>H`vUY1t})7DD@vN6jK zH?D}nQr2qF<`VMD#drSs=VS8Z$)+s4tnUH-emI9k2(N9t4c?AKe%l30$5Pub>ItAW zX$idb>|GW&{xyMtLf_56zsJQPgjnbxifj*{%MrU)u$aOmN;vr_CaX=%WbXzd|DSOd z5tY|PY2>n@XblfrSbL12>^1mY4jycu$ASY|BONk=a#%G3S#s6sSC(C+;i{0sRb%?H zpu{q!+osg);x+uWjQ}Xk)>hD>hL^Pe&xy@)Ro&c?`-SxKtBo|WZa~O6rlJ?}7_1Fg|{%05ZDyczI$-`%v7`JOzzi(v8F|qAc5k#9}c^ zNiISJl{~8rU04~EJsSgeccE&?J)u-;1wwtbf%km#EsUS=2qGdQO);4oEwl`MDU|W2 zK0zzrD(0ndZA+0~{U~Jv&^!(fx9T`b+NxFL*TXPyti+WKb_(;2geHTm(y(hx02Emz zNsr}GhH(rS=L&!$9aaOsgbqQPs11jWMUPYa{9NS^{=0LRxBzkLOs?etjaa07% zZ80_u8MV%hv5atj4S04nIjRVy>;P|^#e+;si7Aps)JfR}-rTU!BrxYi(+<#?;le%) zAj%2E)yty{^6NZtej&dSn&!-zV~l^Q$Rw+CmzXBFt^Gl?_Dn%xj%AlokrY|MRlHLH zNorTFf~0cWg;O*(0Wo&oL$Z@d;*tKX@@FcmwvTqA4<>zs^n7RBdDmUWW+7r$ZBP-M zd2cbw=XbhTIG23R57w~I%X%wkLWD@+>Q}b1p0(Qdsmc$D?1cDy34+YfJ!C zqFeRaRR>T;z^gAgkNy5);korUVq8^5S3Bp5s|XYxE2J^xPUF&H=Z(cH)(kkNP;UC? z`Z0Kkn^LK^atYZ&ZDk;mVKbZvqLN(V!UK5tiF*j~tBL%F2F?2m>0TN@i6W9xz;+8s zBoPbw<>!~A(T4X1|Gz1x5pG)^iRCMnnMgNVE#0Ea0nLm{QM_k01iAlvoh~J)fGJjBUo428zk{UMmld|NQ2b8}l_1yqz3F zW=UBp%i-;iGcDH6ueY*;DfCEj5@}9NaNeNJ81ADA^jg;6|*6_qImzCI#`*T zCJ>D0)jBx2Am7P@JutG2=&zaxMhd9zjivX$_S$Rs?YG|yCF$3#BW?@Z0^eK^&I zX|+kMC_5|MQWb1eY*Af)qzjs&Ff~P*>P}uozvD&_=glHVQhdL<_J}h|Pgicc;u_TP zH&EPOVqLsF>dHWhwOA|O$J1iAc(NbBAb%Z(~U#5DKfST+?j#l5Ql<&BUkpqzLe zDy^mjCF$(?-mbv=D0)$ePvXY%YDgN9QB3K`N*g}!yz`)11#)9bvK1ja7Dxi#y*m*t zT~cuHho>=rN2xl+SNZ$}nn%@zyuFh}fMh?hH*qsJI`R+it1zftnNCQ_DmKp|RZWFK z$YZJpUwrX}snf1tg0{`0@O1A&M5iyTIVY;#a1Q&Gs_0Ip$R%H^K;qv2&9WloR4k(l z#a&s;O%e?!=Y%YR268OmIQDYf6KRE4kH3#caC~9>fyQS8Zd@}~B5JKkSh|OZ3h!$S zQ+#WHL`g(-TX7hkSl1M@majD~JrymPFkymevZ4eN8UJMXlYuFm$bWNhKlJk4hEJ9k z;*+%`aFmV(@_j3UP#K6SizdP>n}AA=sV;%y5}USLwehGWg8B zH=|436ZYjsW@@YcN11T<%(jrSU|F0){x%<+!Z9ZOxhfa(r=xA$W2_7=Bx@*3?@R2YKkBhj9Dtw;LOfBtoT{D#kpN z#^CGwhG1CWR(!lT3!f7CrRytQyB85bwhJMIV&A3SC~RAxxDAQO&o8xtxW0`g*Q82N zD>3qXMlTW~1v1I@AR_R49Q#O8R9Afq5dsw_oib&LsZJ!M5fQMJ)Di(uFpZ4g^XAOL zij}LuVIL-xNrjTyb~cIF)l_RF0VwkFgdx8sm113%M;Kz$-LZFnnyE9Xs@lpt<#JRF zL>XUr;RTb>AtQn|z&QuLWQZ77w~ir?2s3dR@HID$Hk#UFOO#dchr};=0v3=mf4tsG z6@G;a-h#Sq43AplsFj%$Zj#;Pct336FgV5=+Ve*o?+M)`#~LTcvZtgW{#esSsZgq+Ixk(`yD2UYjl-9V((zw%a_Ra0&?nzp!TnZf(*H*wO$1AOJ~3K~%9DOJh^7YsxQIl-CMA?T-7fD-#}GkP>*0T3!_kXqF8$9RS+aN1up_Zs z1`(w}$^fG7Iis3c`XJ}6MvzJYFjvjEbI)51!6B`7_Sa{V(Q5S2kbSF<11{6Y+UQaRc0!I0)ZP`O9!RA-}BT()(pa z7UEBuG|8xg!9@OXy<%{8+fwZ5Spk)Oy>8EH!~28xbTzP#!i z$QW8{1i&_t+$WM8TL+e~40;wW&D-(++?@wtRpt5rpX{)buvZ`nVQ&OP*&yz1-CFCc z*4F*2qqd4wTRUuPwXW7d>#SRGfC{qrM)pY91i}p2)p^$S z$ZMYI*1OH4p1E(T#?b77rWk2LQUn0mS==AEeP}g>AqM@3zn#VTs54dbfzIaig}S{41(incgaD-LLDX^?gI6_|tIe+o51qQjtFw>Di0&U6rYqFbhAFu> z>5cpIBkY#VBW>cOuN>#YcZ`ppiavB_CZC^#^Uugelu@M}f`Q zrVXh1ZlJk7Bf-nd5A?pGwMOg}09%d=Z}#5S?K7KJps*Qh8kKLSw@kOwLiTB&gxD4l zr6ajTE|3SJ7OGfj(s)618o^Lina`Vxxw-vRd@k>d$N#xV28h(c2KK^~&9+MQIw9V) zTF0R2LqG%oU1#muwJw>1AD%w$G#isWMIlXF{qr3Cs)?ZP{T)-axl=u#b`Md1QdRM9 z(|s3%9i3(#pX2FzzZv3{rNSi?3?O2@yVjGk5b?3HR<+Ss7hFyNb@ee4))!=m0O6uc z6QM*m#xh>t+`phvOWRq{)UKZwXVd3>>m)u9p3OtVCx&10>CyXX1VfbH$R2I&<{pP_ zK*VOt)Pl_2t~HiH4`Q37dm;i47h_fHQhE(w90UpBCL~hvxDkNTgDCzxRQtbWG>_sB zG$xoBTZr*t=%a%)HVt}2W=dL#4RQ}xaM@%2Xn$w}dwYG1eKKX9vsK{QJnO8poc+Q- zc|ZgJ-JhE68#ZikV&CZlyI4Y`2!O(XD+Emn6Y`i4`>PaDL`@uA9ubgeGV~!rrKv_s zBh3%idt4Cr-EW6Ucj{a$2^1q~h1c*u)VZjHiys&9p5zqgvaJHCF|_#}0)HVLy9wla z{&j2NmCK=mVCVu-AY8F*vg16CGPlyKgKg|_hyCKkuWib#Z=9hEga`SF@Z#2I01c`tpnzrJ_z>SN|qdp-|hOckZ+uMYNhg?w>QuS}T=_X4|Oe`}j zZM*7$+~H3?`Na81Pde!&JGEe;=1ME*}VdV1RfgB9U6vKaZ<+}apgXY13- zODG|(e4sYS_d2`2yOUfs7}J zW9Sq#DaGr=OY|EVfzDVI#5rp1P!>eUzoy@V_TU?HT$NrVKZ0Oz^WonI`7!jp_~MHt zsl6T4f%dwAO>A6?-4>ZIwym|*f6JCsMvx7LKe`Ly0SIW0H4b#?|4O1`eyEZ|^dW?j z_w_bEx^$(WJq`0AuE0sQ89I{rtS=CCT9lJu&#h=+n^U*CMksh|sLE76#JO4mKw!kG zRjZukAH%`Potj$jSlwY>CEQNi>xHW8Ir{CxHViKpnO^#Me@(aZxNBg~2a%t?Jf zTzmVz+a30+SHCH#;M<}_3w!Xv2VJ-~1z!kwf%Cuo^2?48Kpd{UE*Qv!RCw4D2^{Mvhm9`(Fa2GQr2c_rOjh-l!Wrx)R!Q^iF5eF1XSCxRU{Y8jO^ zR*KM2Djn5D-nM#!yry03o1$U1WRbx;^o z*@Ehf1lkZ)1y#hY;{3hkuUz`QHVVi~3Mz#gDC6}OND7UqYN7QVMOFZehu8uthdz{)wz{`XQ6I}Q=fiHLfZo2MjyQOc4wNy*95(l`(kBtX| zF1PaeCeJwg!__MJOY4W;|I%_Vj)S8J)g@K>s}wIf@UM&IMx5@|Bit|BiQ5}h?GH|J zJU}-}{6d#F4N2pn5;eA^D)(+(jZ4?hZX9pnt-HDU3#=njI}wZ(LA3+`{hxGSpj+o; z8{SFhEV*5)FR{NynZ`Mi=N|O`A0RccgJ0sETraqn@{YR1ls5(T= zLexrnBK~%+2&kBht7FJH>Kk-VRG`9UffS1!pk6>5Dk5X2wGBV$a&!pHq83AC0Gd<@ z`2I2e;X>%yBE;HhHzVA1zbW#W%uJ9UhB^oxz=iv(8CZQ zG#0;ieGsCIyij{^Ntk{3-G^>0h>S#c-g@h;j>}W;f!O}v{qA=qMLsF?@!(lWmb7Vt z#H!*+b-ylt5~33NN&wGG66Z0}Hq@NM(Mf|vTB9*45+3%LO$T(05F6y)eZ-5(qtqC2 z0C3b>LI4q*j#GG!xe#puoBWtAq)^3wTlioi1Y+Hp)12B zw~1kF6fvY23WO1UmIO>TBc6})-hzrJtad*Q$vtE(^0rE4kGEyZS2!0wMOmoDSRSe*09b+X z_p%YtB?cyo9j_I3R|Z-zb-J>h(&bnP7S3_+%8sw#bCBIh4f>8eeh|1y0-)oV8LlFTjDr#+EEyW|W)f5i|k7 z?SK!K29^5K_jApw3G=t6QFQGg&f6>HdB z)3q`Fw7^>oxCh^1ZAbsF>7w|X7B0@;0M`bYIWKVqEIfX2xL=CsC84b7wX_0bv%|&U ze00|xA;Q&EbLCoLakAq8xoRu+@Xm4e=GU`J8f9J~ot_{c3Pt!Sv55V&?FRY#c1f^@ zPbsvKk;^RPNb!wVGgde_HkK!biKDlZbSA{uRE!uH3S%O?ybO$IxckV1z?D|j+TgOq zuGC4tIk%J6ScKr6wO$tGgzvq2hQHAIBUK@V9#4RAA@x!~Wxe+Ceyw>Ut#MWNQzzro z@-%B$V53@R+851YT&5-&yoB$Q%~%?=43$G#TAE9BWCOH{&bO#EVN*404^l{QaFgH= zt@6{C`3A!udjC`Ng*@6M=;=`MhEUKTfNQ!ISNaXL)-kT(mZ9yE|9KFnbBA(Is1QgK z5GXtx5EsNe^w`$gv{&{Bam^=|q!rog+K6zv1KI!(3g!bSesO;zwID81m*BYR{<`L2 zMTb4TceK6s)qJNPQppMA2iY|_MR(7Gf}P=wRf?+I>Rsc05&N?f zy?s={&+F_Xh!aUg>^Y)bu?rk`&>V(k?63h*4Q)ifWcz6PGJ^n+1a!d#7dYdfKc*@P z0LH(=hYvdr&`y-Z4leh9SM6)Sx(_R_0n=#m(OI5o%*heyF(SIScp+a+p|ci*M;Yv^ z?qtQgk!VF?8CXd4*UvV2;wA+~gx4joMt{vs3v>SNboqar`?BQQ%Ksq21)~>|OPvQJ z>7KH}8{5nKhTAJ&uW->}xbn_C^Gs*)$L9~Q=FdFyjH~kOih9Jix9d-BV^_9X7Bupg zzH{~i-Wtl9l|X>VUUGazf9M?8jfgctMfj&^)R&vRdVfd&XC(?5iuYJWKd3MQ>7~jbI?uc^|4I0Eqt>0ApjCSfAv!l4HO1 ze^==%a}9;3+Nv)iS9mZ7>FWCqd&Znc=BR?QI4eN?xnB+vVrW5+nL7rv$rzI!dxVrU z6~(JCWs8?KyhERr2UH`ZBVr|T6p^%D_Y8no9fdd@TQ{|)xjQZ5@J{EEU?ZU3ERZP7 z+$@xoaQ!4jKk8nu>fv$4pa_+Bx$2*FPq~q?_IB1NdvVGtw;34w*=L{a%6G-bi`oj- zty|}6J-qYIJMNxn>~X{BB)chor9~>lw+z**{;Cxp5zKm2e1-}?B~$R6Brn&5s6!$N zQUCBPVI(dwJk-(k{Xt=8!uU5&dwHcKTBJZ{Z}JZ~Ua#6dTK zqkbrBIKA!Ali`A0h5V17DqTH6KdR%!Dl;r03E``>Ya%z{JBgBrapi$%$c`O5x}pk1 z!eJXUpuYH?xwYgG8E zG12hy1xdLCqOfq~0XHbE&&a1HvWnyisv(mijkg5j8J%zV8{g~X$zLl4bFEDoKGN>H zCnLo2Pn2g~WPcguiK~=~rc@c;4x-!;7l*Xhm22_73&NspZkr$5pFjBCjhFkP zS?7~aK50FANbC?m=%0W7c~|R!z%PnLTso?+-PtYGTIX)_*1{cm;y;m@M~%T#+bSq* zvj}>M=Vl}uk$elR^cWqH3?K$Xsg}6MnRkEgOCzoSSpc`s&j?}0F0?|#K2UWqfKvy5 zi1uPke!BID++oe*VrWajEd?E8rm`Y(tTYMr30?s(S~%N->u<-9ekQx=qIM z)xr9H_t|gXUhWEaa4ddcI6vY)K!g~`kIsMKzya6Q=gMQz2~Hw8@na!pN1B z&_N38vO&!TTTRmMhI^4)pKkE{;!s~gHqTA=(smnal8O3)Am9(DY2ssZJ;Fic z*s1axGl6wBgIaWqeUHsi@Q?@(MS`Y}JmN&NW7Keo}M zN4vvlBmr`vA|O4X3SbZL3ou&q&SqmDkXu0)J+jY9MFauip2S#$r(vz;fl}DV3PrK; zcJEtD?TarbyHmm03GqGWoO4`U2L%2f|M-V1=>_s*@Vn~#)9v|t&p0q5%O<~bWL##kRRxl*v?-1*K0O>RdL zy>?||s>9D&zsV_{)gR=Cvr`!6!69BeeyHx{WFagDIZA$$i3!2wSafud-S32q$c`F{ z0hnMd)KrKBk)`Ax5UVn2vnL%4);Y&@@ai4Xw1wCNfO9|ukRaMZ%!~Jz`?5ZsGSjVT z{w8Y~+fW2R_oad^BneeX0Pz1qB@lfZlc!4M%3wf~z$R|aMlKEdyaY=9P2G1IK+vk` zd(oOjX(9lvOO6ca4|h5}@mlKCPPcQP6@N%T4|({{E%5?;9Ov)QLjB?1uo0uiRC_JL zX1jOq?ouq7$e@6_SSMYhz=3~iPPaKiNstl*0Kk3326Y6$`zWaAeEAw5**e_bow3vr zaO@a2-E@=rX}ySl&p!LCE9!wUs9o#kc7=BGt=;!n@_vaz2PKC54*^I`q8E}J0c3Do z61^S}@;f(jG4g?&B^+6QCulEV6oljJe;ELQd0;$yU zXbIuWqeT#~A)qE8*^wDp@2Zq~6~<(zTFXX_o%BZyNAQ~fOfQLWu9iS0=V5_}&;wz3CG-+XjSCVAkCm5T z8|t)CbC1tBjs=|~L?aW8#ZPV>YcIb1N)sYTJ@*ZI#5N^k*w0b@6pqAi`qN3%^i+1=7^5d-nDkT7j z2ONaKD=SB<)UbK*1R#hz#Sqgi&a)59lo(8FB~oVlx6w(2v_62qAT*SCyCxUCdA^W& znHGZNAF|9K2>wO_t1!w?tp$TlTTyE^3)CEFEf2?Ik3C`|$DQqc5a2VBbC+L!xr>@3 zQ?7si{*GW01XL}+7P_6Ou)^m>k))exgJEq(lm+?OWI=&8YerZjn{Z%=J^$@`gUh3y zPymuTepK_pp!>=zuaqEv`!=oYN(JBF+IgoXhim6%>*B#)H>g2+2XhG!mq05xHfzjU z;C(@KM|UPK0DnGzGcV-DZe)`j&Iz1Yr8nFNb(3JKVRCr1jwUu^7n?5oK&TuX$e?y>;W{C&{ z47&Nehz9ma<`DbGjGab64?uTYI``o3rIZ(zeyaFloJ1|SU`QvsIeEK~UlYwm_5XMP z5*kKcf^^8><2{5AX#lR@P_^P)H&7?x_z=6kXOXM%h(zGVr+Xz~Y>CuEii~g`q&SSo zG~u}OBr%XSI#$QjIcUBh1`sXwm@9jx_b}GeJIcT;semA)e~CyDk1)Kw7lS~20`>yj zk9fu$_;b%IV~-K8#pu8o>4pu(6*F|h8CoZ)jLtrz>jVcOmJ{9D4&)1u1xSW|=i^EV z06H$lBgBOz%a(iOF1V`(eYB(En!JCAS|Y~3x7PF7LRDFG3VkdTRrTkqgN~!&1Vtv$ z=Rj~iBOY54k4G6exOif-wOL-!t-xi0u1WEB`A>dkjpFp<8UVI{v17;9;FtPIh;~i$ zB(szmZq5CBa#f0hSm4}{DEp#tl>KF9n)x~V#4XUfk^1kbCm(+Jp-b+enh%8i{GmPV zc5(i0q1sT#3HiA{L}iM-P}rlSS7WK!g9seTQ6N=Lh_dNIwALZ^^L~YPRdksQ0M}Y3izRJAby~z_bpb?_9RQm2)7;S8J50zh2SOqmFDi7n%T8VlXU=Zs8s68%1C~7|;Kb3&n$bjgSET|`o!J`<-^;Zd?E)e1i zh}qcbXP;xe2WZ0U1HvVqG!p?R9&fQqR-zjRG9+3)f7AGU`_tqdu5JUrp_?u3xsgr? z?D3I5B_+in|9K<&+Z|nZTd&Z~9y{gw#{r0Tq~zB#;@ogYA5c}`NQk6(ozm0Oo!SX2 zUAZ^J9-R}SgsdXFMnr(Mqm?)H6p)xmAHK7{S3{r)1fTUk5kPZF)0^(%D~}BovWuxr zO7Y@62#}**05LG6NT1)y>yXt{Vdb%>-eh4TZnr~`?d_{CC)(R@zF|w3EVjMr`>jw? zBQYhzI<>Y7+JxGO@U>3r4d`}Nx_w95e#<}v0BhEi@V-se|~3~ z&7M8m9Zttr8n+_;6NyNm5*>R9^<_QJ9x=%7?0LZY7s+xa+m0hX)n4e>58(d3*d*0U z$XgouVKT%`^zGZ%#atk5u3x|2-4CVc@IoOq_^rE93y~ZM)}hnTFNFM9-Cg9Qu5rSF zrWi5*G$A>AmyXCpDNai9>`(;CVZZ9tJjA;7Pqs^2oMZ8YarW-3FF9Kc$#~e{d;qaP zPQO^aa=)z>5uMs8(XQzlZ`XF*XUPpSO#z>kuch`$p$t8O^8gB*jgY5<&b_6%y-C8>0`j2O-uQ!4qpP2xy zF=&w>dBj}p_@&py`x0o3Vt?;`!uKF@_0Cerz)y_EM3`Za-&qvGh zjhj;JZ|SkNVQ(Y5y}RrrEwd`02XT}FF`De6a3>LB5Jvy^?Nn6~0K`ecV96p{y6uQ9 zA3fUohQ3p`qLwBM7Yv0m@Q*WpAij#&cyEG0dM40;km}h*o+`n60(oL$W1Nk{JD|Rv z)n8t?hRs9~e2i{uj5|OwU(s`-ki`5^PK7G2g0Z`5j(R$42QTEWd zb~b3w`xcs?ecX`W4Mq$2oe1ypecY5VLBO8EcuFA>BoiMnI-?Q{88XDxpd^?I&xK#r z7GoP-h8`L$pSzHs;GN?|$ow(Z_?5A0?_#VTB|?C`YFPUao05@WsgYeQTts@_yg9Z~ z1e@$q5OnO=v3AEDci3p*9U?n!TvB>pfBkivHEWiAxFXXIW<=SqB?%3YI)U_f)O<*F zD2!~ZnOC<%5q`fgC>}ocjk(B}V}RARB~59@wvs-G4z}JNeL87M3d(%tkzpfS-S9en&f?>cc*eQ36Hoowe)HH9)XHgqcv#Q#3pUXvVVLZiK{;0<;1&;tQRMI|Icrpw=Rk!0P)oo=&-KUn3&dyuv6U*w4>!A>IiT_ z!r{qHs1Dfhq+Rl-M&jTdw8bjZ>Ihp;l?mtbYyf*9`yzVIkr7@ zqy2Zimx#hR=$uSt-10Vn0(lJPx46`PGjWT3{>2w={BTA}c>nz8KX+6e>p88u-+%vo zXH9S4zMb9jqj7d|^a2apyXN>KKg6bW4@>KKw(Z<|$VnsIBW_5dD1ARPpH&7)NlA_i z!u1-c0}N|Nz|aXL$yGM^>OPnK$GVKO)tk22E3$W>uECga;gVfS(GHNkGN3-i%{Sj{ zWk)ky zRD#_DLRA{_!lGpN_- zsI8)aNKwZdr0*8>JjeEhwbYmnm0TUdMHHpK0ZYE9;19%AJO#KkV`crrQ0kI*>f?SY z7~e5{6xqOXVmsNqIkQ}gbACM{0@a24;@ zq;1@~%Xx-St^8sjoTpL(fZ+w?rx7F@EHN?Bu03bC4QMYb#)-NB!f!%_LH_%uNne)V zpRmo}oZ?xIJ2s7Q69*;a{>XT&7m)bBW8D&a`7_nzFP=*hNAL+de>PN1P$UD++>n#( z@p&Q6;KyfvS})msNN2dps69Z8KUJLJtY?lLuE3alYo0POC{GFJuQdQ!V>(&dzWquu z@T{DS7v#t4A1JWVqhuHi(LbgI?th|gzd-NF9Tys5*`bZ(qFwExGckT5@?-HYEuvR- zP6#9_6)F-Li+-$3>EDEi&>RVE>|%Lv4Wl*^;O9ey1b~2yzy9^F&f3TZ!xi!C%LdxL zJ@;FvBG-<;F6j@qidT?d;vu#6?wjtpo?0rV0OY6Np!S~iQlYkRiB%8)Qesn5QmQy% z-F=mplVz{I_?%5stb-3@Wf`V!T?y!ZzR2or56ud7IzOMoA#nA?UNe>p`xe0Sf- zp+oHMAyL+8+xzv4DH?xXwye|#4=Dgein{=0CXE_bRG<(dA9i8ZVav>hy?Jgw-(?!; zIZnvqWRZ`^*=POw4{)Wrk#bILDe){u53xfk@&GBrGK9v8f`m6JJ`;Bha6$S zo>zMQ!%H9R|Bc9xs{xA9F}|HWeSSMTFZxSm+;|J=A9o_X=8N+a==0<}&rn1LSO;m5^#T8V<28H!zu%N_GE|fsHBMJD8}_F0ew8!O9@V`p zS|kgmfFPgoC&YoKIXEs zP&e<8tX_Wc1$+26<6R3iu0r4s#VbZ96kk&$`P-tQ_SpQ0k|LgP2V8p>U35_i@>ACh zvHzowK5|CCPKgP2{op1x*5+E6^1uCiuA4gv;H+Ach>cS$=17Vp6%XNwYQr9o6{ztw zKg;&dnqbT4O?MY0n1&KxEo3aM_xlTA3aUIL>wtx<`qY{z=p!k)vqOFoxj^bb;h^$7 zR8H+(#91%C_+tA>BVm;c zRwpDN|LF0$IRB$_yf9PJejgR*zrIhgKfM&QiH{Ap-aWdN+zOpPZ0E6SxD!ctF zxo=W;rMpX#>PkICxW9A#i5PqrG1h)Pv(VbvS@C$MQ{GzW~fg*!VLBt(uAw46>!wKPs9)MvXu}0wep(3vm@Dg3i3&F z#bg5|05C8J#?&d_xcMbizB$^1FZBs84urMgrn%mwim*Z@j{_{|T%3Ez0* z4YxoTo9XqiD&=a2s2l_LdZWm`V4#I+aorAzC>pM zG4lLw?AWpHJx^Hq36q8UbFQR>c)Maqyj`E5O0R`!68%dKt=~U%e{@uuv|_K)n-y`U z^+I>wy=}AYdGk&oxeS3VC8EV@Lmt|t8eC#D`%=YhM8KlO;)`-^#>zeR$LU^XC~G^i zy=n!t(``xJ`~LzCXuamXYyX@o+c2lR_ z)}cu88FU}5Z_vGwcKyKy^?q0?W31@i$aY1p{vJg<@V?BLm2SPXX3b*0R@0eC1*z%> z*ab`S!dpAV6Et zbmOY43cyw32Ht!74Y%(pIznEAo&M((d)0j-cSL`LkR)E zAoj^8pE!Mz&38qUZJ0r*?#;cD1e$-Vt z?IXR~^HRucd&djy`Nc6ddCJ>P2SiMJ`st@#rkt;@LGfRG^;MVZi~F)=3l;S^rHfsk zoMy?k#Y-uy$FC`9*4FCP zJl8!a-hxC#rsftAhWQc*rf(JT5WU2Jn{;QsAmI4;V0@N@lck=MH=Nu?H=6dz$r?O@^t! zZmbCHr|vx0U3Z-`9+x)$`9pC8fXzw558M#f!Ubbbv2KyVE_!{RU_dzNLT#=GW{7z1 z@iy5RiCzfpx2cjKbG#-b6%Jdam7>y?+qtKlW_y4A8~gRc57{AQo8c8e6~O=czyl8i z<%;pI169VzM>;DJc{B~dFVE)yYfUB_#Vvk2wAkXWjKKW~=h#a-d)ll2{(}qOMG67= zvG)5wMjSyte2$nHCqM4RqXyWm-PHA^K&(~-ry@e_uB<0s-NXO8_?0oa`gcOUngF*( zJrSzdKnXoTHa?(gy~6rQnHdyrzd&R{M`40`!3VD#feh+pK|CavK{6ZY(nY zI3M^!?T5>|dAdKx@7H-LpH`QkA-KeuLPQa*ngVGhp%myZzNs3r3nMM1pqYg8>!xX*Ia$2;vY0Q4s>liCx!WTWXF2@<1g>F zZ)eQ2RwA6&X+CZ&+rr(-1{3nbCD^>fr5FBDqBI=j-`}gd@Mf=Nbb0;1WKe3% z5wrR|`|-K|u+&>_wHKa$&P4=r@ASqaOcIJoutY@^v*bLb{@}M%+o2%{T$=cT62#XS z+1z9_-Xd;zYk!|Wh1h|(UiRvtLH6grJmrv|Fii;1WtUy%&dxayneoaX_WNbWE<0yx7!rj1g$bs|`XI`>q7p-v*P^9MxBi4^1SBl-#47PnfmVnUFf_?rh_36QTU z08uHnN`A%6?OvMo^ldW23PBTepT891|5Qd;s^YkH(DA5c*gUA93$d6ZB0w!aG9h;h z>9G%RS*1L<(r{#+->h@6zLaj~J~kdys(2j|fLx*a?t&QkQTo`nkaiXluAUenyKHdL za%&^|it_3zpBCwtDfw;f*Qvd&QB0iO*tF0_MTh`s4XOpr<;d3Ac7f*S`K8(R+*6NQ zj|Tf~@Q_n1T(%HXL64$?+wIWCh4!}zAKSmDZg=x^ac5OSl2k7but-#>tuIWl3EPtG zrFY(Q`;T<~pZ)A-F8i{wF@&?p2#WdcyYJjFLx-Mf-QzZE#O4O0@nyC#lG8=;gKja)Z&l6sa&M zMOL2voMhddrpZhQL6SuD$FcyQAk}>$+!&R-MgJe0#<7 zPB0YJX(=nHB7_?;idR%!)$wp2iq&Y!B^u$~|_wH^(BFG(f+HNYplDg*3D|Sqb)^v`)5>p!&j{)<7J%X^YmjuFVr=mU42?o7go@J&t||ye{9V3$ zx$73fCLGwlfoj!jr)cv81uO~={giOrNG+Os?{CncPFC(S@T+byoh#wChEcPq407$cy0aiIJ8YM*lW zXJtA20O!8sl1uFV`|mFa(_|d)zWc6IO|Z`pLVNAym)I``6k76D-DIwIgznn`H!lF8 zKHntc=ti%0BGq@R1Gw)79YmQbigq9k+}_vYEaa~H0ODh8Me_PG#naKT@*|Ry!*FGH zuhUa&>FN&ru@%29dC`6#-MO2LdfjxbJna`G7Q$G$4J43~<}sW@4|IPdybsq)B@mMM zo4(|n$N0yQ&?fe7#sGV9agIWBXW5Yq1=qk)1W1Hw15dWh-s9}1h%YU^KoqYcC=9Wz zo|jli#6k;~s9qEy`Mk0@sPOkH=hoJn`?MowAE!t{l5|A*JBr)RmBfUUg$jH|qE|2n z{oh?fb2D{kw7oTRgY);3LQJ9Uru%4k?B$KTQeDJKA9$U5fsCPzd zD|9%@Amg^_-@14R!AwT!QENl&&_)|STmJs>m)HA833t^7`7ti)E}?BQ7pLR2x5jyi4xjJp=~BByK}o zv*>SEj_GT6^f;gp->G7UV)6cb>b{xpuT#C^lao@)nr`&9MMp)7n?+f)YH2l;s2Uxb zufiY-AC)+eu1&UEw2Ra6Sglk4T62xGaH|Lbn~x4UAU>iyB0q=^661P8N2iiATpdnT zGA{jDB@|x}DFhoqnJ6~@-il9v2LK|lT>A^@?~<NNd_>lwB9{xy2P7sNl*4s@tdX+p;6&B4&k0i4jPo2}lIc zVY+8rrFe%Zc~AWc>O_>T6+ylTV*gzOBxSYHZ=g|{zktqE+7Rvdgb3gk3g}`Rb(a!$*8SC7CgFW?= z%dBVTM0@9hk8Pzkf?tarwSY&}5N-{lLTqe@Li;!*ZBsZNl94XW^-}p|5hsOn1D#chq`ZE%hzo5Sx>o^DgxQgEf{8H8L^c~^9 zy+j1&?(m2lT#<1FOl&F{2+3CSt*5=cK2ojR7dzy~4uiXlOgp6GRjXFHA{|Q?&$p&A zqpf#RFB@AhtAaDC%2d`iYtp!Z>>8OOpdpsupp}JZZx4K&x>wws^bt_nimM$+>3g<$ zbM2?0VsPha-dpRt64g)AV|F8rRd$CyeVRF`HBjW|Cc+8*CF~b>Q-|m*i;ofpd(scz zR|%ORjqLB=H?V)qJ*3SSVae@V*o6rVtXsq$o4x62ie;br&?-Cihe6{>_9u;38}o%U?QR{wn-z^cn`4wv4?C-y8`*U3tSZ= zw=v5T9*uWRt8?v^$y`0frhN6O{b^c;&6E8X)!@nbUU@R~bksWZ(K8dh2izZh-A#!*R* z0mev4%Q&P=M*xoTN_)cF+BfO#ZP}WY68jIkIqK7=k1JS$+K0r4^oLs)NsRLNGvm73 zScp$~2raVM9W!OO2$fn_V0#Z|+mWc&78{`f7Z*b*|C0*eYc44ZcXp!ouedzD3|TKe zHAV1PnsTt&*}Ho8#%F=!dk8`l%3~^SGv> zr6-}(iD~6b!N~uc=Cv97?J#fSRLL#0v25EKi&P}qDa{kqSti2H9hGj&lL{xexKExu$ufxltOrby z`i0cS1V>Ut1iowDNbS^OtV=^pPU&mQQXh3-y>)5X$d+za1J?Azwy&s-#YStgax=VDCWWQ{!e03m_ z^xmE%dwzbps*U8>aCr_+(T0nPina_P$!d$UHu0^jd-A8Ya?d9FXuapsfkRgdx^cvQ zHaG2+;5-D+5aIXG$%-6>>lAPJiq1trP4uXbCAQK!YHYm3rY<_Nf{82hd&Z_TT?j#A zZI0pEY(rx`t2u73kPtobKkSg>ve6;=azkoxI@X<=^YbVV8vB86SK9NdTiLrGzT%8D z`1(P9a=!sK8^u0+&JVXfYvd5ScTleN&C!kE|MbtT>(P3OCaPG)85= z6&GU1yZP1h87P0DEq!XUGHj5%uBv82tjJ_!N!2NgI}yQ~&y2;w-wc5V2Zd ze7c@HRtuoDw}x6jve1w^&~=-H=UJmr8H&&=SR{y1Ws9ZrWp=&DUfbK-UU=o-j*B3U zgZwlWWpgqAlO|1adH#46Sch?=hui&QTiAfyc|v~a68`yhKI-bD;(!DoKL#u6H9$OY z`w&JNH1g{f94Ig;B6+l3_QMGD}$>mot7Jod&KRX^TsDHQyn@C!t zw<88;JQFpg00%>2v_~n+p6d{Xd%%;!dXxr`3F(;Hgy_~;^0Q9-KEqZ^4JmVN?E?&% zedA*#c{NiZltZ>@_hD&}`a*M9XQ1&>>=Oed>HB`fX`t5&#NehWp6YopG>4O~FsN@*53nhSJQ zM0)0>^aErk@DSfJZM*r71`srVpr{8(80f~sBS4o};sJ1reY-`-!e$8;{LNm`YXIlU zZ-27AerT{g`KP}+%8ZB(@*|>y=!linUce4Oy?2oL>@&}>-(1|=2JipGLeL$(<#C$` z<1(%=Br4{LB9F9i8$W)$s}{@oYXhRXj^k}>GXWKKLmg^DG%TXbBleTRjbyvO)Y=F-!G&qy{9x! zL=7g#=E?&Ws$Q0PwrNj>5}|ZZAk3%yMFV}WJ&+p~X=&*P9pPu3!7zYuL>_(s<;w{X z0ZpZr=wYo}HaF@k5XMdTHYya-S!rNiFbwk8u_x4a<>|sjS_lsF z=SA@)F-O*0i+nXX5l7x}C|?nmMJ9SscRN@Lr+_8%UWvbL6RZ@5KXc;Ep$>HykKC0L@YAelNUVHI0**icdJRO#&>7u4UL1d!TN@0G<=3d{GuH06NOgD} zMzmKD)n?BV@ZDA~4!$W2BFMqT6&+M~?`}KLsGE~y!GTSiWcS#((dqmcP)qM?_A>S| z9wDmITo|n~+uHd~vUvrKoMHA*ZkQOW28Q%nR}j&_4i?4O_Ox{CJFu&B zUpl-C@Oq&hmsYxi27kz!SW%=DtrF}kdzMVq7hiB7*0$`+wD@*y+{UZwVyp>C6f7Pw z;G?vk{LC-Da}S;bAUt}uZz#m=)3dqvU5%b~-bUImbZBMMP$2ZF`JS{-0AW<__4pYd1a1#0@<`# zbBk*(i)4Awo(rd)H&K9s5UoA-+q#4Twfsss6r~Vv&tu{5u|TgGj_U)l1`Fc;ED-^9 zaFGq|D98zkwyz`3vS}(nXgO<~dxXtfno5@akvM-&wi1|f-NqqbnPMF?wtIE@(P80a zh;~GSHPYe|R!WizNg}wNdP4we!u|b$=(nAOb5sagFZF`{avvm`UEMG>f4V~;)N#7c$*havEX`T!7z;e9*VT?2D%Sl%=X*(s&Af^nhiPS?CK zF91O**Is+A3-$CjsrOCIp4r^Aox%voCMOKq-$(=)A=hHU(K!>{IA$6 zFcJdHW(xV~_Dpml`=o)GN3df{EL4bfQMw(F*9roF0hQn@!o0x?N|^h|k96P%%ysD^ zsR7qW?jkr`S!mtcikcjht9Os~y^40~QASEAd-Sor6Jb7F6sE!{DHbUYobSR6=A_|J zcWxFAuwSi3_GE;aVq3~gW`S(p>%%&^sHyDC@7(zz8i@auL8t;w^3pb1uA-vYGjR8| zB952q;XXig;tQ@-`oU))J)e~puk^M?Ac8V9QITt%R5WzC7dUffg7jxuwcYh=bkYib zq^a22O6{EH#;Qo?hYq<%j~?xiKPf56{Q%^8{PD+Kq#qk=M8D4Vb4e(p8mC&Ah-F3N zfxE4f_)qc;UJZUnjlgl^#<{?i3Puw2M;Iham+NM;L!clGx}ZfV#I#8R4J0)0*a&ja zBRl#Bcx6ah`b3DYVna4{s~7!Asjy%n$097pU}D%2Ja->!MSCuSfQZ$A*y36v(Tl8E z41qnmcT+g^mZLAHJzE&vQoZ<8jbHOd2sT8%uAneX{Q|AEE#0)&5wL*+2Rd6)FxS)C zhZ`-J&`GHnx&G8u_wAqHI-Icc<4B6uU{dK_2BL015osDB;#NC&iYoU8wy0 zJVSItq<3MtnrsIkIKcbzh|YKAKjYY%fbNCFMq=I($4D!MlT?IkH95Wejjpk~<9YVG zWi9RV&);?*QGX5VK2~~wY(7Nnciwr&ZLU!#_p{qozI$Bsa*HH6sgnC85{!88jR)Lm zN){SDy|%z-0uUB@3}6qUEE$`Z@7i}vvJO3jd0F#n>ykA-4{Jv}0PVK%EUnUmIt1)5 z)RbTV*O{01@BIoD03<>hLQ;cZ6A6gH7L|y#WL;avHL}*ZyF?tzT}|&ZGqNmS&0H`t zHjxe*MIcaFdv3WO)%l9!vd!}*+8h;gB-0DAZJ5NiGDrvF`;YP`Y zD)Ao`<6fyD&S+E{=jR;SbcehC$o{@L(cVxVHk*YsVq*D0D1Zt+l=q_EBEH%Yrw+Dz z$91qX8mzMDJjwM)JQVZg437z2ty(UMQjTI2}z_n zvp;(GA80*>oh1>Z%unj)jpl@PBq9+H0I9LKdR>R*%C}~PV~r^~q{N;>+O^(>gV^~- zasLO*19L!?9_GEJjDyY8%DY#=YX6WQUbPp}5A2uQ6iQU6e2^$>*jQF;UQ6?G^PQe@muVW--W=Va=s0tq)Bu5oyYE ze~>>yk#RkZ{a~0b_on30gCzu)8!&1Gcg!wP?Tkz3uO5ZO^^#bT3LLV&JF@2L>iz!AECg^ z0V*$^m++!I84s6Rqaqn*%7aAmOyv}$?Ny+d28mrOia6@pVrZqVhg~K$yRpsLknX$| zjFoW)3yLKPb1DEohI?hGtdT{cApZbS3K7O)8dH>EA-YKb%7~uC27-b%7ghXG-b6d) z@VB;1rD8yS_6fl_~a z5l{TbAp7Xiqn&DmC`mdo^#$OjQ0Ygm8fs&+zp;o6vGpoA1AB&XW9cRjA0ShW@L^t$ z1<>tDb1kpFA@Wm~fCiO5u+H-qEw%4crGtnN)Wv4@uNCmCCZ~N9*>)sV;x$68`&3c@ zo`GPYd%;@kR=B}Ji}Ed1BLDZ_fA97*sqsidtSOw;4-xK{zsv^aFRA1*5ej^3=u*ie z)XX#@UkjHb<4qlaI$YRySzQ&ou)*!Cnlc4P0HAixg zvc-zVMAvUEqj>-R{S==Otq^}v73uR03o~p;-U2%-SH!!r9CPWLc@0`RsSo#h>o_3` zCC_Uc1AohHkXf_21ha+q_*$%=mCo<}WVxbhVQB@iJ$t+c!tV5nf*<2|)XpViIHo z#&bi(h;*!1r$pq;{VnXCg(?@daiwd}NGUN~ejpdzm4Y6$?b?^V*GBY7w1@kq+t@w- zv5+k7(g4Omv&U~VevDi|q;#qC&OW=^lF{DLRX>B+%a$#3h)zEQh(E~BXSgge2$QhH zXNbdD^5ksas0ob`HxuHW5TH547>MIwzV$YYn=->T5|qoF}%vfj6xBMbp>smB;6*ltqn|WBj0TR ziyi1#IZop}QrN(r+uq5xY+YzqTycdnOa^m`(#JZ180tYb8J6n3svNm5tH|i2ebh!R z%(HRL((L?>rWD^SoAAyj_KwbgOY}!wRHQ>XSX&Sc(Kg8Y#)goq6yxxQF%}jr`HpHT zR8`?bqQF#YIec)xgz}VtN91(C3!5?xI~N|In}cmd*2@W zGn{|UK_UOrcw4?=iF2P($dh`0h|pNjKmYu5*9%~~>MRWH*}?7~lxL$GZWr=vZ~@K> z1vWpESnEUgqy#%{?C4r?{XqaQcF|dg@uCXg>cR)kD+Mu71-}0JYp2@K+KZSD>Qf$f zRnDJ)@~@i5ma;2B1n40^I5|?lxt+ZI80b8sHoUL>^8Q*S)N0S)&^_DkkDqDH^JWHZ z^rRmD{I%PhF5WsO+!7+Iw(*p|rE1@6e7RB0?33{G?ERV3To4!qWRW&%3XTAfeu}Y! zgcM3)?Nxq%qHF_YvmJB^A$AMlCZathp|&3KqV+Bl;=9scZ0^bl|l17?M~Zm2luDDklK0QOtjQh3oK*TW@{Q*;G)7#mKaFH zU~_E-uDwd!;ORy3Sn2OyXq*>x*5`07h|;lwres-0E4y3BzhucGheV{{-hTV-C0rEu z8JwSJzuw6m?ADXQ?erEqo$)BpP03K#i1VWY0MOzwgL+xdu1W5FZ9Gvg0Kz|Q+BDaF z7*3BQFm~)%S4NubH=4vi93mBL-&~XykBYN11xUndW1Ll``J7>It-Q$`|$2#xueK{K@?E8cEh*j7bA7r02d+ittf z?z!h4hd7*{W}_tcKm@vUXl=I+jIs+`Z&j#?SZ5G~5uJabq;0$aK%C}yV5?k7JGHQp zyi+%fpPz_B^cc-W z$n9_2s=3`bIL@w#-y&PBZZya-u-;T6^3lDOXmPv4VpD0NmND_=M_1$b*ee)6kEEoe zGUve>PUIUvVbG-Tyyc3v0jbe>xResWR1weEP_2HD$j|xE zOZUo<=}V5JL$}P5g1df-S>jOb?r09HGay)rd!k06BwOX+hgnONi(~Cds8XF>J%|&F z06?5N$9nES>Lt*uggld~G6a#VD0B(|;QlBzhZ;+magFXzdo@qG`S+=NEKNaQ399AQ zvOwzEsu&~Drnw`}l-R+4LE$zE`3taTwZ+`O|hy1?b z1)B+(eXqa%y3?tDJf^4J)oG2j2$f7)!>ObA2Ko2C^hjr19=7l`8Cx!wrL}ezzq0wE z0}-LHxP>FMUcKUSTpOy&j<3(pF;&rg1;S4`ZE7VD6-cyTML<9p`2&An>~%7tThk4C z;JvCD^6PinYw3|4Y<*5MHJVv%eTVh3HW4!7WJnx2hJBbXBlw2UBn7fX+S^mVbxiun zC!Z`6r%};82J;y_-T_8H;+%msYu4DD=wVh6Ci&_ZZor+a+>?r=xS|#*!jA#{`?|&( z976f!H{X2I8P@1!hHgzUM#P+oke}Z;5jL)w^sZco{Cox%AT;!|^?KvT8=uwyw6V4~ z=w*LP?Pil^Ep{%khaP&U4Dw?!r)M9nyYS8bXk=fzztaY56|%3!$j?Ysb;=>0@7>^) zjY~n&y5{~|AL)u{KwJaf&#=uOCcaNLVo`O4V&6JA^+lyX%?keiIY0Fu{P=tQR8mSn)7@a!50^Hwx?Ib z+8f_2b(wx7l3};0O(-D%AQ_fn0$K973$y?fv;;wcbL7{C!((Zt zrydAJOC!YV@_o#`UmX4X(u*(J^w|rnz1#pJvtkTn}!;rcohiF+7mnBq5{h?FPP3V;`~%r!hML| zKcJQF=veMcYn0tM(H3O1v^DEDTDPQ*);D~Mh3%G(8|--*Z=@`5kuB}ph%xrm%2xKy zwC`PrHZAOlBtE5d;TBC;yt}q^Kbv zKZd?QfQB7d-iuU-^z73{*`G!!nM0x=K((0Zdenpf>}`-}FBDv8&%Wxl>%RBidtE^f z-{6PuoSb=#evIMb(}&tUz4ltyuH(# z$j;8O4Qp460PJ-ap~DlU)_r1BcUP|AnT2G`Rd)$TxTfinv_b@c#;B#GSN7b?!byyN z5Q{qps3TLyV!~F#OS_-RK)3X8oP9BOwW_$~*l8#Cw0_NGgvioB0tG}o6~HWL+}bu3 z#M|@Rd)j^PuCUolR=IL-PbiC&L?k5M+J-V`Bqy9QQ^cC1lRx*-49jTNvsSJNF~qO^ z!8(sD61z+R1K@=hUT^^^^faSQR-oXQ+9LDrslUBoT@uk=4}ueB(>5vn`) zfrcIIrKlV1_kVfLae4?+>7ISe%QxSACxcdZfdIZo?~av0 z%C}@^XfGXX(#Z;&bq?Uy$971@zFoF)@pR=bkR>PGSO&;edYs5WJ^=9`WCv1Eh6E~_ zhbVr@0l{Iki~E-d07gSf%u{a8^&kwEOP8JqNrO9L2H5)>BW?cjH8%9rQ|yeEdo5zm z^6I(2IC+tb*#&W}EVpexONs7dAMEdD_bq5;fB0yL_H3AAhP0=HG1oTd_isZ}R~FDQ z(7lNQn>Tl!Ex7J68^aA1fJrq6baO&A5yJpt+OazT#9w3S$FGif9n8%Ve(ONv%WT%( zPEXk8%4hKzoPcy%Rcfw&L3BuFlSF%~<$d<&U;oDG^!UdgeDJ}N!lxL;DBy{&pC%Ef zk2=+ERln*1S#vEkSK`gFY$gU=41}^`#G)!P09V^q)WUKj_fKl)8}pZ z-04nzrN;t6RxXF4POeycCmqn*s|kSqzfQwAMZx zY~`Ah&1yp>BOI-Q~SY4-cfpH;sUin=(x!EK1vat=Yp^B z1`th$Bp`=I_0UQS+5RDW{Fe_ogCBtw4?p~HnJTNe9VzEUto&&sPqo`eC)kke$rhFc zyQ%&XfgV9?b1L9c10Rd_esQq53Uxbc??FqF?pi01n_>IEecnEM<0V_ZQ}VKaeslwc zSo8?2&HHmFujQu%X-FgEy^?d(2$+9y7I)k^#`P*{9OsO5 zZ_U`KK(!5yX+|F2ZtHRnTdTOi78jar;rRzG_sBklQD?Xi-n=I5EvHGcJO&ABiymt0 zHgC5@%U9W&)HQPX7Rl}1)oxNZY9jpbj2#a+iU4p?3PaGEdgaQMHhJm{`+W3mc0q$V z!Ra-nM$cU1*Iu~W`w+KY=^zG(4vz`}%T7Rsj}QxwX=7{z#5{C9`r8FmJ6?esQ(9bO zzkcjVm&ilY4v13e0t?t0@V`!(B7!*VRJ-Q_6^O{1Y!Qb<)rv*U3ddiA4{>1<+=6wQ z5LeXM$@Ao1`gEfGETO9+4{KQ_Pv2yDvtPE)UVhfzTbgNE&|QszXv$M1T00sX2*RK< zl!rimSN=COcu(5>S&5$Q=gSl?B9K&YyeE{KzpSg-gC`65rT+&Lm08hH3Z=~XKmv>p>Eg`epL@$%UC`Z5iB{wUvV4#LHzrJz z{B|HYxlYwo7%*{;ST#{RR$k z^#J|jj`?-x3d{fUQJeAA$M)>pBHJpJ34j1y*GmR7Ng`Fw9|y~3fx$p2^)4w#aW?KF zSK*l*#vDNi>WUcX+R9epgTH*!tcqR9oIRYt=$V)i}5RDMCs%CWTli%jX-J zgBZ;*A6g*+;HT3b#72|P;$Zm|G*7Mk3(Eq6QowMk(a7F?K98(&21zqz#Owxc->?x zn*4+`@^6l2zlF+q54+7mp1ZmyZ2uX0ORf(_~5P6U-M?^Qbcz%!q=+^G2!~pFY{7*QTO2X2{K$_M<_pSsR#>D2!mEpSo?`jfb;)quqquzuJ=@+%7}{l zb?rSNuA+zE-d~ARb3A)Mu0pd((}l|ruYdIcNjJ90)mN8zQv$m3ArbCx9!xGLh86j)6k-k-c&{8G`DMnP*2VG^6^o*d;s|{AVPd0{PT24jBrXX zvFoK)9JL<)4+DMGKw%~e#L=nx^u;DGSc=R*xciuRt$UOg9*jCjP!Nq(a0OCivm_bMoI?xD*`{ss-o{sq|d4(01OnP1OYGj z?1|NfvVA;nqy4BwoDGf?(glz!K%7HUEeM7s7H*$fGIJipqFRGZGb}$n)i%iJ0v7_} zg#45+a~sZm;ytBDb+muxoMkV*`-T(6sMw2J5$o+y;H%ix#pUZJrmIHPtb#^B>;?@ti18#$2)Nokr>f(|bMu0E&Qy+kmKgmw z-(GYUSnlU6xn6vKD=DxLI_mlL?3!$Mk8ELML*`n9D#lic6s0dx%YPH+eq}cqPql%c z6f&{txksb`h!i#ZNQ^pLq1Apj8;X4(au(+0Sbo|D%bfkH9bEFIt=xXVA;3H#&~Ayt zs7pv1So?o_s>F2|nm(%(w3ZY$dRNH&?mBNhNvB0>xLRX`vm$xvzazXD6G_kga7zzv z;}NP#?^)L?YTVG~M4e{OyfM)+E`rr=y6L9cS7S>L_&EI?5CLE;gzmy6DJ4ZH?7VHc zc5$l^Ype;Xbn=RC0s??lyPY@#(SWJjciFNfi*3}HakXOr*}lYzHcoe)Vi55FhK2Dd zfz4LD8IGv$;VaGVwmf#{W2{-r`6aZW6ycVolCOv~M~$+GvP+Cep} zKpdxH4)O9dNnu^!(%prmBg72}rg0wEs_s>Y1o3!nmFHr`&_`4q#aBT7GV`SKFz#VG zcRLZ{E#epC>q9_rb&|EorT7~wJ!=LqE*|B9V>2b)QNru<%^nd%qWHC>7GeM@`c3I` z5Mb3`L|};a1^bZBLI-n-)c{Uj4vI9ejHW&8!|g5Yg&AvY#fELpP)u+b7X1GoAYcN( z&0@hMSZDe2<+gO?YTJKWtXdyyZE}D}Itqj|YM?jy+Bi`yZ9?n&?GL~Ivy1E_u?H&d1BmqT#~<5E zFTG?fV;kGO7oKG2G+b!W`?i!25dYZvdS!zT(&mK-AZioZnj)@>j*EeCw+vG}sH;#F za2|3dD42??5#wDW?F5#w%9wxsj<95+>@dCogG4lL>|Fu!dtbX}YyyNfQ?O%}%tok# zAS1zH*dE}{5DJI@U8IQBhhRWlkWMg0LL}HX1a^V^7_;ao+%2)TPr5q@9ZKHh- zbczsVmfn_f2~@y+yf2P^<|p{(anp5;^NOm>-z{-ooE?P1#^T#r*zt}l>NDRn0^ff#ve;Q0P#U8BFfg6^4u3yJV9h|b3%Y{5kr8=LxDoB zcQolO8%L47IC-V(=5+JTHyisVF)^|H;s4X`gCYRR3u;P(hS=MrN53hL8YZCKCks|GxX=#7oFcZU{4Xf4JP6d(YWtpMCaPdkw#} z7K?!0i!jUuTCn>x`Op6CFV>+=Q@iN8J9T=khT>gLBCbt)Qr7V8_FFCD{Bl0T?nW`t z)*_IDDVa7V?hbqGiD#WV=FvwVJ!H=ZCS#1>s zC*oISGM79Pq#^MV1pTPnY8$2&jCthWqmg{Gs|XaLs_ta4W97H(Br~J|A|A1A@N$3a zejvzQ8aM7d@`WQH{BVc`--eMSOdaJ4nAB zs@K3)C-k*fx1`ytQ^z{uCqD&Qps=r;YmMovRl^{NDuA18{LG~`vbWTLgL)!0tsY$k zXe)T^hs4D(27aNM-4FiwNA@3^H`w4ChFeU_PN9#btk~9!d)DTTn`y7lmtkzPhM+O9 zFME(;$5A7sAK(fw#h6yJe9v zwk)Efz4BF(y*p`~3sSrD&O6=Ce=ZU~^HysH0CbTAqA-BjvuE4dYj3umIWLFw4A_}5 z7|qI)Pj{iwiAx^-`Pu z?=d!W^=>N(Sh!gIzb_`!u2p@TQ`Etp_;8|okYrP-O#Exsta0hQP-#XCyWSq`SYVAd zO!NkJ%m_~07g(QvJJTaj3}?ip56kpa78j+)))#8y-t__prA*Y0Ad>aIT|@_X2^YP~n0Ef;`^4D|4;P>^!e*LM|41j!nr~#ynb}6xzl-V;a z#EJ{G(rRjY002zzHN(Xz;K3r=phfuSF<;nwQx;gKo_(xkyAFa1d)a^eI(AsO5z%qe zm6j9>exU85QbWXjxUY7(u3GrJ9|TMVLBj6l~xwSu9%ta(M(9p1r{h)6A7d8dSMu_eF&NJI)#b`nT+ zbD(3f7l5%q90ycG>33zp_8y`b${vZ>+!I-Mxo2PWCj}SAzuFM3e=NH<RQY!GcDp`X`+O@3m$C+%p+U$Qb}2 zXiM%E`jQ#V24{T7ALVKV~p{15++-$`sqiMV>V%%SU zm}@q9lNT66sq!n^Ne9z?Fm?bb)H9qQf|{eb0NjEhlXq9?MtxMmUqwNCBvFt2>iPY0SyigqGEc}5TS z7E|jY%f1*#Xcwtsq#7q`iZeLsXVS}2TcS4oku~_^9M84r=2h#ZqN)GrS+_FEwl!gUS)lf##=&3t_(;qcHh!&wlHUl z{pwf0a;`o<9FuYIKq)vf=FQR8qfv=H*uBWo;mfM5Q!N83-FR8jTe`A5M`tZ!k0nXA$=f~{pwM+L)3&sN)665A7U4wT(J)!i?y-rx~jk8;0FLwaUw?Zn4PqOU-Ds11TGH&_- zn0j5S?)dX{CciTU$JK~|211J{y(NFU{H4q7Iazn20M3Nk^ia^j2pqv`e^r|2uf`pO zs0VO_>cZ%;h>rDi@cO6>dt!S(d+VJKoE>2E#%w#7St4|q(sD0UZneA}M%5I6K7nDD z=>0Qi&a~&Bd)8V-@3EhDE3~eOd$m$E*dPm&uhEMk62^ph&1XbOenSc&)&Q55hUxA_ zZxsz9n9j~WM@o%$e*D&t^woWeFwng#nmR+O>CwbdlquI!@2crF96U-x{t91H=e9MRS6O05l}36pYiqwx-;D_W!0!4bjaZ z9ueH6*jg|ERy=ndd^oPTtz5m&ayD#o5OKghCp1=tft-QuxETQO+57Lm-zHC<>_9QxcyO0*UPQf&K}=-slBGEwh(v!9+~#5mW%9g z*Pppm{H6d0yR>;NF55na5T07x+v<7yCZ zs}85zl$;`^UoTO9$_(q-vu8!hx_}{^b00NT$KObQMD9F7X*c9yTjFl5 z*c0^7{n3@yOSIP`zop_KFF4}v(-^Nv)beGI<`e2nKS%_>TucP84~aK0uwi^-7sH5%+BA8i z2X4V2_tT4HW049_(=)&WgHIg72RiLb6vy6c@NXF3-Lf+}qwTb7(*({{DB zc`GNn^j@UK2l0A7v^p^WCWy?r@4ox4%bYWRbE$n)HqeGQ(roY8a^mJs4}L{dXZxQ~ zZ@WAKBusqt^5)hvWv~5YRu?Nc6s?{AmoAxN<%<%yL}VY5%J({!*&S&Gwl<=pHHz71 zjSp+JXyLl1#k*g-JH|+iafshw#RD6O9RdxCs1*n0j@+hghFy5xR_Xa7QWhBLr|>yr zp!~UZenj_Bi9hg~EPDL-Sz6o>H+>RfyJokiga1psmh8s>T#yca-rGY52KEu`GvYA0 z8o371nzcpM`Terfi+_CGPB8QTx?@k>0)EUKyrSJ7V<1Lkq&1L&Fh(RU45x&J^9+%c z9_T5_NY4Uwvx4~PSo;3v$ksM))=I-W1kjD*G@;g}2prql__@vuAU!?Z`Aadn0j&AQ z;x0Du%7NBq@4H{imUWz&!j}E)H=i{Y24IdWYfToGYp+VP-~a7J%Px&p>h7Nzx%?_O zid(*^a$_Vj`Cd1<`%?35%%(J(xVMen(q^k&mmmfpf}&9>8p6lF9k}B+h>Nw>ZQ44Q z5UwH8JNem+2_Pa36d)xq5xKd_3ahfS5I+btKu^E!ul#!2jU1ynUcx9p54!(oP7|LIK_9iq^=DNLNheq5qt0-CtVH-w&a0}gQ}&%0HVhGh#{NKT z0rmhYL__?{MS3FT)IEuS&%`PamVA`h&w!byxD@*=Ki(FuSgd)Aa1pPUUV7;%yPea0 zp*k}FZUC_x>pB^8395Ou*&utUbt`LlX!F-Q?D5`dd_#L>cW;|EZM1tpBq$j=bf~?# zVwJ6rZZBis4OJ39yEAd}Q$HDRx25g0kr~@%tZHtL%__BsvV}IVfwqVQ4N8lE-Q*9m zJ);u4qTf?1fH6Ye z&zE*W7y#+BvAlz)M~r&yvz6B7*1>jX+(#B!EO{)%1$oS*Yf*l@uZunN;aEpxTn7Um zVp?8ap7ZmQ!MLi%?hi3ufAy6%H2DG>{qHIE#~FE+n_pmAy*gUYcA}aiLKYSsvA-|z z3~lTlv;^g@8aVJW8*%r2%31JDYZ)X6goQ$Y)cW=7ogoxkLp@(d?n?Vn6Rp$&ZC4>K%!@&3-er*w$~#bLcFv*;E2T z1g}cuuQ*p9NXtx)KVZWzjnB8|Cgn?9&$G<->301^t*mQvwfDkH&LaJ$c4>l>IyF^C0n$Yc z-5&e1h@WUY+=+kIlr9rrMZ!QIM)Yr?g&*=9tFPUX9B?mU07U=CgAwxi$Bypwe50|0 z<;TuKFccPlmkcx%RYn%eEisw)!Q$PvP4IHmJJNgwdXG-eO`Y1So)8AWkl78<&ArSt zFFT{)<0|)>~>B4|_d5BAF6l4a% zW^vZGnh3t~jp=6B9c*eJe!0`~q_U=`ODa@O#nVxkqw>&B_1`Cy0Wf%WL$U~yIt-&2 zmholFS6Ft=1{*gc!*0F)Zo9j0gf(9AxM~UZs{Oyhb_y>jhF2Y==F+Q=t)BVZi zhlQJz*5vWiuxs7W{|V&5dY-Cb13GdY=`n=bz!0E5Al3NHgU|YRW;gjfi(*>XN4d#1 zZQdd`R&@Wqefv7Y?wLLK6F<5W&Hxx9oD^FCP+`g&Pn|l|S<9C!U1ndcUSltdNemrw zlMT!2Y26DZY0IBz#jX3>>WmTg>e$JOG`MAeJ2 z$Ob6qB2*CsyJM(C#yJo_AQx~6Z?E*?5CFH31QRRwQLzM^P>bf$V(;{bm-q%U?GOeW zCqf1cgicMXOvBhPNy+`D#zSIGm=n{7N`lJ`<^*byxDKQWq^dKi9ag%p?BoIV#_}jz zAQv&^xgdUO^PR8lq%r^|6=NI*maMESCz_LamrAN+6k^B5j~-Yh2;yPq|K0C?=L~D1 zJQ&VL=O@QMg*@TrH}^@kpLW`AZAztpBdZ29hzl{8h09LGE*4$Cfy@F&9~W>+?LSJT z*B_?n1l6nx@i?4o|_!DKj>guus_(M8y?wfL1|2fMGLc*Pf#{x!! zd(p-2`-9dz;R-2Ym;*S2+YEOdiA8Xyp|6u~ z@Y-vyHSpM>G>D&_pOjw^KS;eB`e)ihowryU+pI0V>RzCA$Q}I^>AarOK>N~1)o0ZH z+tTuQa>`UWV$!v0lmgf_H8AoA_@TXwkqE*cX!j>OZjF7^FjP`=J)pi|1PiySZk`N` zyh!&AQF9H#Y+(l7n|gsgD`zZXxd&Q9)1A2Qdj_)eq_ck&mPR!((w; zo34LQ`TjoM+1f_U_DZVZ?@b;za>-0s4srQ2TulKG7i7^rI*v-KWBSP2CTwq zYnoS!iIrRVLVIS}AzQOGymC{Z#b~PB{apY7n9N_A8%@8u9YWFWdb2^Bv>( z){ueri>?LMvGgmC__Z*rYOD!z;E@K)w*j;jM&LwcenqkY5s614S_XhtN%dqH^VET= z#>00IKkh;*?UFH=6yFdQ*?jKTZhdK+a>H7XdkWTXmEWrmau`rMf#evQ#SFkgu!ECm z1J4LXLNfG%u;WEe267@0k_+S*2IA)!M2$j40fl#qz9%s&wFVq$X|BgGdPq_@<&6hj zKh{<^=wmO;QNXJ|IrK34F*X_qJ!;-j925ep>7Lw4q5fBX4ObdWOaKc$`3LY;5L1tv5PhBu#)Ke4 z{LmAbiAHo5j;4YB2)v*2{>V>&d-AbMgiw@30M6ps#qwkf_N0MOhgaw07;H?mZED!l zUivD<#!s8>%BbCZ^UV(Lk4hSD+EmWwNx*L4s}G&iT3D~-Ldl{MyUQ12wfCk45_njt zyblLYP*PAl5~NJuy?d86Yu(P$QrpxR3xGkA9CtqP8F44&HgJIAu8jcIr^c%-~N9q9f3v2`A zLnM6n7~f*BKI-zl=5R;-w)T2%TN^!PsRN^t;Dfq;`2F!Tg_}16?pdC#lR?flL^%RD zkOqzvOK}ackv0kdj1O4ZnxAJy+PROnA@-9G0Vwp-Pe1JnOW@6T;D_J0=nmho+{l(z z5@2*Z>N+AA!gw*L=~i5o9IDn(Eyv%Tk2?Mo{o!_Ojjg^U1BOCrH<&<3W72ux^E)Ps zpXl=nVGaD0-Y0YTM>K&uA{*NqdFl4b)OD&Qu~8|$y0|zJ5`Fj^#>pJR+0^%0%>V!q zrKP1gSK`5hwstsUNXT=KxC?3xMnKEW%Tw$^uJ=bR|A+bD)_mlVM_iIr{=Vz3yPS6- zvqOf>U%x{JHdUOhVYVYgD5wCy7GMOveWI4bIbnyhQ4W?U-$RlKIS9#4?BeS+#*mth zYaxRm=U{Bbj&M>M1C5+z$4X+#74xt#_CbYC{0`4a^XIQpRx>c3Qst z&%%*w$UM;4*jQ%-Tq%^w+PKTDQ{)6u4l-=@4c|2GEC4SU19$G;V~Z9ov_8Uw*Crh_ z#16O#1S0tmKtJAh-+eA=2}mT_`UYJtK0e;*blDp>+k|;*>~KPp(1xgm zh&W3YTUw!j0Tagk(?u|P--Px*3}E^4<<7`NI5gt_ZMWU#V5WJJDxP`f8T(ZE2%D>F zM!m>tC`aSL#pZ)%_J}Fr%s3@FbC6qwa7jLry~lGII+#Q?w{TQ9x*vd$AOyJ&vOMET z3`+bkhQQZRodx{CF|69y`gS<6vF%UlU`vm5u`$I1?6;p4*>nH*wvm_xv7d^*x7>0| znD_&xuky#US^@yVIdI@Wn=oO5%MkSWqP0RA4zgCo<2-Lb<+~01TZ@tmv-sC%=7|A_ z;AYI8W8=ntXg_}NXCaG=U>I0rSy@>wlPoY~;LTJW9yMx|z4yU~cH?!|*uZw1R5L*r zVF3qe7$u#Et>4LRL-5b(Y*f-A9XUxikd%TFZ{;8*$CRQmg@W&lV4Byc2{gWYy%cAm;oW!UYBtu1bEj<%j^C`b&Tfp(># zXU+HtAt=*KD_S`TMM1d?S~HwQbWDR*_Ohx;Y z^@xhaTpvkf#*7&*MxMK`^PImN^x-X6tF~m&XfVJ z+It8xwmN^Uv0{t_;!F525a5;&cV(XH-%~kpZ`HWxiuft|N)-wQN3vllc6F|k{#cMX(M;T45UHdkc5~J;c6uQBh zm;(qqFzuws{@+E47?aU!(URq^$jB$3e4@UG*hNb9)i@cG!O~TdwmY3M;+uGYxQj>7k;i6;ykmexp%8j{4#p>L-vt#@O@(?*n883GHu%WN= zjMe;ibxX45v(Jzt($dl#wwsuMY-Q-3uz0ieZIf<88fYszsF#QbfO=n~izrJ^N(x6l>P3nWZ;Nw6@Q<(Kxew!7!3Xx`&qF2w3)TGxfxar+Tn2mT+u8KT-M5gas~ZyRv;5lBcuZ>;V= zfc!&rC#T`x=6i%r@=Xkt;jwVOb6Hn=v`?vZIJiP`tX6AHcd3P0pv6p~%jd-es0mnk zX6j31jfjeNVa#Q+FC120L0Xc;(2IKYR&Kzn?7FLmSf|)sR&V7$B@4eHQ@AK2NMlI2 z`?5te1OQQkaFax6^k)3#?4S@oMKLLGL19c>aU|cU@qU6_vo>FI{}A=#;$!6A*9L4& zH6A}t0Pa(m0018VRSrfhV;}JXR0gIP2X?%pnj-V^Bb(aWTRYe&SqWFJ`pTt|!(xBW zJ@+^!N=`@eII`m-;qg5A%*+3LRG;BLj(Y~q83usJxMf3^Ej?UJ!NFnmJ*Tstqm}o+p|S?2BrA(h>t=Ro_cR;a zwUu>FDYN)}IkKEB)RwNT`yiB|6RK$J_GIRryvgjXm0lzsx;Ec)9sgSXI}l+Kbr5b# zRv@hEm1(Pr%hdTR#zUfyH&@9eD4ibL1b`lPdEAz`_fo~2y2@6;n27o#j)5SfW5ySs zYj~;E0KmNEA%~1_* zzx*P*D{Y&l7A=-lSrk{kYu7YifN;Ed!5rR0u~;Z6)8 zM$4V#ru464TswvWys!Bg@&0WQ719PNy2Mi)GLabl)OhXua=WqfvkSu*IEHaBrmNGu zXgjL%o~lNMBE~>2Kz4kHpET-715_qr_vbrQm8x#LtbT%RZk}Z?Ww)`{-yQ3G^_@C( za>P$%sc>}Osd|z}U+0`+0Nff;Ut}Yu9snpjV*GoxZ*C)Qy2`FNFxip{mRQtbQ4y`O zjPHFL^nX%cQF#`z7UQ8ycNO&L;6GqE`*?$*{ib^NSBsi+krH8gN`%V9Vj6c2vq3gh8u*OT!aKTGt?Ri9u z1B*M19%ig?gnb0cLCI@x`lD%~(vJL>4dP?hvJd!0Uzb8KWBT+6A&LU^qhy z>DN-by!7V^+d)+wiLhWCkIyxGYJqYDUZl^LR&`)C-$9(g7)&*%Rr?ct2DGw-mbN;k zyN%xvW#d=wvoDvea3Vi$JBa^*2Oh9~{rWkJe!ywrkEdw{&S?hV&na#tY6Vauko4i; z1pu7jVoFa-vpyYLtJGGM4M>Ys8u3+@a%i7KZ;1m3D)ByG5B;F91vL`&9mJsnnMgW!3IiOMIce$-K1 zij_9%Vyj9U+tgLt?V~jZZP}U}2k6014>li&E(KjN%!b>UGXv)Z1MsICq6e`zY0@Oe z2o|b11W;ZW0VTlGS~jxo&13B1&h4yoLa8+^USkc!2%03sS#+_ewor<99n}Q%_R+Hb zuimLbpMx~AP$Uh}*;etQ-^}uohEf~gnQwaD2>;%ye1}jKD!aE~nthckY=UYZWVA@O zq!R8$E`?AS8;pW}{Fey7OeNe7#kaEJ`1Y22AiHknV9Amt&SSvuEL`IF6O=T+Q|lD# zkdbCB+oXG;P1d#dHTh$vU)hF^ZJR9Uk21CxcWs%;{E#mLy7CHnt; ziC4z^g)7Q~YpOdjBEpU&HnW_h{z~T^VN>U?aG}%vx@Op*mItgy+ z!g4|Ih1;1q1Lq|J@E-*d0hxtK;5l>VOeY;swv6B&ya*&5fguoem>eH#Ju_47wl2c9 z$Ih|HPZIxhD= z-^Dm~rF64VTQ9U1#?EjIj{Csn)~#cP^=YB1z^#+*;`AogvEhEJSGHgIREwqYlvwGJ zC@YLkvYm$-C`O{pHVcTbvnawg7spuc&LZ2Go2OU46_y-usuadN{P^thgy2H_>FMc? z;Zz=0`0q1o2F_~+;6DlsgAhHHjLGT)79E>`&kP9sfmyK72Y;ily?S>yYq4UqYy<)p z)uxFkzdyljR-SMG!vrR3=+S>=S_bTcn{V1?uLd8bwtC28@N2mWuT9s6tbVF(`n^nb z3EwN|WPkW%o2^)z?cy2mjsTfP?WwPwnsV+9Vj`_&<0QL4<p@wQKp;&&3oF1n^NrQiK}hV+AWSK z{Yp68!(?SB;=TY)`DxYhjPOEAzl0i0$qeq)PlpjjoQ*h)By+-*9VkPaC(Z zgT3;}GF$kiS19$?TW@u_@ra_^zkk0|dq7EYFH~$MaS2iZVa^yt+2J8*>NG;+9aJ?L zHy&A-v5!FT?DPcZgxlFY17QXb;`7_HXOAm&PL4lzPY7V}WdrQ?e$DN|*e%wyY_rAf z+idj?XbUeBHCIKf+RiZozPH9Jo3%lo(er^7Q`w{plKd0gd+tjVwQ^l}*{x z#$H}fXtU)-g&1J+uiZu|H3m+X$Ha!pwfiY^e1}r`|rQ+7y)$&F%F_5 zQ=_1JW}02tJjw=TG_-DU`Iao~Ktn0*kw?S`%1Wx04BT~ng7@EjLgz<56LgQgAx64G zlT6!G($MB^kFgIoC)$+hb1Q&1Buc&a-g|A(pg~S#cYTNd3(r6mGZ1C~RZL1vUttqi zx^$_77?U;(mB4o$64TxxJ=MCjh_wsbHnJ{K^xH%gSnR=l)-d{r@(9$o#JCuR|4KqA z6}qQbqCn|>I~);hk+G8hg`<~MK>v^+^dhG~gmi=G26m{vG7cY35aGw!(x}e%(W?E* zK{&HQ8c9n_b0R;C0S=YO{9m-g zB8qldRLLGY7?WhBQAw5;(acuuOR$COw%F_?9@Am?`1Xem9csge54WtWEa%>pI86IB>CHSOXpl0rOj|Vt?h9 z7s#m8A{2uVDFXn8_Cu;ERwTngfwFHFD>Da1JB)X2+qQKHQNh?#^b);4+`=h)2)qL{!qo;r!wg^+FbD!@_zgzD zi(}a3VE_<5Zbt|`Jw3g`H_vzB7M_8+%s`j{)MfT+d9J_9L)0`s_dRL>pLs_z0G;O_ s)rO#lD@ diff --git a/Scripts/NeuraalNetwerkIcoonSchets1.png.meta b/Scripts/NeuraalNetwerkIcoonSchets1.png.meta deleted file mode 100644 index f31713f..0000000 --- a/Scripts/NeuraalNetwerkIcoonSchets1.png.meta +++ /dev/null @@ -1,117 +0,0 @@ -fileFormatVersion: 2 -guid: cad48149d984d2eddae5808eb1517cb5 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - flipGreenChannel: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - ignoreMipmapLimit: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 0 - wrapV: 0 - wrapW: 0 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - platformSettings: - - serializedVersion: 4 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Standalone - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - customData: - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spriteCustomMetadata: - entries: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Scripts/NeuraalNetwerkIcoonSchets2.png b/Scripts/NeuraalNetwerkIcoonSchets2.png deleted file mode 100644 index 35853d65078c2e6c2326da8a10e5f8d57db43a76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39373 zcmV*tKtjKXP)C$WHp|^x2ke-l2dhfUY?`QUAGyCrC-rn7Aa)JFNdvEuZ znRzqw`^~RUA}O#ElzO1l0~@>ts;a7N&6+i~YSk+DS-pC-tyrGvtxK0K*1vy$+i}Mot)imB+O%n7&6_vR>wTK!byw-8QV*1R zplCg?Y}qoKJ$tszm@&h~jT>j9M~}9VBS+fg$&+o~ym_{0(ISWN5QJ>&by-=Nb?n&D z1`Zr(#~**Z?Y;Njw&|vuTGOUYbGAEC;sA2?Pw8T*2a47MApY2~W9_ZC-m?Gw?|=63 z#~<6wnKKPepdrw@b!$fe&OZBW+jGx7ty!~XS&J(XfUI3px=`wY;`9Ir{_3l*+GCGB z<~|c9Oeji4hyxITAOHBr)}lp=*g8rCAhugdCrdq0oF14pYnJ`omjf1)B}a+0p$BjFTK#3x9XfQhEjF*T9ecI39b0{AmCfc`r>3i{eY2#sY}v}1izqZ}*3_D|>tcy6 z1Iz{;ZPssZTO)#jWnk2(QFhZ!H#vO*)`SqcckgbOUw*lrbka%TX)6(cjP5A?DD^<$ zdtkwW1$O@V=i9Bf-WrSitjarWy}4cb?QXVH*%)iFdZD$jHDdcg;%bE;tU(5pnYHX- z)_rTUJx(**?l80R<~IAw+4k2PZ?wPs8&?fRx^>*S2|?UAUXsIXemIog9#HYwjOqV(ZJw%{ufp z+k78e*mr-s^VJD<$(7gIJc$4vFbN)X&_Rw%fFl4zMoLiXfl?0?qX$6li4!N#%elW-iD;}@X*Oq^*@%Bw`$vCjCwKbLesSz~thICn z9`GZ0?z!jekw+eJPDGq95dhyirDLfF3fu!A95()U-gzgZ>xI_4 zb33aFbO>+0`KI$Uq~sC-sAvC{9xL@gZ9VY$=bt+cAiNJ7{_+(oooyfFAJWV0jsvRf zTm6Kgb(Q_Yg5$ogHQT+-G}~|UmX71_x8Pa~SAwOWL;!rRl#ZnyC}0oZ?f1$nuQ*@+ zu-Gas#W?ox*|MYAwL_|G$DX=F#Gn|ENUpI%`YgAW&6{K}7MKj-OiBcx7`F_eJlN$;JA}m|AoNsMfWCjHhXhhUui2xL;qf6zK zdLZZlqWD0vIA|%W-C>(0?YON(4p{j;RfxN}0Oz{4Oj`T4tuso(HvuJOre9#jEu|l& z9w_xdeS3h=UWh;x+Grs@W{ac^+f5pOu&>C-PyMY_QOg$V%z>Q48n9%^k`e)+GfGhE zfkO8H1OPw%5Xz+hJZYPxUAjlo+QE^p2jqA4%TFKyt3iEg1AsMxq#-2{Ak`nGzoi~1 zSP!6FyX&sIGR%LN;VRmv+TnqOwE)3f9e~f=WG* z>Vfy)f4`;zPz0b;i=?$$Pi%iU7E@NXvn8uieh2=1`}XZ!L}7^l_#P=8OFdA49w1NO zfBy3ym)eQ*}9$~Tf_)gsZ9itO=_<*GKlpjF)Li+9ke^KQt#reNKZLxxX zus5cFK%}j=-rDH_N@hUcE2U$p2kO`ZAU@uHB;k1X-FIDp4YqX;O||;AQ9jOj=--5l zZ~>#|n%zDsVHd~@SabrQ`rn?>!bVS>t5^Uj{GdjHPMtcrG~#?O5deCj1f?FRLk}S5 zlcWEyfBmb|_LJu?4$%B#`fH|OJVpCD7JQ}r^B?*=VQ24Htq_cRut4XCHF#`FQ=7GD zg(E<|*d2D*!Fnsj7*HYrzE?`eQV-P91BCBl+lSr%;~)QM&p-csI;1!5(U!9H4^Yyc z`3lt^rIjBp0GJ{7fOlsmY)Btbh;^KK>SCe(is*ba!|d75*+4|{e|6ok|APk)wr<_J zxtdB=fI@Y6shqET50JB;jJ_wIe6mZd;p6$^Uc7^B{U>Z~cGrPb_S1n$Yb{a0>jD<7 zGJANuyz$ma3vop>=-e{ZanEPv_UYWUsy9_L&Og0+^|HP8+RNBT1Sk=J`gZeLjo!*7 z^?kbZ+(y;|Y|nMwb=TR&7hmky|7^{N?Ix+m54KF&ANH)WzH02hKmc@4ma+Ld@4$5&?WqXM&Z_ zc-L&IK1;;c_1NC5au2g!JLOqI>9&on2R{AuQ@i4dEA0OJ@2_Fr^X~#;gWxFrPTIE0 zE>eEK*46I5eI*8*I0ir2Wlo|XlA2qQ_ z3zK5~J>Q|av{l&AM;~oC0eL790N)cijwDWa`Q?}G&WRi)l`d^eJ%FTC0m$f%_#YrYn<|VRHPV?t-p&XVT;eWl`q^>-#YA?)*$&3^G>!hZJ+vweCettlcwln8*_9^$_1 z+~O7G_Q;ercE=~H?A57jZ1q~TBe<8<|3^Rik=r@g7sau(FF@EES-z9g{hDj8aaS2| zH$MDP2czsk)4P+hEDzarknQ`cTdZsU9kY~FI=wOU0JePC{R=O=Fl$Ud?}3@Gn^yW? zDzV3jTPLlnckXc$B<4+p@Gni4e&ES6n=Q{=xCTF;HdVO(kpoiEg4=hgEmX@LgeZJB{Tm~D37*blAS3y0edyAHN*fBW0^t#5tH zx_0eaqtks^rDNmk0mQw3{p(*&*~i%Df^9n|?e_}pJ)lwwHX(P$svq~D=FDC_&3>ei z;H%yhb_=|DZn{i^kB-;%UeXD4mGh90eAt_1_Sl3J@^dfq4T6D3A>ScD_!q3HTBYyn z5IMFMo#Xc`vW}Z!td;F_?j;>)NN9?{hfOM4X zf6swQ`=&CuvKPb0b2Lbz&~MABV}dlVU&`fkvDh>yG}IY@{TeuMpku#=4jpRk+O7K*<~33%Zf31ClDeAuvp;(~kLC+-wMdkd;R%7f6e82$*xSfHw*=C!p_m?<;tX-q@%}VUR z&MrQ)OMA)tn|07|3Bh5rc97=2K5S z)yZMG_G-`3l+vXl_5jFF0uOf4&4&Eg_etb=s`J;~#R`{U6wRq;DDX65d*d!$y0{P99B*vE*2>s`J@k~KriVW15n*IBSlD|9 zOM^SOkA8{+m?*aG_336$PBeRNiekVuz%%4UcF{!_IXm*tfBy4WdCb>SIEwBLX&sSWBx z0I-Xa?c|L&-f)Vs@#DuEfe@^e5CM=MB7oun0szwY=+VPSK7c&T?xZ{Iw3AgifErLu2sqD{Z<}{a+UA|j4$^BrJU(gv{G`lzW-VB-(0>2>-#dbc zUZ4aUz6a3N{NWFO$cg;hbuqi>8&!6MwDeiAG25#MgBNH4xK>I(5S^7@xUNK<<1txwE5Ed+xcX+ocq@MDLUA?`bSY2-&o0(+na9 ze#4IKDt5ot3E-9t-6!hZMcl$qx7D6+U90TE5#{#ec4MeqgTlXxLo?7 za|SN6W29KtdT9q#h#UAKVb4vLEAOm?&GZUp%_W{eu1Bf&yWjoJ>6PlxjI6ij`o%#LjoUuG%`Ox2 z@6tnec)}icbCz=;{Iio2cDfvWCQ2s+lEWRNo!@oWUG37}oo{<}m}QBP56LtzN_EJl z+`f;^ZPC}Jci7P;BzxMdd5dht%9Yl)Z(qkrS5#CO3u&PsCkL=n6|f#ECVGJ=$M(aIG`&uxMugjxrk!t`b#mVk76Qu_vB*!ih-8o*g^tVhPq; z51`xm)vtb)75Q2DvBzIMq{;@0{jU%5^D^V-i-5c-L8zkUPNv<@~CXq~m6_#rcKm4%M6I^-al{MTHqvfs7-zYiRKMl~^ z*;XB^;^qH*8>O+`Rc@kJ3|?dBywTJqEm-O}42U5t9YnNPgPd;@zYh1I^dpv^EwbYP z<=lQ+i>?v!ZzUz2L;koMYdJSZa{q-wew@U-QV$%#B=`5f|J@x^MX16S(lBNLMC4+M z$yo^i<`6oGe0(e^8d+)tY#-<#;A9d7GE>1b0 za@WT_ynnd0({|#zm>l(;5U$PQ1`d)BL6h<|cIErc?cEt`?bcgwwfEk8&uO92-hN$( z01FJn4}@ePK(yo>9}vZJnarO;0UYS#k3Vj=-+sGWRiovSvYRctE|+&7VZ8MnYn**h z`VsOA1L&7VIA-z*esH1z0DF00MV0mLu+}bmuZ=x5c7=WL z;YW7PIp?_G6Z-k94se7hSV^Ag#Y1fI-jW2;!x4Ss8{e=kx7@N|;vt;u_19ltBV{*E zTUd9Fl``()!AWQDualY2517Ul7x8bN43200 zX~c2I9oHb_4_|~;4sHMw%<$pE9g#uaW)&zT#SiPO%Xiu_dh}>FAwl@oEy@)ACqW(# zK!-xWwjEd5--ax+KX&V3cYeImX3qT5{`R-O+1Y2Gole(Ohv)_J0%3e9<)OUsl>!@3*8_pAf}Cm*OX;0L0R4Q|z{RfhH-mK(y; zSO@?CKq;0~5npW*)}s}S979|n&`Qy*#R|J@$9cACi`I7KD=S3+ZnpVz=QyS7<^#4U zP(>TI7?i0XJjDLR7hiOK74&O9fOzo23okfg{Oe!;+PP#iZ|VZfVG!`?r=PYv@4PeP zQJR5w=g(!0#kChpPkoUeF5;ExO@;hTZMyuyeIgEs)`=&c=z?(&YZ@EG5&#AWHqD#- zc!@&$up|GmDtG|-8w=2u(0`#)?)z>(xBTX9{;wf!qIuOqJFVYBYredxUHtl5H%Vts z7;RTwafxlY+y42N)d=q#F=B+%al9-pZ@er%A%J|YJM{&At4gj-%gp|M7NbA? z=}%5ce8LGQoN{JI=z8wnr* zCT715W!9#tW{mz998@N0qkpvZY8Uf;(Hm>*nO8$BS-1+TK$1;W;& z?81-2TT*68UqRoH4f&Dzf4ghaPEodA2vI|je`=zqo%?P}dvo064CKdw z3?(=5FpU|?K=wEQVLd|9q1mFO;-2;A@TDgJ=DXkht{rm7A$H3xw>Z&)iGhW|4=f_a z9((K&>r3FvTA#-$Q>LVqQ{^I9z1zwbTL23{&UX+I*hCR#Kie*8-`hNu1mcnRzOai< z`=Kpfm?B0wpKk;gnIrg({N*oyNh3eA3l3*%`8o}ghW*7Os^nmkRGdW81=wsNWNaZM zY@(R<^2O7w{MA2Ovybkvjvd-MXB|wVevYyj;WvUvkPF}d2vUmzZ2|c&RXd32bI4y` zx~_RKzg4AOGPcr&kNhHy{45xlv~iwm?8s05l+jsH0P%4*M1}#l$FGRdd$axa3LKms z@c8@aqmS&Yv(B<#{Nfi*v4c~P2kfJmd>RWt0BAqZB)P&iDVLYldVM+x&SoC-i!1QeM^2U(Y`Ktkbl6wjGlv`jb-!YB!uis_Zvfb+NA# zSK$EU^PlQdwpgOqBWIaCb&<8QWp?T*r#dB`zl?Q;PcC4-M!65}Cs8L6eWwZe;YR8! z(k089*pf}QwyP#@W&eG7r0^p(Kj2D+4jt+iy+XR{=6ctLUK6hS(O6d$6xT-@aTa|5 z>=YC@Uw{Im!41tk3=CT*pK{76E{c${=rmFlvtL{EuGLD(Hd>w9YhU*onyDf+ zmQ`v;1s(lP$bu)@G8vX{ec&0p?4sY)y7CpNNqH5E-vmxg_;dhxzY#_EhrN<^?T{+# zFF%SJ$nNfp`GZ^R%YW2Xx)<2aTj2vQzuam-xd(e6>ZtrRe?-I#=N;#<^Z#Irq_q7S z%P7(D59V_$Z)yuWZfCd7*~adC{$p9nQeqB^C2{z~%plHgEKn9F+d}}LU^ruVKwgjI z7X0<-k!M*+;{a~L4`5|wr4tWw$#ijL6!YAiNuQ>PT{|&B5P|gynxF?rPCiGIl~rrO z(iL|5-S^w&S6rSZoa?ncwN%E!fI|1R*IrBCNwU=Ql`QjcZIIzyVL`gO02{BobGtSD z=w27=9zKfxC~n?z57s4|jJ$ZsIfyEWThHA^+(!dNxmB&Y*|W{|x0|2(M2g~dq6iLL z*!tOaYh!{~4uBUxD^L8shvCDA$0}9)_2>~ZA~In`MMd;d#%~ZG5uq;JMMePy|BbMsx~G-M}#}GH?yH- z-$#q~_mnET-U>EeP}x-yuUuzsZAk{V&ijMtaexw%xRP-3fdGB0LRN=%4QmgX_eRcd zVz)f?ft=*Vq^l?I#hGWGX@?zlSo++?@+Fo7pz$a$kjwqbj0k{cHyh=RzA!%5L;wMDUJ71Wt^!p*(%H|Ig6cfU zt!T^FD87``Rp?S!1se-6C%oCzb({K){Sq1?XQ$t7#Ud;Fa&&4us!t*Ycn&gsU-cKx zLm)y6Q$iG=pE!U95hFdmMy|c@jGwE7IB%w_g_0+d%6j%6v!S0 zC>tv`&J1jfL5ITDW0xf>5DJfqiVBD15Co_$av(=m12n;C_Xz|3?|=WBm1XnwqD4l` z`0&FIoi`kcK@uCTZ*A)Q*)z4vN{YRNb!;X3Kbt*f@SwiY>*J_->)ci4t=7J|BGuk5 z*Jcn&XGTTQ%GiAGd*53hEy-Dj7vVrN)XL>Gb;~)Q&vtRO3Y@;!labagnLzjyvvf^)taC1in7s zzG56_&zWt@SEUF5W-N37?DM{%0a4^<+q1=#Hl9>^v1tpdoZO9001fO~+0@;RP?_*S#J!|w6o9)Teu3<%CcuwR%#kWtC{X(u|s;d2fBK0}GvSCY#~Kw2me z4^AK#a5px4$0_8v5yYUZT8hhB0#p7(?JCnu?Cb?2n%R^EtDX3SvlSc~yT1^2nr(H= zT5tm|K$t5kDqOvOyg!W zU!>d6`}+5UbB&rDYb~M?-5~2|?SPFQ_s#^^hq_#Pxwx0w z-zxr&FXt|_m2AW&fNgZUyn=c0N@sT;a`{5}4UywL*pSs-OaIXfW}g6v1T1~ML3RCb z%e7Y4ytQ5W{w6l=i#d*nvVAo<93ZgkJG~kRL8d4c055yL|0RfV9qgTLV##Eg=BcLzTah@Tr_XCEfyyXpy%4CIe@zK1KSJp!On_4 zfR&rUhdn3%zaJD#Fs%02`x!8F3B+{cBI)%F1W16)=n{zZ!p9qKARAy}BBUi5S^xkb z07*naRGgH=q~s>xS+AhX_Dp@w&zwEiRo*rBBpPC$qNIxJG?I_d!?BbiEtl|7i@pz2~S-4bv-wK(Gu<7ULDS?6WzhWS$B4 z8{I&KTwK4=UFo8GYekp%3l}g&PGPz7$l-*tcy&VZvGx~iz{(IAi9QZrbb^k;hu;Y_$Qzrpw2?TqQ%1E>J@9Q zILVtoQqYGc;S5bkEhHJxqfMEj+LDTHQ`TQ?8Ma`hl81KDO(_N<<6i%xgEaZqe^6$Z z>@Mz!i5)4^-utF!x(;Z zzkTe^+i$h`OIM0ODUJG6x%7*LKcs)|K8e;%Ki~RE!e0MER|4XJehGq)J}Miy)jp&c z+!!6WY!Byie)S4VC}^okc?xx?FPr$9PjMUi9^qy{UJKY7%4Jg2rTkrX*~KNt#Bz`i zdyk?KuP+>w8Y+jO)4<8*)i>Ts<0Kn>j?&6MUECgcN>}+0+dHv0`@cU;*qJXU?EKdg z_S$r0Lfsfl+KevM`6)7K{rgkJyJ!~}XD`dRp^iVQ)>@OPZ`gjF=eU08*)zqJ@h(_x z5D6OEFZs5JasI|`yW5_M>O^@;e~}sY?;j^@@`C)|m7ID{Oi0+@^c*6UU%6S;*>auD zWO4!WK1dlt=CANdJ-&+rU|SDQgf?~^fX1yj1fU*W>mGq^#q>z#)=+1Vtvo_QaXfnP z!3Sfl3E7_W=ZP^Vc6*3Q9{#u z<(0f9J5(F}#P`4deYdKhQ^4FDbSaP zrAv5nQp!&Lt`ubK6uSUXvY|A1>0B$j=Xg7+-6!^opPZOhw4$g*AxOVOSHgL=E@JBR=&vTq-$t+BK{mQ$@{Ap&S!Mk(SMy+yeFKU~Txv;L!udGx$c@qu4uB8m;=rBPpEtz;9QY_M_NqcV|NONSCWY5P+yYh;dUj1%jllUbQl9YJ|JWHh&6KVNr`ISI)9w zbXsEtxB+a;SP9U$;%bc2C2mEVq2MDNl{k_Cmiw@YLpT^DEC(P%HrM26KXj6=X~(YG z?N@;$X#KlO&q!n-y~X6^69=50urReT#NA_ML6~ngv?o>r%wt;N#3^tOZ1Du?9JlXm z)<>Ls!$(287q41i{aP%vQH$H!6fjSKe*oT?q}YzS$+{Z~`A5kzHc_hc9t%IV_r}eT z*uzF2@{>?g-qwbf&7>WCV}>@soRV+`*NTU)T{p7!i}|AI&kFnZOZ{rim!UIKXtadH(_89+ru7SnXEp z{rf5-&jD5TfAYRNYCzJCls0?sUS^d-R)SrYtdf~Z6B|~SNge_}Imb1So?Lj}*ff;{ z^KmJ;oOhe9&(ZeKeBVa|qHXiAg!+A_&W_F2D&_cUdwE7v#Whr^4XK1Ktc-9{xxDD= zS8L>{wmqz0Wra1LJ<2{9H{Cf&(Jq{&o}R?+w^EpDrGH3v{@cYRy)A;ULQELh-m|wrYd4UK(s}44&$6ogIJDL`RND=VG1A@YAV zKpRd9DOLsK{S1&TZ`j4d?9wxiwLN>SuwGLiw|&b$u{}4L>yk&Z8}Q&BsR^4FBH`Wj zX`)qSGo|d>M{)1nTbWIgdGAYU_hX5GCg4o5x`gv02D~GrWCi42K8O-y=O=`;N!zwd zs{D+0*5e25+fu#>6Bd=(=(#D=*rG+LRP1D}p%04<hMCc;#XV!;7{)>Bl!p0zgN@veWUfUbq`0-$VW50BtyOa0q2`BZendexW(+%zeyl})5@05wJwtNVaW$*!m#RRoq}4yS~N4;r5o91lLl+gsum>z z!f}V>Pbr+YBCOBcE>+)TQ)T&Pt_z!*3%IU(Q5IITPudu*wowAW;~@KFi3-=fr{olDGNRvYMLam~^Z~l(W0}F& z6X4ptla5F!6E+S00 zHej=ga;?5Ku(P%YYr8Itt&qG<;y_b0E$soiej%`)P>76nTtXQS15cv3ITBh0Akyu zKriw$EJK_=z$BVw?rI%iE=4}*_h*I<`iti_$cp^;HT{EaVqj{MX1PT@(-z*j$@k4&F4i{S^KK;ILnL!#Y94RaIryr*Ahq z^Vox|eLG<(AYb!$r6l~bq6QbP;I}*5pg$nM-m+L6qs=kkHfRqk3u)Jg;V(8YA>({E ze7%^`LXN&JAQ~?~KYOBA*YcwG%L&+)Ct9li*70X}p7MUh06bga)bL;hKyI}C zY^8@|7eoPtAf|5iBE)Up--jtQ%5}Mm!Jn@b0bl~Dz;gFtHFgN)-#3w4Z(US;ndv*2SuYX|fOmfHI)CqTm6#y{`rz8&$B~Li~x#;mLMF4m? zz|Jh`T}a*p@3L?q8LU;KivrRiKgDx^qe)h}WUxKs15a(+|r)u>g%Zn(1snmY-Y+ zX0kn(?L0&vj2qxR7s&!r2w1Cp0CQ(d$>1m;aLDC_4hkYM?qiQVmTor6O;&v@Ul0T8 z^#CD5pFhuLVVtU(6-hHjb zp05uAKqVbF?cv;)nV3-sU74ZWP;l}mdQCP6`r33^20ldjq#relh!&aqx44dua&$Un z2W_Cy0a+GtAn9DD;R3vdId>uXUuE)2pBsgg`0hl z8RzaX$|Qt7fU(!1K_Dx{e%+Va_XhPyvx`hL++jjw>6^rx5bLFB>Ew zL$L>j0Lx1uVC|aK>xBb=nE3n@^bPX@#r2=)(p2QGm(3Rof+Y^1yQKe~>B+BKhAJ-nEzic#JydA(Q9O|>U{S(;#zeP^!5FN+veoR?g=*p|Yt2Dyybkv*o{P6~TQQ;yP+c!BHR zT5hvPhzoe(O6~DArrz~1fwK`fUnm-FIG#cR1OV4!4-ilM_X`1QG=|HTXLdfwiHK83 zD*&cUI2jKRnYj7mulpnI2nh#-DHqr9l_vl_`fcUdL6FA-jzG)N3J2%>wW1u=%Tp&! za3QhL@>w;IljDF%aQf+|yIq>O&O3mpB+(${c0>6$UVqcpNjpNW$n01I2f(=zO3?Ah z7-7t~=M}i{sJNy2snD5>wYj4b_g_c_pqlRpX1FH;1YnVpx5Ut2Zm$!tXT&n)HVEeq z2*xLuo}*5c=w_6d5CDh^WrNiDln;^MK9BT#4+%oF9bb6@P`UGd)~QR^3|t`%7b&X3 zL5y}xp?|;g?)xsCSzNhzl4S!#05)0iaviHQ9L&}4mf84uda8jV$nHnqsz}N*vMx>l zli5F%$n*2*qLlC5uAE|Hvo$a0dCXG7hY!zs4;pJYfH><&)`#-AK)LKxl?G7&ZTV=c z3cv+G0G1N96#)>hkQNlU7~aDJIsp`ewe=NdyGTgr=gy$mNNK`zo>Yg$67Dm6et0 zVtFM9z#`ng8#wI3CtJ0;W?!(<7E%WQvZKfZ;Xz=6sk|$7uK7YcQ2cogfO~ThjjtpD zfaSqI8dD&))GfE!ZXNPy04{Gz0rzn54#DFC=6_vg%aYtNO z!^E7?dzh3J6%`pKtLQ!T{au3tP(ezK*kC;X$iHYM3cs4;SZD$O!ovl4w`ME?Y=ncj zm}|b!jxbjN)`PDV0U!W^9c0)*6xZ5A4?WaHz0sL~rn8H?e`C5PMUnLYnlCnHUczqp zNJ%fneu@~!f~VH87pqThw%KM*9{|#LK$pQPJrQCiByI?hh3MpMq!W<&oQV!hl(p+R znI0#6Fha4*GgBw?_zMe)JvtY_&EWCqtsJ@Tt$|XGfW{u#HW>bW0q{|#RL?M&rVkSzYsLW2{2uCbh4%|1Yfvk-+lMB zV~#l{EgKS=`nm`iPD1ieX&8H}S$%N7q#ds4MYcs}vQz%c@;kWY!?m_##CoWAT7@@nAqzagOT3?U<>Wdev-+dF4Ik@<_~3EuhH&wl3I z!AWLIkP-dl7cWE%d@8USWg`Hz0p~J*9p95&O4f~@06-04i>|urDwhT+&ZLHN2G+;} zEAa%ap6orZes{o-)*M# zWi7Qcc1YTef&PrS&OUwrx#uohvnaphA;iXeCzi1N;deaSAOOVz2tY_!(c2Zm7a-d_ z0fBRA+jG4qa}y6t^gIte^ibNINc-^!^|=!Gjn4=~Ae+gN`HxcB&kuIz{>pLyAU_>K z23bC#_A}byAdmMCXA!_30DJmKg$6UI^Q0s~yIu%@)f_Ry>{{jj8!t8*&3!JY%fvxx z#?D5aJ9lzL()J0e15sce98E2C)?ZG!SFlN0A3EC9sFJbDk~s{Jf8A(?-n!KUTts8#km701&XQ0Mh^B7r%&2C<2#6U!f-`CicX)~CwbU0(LfE4ZKm2f~JVA*@?7Igtyu3JWnL4?t*w$29 z?)SBA_vO1MZAfp8G=rTBG;yFm&q$wevqXwVWts!>MSku@W`?SV6PEM2fE|*KJ@&XX z0i?dy#R1$eljBbY=F#q4h3nd8?X}bKF7oAHTBcOzDI!p%ekUDuXE|0~c;SVy*_R;3 z(cFL0s+iD~m6aJXdi0)#{$||Kt@uDIH~_>xL+1!30O7^0&5}uYmbPbGAOecJu(Qm@Y-vy%_(R47eujw;*3s# z6QI*^PVpN@Fb}E}@UmPQBEEx2?C{Ix9Ygx+1d}EkNK}}qRUgE^Q{uw}Y5P@;`(%5B ziP)}f8%M>x%!q?WT?qgKjH#1sK7Iuu>P0y`(| zyjK%8Tlxh!fo02A*j;zs<$`U_JMX+2QFmmdjSFrHtHM!d;J|_5se*qezJPcD?>s{g z*t1il=g}5z6U60B)VR$M^3PV#BW}WkT%#yduQ}lT`GI1T{TsTp)Fvw(bx#d8qWS?H z{CKWA6aS5spLv+ePl6{2XJ>;H(tTmtgR4Ot@Lr)10P1A!z!7@_#C>FzLV@Vd#kWMs zQnOuX%;#Tx@kPh_)Yir$w67e=L40gDL;#H{6PL8uVU`-k+XF;^J@rnK(+Bwj(zC+f zpqtg-cF(5?yHPg&kG1I#VaA?S_P2#cCKhSJhV*V?I~@9d_Sc*KmcC3t5CfR6HGl_s z7nEo?2wiZ&1!?wklnB?YBh4<^JzadgzmV$uhg&5bviwn^4M>7M07sJ>Zn(j%P7v3S zb0PM>HVy#9B)d(q00Mvi{r6|I1KrGDC7O{Uon4rCmm1@mvq1@aX{z>e0An0k35Imhtt#3 zPe1KEA34WL$DRTQRA^sAZ90;ZgW-W%pt;`r99adXXvMsH^t!zYU_lYVaOXYju*1?5 z5cwZ2APP)SSXz#im6b*D00bd$o?)k`ci(+C10fO9T>M9M!@!qnoQXCy>u<)NI0?ox z1m20dYcqYqjS$=w?pz#}!*>*ah^v=he!0_=&}Set3O_bhVX@#`+{(^5IIHWfyUw|f zN6U`;z0nZ>WI8BeHg*eHXwaZRZW3hMBm~3>SFN~?0g>LFrCoeyC+zwU#0oO#`XEPo zQxMNZCqq~k&-C9!n}0~7P98o?Y-QROY*O1+VlB%NK^;KR(cso5uZ3m%?`U~hEk=wO z;mUy1Kx2QWLh#A{>sKs)f1Qt-_3UkcPGpKUKz(&uiV#u`6PiFJhyV&F5CO#%t6?_q z;{yRNBrqS~3{j4<%Em#qv4RkgGXf3`F3zp+`i?#Tr0>Q+-2ea}07*naRQKbJ_?C@m zP=79K4vP-kbs@6F0ey#36muXPst=Lod__ft+c63IKcXLt1?K^d^eOkl_FsDGr7mw^ zTpe-eHW~r|)r0lC`s%Cg_S80pEb`Q=5q*aE>-getCkp4Tw`Q0~^i+^kVVkU83JIl20)XiG7Y@roO0;qtMBNx)Ro3i|Y zkYN^l_~C~gC%|nev!0ria61m|SD_O$rXir`d$pB?W3MVZ^@TEf|I2knVs?TE+Bc*tmP^bB+}sWp5PuL5?zzMS31uKr>P;NfC9#oW6RuUAmj~6PMOR zdL71>597{?KW$OM#)+un8trmP_yU54LI6S^e1D1eMu~@`TCU8?cL0oX9a*I z%>{HEau_lj%0O7wC=1RQGYJ5HO#RCI%Y9CBtRqO$POBwKCj1H5jKl2=Un8&u;ZlJ3(G3pUpwsLi~vJaU# zwWIR@ab@4zT!~`UPcEp6u?m5~m)&oQc6NSPj0Ld~QzZ`Zya(P30uY@;TxX84doPPk z+;#2&`PtOtr$7BEKVt#07bHh_g1HZTz|S9@7U#U4EB4_WCpQWL;0Krpvs}qDPCW6% zoShiwcmGe8o>fM4rrQ%jH+O20v~27$RnM`9~LuTfPF%VhWyF^`Mmff$vC)wDk$ay`2^rHf@%fvI=EpZKku@-U&IJ6k;UdU@{`h z!if-yJg{@&xPTV2qaUN(0kb5%T&tucY+k~9Lco0VT3lN}27nc-zN=MSxma@`0N%Na zdoYz72AwaL&*!y@FW0v0VyByNNA)Oj0P*tyjXjp0Huw?50IWGqW*>d@ zkxK#3Er>%X^RnecVCBC4`s;1z(4jFUuAftlngBpek)7zIY-~SNabHEr4I4JB-l3(i zZ{aG1Lg>f=TGh4MO%n2xM3k(&$b`&eCJ_^1yG}{l43~TsI407HlLj+I8kjs@yBoH{U(ff5GVsnj?{wx(nneA$C6nx9yCA?P-|}MbQ<VV^U8bN^)Nj`~QllE*2*d)dNkMG|6qq$$|n`gb6yEqYq9!=uJrex*?%3BTxml3$)0wF0`w-Yz4lsKe4?(_(gU4#>>*b6zhBiv z{svZzPUo8y<}5n5j#8poQP_~nqt8*sBCE4K_v4R09$O>GPqLaq>q25HtL0>Lde(CL z`ne3kBRAn}k_-6>kif?uvtL7i)d^WL1c$gFJqTXS{yQ1bpW}Rp{QhBG?=EHFadMzR z!wkoe0o4Scy_7m3AU{S|&+vLa-$68-pRgNyKpMGMtMo`Bc|*eGZ>aB4@42P8pJBVM zv7VjU)O^qCazlGHVhXZ(p#ZVX>pUovx=ua*2&)`%kz6?+E>txc<=_!`^0v~eD3fxH zvDKZJsL4seCM$8{$%6IY|Ngg8AU`kGs0aWZhAfOy1g&ni@LmQQhX+=EI<%nxl;e4V-#Gd{4-`^pBAvZ#8*xNKB0>DJU9LK5;0mz2@ zu+Q6Vx19@u*;lfEApm(Tv@S5nD7zX0-NhoGwtX^|kU+qq1R&e{*0l|=*_Z^8wLP#4 zF`kRhPtlw4as>p$iXU&a!VcKBYf9%4DH~$P*n$8kBJZsz*Ohmv`Q6xBa|1=_-n}H^>5)!kQ_TUGeDOVjD=1b9v>esvywqqo0JO*` zMQ~%xg$#K2VRL3O6$;Rrqj2=Vq$W{jLx7e4TYZzUK{+5r^JbaW3RW|}QZ}sKlrt1o zkxO0k;L$-fi%{|gxa#0raFJmrJ$DCoZ3b7f7P zOG7#{$FtqrC~RC&m+i#Jb!|?k#siKyIPnm+Ud;Rl@wL}}w&sY{{!GE|VDh8s2l=C{ zldlY<@hd+aT1Y_t4+A+M0IlS*+fZPo=%Zwt(G`hziF#~7^a>>gU}nQRFx)1cD7M$8 zC+u;BEf<;#SSv@Fxe7&ORgQu`M^+nb-h~3ji}YCl)ow2*rR_TFhhA^Jfa?6F2>dtu z$dRWNN}`&;%1^xizy9^FymTMFuWFW5yfgJ90JAFuA4Oj)jbS$&-(G{V1_5 zRDCtdQJsj1XYW*Hy;_UzL-Nsexssf?o<-J z&(+y0ZRWC8_U6LQHmOO4&2Lp{3x!8AKsiMhu8Isgu8uf8V5$of6teP?0vZ4Q(2*nB zB7z)H_zfOBIC`ldzgc-h&I1boVWY*GOmF~9kPsk1QA1B(E$W!pJnkMjyeyOx2oYzB4x7GQwq`}M ztsZM6q#&sRno)pBNC&`@qWr+_NsSOZ*P?-CcVe_yjo7UXc&)@){8XXeOB>Wd{c zS3&I<{Fe`m3BCy(vKP&)zf>uG%SXudC=O$2u)##pk z?r{o{;lqc!Soq+P^jA6r|acP0C+0^Ly0F~!JKAlG(3fIQ33$+7n%T2H8BE2 zp?P0<^mMOF7x2h9dGigDa}bP3s!26kn(v7z5-ISE%LPw9`J@Y5h6pqiaGDC;YqybE zE>73d(0cNEUVYb73c)Qlku*G4l2tVV__?2}4DMl`dkDY#bHzR~{JDXsm=EuhW5okD zeQ}kYr);+byO0G3mJ&{uPr2TluuCR(_=&z0D-o`n_uhN2bAOFi&iyFJ@M|afuh_^> z{jidu5|CJcmavn>fa*by>HvyG07xx;veKe)1ek7^1@Dj=XOg1Y3IUT8E=wx(byK-! zsaSb#z4g|NU2AIImERdspoRJ(!g$xK{2ys%Yb~QYbrU6s5Yk*CT^zd~#g#}kMfq7f z2Y|xw-GAF0*^e%KBjHwmG|HZEq2NKjL*7T>#D~evgogEFWo59?^urQ?Y`lD22S7N` z7a$^_Kq;itNUq+C>HwOepNkA;uIKA?O&tfKgeE$kFBSoy>~DSRTQ0vmt1$fz!5*oM zzyJNr>|Evit1q{MsK+8OUCPBcK>Q2YV7NcrV+p`wze9W>qWut8PV^iijVIWwxP9A+ zV9OlG#znb^P_&#v{f1-QQXD`C^mC}A2(S6?+~bix{O+%>k7MlwV8+L`aOODslj5Lp zDRs!NmeFvK9@7rCc@USCI~-763M$B|kCP7`QY4Uw>lmKJg_Rt01r^pUZuO@HxJriGU*~95K`%kLXp<)ZOrB=t^=FG4(zskJMnlTw zS@O-nS%oghgf~C4h$(RRza`Qg^ z9XYZ-W&;vwklLImx!NEk*4zuyw=I^!wzkGpU)P%GHV=Uig(mP&9F7*nqL>XAqW2c_ zcTN#t+U!O4%qKIHMk%E@f~DDV%PpNlPdLE28i@Q)!bYfelp@jrev+Ugpv>q!xymlY zHR?y9kTU%X~GJLeSenz z=h}A@>$pHQvP$ouPP5i>nCRHClg*vCz?P{WAvDPNaEDEtjWOYLKhHk*tT?Tdc*wX% zCqD}SA>eEow%1;JW$gy~&W{y0L9Cs{CKrXtT3X>QAU3iZOeypyutw&T%Xbq-LsrZ(j#}5k)AQzt|~- zpuWEOQUTraNts2 z?MLyua@9(kGG(f@l45Yu#0kzSRIUP7`z2H5;wOUXmz)9Q4vYi(DMSJ^@Xl*9?&kG$ zjuAyM%JyR6yva6~;Wi<_#oQY)-&fB{06@+OQ@*f8;{QA@khh*szQ|7_Fa_Zbj0PBB z@OW|Z@v(`7A56?bOwjcWyo+y}uNwkTR1hUkiyYMz(T=+GYkk`XVv>OJl~-O#zxO;% zT$F(aSDIClsZ4Z$3H^|E9RA~bnaJO&g+g2R+sA%&{_k9{5riD*-+zG93$f}&S3bCb zd++^E+9~XnmtVG9yhG5&{-sT7o;* z&sXrnS&oEFq-2K(u)1d>0JNWXtt({fkGhr<-d|1A!&9m6uqaS&HqZ0`;?}hh=nO~$ zMe1tYe~AY`hY;lo2$igB*}h#3If97ZP1cvwL37#@J%6rXM@@Jj`mX$ro-0_Lk%F+p zlSRqbSEW_hc?V8tVr#31`y)AeUH5*<+~-&RcH*^9IO4l@(?4!=!95=Neen?cDDwMj z5FSJjwrM|3%1F{+4;-|Ub?v^X%!Mt|+z&DS=mMB~aX_8a;{n%mtWz5j*f5lR1N_!$ zv;`ArHUa<#O@A~7$jSkDHU(kelz^=KRnV0K>Z2J7}WvPwO<=@Ke73^2(wA0*9EMW+3qg+1su>f;mm5pd5oC{QA*X+ zN;BoS{kFH?U;9UE+ofAWs&||oRv$Poa^tO*ZeWt4`vABgbVhiKLM)VF5E#FyY8P`A4lHPBLVd>jKuL54REcF5dr93kt82LOeFO<`gp zuh4*~+?sDC{yxfK)d^RBt{rsHK?U6`!q=D2k#`F1%Gh+X<$lknynOC)L}$4|=mMzE zst`P0=dWZC#xH=~bm#*ReU144J4UzA<|b7N^G4aniY!mNwyABxJ8ipro$JZ<06qyg z0O29OFr6z*dYK~XuK{06+h1_HJZo1%CK&n?jm#N}cVboL3v zwc7U+q7(Q>)5E8V!40OoOKx9Z? z6`DlqT6RP32N}H*5Z0VY@3H~$%A6=Phyw`g^u^QPQJLCbE7p;ICnOu94Djyb=C82@ z%SH6T{A&14C0TIwqjkJy-rrZBBU}iRmymJB!E=V}n2hfTx(en_2;`Q4U_vlh{m0H% z!vkwVcyF=4;~LL?fl&g)doa$025^uJLj+c_V{jDUnh>Xk4cI#MRz_`-EaVSM6zahfU_dST_JTnGvrFo zo)2t)9z}leH556(RZOaP+;K-nJce(dKW6PR2BT~D9@eo-_w;1k zA}oZMzO9z(858&cLjx4F=6eh6*cyXg9BRM8~|gC_=Qy_1JoxT zHdUZae-ejut`q@Cnf&~7dR>INi?6JrGXOBMm zn6s{+QvuLzk!Uy9rZZUy0EpVPtFrh6iXsX`!4M*`t10p)A64I)4NQ?tYt0*86Y%b*QMYP>I znh?FM!M|bULvKu9AfiE>*ooK}rahmjY(!5?6e6xiYk)j?_fjUYP%2f<+H7Gz9_f=7Nd zzWeO6k4sb$rTW<#TFmol3av>F@)s&0Xl$Fc>aK0l+UC!jpK%!u!1qtag(Cl8Ebt7( zLoixD#IRedq;0~&-%4qB66%}+19Qp8iA0@a;5N|(L;*tio$q|diB0aB8hZDq3HxlG ze$nV616uz(KTYksNRPZcEjxWA6Bhehvbk+2YUbNS`sC@SpLQ#`U#R+TQf4>pxx{|b zVT5%WbFVddAEApt*P9pQ8t>l`YTpXd^=ZR7^h8iWB+@7 z9x>0JaKZ^S-ETEkj8_?}|K|IOI@a9}q_+29!N4OF2suZ7GjAXQaX^+~Z^ndEnI>-Aer@+Mdr#q*4lv;vfQYDRFFDO$K_g3KKPFa!HL%T%MWdU9PT_&XT1mj zt1~;DZnMoct}F(Kh9H|k%~0TQ4XB^4AOv?4J4Qr)YAG4sDO5<=yCYT+(rA_CTom&5Brj4HJ0b85LIzNl^-AF$ZVtSM>1N=yx_7B?TG)cgntm-`PwvHQP{3 zd(X<>xY3%gS(rAAKyaeO)z_1g1K=j?#W-yE7h+Iw#E z8i1U6&N=6}lwa<~M(~Grg-XC|{aVPTE?l-sgOBZK9U#|+$hYpw`uT>;c+yEHIj5Yk z#!uu8_~g9KwzgH_O@P!hcI;T^@Dum$oI~u41Mf)WHydHxh-|!AY3n|jr5~bMS&<~J zz*^2}n%JM-OV}@80r{ERDFX0`Qmf&P9L^hpp-2fHr&l4H@#&|ZZa@Cuk)>SJ3-~l$941LF8X<+SP z^MCW?+2upP4nP=LsfBow;ClRS)gZ+dJ3kd+b0u|K? zz*^C~jo7nwYU5lJeSLNe&Nbe==IdpwM@^n>x83=lw5a5-72?P?Z{c?4VVO)?g2}Q0 zM3c==P-3P*-TRV||3^=k*(D>Ci(rnfuwwG5jj(I%S=}G|oG|80z|RQru(mQ#oL5v- zxCIY(AJHlszARYw3>i}p7PC#y; zi`c5<8s$L&tH|$dfZ(s~Jb;z9(7`sD1a{H{*KT4|HWGpM0`27ka$_);2t60X84rqo?*Dgchz_H{7-8 zAF?;S{Dn-D3sYhPIEXtnI2s4xYsOtqp97)M6yvf=-~o;aUPB9e4`D!Gzz3F&YbclK z09c}2a!9(84e*6Y7bO5iH3O=?RVy;Jz;H~Bg$OXdOqLKCNdSTq7v`+Ho_arN$2{abkr4E zMcWIZu=H>p^Wl|mC+yad3GFYCv=g^UDcNxB!OfV@=ZZD>^ZW9~lhaR@g*4qX#u1_f z@LpKaPza(Ez>_v4tm%iUzo2g+Ycmmja6VXyn2Mc5Z@1V)Z=ts20@{4H!nntZ=<#k4 zYDA=5oOhiF051kop3bkXCQ!@VRUoIdhx=_G%;7}GPmPE$@B7mL= zVvY|y3zSDTkO=3U-wV-M9rx{%v^^EyK;oBMW!8I0GCyL&5V6@!HU1yTiZDfl;eBxp zIQe`mP5*-GfFH^V0VIcO0uKQCj<$G!fI*zV5xfHNp-C?|{-($g%Ye5IfXFRXT&-NG z?)y;sj@$G;tF`F^&*9=-!_7NVSDgp|&oW5JIeaivU=qas&w0cEw8&9KQl!pC^^=Jn z4u~TFMQ$NBVLv&kib+&Rwz?tB$GL{K_z4}BMVlG#+ittfF2DTpg0y+K`~V(%>@i1# zqnrS8FwSJ?pYj1j&tLxXmkuEjR}cq0KzPyEkJKr4MPhGDr9f~S-GD4jgk;Z6N!W1h zo=lPv5T3N@01HC4MZptH&*Gy<4G93x)1POZb(RaSzwyQ!4Idde>3jfH(IkaCkC>6L zZ!0QOO{obwsg1krI+-cQD>D&or7wu~tj*c3&IBN=9ZrDH#tf|f;b6peZ~1NFzXm2)Sa zc%l=d3Fjp#t0x-%*=)zD5H=^oZIxdDTn_=_%fjmy-|#xuKzKe_fx>HH8PV^s_z)@&h`_nTIZSfsDTwMrH-H;< zZ2)m1;D}wAqYYz=x0fcH-5|f8g=$8bUSO*M{T(O7Sk?w#djb$;JE8pf4t{N&8+RS^ zAM#x&0-!);;xrauWzQ9*3HQRP_xHd5Jyukx?LA(2;RWXriUU~``Gva~02_bbefMSb zSH=x7KM?7nM7F!S_sTtzcHCA;8z9RfN{akCdAaR?i7mfur5r0-U_hp zuFP)`2uzUdg8D18LEnz@8(+=L_`nJ@?$> zlyxNgh$24|eNfk=b&)jWkrNS()K_o}`2zK<5fKQ-5ry9`1|{uJ`z7uCU6O7mA72MI zvXWxw51$F^ni5P#&TPLrF(kxG3_&cJD1M{53<8Hdx05 zGrAf`aYd@|ILm~;Cp68`7t#9lCRc+kG0u1Sku? zc>ECZ0Y?CY$^Lo&46-zS^z7jW5y+qr{-)|9I0eDzDjWQ1+b8X|1FDo8p(cTV0Cy2D~t}L~g#HUlW6?@p;6;nbda-q@-WMkC=364GXSeGw?_Gl-p z9ykS3!jTGXPZ_w5-Kxs=6i0$tkXPU>bW0kDf$<_hA#^$P4>|&NQ^M3vK7ctZ687%w zrnYSl<<(#pl4h+f*>iha)oGq}oj2AtZ(n7X?_OntH`SJX?Rwe#vX0h498f-@$hw)I zexm@q!z-O|vSEuv_@q5Wtcqb{(53ES7 zs?MiJ&j1jSD0t3?^T_nI5vS<$*?wbQ$Bp>C_ujMlE353$SzT?fR=sVrUJ4tp*xgzT zJl1|#cCW4a^cg#}?O5BaW9%aJo)64PCkZn%LWjDCY9HvS|{~*?gj!-C}l1Llh_;fN+iSZ@NrA*vT^?h{5^Igm z{lWc|Bu3i#4CLn_QHf5|p0ytwe1yIF`UqvAn#)-SI3eNaLtIKWzzi7W06=isk%7oU z?jGU-dax}z;2Nr<#J~*DdFV4lBnn;u2*N_hbD8s^&(`*v4L*hq8|K33aT>bwt~>4F zM;^9*m6guj9y@=RE?u3=ea|fh+g2Sn$=m$r>;76300s?;9kSnuSk=?P_fg@Fnth8_ zDjHBMa|pCyV;}%e1Vwn4wqOxtD%#UixOq`-F_*yzaNP$z{cPnf3G`Ec+!lG;Y z&b}GU58S0m#fRSkrbhGw=n07Q!`&CotUh|AuQdUn^BK6%a|iHULlBXlAjc*tVULwnJA_C~i{Ubq-rLD=B>(gHSqK z4ay=l_I~@(aYx&$uf1-oSIODE8XkJ+A?G}kO~#Gm0C4=#P}dt)NqI`DqRqgzXzF^fSRF0hx$_)M>qhKb0N?kxH||zeSm1eTm*nJSx9R00<2HnJOi>9 z0^y_eLyN!G00j>xFiI*WO0i(x3hG-I)rB&vQztEr8wp^mMg~9Qj5AyUQ3zKY@nX9y zV$(;-Mb#lcNY5wFzFoRHVb4rhZ5RLXX1Be3SO>_BN1;2T-g!|aAZgyxO2F`e zJio&gvN&V|L^xLeT*}F8&u+-`UwZ9^?y)G-S5UpRwq#fQrX^ZC1v-jV9yM}U&AR>~`Mgd}u zZQiHW3a_uxDqdf3oS`0$zD7ud-~j3)hu61Fg?O$+0Mv^a9Dsfo(;KiXaB*b-(Ha+8 zaYVW61F*;6e*5h%q!+Ou3M`ltWn(8$r3U6iZ;t-f!>0_C{y-jXv*bMpghU3D;DZl7 zn32nYdqBwO>d$!`e4HZ?Kk5PbZ~!RlLVZ#_s#))kln8*jJk-EDJ9QCk@GNM2lt-HolD^{b+XY}UqxB94y^l2wahtMLC+DIi-l(NE; zNf+1R5FqA=0C9j5R(*kFo4FPSh!d-SNTljp*ZO?!Yfk_eFh8-FpAdjJWluo{MHMVw zm6>uH5ny9u8{_%{a}_}>p-GkdmWbfpr!Bi)o}wRhooyP6L$nLdfqhBbT9vWdgXp*# z;}{eI96;0ufa~a3`P2*a+%oATauE>b5o5WrL0yMrV|%~6+8c5Ji02JhD00`Qg4-#< zTR0D48N>Q>7tnaGqM>H*2=?p?0i+{r^{RKuY$gFMQpVK<+RJh1wC$@DjaMa6E%Qla z{RbX+z=#&~0AcV+LH#+7tlkab?nozAn-XwiB;;Rv0s!UCVB0iDLj(;cQ6aup2?Ig` z6AeZxL>(KdjLOPNM+69O4FMwXk~n~Wej+5o0$Rro9wa}4lebG)3x(%FpgmykC#OD% zO1;^Sb73w(e=p&)*z)UIw|^c2;5dLRZD$TexgY;*V?KWE2>>i(S_!DZWy79^tQ55k zc4m}%$_;p9TsgA6=i!GR?qb_Rq6z^3Z?9F-%C~1^doufZ{Pw>mx8Vc+zrFK-vZ}fo z@P5M#I3Pu;6k!Gnh>9Rs2&jk=)EF^|3w3FXHHldoO)OcOVxlp`-`Juiv0;zV*ih^S zFjhoF5D6evkY1!Yg_*hk{?428=Da(v4sYO#HIAD4lHG7$!4m)mOeDEQ2Pt}HB4f|a z_EBvy*)I(M_m2>uhQm3%H*DB2p(3sQE^rJ@C81`v#s<8&NPlr44S*=0+;f|Z8_-%> zmp0A>oH})?$(o}tW2pcbc6WvVu*y&(;2V)Xat#We0MKD{o&nu3NSjjvXh8vb2l9~s z@Oel9?y_D~t7XpPk3YC`J-!`0q_kV)$+?G=$o}2it4a|~K@j_K3$nx(MM(U>1m37& z*uLBRm&N|Aw{2DxAdwr88v_*}Hu|#qC>+Dh&SUa7CsiydROJuTm5Hbt6w3{W1V9vKlL&y` zMjU`XA|V74Ktl9n=Sc>OB>)Ukl0~$#ag z)t7HoV<5>jO#;=?&g;8L4k+){XhM=R&+=QgM3?(~O1-U$F2v-XPP)%(K~_*qdT|b2 z(45RJ>(OBKwulWtTTHkpVrsL1K9`C>t{*VpjDRlQ1`HTr(uX+)N^zwT2l3guklZ&* z4>X0)DwQttzLX1w_fmq=IGL3wz=&6e7uN$m{Iw8(ri^%Pe1!%A;T?)MG#E><-fQ2V zt=p!cBU`_vN$sNJA~pbh0@mtyo!q1s_-^tClVCN^R|$Y`W0fK65ujA}W=#z0ri*ku zIlo9Y>S{MlLbgf)-|w_kE93O>VK@FyEchEx0g}n_u^yrK;6+FV?l?+zZMK{*cmja_ z?HX^e0qjiDNWzZQLHOmG=v9G81jdPlN0#JXp9A1inQ;O{i_ zyk^t&LM>#~+GqlhYx(2p4p>s1S>4xNWoYHrI-O7<%@ov$)kK3}%erbgx&6|JjR7Kx z#NqEx+g|!~t4`v|6gauP$8IqIqP`>oxWB7PCb~A8&J{cXz+mKxZaPj927K&H=T)gG zdIy094&*EMcRtZfeoBeiRM{%kgV4v{T^W)$bw%5B^8T?QGz;iJ`l_;(ioOk_ zkIA1;VZib529A*esB&uot2#trv6dDz<^CGbVlPR$?NU-HCv@7NoIjj}M=St^N-Uvq zA3(p>*5Q3f|3zC=S|OJp5d;!IBJ5=GIXccI0O)zmq5|l+Td}Rk#H3rp7cl_2m_pi= z?(E;czsV7>1dpH^ye+e};`egW_tT%3(lS&l2ez${PHl>fg`OqEcs?14jSQ>Wue!d5 zB#Y>4^ljQMxPK}}z#tBw5%#kG0Nlyd8}(=NL;|X;HG561x&a$x3<`ndYBivy^ek}! z{rdHb+`3lv|1CPXmg~CrbxAmE1F3v~#ugS&<3FrC{iV7hY(JmlBNR_AS9c zMwd^M*bqQek)(Zr1mNqKT>0q^5Zc@@Jv00TI_T!C*EIoD47H)gaQ}EZYlh#R6^~=t z@w3i4tART!PG)G{&gbhxO^(y=*}7JSci$l;>bk+YvVQ$~S+Zn_saJT$8D~TY0R2if zU@~J~BSdK%*Qu&ff$=Z_;eY@HaR805mm3FMak1Hwfpm1Puh2y#oLplFKrDSVH?Y>U zR{rQmKQfD0a5sc-)%GI!KtuPxR4Je-KxE;tZZ*=ot!4+POAs}HlI3IuLU7!^g#cg( zOf-=jwLvAf4eCBj)drAjM4+IJfN*~%pgTy=O_L>kG#Vty4(LFyP*HcQt_tJ=F2H;QjFA)nzSYo)!*mYPQ}WO)ffoZ^fSV&_x@@|N+0i62HO!D5Jg`%(wA5@t47eLNZZzu#utd3A zaJ5Fm0m%tS2WnMfSfeUHGQ%(`00bb{41onL0Wc8Y{w^1;Rbx^r7Tv3T6Qx&+-pl8pXf_`qL08+3&SXCr%EenNl-#{l*LybypWBRbPw_dIUfJylN`|lf7 zz?A?zr8bGmdc}Gfg+P!1fLP74HYB$E*>4Kpk^TP*o&eBk)-^>3*GRE!E!LWLdOVX5 z=4=ff2j0uzbk&bczAu}fh17N2amPh@1h%Sz{>cAY7&o0SRx0_YC;=GM-IHT_sa>Id zM3d!-1i)gN7V2~g*A}IhfrQ%Ai=;lhKfPD!M7?~lCtWlq z$cpP^2HI3_9u}gWV44J=qdu>5X_$P+Y7pPzg6&`TST^qm1VB5`orIn`q^tM+wknmU zXSCn2EszOl2aMh3+JMOvQdr%Vm4&)==@NP52DJseuvoJMRp*W=Z%3{)lD_jxcXf^) z+SQX`J)+OK_^s7kjM}2c<;0>N6#c76Gmg8~n`vT^0r&YB00SdnH2!kpmtPDwOHp?$ z%V^sxy%MSRl)KflC$@zu0f1Nt;1Ne0AtOhQjNlmwY1&GW=NBnoO2(RE&PJ622GyC> zh-00uQ}wQ@Mfyh9_FBeKYnen-miks(Le5XyxAmuTVv`KbIq?xY(?}+vwE^%PDEN+Q zHT_Z_JX4@jVntoCCIU5}n}LH3z%^23>UFvD9D<-o60%YN6KLHxo;<#wSeAUPNQ*9? z81-2`$vblHux=uw`>3%sM)w&bU{cBwc~oSlgAxE%7mh_#A{XgS;0AQDkt6#|M2u1v z7=&hJS>0w5Dx{U{P!428Ti%Noz;#n)@_o7TtkI)K8%e;n7yN&`IwUVH(fEEY3!AxJi2trD zj!v|z%w+7Tp!b2-HWD9WDK6*ssQe7xw0QUB6FqH z8EhvifS&*u*O8xn?BqM^LM7s_S6A(*k;#iHWu}H6CsHq*Tg+}xeI8OkB7hLszeLw%+qr@t zeSQK!2N6l;4xCJM+72ZEIz%E&$%>Adcy_KogK+H2FTXrW3aF{Ak$)`eD04UI%uAC7 zv{k`jWG_$3+BY`ke74Th<;l``pbmsi>Np_hAQrg&h%}jN5<$Te0E}?$+O>=7Th^Ns z-x_pL7o__`xkGiRRhUE6-)jj^p(O*wLmh!Z*aPeYB2nnGC2QoanRRK0@A8fVJBb{v zfkFPM-dc$Re<_0!fIUjIq0OE4Cz3Arl^*J?G+XBLRO^Oa&H4hN2hueNH}JyPue==-lE~7btM^$(JyW{YE5CH$h ziGM=?bbcoU2ml1#A5)U>rYtxa5C9!`t`U$v*}8SR)U}FM3wElnN;}Hd7VR4m0Keq1 zQ}4)wo7=W+E91tElU}`4c2{6B!K*(~x8P%Qbp|Fe#F?AyKNYt2?JROoCw)TwB`{2H;Ze&1wVqMpOl8ql#n( zpsr00zZVU_w$*BA}hQXwOL#orzG8o9E~_IFB0)L?&59 z>+Z@v!UHkoFN4!4M#*buB^m>oTvXSthj?weSVm+H=jwo||Egx&U<1G{$eM!0W7tT^ zS-PzFLvxD4YYHY2$0Lo?Njr8wPx`7i0Pr+Cu-Mz7NkQS?$^KJ2VB$iNb6*XwVW2}L zF3_L3DA6VOq`2RjS10H=Bmh4F*tA3CzW!tMTXnRd05WPKf6*flE4 zNJpyzCwU1(qrrLBty^clud=ez?C;ZBM@{F0CDe1Ugj#oyqGBCQcn4O_)Ka!HBviFc z>(IgOD`m!7k@H_KlJz=ht{mdYnf>ZfRl1jix((1AgK1H?3kX0II--6snJ6Cm#v5&*uDt(R2^vES<$Dy-E*T3K(Pd?BjqlrsG@}3gu*OrFl+=F!` zAMHA7{cY5$zbo|Fw(J-B{@!W>W-Y<_o5IhIdS>+N%r9JkNRqh*1y2CrFib{>fCVA} zZ@J|b>E5-g6t^5Mdv4iFTJKS67N98Bju!8DscSnzT}-Q`?fTE8$J%$b=Kl^;aFUER zTu;Vm1k3MOt|RsssjPh4KHhA3ujOu0CxRaa1EdO*E%?eSuSDFZ2w=0;hGhJ7kvm6v zVPjqj_}WWp_SJ`Lj)C60Ou7HRzX%8Re7+%M2*bk7A=7u^bnS58^-&ve-}auYOmWQu zY&z~3N}*XjK9?pSybFoT9>v~lVODx{7^Yn zfhw|;l4@V762tzZq-CexDgi`Wkpc-IK3X}$gu3|Ri;V>E@y8#VEKRsDk-;yj8Zb~T z{8tb4OqO0koq(H^aO|h42E(;#(3e|6^7itOy!(}w9}9PvQPrT;F3eF?0RmC1$NlH* zb*OMQ{~rk;AOIFKIk5fetFPp(x89O}{p(+b03i0ekcxh8xOh#KY}=}TdNXb&2Fue6 z$VLmvStIt5!GlhB9~-qFNB~jjX!L`MLAV6}^rt_`bI&~&mY7s>LTtZtW=MLe#C@*n z_i=&XA-(n!75iUN@qdmFof!ZC8Ba+>K~$cK^O#+#)dlG3aU=@tHxLlBbsoeyXaW+Q zk2XZEf{61+KSHovJ5uDLEZ-?O2>=T}C8HmI{BfB)d9sS;mEnQagpQ)~0e66KXze#4 zx%Cs}G^#`Xe8?;rGp1W3A2EZ*a*rmwx?pZO^w2})h8u1$wf$ay{dF_Zz}tEa5E?&C z{rasvIiatj!xgaT5S_sDm5V>KK#j5sLo!>PmUdrG%TKk29qaF6}WSkmlhpVTT(BPhXdV-yR zeuDrk(qbh4QOo~*>UCJ70sR*O=rI7?n}`tb1&o1Iq(-jICMXC3z+}JgzWd~;6sCisUcH)|tHhRa-@F_%Nh~zL0ECj|`I+aUSTP0YIb6Jh^0`Cxf+eP&=LUhA`-) zckKwhI)rNre!I8Gq{W_Dvw&wIJ-86v-(hvYJ)aBvc~1a7_}~M%>86`>z)Ud{*WW1^ zZ_qPYv1az{*=ABww;lu3cfb2x!>N%5;Mlh06Tg|r{AS{>T)EPy6?fl#xB2bo1Q3g_ zzgBkT0M%+)$1Z@>Fo1YHeE4wV85lNfn4Epq8M0vEVpB%^8MW&7Z5NU&)ctz>2O)V> z!-grs%7oSVFVys-OxSq?M2_m=NqZ(flipPu+-9hh&{FLO$Lu3=gh~nH4yaT2W04XA z_adHO6e0R9F^ImZd44elSFc_zGiJV5cQ~|j*{-(yGKR0#%o315&$OW zfBy3y`PHv}WhS;C0r;9h60zqOTyTL2<75KEVK6=+0dNg}$)IoFzS5~vCqYM@HEWiM zDS$AzC8_<-KmtHAL7K=#-O>L&yXrRt`>?|flS?nVT(14q)v~>^+Jx!eJ0~RnQzPG- z%XISV1V*3VODF#Ey*>HKAb>`UyUrvf-90O0;ssC% z%KG$?uax*(NzPCBlfI(~7clXcFJEq?N(`ebR;-BFv0zFVBFoCk{hzRi7tggcepQ*U7@1Wk0?OVG|=h5k23)7fB zeY*VSH@}hp{`bEzjmQuqmPr5n^Usacd);-{2@;b(;my8VKO_Huh`t9NctAe+09cKdfk0a8KmPF#`Pt8YCf&MqGacn0 zAhc)EqD8WJu}`k#VF4t?K&Q@~S8K-FEe%^E_cUKoZENmFyjaN)wS1ND^sUVjXC+<7cjowe*0}B z1w8ubqlVGA=k0!r-z(T3`LKmb;@`jd=9|OSef6V29-;Q8JT&m_<<0 zYp=a#a@q$D9B7P)s2O+wh&uq>fr11;dq<8O8At(Xb_RIt+@+gFT-M3Q?@cj*S9-`; z>scV=cSnWe|I>VI!pk8pok}&1Ky3$auRs;hoqFnn3W&|9kE#XD0bhRkrCfjg_44Yg zuSPu{rZaTtP{VZCN9{Bft?I8rB0ySzso_%fOPhHo0ib)M8(AbU`H9d%9r(i^{vhS$ zKmo{GIF)%Up9;dx?A>ez-I-{pFf4bhJ)X#D9)u3V2p4B?9xbHo;8IEkNo3Q1w{k1c@(` z!1%>G1p{+qSE!%Jgg*T6!%Y$rwFqEzcmdG)v14HifOr6`b-`k(NWMr6mO$j41VCIr z?hydwq0>`qZdVlF0Qrb%EPUyQ@_qMJB0#iCV}NMUnYObUUlAOMg#r4PLH?;u5LJ22 zMAt*oTN8Q66=*K#sBXl=G#k;Z7NqZk8#AGhNHPr=w4ZpS{mM`xt2!?^7&5 z6}aY_YYfwaFj;_r+;-b-#yD+{2bDc(V*tF0xVuVG@rVKePo#*dGE2;d$2 zsvU_!DKS+{b5-nrxG0H;btPdWWz>LXLQ(97H0Mz!5Fcf^ES*6>j=Sh&bG|>>vq>iM z697NQfJl7w(MJhGh?BjiP|jO!=6-Lbisq#8Qpkh#0W%c<L&tl{+a7Sa>U-6>8E)B%|!rK zZC5v7eXT$+OFL3g0noXLQ(-KS9L5&akmK|{OpGxB$L2S>x;1Dso=1)x*9Ww$#3<4z6fsX=eWD`OKA%oZ2|t#spDQ|y?R@Wlup6mLmopw z04%0rZ?U+$5|qwCnWVV@r1z9_PREkfmH=>$L4t3a0g;QNIT1P~tsM7p^I5)5|HI2_V<}d@)~7r9I)yhO zZzKS8D|aHHTPO0nM`2JTg{3{P08b+qRtngDL|7$R+}| z3s98SDi7tF4{fT%^ zIyn7?B#Hz|U)p}P&$N;t$2kw7V4TLf*52c8kq(e-(+N7-xN)N?iequb^H>LC$dDoV zLja(M%*Wa)RkV?55j^I_W(LE1QK^3 zz+~L0y7>zA0`$^QVCH5M+CNEN(&G@7}cH-L!&lX^e za=m3v_BwMi!9VUt<)KVnI-V`&0RdA}HHFv$&m#8(J5%0B0DPQ9GW+N}**1xeJMK6W z!U@%f0t2W5bgWANXuBOC=Az(VBMgAIva+(Mnh(Uat*p?(f8sdl8{OH&1HBIy@7Swk zZ4K|dztKaO$gw7KtYeLCPT>IR4k7I)oN$5}Gb!9+ybRAg^Nieo|NT+65(p<%u&|@# zjST?G>Jk7X0(2(VGmr|>n)@0=HxO^z>Tfp#1`fer0P!(^mE50uU#&5^b88(-xiaYn zJ{|vADV;g`3JDGTzGfYMY$`dWbWa8^f@zR7itj!ZqJj#-We7FK5g9|Qd5E-Fsv3tUC`7Y zi2q#?pQ5=``qU;M%_A&%z_0k9uww@|t> z&pb10LV<0&{98W(Kr--41^#=2-{BNoBmg%72g3Qq8m-dY^Ip%~HqTi^Ot%-1m1S?!A27p#HdcOw%DOgTJ^h%V%f5zy+?_Tw<3 zWt$Puw$0s=@#O}yFtBlP#jE1#-do7~^fzuds@vGycJRT9L9fqRF5|AeT3WtxwfY8i zMW&rW6yksXF|u;Qc6s>WhZ~9Cl#r+56luEDb0C=umo!F7Yww{yZFC?6p0?ZZN&n+P zKvc(G#YBc7*jNJFbSg@X9Xr-U8gdK|7k@;+l0U*y>SRcgChZ3#6iR}T8t;d^Apmep zR{~%^+X(=M8akiOb_p0Bf^_`6{!T5F--zFocPD4wN>LcgrhodGyuIN9Ibrl~L|(d1 zz8168dMrf&sUWHP&eZ!9LgntkKVH1N(VH09;+r zex&8DxY@E1(9tmJFc2&OpmZ6XmX5DC8^3K=w26Kt;}d^2`4bkFX;kO~6CRSI)cw_# zklojQucE5S<%T;)1h2e^gToVc=H5#^zp}{7z`7dD!^{KIfP(m2saXq3xw`6 z(QVQYi`v?dcNj-JU@UeYAND~r8j`oFaW_k>7L%&5`W;>Rce2PTt-7>L*9&(6y3kf@=au%5MWJ3Yab-uj z_vPuzaTmB(nSJzeCRkIFavD7>!2#k$Py-P2sdX7k%y(~x7-1x2{R`{`sX*Qk0HT}x zRaptmL_f;La@!;?v38*w@dx#$;;Y}kok~X*@->LMXPev8>f@o)7k8V*tX*q{JKGub|5vlvBT~}NR6nCsJf^IFg{$Ncp=zN84sS$S%VYlK^iV|S}7d}@e*{^>SUKW^Of?mqpcEAMzJ zj^`3elD0K(jDT?eGIh&XBOqIhCRm5jp|S<=-QIrt9cJ}lw@p}(S;L^Y^-A}h`L<8d zOxA>?G7tK5G9aHH?;Kl90I>k+0wd$S_ugyN48NKg>zAYdzuL5sg>SSvDni|+z8(m z@3FRAuYp*emX!B&5e-k($Q;K={O0G44FIZ3m?M;*dglOA0FhD@-H5eZm$_&c{quHw zqX8VVa{BjE4Y2Acj{g=@T0UJ`E%!}IC`e1@!?Tz zL;Td$WIc@`-z{w`=x;PIzSqma>{@cw!VMo(`- z*Y2n?E3y9c(w}Qo*3(fwf8L852bU7@>;ddr3?SC?S1_DD4tn#B0Fe3QPkcbsd-au9 zW%6q;s*ATW4k|Kxct>@m5$k_(QL{=dJNP*n6x z7m!Lw%^W{|yp)%hyQhNv00X-e19?XPm~2>qvG@`;X#pu5n zt-j)Rx{g#RdV<<}(%x=eAqzixORoRRJzA9E0aJ@D*5s$K5a>V8rG-E{L#vuTQjuScLd%9NFep+iP zP3x}~oRH-o%8psj%ZJlu$nW0Qx^#1w8tDU0?*c_4PCM;1Q=^@rl>h<^>~0L?B>@1b zME_lN)m5e>GTh$+MBrOT9VNd$?GQP7`(!EE_=OaeXwimZUC*s`2a&G*MfN^Oq_fs} zYo)~{^|)+UEV5>qxqFJ{0=a% z+cA*$1c0(&ERMjUibM*=11%}9+&g4KM3DfH1WI)a5h&4wF_ehfx{z$C)>;z!m}(^i zu=`jOpLbB4fe1vF1IxB_WZD-%fB`U&_XL2Cq`)FeD?jnX6Dh412r)2VxAi~GMkhVY z-e=!)uQ27RiS57i(o0jyN{hNV_z_@W7h<3w2mtt`JlM0(J}dwH=RZw6IG%z`1Gxs| zA~5+8`GWwTOk+5BUZycnFa!X^;SFGYH7fB?OPy6-$QJZ3qL40<$rz&s8a0^ZgmOz%T*ZZmgy6al-FxxpqvKP)n}s24d1w}Z z2q3^fE@7Zx34q&46y~H(A9?!J>BnYZS8AaqJA{DnV&eCSG9-1BLZj3eu;s|z=LP!# d266=h{|{?=n8$ZSuY3Ri002ovPDHLkV1kg)^a}t0 diff --git a/Scripts/NeuraalNetwerkIcoonSchets2.png.meta b/Scripts/NeuraalNetwerkIcoonSchets2.png.meta deleted file mode 100644 index 9abd599..0000000 --- a/Scripts/NeuraalNetwerkIcoonSchets2.png.meta +++ /dev/null @@ -1,117 +0,0 @@ -fileFormatVersion: 2 -guid: 2e644ed036e8939bf94586314a4f4607 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - flipGreenChannel: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - ignoreMipmapLimit: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 0 - wrapV: 0 - wrapW: 0 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - platformSettings: - - serializedVersion: 4 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Standalone - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - customData: - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spriteCustomMetadata: - entries: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Synapse.cs b/Synapse.cs deleted file mode 100644 index 424b7e6..0000000 --- a/Synapse.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using UnityEngine; - -[Serializable] -public class Synapse { - [SerializeReference] - public Neuron neuron; - - public float weight; - - public Synapse(Neuron nucleus, float weight = 1.0f) { - this.neuron = nucleus; - this.weight = weight; - } -} \ No newline at end of file diff --git a/Scene/TestScene Boid.unity.meta b/doxygen.meta similarity index 67% rename from Scene/TestScene Boid.unity.meta rename to doxygen.meta index 81fe061..df504a9 100644 --- a/Scene/TestScene Boid.unity.meta +++ b/doxygen.meta @@ -1,5 +1,6 @@ fileFormatVersion: 2 -guid: 4f343147e37db9eeda3e98058c553c92 +guid: b5f21cb978d017236a19dc775f0b1267 +folderAsset: yes DefaultImporter: externalObjects: {} userData: From 334a4418c072797c4b1a312283a37fc26802b159 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 7 Apr 2026 17:35:08 +0200 Subject: [PATCH 05/38] Added NanoBrain namespace --- NanoBrain/Editor/ConfigurationChecker.cs.meta | 11 ++++++++++- NanoBrain/LinearAlgebra.meta | 8 ++++++++ NanoBrain/LinearAlgebra/src.meta | 8 ++++++++ NanoBrain/LinearAlgebra/test.meta | 8 ++++++++ Runtime/Scripts/Ant.cs | 7 ++++--- Runtime/Scripts/Mouth.cs | 5 +++-- 6 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 NanoBrain/LinearAlgebra.meta create mode 100644 NanoBrain/LinearAlgebra/src.meta create mode 100644 NanoBrain/LinearAlgebra/test.meta diff --git a/NanoBrain/Editor/ConfigurationChecker.cs.meta b/NanoBrain/Editor/ConfigurationChecker.cs.meta index b8bea95..68e2048 100644 --- a/NanoBrain/Editor/ConfigurationChecker.cs.meta +++ b/NanoBrain/Editor/ConfigurationChecker.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: c7539a20f7894542ca347730cd8417b1 \ No newline at end of file +guid: c7539a20f7894542ca347730cd8417b1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/LinearAlgebra.meta b/NanoBrain/LinearAlgebra.meta new file mode 100644 index 0000000..c6aa525 --- /dev/null +++ b/NanoBrain/LinearAlgebra.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 95cffa531715fe90fb47659db696b546 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/LinearAlgebra/src.meta b/NanoBrain/LinearAlgebra/src.meta new file mode 100644 index 0000000..432967c --- /dev/null +++ b/NanoBrain/LinearAlgebra/src.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 03873b853d7b84b6994976eed0819d67 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/LinearAlgebra/test.meta b/NanoBrain/LinearAlgebra/test.meta new file mode 100644 index 0000000..b3016e9 --- /dev/null +++ b/NanoBrain/LinearAlgebra/test.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7e3187503d0b7b9bfa2214c94b923c12 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/Ant.cs b/Runtime/Scripts/Ant.cs index b7a3cfb..363329e 100644 --- a/Runtime/Scripts/Ant.cs +++ b/Runtime/Scripts/Ant.cs @@ -1,9 +1,10 @@ using System.Collections.Generic; using UnityEngine; +using NanoBrain; namespace Passer.CreatureControl { - [RequireComponent(typeof(NanoBrain))] + [RequireComponent(typeof(NanoBrain.NanoBrain))] public class Ant : Insect { private readonly float inertia = 0.2f; private readonly float smellRadius = 0.2f; @@ -15,7 +16,7 @@ namespace Passer.CreatureControl { public AntennaTouch touchLeft; public AntennaTouch touchRight; - public NanoBrain nanoBrain; + public NanoBrain.NanoBrain nanoBrain; // brain output public Neuron hasFood; // brain input @@ -36,7 +37,7 @@ namespace Passer.CreatureControl { if (this.targetRig != null) this.animator = this.targetRig.animator; - this.nanoBrain = GetComponentInChildren(); + this.nanoBrain = GetComponentInChildren(); } #endregion Init diff --git a/Runtime/Scripts/Mouth.cs b/Runtime/Scripts/Mouth.cs index 0ec03fb..907af2a 100644 --- a/Runtime/Scripts/Mouth.cs +++ b/Runtime/Scripts/Mouth.cs @@ -1,17 +1,18 @@ using System.Collections.Generic; using UnityEngine; +using NanoBrain; namespace Passer.CreatureControl { public class Mouth : MonoBehaviour { public GameObject foodPrefab; - public NanoBrain nanoBrain; + public NanoBrain.NanoBrain nanoBrain; public Neuron havingFood; public Nucleus enableFoodPheromones; void Awake() { - this.nanoBrain = GetComponentInParent(); + this.nanoBrain = GetComponentInParent(); if (this.nanoBrain == null || this.nanoBrain.brain == null) return; From 3f8716794ad9d685cfb9ed9dd230eb31cd8df10f Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Wed, 8 Apr 2026 09:33:52 +0200 Subject: [PATCH 06/38] Squashed 'NanoBrain/' changes from fbca658..3eb4ab7 3eb4ab7 Cleanup git-subtree-dir: NanoBrain git-subtree-split: 3eb4ab7993054a9ec75ba7cadede74bfb213e34f --- Editor/ClusterInspector.cs | 44 +- Editor/ConfigurationChecker.cs | 4 +- Editor/NanoBrain_Editor.cs | 12 +- Runtime/Scripts/{NanoBrain.cs => Brain.cs} | 2 +- .../{NanoBrain.cs.meta => Brain.cs.meta} | 0 .../Scripts/Core.meta | 6 +- Runtime/Scripts/{ => Core}/Cluster.cs | 0 Runtime/Scripts/{ => Core}/Cluster.cs.meta | 0 Runtime/Scripts/{ => Core}/ClusterReceptor.cs | 0 .../{ => Core}/ClusterReceptor.cs.meta | 0 Runtime/Scripts/{ => Core}/IReceptor.cs | 0 Runtime/Scripts/{ => Core}/IReceptor.cs.meta | 0 Runtime/Scripts/{ => Core}/MemoryCell.cs | 0 Runtime/Scripts/{ => Core}/MemoryCell.cs.meta | 0 Runtime/Scripts/{ => Core}/Neuron.cs | 0 Runtime/Scripts/{ => Core}/Neuron.cs.meta | 0 Runtime/Scripts/{ => Core}/Nucleus.cs | 0 Runtime/Scripts/{ => Core}/Nucleus.cs.meta | 0 Runtime/Scripts/{ => Core}/NucleusArray.cs | 0 .../Scripts/{ => Core}/NucleusArray.cs.meta | 0 Runtime/Scripts/{ => Core}/Receptor.cs | 0 Runtime/Scripts/{ => Core}/Receptor.cs.meta | 0 Runtime/Scripts/{ => Core}/Synapse.cs | 0 Runtime/Scripts/{ => Core}/Synapse.cs.meta | 0 Runtime/Scripts/ScriptableObjects.meta | 8 + .../{ => ScriptableObjects}/ClusterPrefab.cs | 0 .../ClusterPrefab.cs.meta | 0 Samples/Clusters/Identity.asset | 745 +++++++++- Samples/Clusters/NewVelocity.asset | 1305 ----------------- Samples/Clusters/Velocity.asset | 42 +- Samples/Clusters/Velocity.asset.meta | 2 +- 31 files changed, 797 insertions(+), 1373 deletions(-) rename Runtime/Scripts/{NanoBrain.cs => Brain.cs} (94%) rename Runtime/Scripts/{NanoBrain.cs.meta => Brain.cs.meta} (100%) rename Samples/Clusters/NewVelocity.asset.meta => Runtime/Scripts/Core.meta (52%) rename Runtime/Scripts/{ => Core}/Cluster.cs (100%) rename Runtime/Scripts/{ => Core}/Cluster.cs.meta (100%) rename Runtime/Scripts/{ => Core}/ClusterReceptor.cs (100%) rename Runtime/Scripts/{ => Core}/ClusterReceptor.cs.meta (100%) rename Runtime/Scripts/{ => Core}/IReceptor.cs (100%) rename Runtime/Scripts/{ => Core}/IReceptor.cs.meta (100%) rename Runtime/Scripts/{ => Core}/MemoryCell.cs (100%) rename Runtime/Scripts/{ => Core}/MemoryCell.cs.meta (100%) rename Runtime/Scripts/{ => Core}/Neuron.cs (100%) rename Runtime/Scripts/{ => Core}/Neuron.cs.meta (100%) rename Runtime/Scripts/{ => Core}/Nucleus.cs (100%) rename Runtime/Scripts/{ => Core}/Nucleus.cs.meta (100%) rename Runtime/Scripts/{ => Core}/NucleusArray.cs (100%) rename Runtime/Scripts/{ => Core}/NucleusArray.cs.meta (100%) rename Runtime/Scripts/{ => Core}/Receptor.cs (100%) rename Runtime/Scripts/{ => Core}/Receptor.cs.meta (100%) rename Runtime/Scripts/{ => Core}/Synapse.cs (100%) rename Runtime/Scripts/{ => Core}/Synapse.cs.meta (100%) create mode 100644 Runtime/Scripts/ScriptableObjects.meta rename Runtime/Scripts/{ => ScriptableObjects}/ClusterPrefab.cs (100%) rename Runtime/Scripts/{ => ScriptableObjects}/ClusterPrefab.cs.meta (100%) delete mode 100644 Samples/Clusters/NewVelocity.asset diff --git a/Editor/ClusterInspector.cs b/Editor/ClusterInspector.cs index 14b4f66..b081cb3 100644 --- a/Editor/ClusterInspector.cs +++ b/Editor/ClusterInspector.cs @@ -9,16 +9,9 @@ namespace NanoBrain { [CustomEditor(typeof(ClusterPrefab))] public class ClusterInspector : Editor { - protected static VisualElement mainContainer; - protected static VisualElement inspectorContainer; - - protected bool breakOnWake = false; - - #region Start public override VisualElement CreateInspectorGUI() { ClusterPrefab prefab = target as ClusterPrefab; - if (prefab != null) prefab.EnsureInitialization(); @@ -39,23 +32,22 @@ namespace NanoBrain { root.styleSheets.Add(Resources.Load("GraphStyles")); - // does the main container have added value? - // is just is like the root - mainContainer = new() { + VisualElement mainContainer = new() { style = { - height = 450, flexDirection = FlexDirection.Row } }; GraphView graph = new(cluster); graph.style.flexGrow = 1; - inspectorContainer = new VisualElement { - name = "inspector", + VisualElement inspectorContainer = new VisualElement { + name = "inspector", style = { - width = 300, - flexGrow = 0 - } + alignSelf = Align.Stretch, + minHeight = 450, + width = 300, + flexGrow = 0 + } }; mainContainer.Add(graph); @@ -67,7 +59,6 @@ namespace NanoBrain { return graph; } - public class GraphView : VisualElement { readonly ClusterPrefab prefab; SerializedObject serializedBrain; @@ -236,7 +227,6 @@ namespace NanoBrain { } - public void OnIMGUI() { if (currentNucleus == null) return; @@ -896,20 +886,6 @@ namespace NanoBrain { BuildLayers(); } - // protected void AddSelectorInput(Nucleus nucleus) { - // Selector newSelector = new(this.prefab, "New Selector"); - // newSelector.AddReceiver(nucleus); - // this.currentNucleus = newSelector; - // BuildLayers(); - // } - - // protected void AddPulsarInput(Nucleus nucleus) { - // Pulsar newPulsar = new(this.prefab, "New Pulsar"); - // newPulsar.AddReceiver(nucleus); - // this.currentNucleus = newPulsar; - // BuildLayers(); - // } - protected virtual void AddMemoryCellInput(Nucleus nucleus) { MemoryCell newMemory = new(this.prefab, "New memory cell"); newMemory.AddReceiver(nucleus); @@ -1090,13 +1066,11 @@ namespace NanoBrain { #endregion Synapses } - #endregion Start - } public class NeuroidLayer { public int ix = 0; public List neuroids = new(); } - + } \ No newline at end of file diff --git a/Editor/ConfigurationChecker.cs b/Editor/ConfigurationChecker.cs index e487d6d..18c318f 100644 --- a/Editor/ConfigurationChecker.cs +++ b/Editor/ConfigurationChecker.cs @@ -25,7 +25,7 @@ class ConfigurationChecker { public static void GlobalDefine(string name) { - UnityEngine.Debug.Log("Define " + name); + // UnityEngine.Debug.Log("Define " + name); BuildTargetGroup buildTargetGroup = EditorUserBuildSettings.selectedBuildTargetGroup; NamedBuildTarget namedBuildTarget = UnityEditor.Build.NamedBuildTarget.FromBuildTargetGroup(buildTargetGroup); //string scriptDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup); @@ -39,7 +39,7 @@ class ConfigurationChecker { } public static void GlobalUndefine(string name) { - UnityEngine.Debug.Log("Undefine " + name); + // UnityEngine.Debug.Log("Undefine " + name); BuildTargetGroup buildTargetGroup = EditorUserBuildSettings.selectedBuildTargetGroup; NamedBuildTarget namedBuildTarget = UnityEditor.Build.NamedBuildTarget.FromBuildTargetGroup(buildTargetGroup); // string scriptDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup); diff --git a/Editor/NanoBrain_Editor.cs b/Editor/NanoBrain_Editor.cs index 3288dac..7e6b441 100644 --- a/Editor/NanoBrain_Editor.cs +++ b/Editor/NanoBrain_Editor.cs @@ -6,21 +6,21 @@ using UnityEngine.UIElements; namespace NanoBrain { - [CustomEditor(typeof(NanoBrain))] + [CustomEditor(typeof(Brain))] public class NanoBrainComponent_Editor : Editor { protected static VisualElement mainContainer; protected static VisualElement inspectorContainer; - protected NanoBrain component; + protected Brain component; private SerializedProperty brainProp; - ClusterInspector.GraphView board; + //ClusterInspector.GraphView board; public void OnEnable() { - component = target as NanoBrain; + component = target as Brain; if (Application.isPlaying == false && serializedObject != null) { - string propertyName = nameof(NanoBrain.defaultBrain); + string propertyName = nameof(Brain.defaultBrain); brainProp = serializedObject.FindProperty(propertyName); } } @@ -35,7 +35,7 @@ namespace NanoBrain { VisualElement root = new(); if (Application.isPlaying == false) { PropertyField brainField = new(brainProp) { - label = "Nano Brain" + label = "Cluster Prefab" }; root.Add(brainField); } diff --git a/Runtime/Scripts/NanoBrain.cs b/Runtime/Scripts/Brain.cs similarity index 94% rename from Runtime/Scripts/NanoBrain.cs rename to Runtime/Scripts/Brain.cs index 5c3e091..cd0c668 100644 --- a/Runtime/Scripts/NanoBrain.cs +++ b/Runtime/Scripts/Brain.cs @@ -7,7 +7,7 @@ namespace NanoBrain { /// The NanoBrain Unity Componnent /// /// This implements the top-level NanoBrain Cluster - public class NanoBrain : MonoBehaviour { + public class Brain : MonoBehaviour { /// /// The Cluster prefab from which the cluster is created /// diff --git a/Runtime/Scripts/NanoBrain.cs.meta b/Runtime/Scripts/Brain.cs.meta similarity index 100% rename from Runtime/Scripts/NanoBrain.cs.meta rename to Runtime/Scripts/Brain.cs.meta diff --git a/Samples/Clusters/NewVelocity.asset.meta b/Runtime/Scripts/Core.meta similarity index 52% rename from Samples/Clusters/NewVelocity.asset.meta rename to Runtime/Scripts/Core.meta index 5718f8b..c5e3a80 100644 --- a/Samples/Clusters/NewVelocity.asset.meta +++ b/Runtime/Scripts/Core.meta @@ -1,8 +1,8 @@ fileFormatVersion: 2 -guid: 61eea9f818639ec20b7a7bf4e86fff66 -NativeFormatImporter: +guid: b583a04a1d95b8e078089205438fa6fc +folderAsset: yes +DefaultImporter: externalObjects: {} - mainObjectFileID: 11400000 userData: assetBundleName: assetBundleVariant: diff --git a/Runtime/Scripts/Cluster.cs b/Runtime/Scripts/Core/Cluster.cs similarity index 100% rename from Runtime/Scripts/Cluster.cs rename to Runtime/Scripts/Core/Cluster.cs diff --git a/Runtime/Scripts/Cluster.cs.meta b/Runtime/Scripts/Core/Cluster.cs.meta similarity index 100% rename from Runtime/Scripts/Cluster.cs.meta rename to Runtime/Scripts/Core/Cluster.cs.meta diff --git a/Runtime/Scripts/ClusterReceptor.cs b/Runtime/Scripts/Core/ClusterReceptor.cs similarity index 100% rename from Runtime/Scripts/ClusterReceptor.cs rename to Runtime/Scripts/Core/ClusterReceptor.cs diff --git a/Runtime/Scripts/ClusterReceptor.cs.meta b/Runtime/Scripts/Core/ClusterReceptor.cs.meta similarity index 100% rename from Runtime/Scripts/ClusterReceptor.cs.meta rename to Runtime/Scripts/Core/ClusterReceptor.cs.meta diff --git a/Runtime/Scripts/IReceptor.cs b/Runtime/Scripts/Core/IReceptor.cs similarity index 100% rename from Runtime/Scripts/IReceptor.cs rename to Runtime/Scripts/Core/IReceptor.cs diff --git a/Runtime/Scripts/IReceptor.cs.meta b/Runtime/Scripts/Core/IReceptor.cs.meta similarity index 100% rename from Runtime/Scripts/IReceptor.cs.meta rename to Runtime/Scripts/Core/IReceptor.cs.meta diff --git a/Runtime/Scripts/MemoryCell.cs b/Runtime/Scripts/Core/MemoryCell.cs similarity index 100% rename from Runtime/Scripts/MemoryCell.cs rename to Runtime/Scripts/Core/MemoryCell.cs diff --git a/Runtime/Scripts/MemoryCell.cs.meta b/Runtime/Scripts/Core/MemoryCell.cs.meta similarity index 100% rename from Runtime/Scripts/MemoryCell.cs.meta rename to Runtime/Scripts/Core/MemoryCell.cs.meta diff --git a/Runtime/Scripts/Neuron.cs b/Runtime/Scripts/Core/Neuron.cs similarity index 100% rename from Runtime/Scripts/Neuron.cs rename to Runtime/Scripts/Core/Neuron.cs diff --git a/Runtime/Scripts/Neuron.cs.meta b/Runtime/Scripts/Core/Neuron.cs.meta similarity index 100% rename from Runtime/Scripts/Neuron.cs.meta rename to Runtime/Scripts/Core/Neuron.cs.meta diff --git a/Runtime/Scripts/Nucleus.cs b/Runtime/Scripts/Core/Nucleus.cs similarity index 100% rename from Runtime/Scripts/Nucleus.cs rename to Runtime/Scripts/Core/Nucleus.cs diff --git a/Runtime/Scripts/Nucleus.cs.meta b/Runtime/Scripts/Core/Nucleus.cs.meta similarity index 100% rename from Runtime/Scripts/Nucleus.cs.meta rename to Runtime/Scripts/Core/Nucleus.cs.meta diff --git a/Runtime/Scripts/NucleusArray.cs b/Runtime/Scripts/Core/NucleusArray.cs similarity index 100% rename from Runtime/Scripts/NucleusArray.cs rename to Runtime/Scripts/Core/NucleusArray.cs diff --git a/Runtime/Scripts/NucleusArray.cs.meta b/Runtime/Scripts/Core/NucleusArray.cs.meta similarity index 100% rename from Runtime/Scripts/NucleusArray.cs.meta rename to Runtime/Scripts/Core/NucleusArray.cs.meta diff --git a/Runtime/Scripts/Receptor.cs b/Runtime/Scripts/Core/Receptor.cs similarity index 100% rename from Runtime/Scripts/Receptor.cs rename to Runtime/Scripts/Core/Receptor.cs diff --git a/Runtime/Scripts/Receptor.cs.meta b/Runtime/Scripts/Core/Receptor.cs.meta similarity index 100% rename from Runtime/Scripts/Receptor.cs.meta rename to Runtime/Scripts/Core/Receptor.cs.meta diff --git a/Runtime/Scripts/Synapse.cs b/Runtime/Scripts/Core/Synapse.cs similarity index 100% rename from Runtime/Scripts/Synapse.cs rename to Runtime/Scripts/Core/Synapse.cs diff --git a/Runtime/Scripts/Synapse.cs.meta b/Runtime/Scripts/Core/Synapse.cs.meta similarity index 100% rename from Runtime/Scripts/Synapse.cs.meta rename to Runtime/Scripts/Core/Synapse.cs.meta diff --git a/Runtime/Scripts/ScriptableObjects.meta b/Runtime/Scripts/ScriptableObjects.meta new file mode 100644 index 0000000..c1c2dbb --- /dev/null +++ b/Runtime/Scripts/ScriptableObjects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 269c75a382a564e6f90c5727dbd364ae +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/ClusterPrefab.cs b/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs similarity index 100% rename from Runtime/Scripts/ClusterPrefab.cs rename to Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs diff --git a/Runtime/Scripts/ClusterPrefab.cs.meta b/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs.meta similarity index 100% rename from Runtime/Scripts/ClusterPrefab.cs.meta rename to Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs.meta diff --git a/Samples/Clusters/Identity.asset b/Samples/Clusters/Identity.asset index 2471b04..e71c7c4 100644 --- a/Samples/Clusters/Identity.asset +++ b/Samples/Clusters/Identity.asset @@ -14,13 +14,23 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::ClusterPrefab nuclei: - rid: 2262690531574022216 + - rid: 2642584026360840247 + - rid: 2642584026360840250 + - rid: 2642584026360840251 + - rid: 2642584026360840252 + - rid: 2642584026360840253 + - rid: 2642584026360840256 + - rid: 2642584026360840264 + - rid: 2642584026360840265 + - rid: 2642584026360840266 + - rid: 2642584026360840267 references: version: 2 RefIds: - rid: -2 type: {class: , ns: , asm: } - rid: 2262690531574022216 - type: {class: Neuron, ns: , asm: Assembly-CSharp} + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} data: name: Output clusterPrefab: {fileID: 11400000} @@ -57,3 +67,736 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 _receivers: [] + - rid: 2642584026360840247 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New neuron + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 2642584026360840250 + weight: 1 + - neuron: + rid: 2642584026360840251 + weight: 1 + - neuron: + rid: 2642584026360840252 + weight: 1 + - neuron: + rid: 2642584026360840253 + weight: 1 + combinator: 0 + _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 + _receivers: + - rid: 2642584026360840248 + - rid: 2642584026360840248 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Output + clusterPrefab: {fileID: 11400000} + parent: + rid: 2642584026360840249 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 2642584026360840247 + weight: 1 + combinator: 0 + _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 + _receivers: [] + - rid: 2642584026360840249 + type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Identity (Instance) + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + prefab: {fileID: 11400000} + clusterNuclei: + - rid: 2642584026360840248 + - rid: 2642584026360840250 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New neuron + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2642584026360840247 + - rid: 2642584026360840251 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New neuron + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2642584026360840247 + - rid: 2642584026360840252 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New neuron + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2642584026360840247 + - rid: 2642584026360840253 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New neuron + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2642584026360840247 + - rid: 2642584026360840256 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New neuron + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2642584026360840257 + - rid: 2642584026360840257 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Output + clusterPrefab: {fileID: 11400000} + parent: + rid: 2642584026360840258 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 2642584026360840256 + weight: 1 + - neuron: + rid: 2642584026360840264 + weight: 1 + - neuron: + rid: 2642584026360840265 + weight: 1 + - neuron: + rid: 2642584026360840266 + weight: 1 + - neuron: + rid: 2642584026360840267 + weight: 1 + combinator: 0 + _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 + _receivers: [] + - rid: 2642584026360840258 + type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Identity (Instance) + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + prefab: {fileID: 11400000} + clusterNuclei: + - rid: 2642584026360840257 + - rid: 2642584026360840259 + - rid: 2642584026360840260 + - rid: 2642584026360840261 + - rid: 2642584026360840262 + - rid: 2642584026360840263 + - rid: 2642584026360840259 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New neuron + clusterPrefab: {fileID: 11400000} + parent: + rid: 2642584026360840258 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 2642584026360840260 + weight: 1 + - neuron: + rid: 2642584026360840261 + weight: 1 + - neuron: + rid: 2642584026360840262 + weight: 1 + - neuron: + rid: 2642584026360840263 + weight: 1 + combinator: 0 + _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 + _receivers: [] + - rid: 2642584026360840260 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New neuron + clusterPrefab: {fileID: 11400000} + parent: + rid: 2642584026360840258 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2642584026360840259 + - rid: 2642584026360840261 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New neuron + clusterPrefab: {fileID: 11400000} + parent: + rid: 2642584026360840258 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2642584026360840259 + - rid: 2642584026360840262 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New neuron + clusterPrefab: {fileID: 11400000} + parent: + rid: 2642584026360840258 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2642584026360840259 + - rid: 2642584026360840263 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New neuron + clusterPrefab: {fileID: 11400000} + parent: + rid: 2642584026360840258 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2642584026360840259 + - rid: 2642584026360840264 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New neuron + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2642584026360840257 + - rid: 2642584026360840265 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New neuron + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2642584026360840257 + - rid: 2642584026360840266 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New neuron + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2642584026360840257 + - rid: 2642584026360840267 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New neuron + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2642584026360840257 diff --git a/Samples/Clusters/NewVelocity.asset b/Samples/Clusters/NewVelocity.asset deleted file mode 100644 index 87c56b4..0000000 --- a/Samples/Clusters/NewVelocity.asset +++ /dev/null @@ -1,1305 +0,0 @@ -%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: NewVelocity - m_EditorClassIdentifier: Assembly-CSharp::ClusterPrefab - nuclei: - - rid: 2262690579536937007 - - rid: 2262690579536937008 - - rid: 2262690579536937009 - - rid: 2262690579536937010 - references: - version: 2 - RefIds: - - rid: -2 - type: {class: , ns: , asm: } - - rid: 2262690579536937007 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Proximity - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - nucleus: - rid: 2262690579536937008 - weight: 1 - combinator: 0 - _curvePreset: 3 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0.001 - value: 999.99994 - inSlope: 0 - outSlope: -112788.63 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.008866142 - value: 112.788635 - inSlope: -112788.63 - outSlope: -6740.78 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.016732283 - value: 59.76471 - inSlope: -6740.78 - outSlope: -2429.6155 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.024598425 - value: 40.653008 - inSlope: -2429.6155 - outSlope: -1252.2269 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.032464568 - value: 30.802813 - inSlope: -1252.2269 - outSlope: -763.7558 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.040330708 - value: 24.795002 - inSlope: -763.7558 - outSlope: -514.45264 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.04819685 - value: 20.748245 - inSlope: -514.45264 - outSlope: -370.0882 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.056062993 - value: 17.837078 - inSlope: -370.0882 - outSlope: -279.01324 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.06392913 - value: 15.642321 - inSlope: -279.01324 - outSlope: -217.87398 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.07179528 - value: 13.928493 - inSlope: -217.87398 - outSlope: -174.8461 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.079661414 - value: 12.553129 - inSlope: -174.8461 - outSlope: -143.41913 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.087527566 - value: 11.424973 - inSlope: -143.41913 - outSlope: -119.76661 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.0953937 - value: 10.482872 - inSlope: -119.76661 - outSlope: -101.519356 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.10325985 - value: 9.684306 - inSlope: -101.519356 - outSlope: -87.14706 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.11112598 - value: 8.9987955 - inSlope: -87.14706 - outSlope: -75.62513 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.11899213 - value: 8.403917 - inSlope: -75.62513 - outSlope: -66.24654 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.12685826 - value: 7.882813 - inSlope: -66.24654 - outSlope: -58.510654 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.13472441 - value: 7.4225597 - inSlope: -58.510654 - outSlope: -52.055042 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.14259055 - value: 7.0130873 - inSlope: -52.055042 - outSlope: -46.612007 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.1504567 - value: 6.6464305 - inSlope: -46.612007 - outSlope: -41.98024 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.15832284 - value: 6.316208 - inSlope: -41.98024 - outSlope: -38.006134 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.16618897 - value: 6.0172467 - inSlope: -38.006134 - outSlope: -34.570965 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.17405513 - value: 5.745306 - inSlope: -34.570965 - outSlope: -31.581244 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.18192126 - value: 5.496884 - inSlope: -31.581244 - outSlope: -28.963417 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.1897874 - value: 5.2690535 - inSlope: -28.963417 - outSlope: -26.658009 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.19765353 - value: 5.059358 - inSlope: -26.658009 - outSlope: -24.617418 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.20551969 - value: 4.8657136 - inSlope: -24.617418 - outSlope: -22.802412 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.21338584 - value: 4.6863465 - inSlope: -22.802412 - outSlope: -21.181019 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.22125196 - value: 4.519734 - inSlope: -21.181019 - outSlope: -19.72667 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.22911811 - value: 4.364561 - inSlope: -19.72667 - outSlope: -18.417059 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.23698425 - value: 4.21969 - inSlope: -18.417059 - outSlope: -17.233776 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.2448504 - value: 4.0841265 - inSlope: -17.233776 - outSlope: -16.160883 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.25271654 - value: 3.9570026 - inSlope: -16.160883 - outSlope: -15.185221 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.2605827 - value: 3.8375535 - inSlope: -15.185221 - outSlope: -14.295299 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.2684488 - value: 3.725105 - inSlope: -14.295299 - outSlope: -13.481375 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.27631494 - value: 3.6190586 - inSlope: -13.481375 - outSlope: -12.735047 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.28418112 - value: 3.5188825 - inSlope: -12.735047 - outSlope: -12.04901 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.29204726 - value: 3.4241033 - inSlope: -12.04901 - outSlope: -11.416967 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.2999134 - value: 3.3342957 - inSlope: -11.416967 - outSlope: -10.8334 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.30777952 - value: 3.249079 - inSlope: -10.8334 - outSlope: -10.293426 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.31564566 - value: 3.1681094 - inSlope: -10.293426 - outSlope: -9.792865 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.3235118 - value: 3.0910773 - inSlope: -9.792865 - outSlope: -9.327949 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.33137795 - value: 3.0177023 - inSlope: -9.327949 - outSlope: -8.895375 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.33924407 - value: 2.9477303 - inSlope: -8.895375 - outSlope: -8.492224 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.34711024 - value: 2.880929 - inSlope: -8.492224 - outSlope: -8.115812 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.3549764 - value: 2.8170888 - inSlope: -8.115812 - outSlope: -7.76395 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.36284253 - value: 2.7560165 - inSlope: -7.76395 - outSlope: -7.434456 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.37070867 - value: 2.697536 - inSlope: -7.434456 - outSlope: -7.1255083 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.3785748 - value: 2.641486 - inSlope: -7.1255083 - outSlope: -6.8354197 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.38644093 - value: 2.5877175 - inSlope: -6.8354197 - outSlope: -6.562695 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.39430708 - value: 2.5360944 - inSlope: -6.562695 - outSlope: -6.305974 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.40217322 - value: 2.4864907 - inSlope: -6.305974 - outSlope: -6.064021 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.4100394 - value: 2.43879 - inSlope: -6.064021 - outSlope: -5.835745 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.4179055 - value: 2.3928854 - inSlope: -5.835745 - outSlope: -5.6201315 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.42577165 - value: 2.3486767 - inSlope: -5.6201315 - outSlope: -5.4162097 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.4336378 - value: 2.306072 - inSlope: -5.4162097 - outSlope: -5.223229 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.44150394 - value: 2.2649853 - inSlope: -5.223229 - outSlope: -5.040342 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.4493701 - value: 2.2253373 - inSlope: -5.040342 - outSlope: -4.8669295 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.4572362 - value: 2.1870534 - inSlope: -4.8669295 - outSlope: -4.7023005 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.46510234 - value: 2.1500645 - inSlope: -4.7023005 - outSlope: -4.5458865 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.47296852 - value: 2.1143057 - inSlope: -4.5458865 - outSlope: -4.3971753 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.48083466 - value: 2.079717 - inSlope: -4.3971753 - outSlope: -4.2555995 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.4887008 - value: 2.0462418 - inSlope: -4.2555995 - outSlope: -4.1207685 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.49656692 - value: 2.0138273 - inSlope: -4.1207685 - outSlope: -3.9922712 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.5044331 - value: 1.9824234 - inSlope: -3.9922712 - outSlope: -3.8696532 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.5122992 - value: 1.9519844 - inSlope: -3.8696532 - outSlope: -3.7526293 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.5201653 - value: 1.9224657 - inSlope: -3.7526293 - outSlope: -3.6408176 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.52803147 - value: 1.8938265 - inSlope: -3.6408176 - outSlope: -3.5339315 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.5358976 - value: 1.8660281 - inSlope: -3.5339315 - outSlope: -3.4316826 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.54376376 - value: 1.839034 - inSlope: -3.4316826 - outSlope: -3.3338284 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.5516299 - value: 1.8128096 - inSlope: -3.3338284 - outSlope: -3.240066 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.55949605 - value: 1.7873228 - inSlope: -3.240066 - outSlope: -3.1502352 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.56736225 - value: 1.7625424 - inSlope: -3.1502352 - outSlope: -3.0640743 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.5752284 - value: 1.7384399 - inSlope: -3.0640743 - outSlope: -2.9814053 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.58309454 - value: 1.7149878 - inSlope: -2.9814053 - outSlope: -2.9020314 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.5909606 - value: 1.6921601 - inSlope: -2.9020314 - outSlope: -2.8257964 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.59882677 - value: 1.669932 - inSlope: -2.8257964 - outSlope: -2.7525082 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.6066929 - value: 1.6482804 - inSlope: -2.7525082 - outSlope: -2.6820538 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.61455905 - value: 1.627183 - inSlope: -2.6820538 - outSlope: -2.6142666 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.6224252 - value: 1.6066188 - inSlope: -2.6142666 - outSlope: -2.5490105 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.63029134 - value: 1.5865679 - inSlope: -2.5490105 - outSlope: -2.4861636 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.6381575 - value: 1.5670114 - inSlope: -2.4861636 - outSlope: -2.4256358 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.64602363 - value: 1.547931 - inSlope: -2.4256358 - outSlope: -2.3672597 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.6538898 - value: 1.5293097 - inSlope: -2.3672597 - outSlope: -2.3109925 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.66175586 - value: 1.5111313 - inSlope: -2.3109925 - outSlope: -2.2566907 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.669622 - value: 1.4933798 - inSlope: -2.2566907 - outSlope: -2.2042859 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.67748815 - value: 1.4760406 - inSlope: -2.2042859 - outSlope: -2.1536992 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.6853543 - value: 1.4590993 - inSlope: -2.1536992 - outSlope: -2.1048093 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.6932205 - value: 1.4425424 - inSlope: -2.1048093 - outSlope: -2.0575728 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.70108664 - value: 1.4263573 - inSlope: -2.0575728 - outSlope: -2.011927 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.7089528 - value: 1.4105312 - inSlope: -2.011927 - outSlope: -1.9677659 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.7168189 - value: 1.3950524 - inSlope: -1.9677659 - outSlope: -1.9250447 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.7246851 - value: 1.3799098 - inSlope: -1.9250447 - outSlope: -1.8837026 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.7325512 - value: 1.3650923 - inSlope: -1.8837026 - outSlope: -1.8436778 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.7404173 - value: 1.3505898 - inSlope: -1.8436778 - outSlope: -1.8049132 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.74828345 - value: 1.336392 - inSlope: -1.8049132 - outSlope: -1.7673749 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.7561496 - value: 1.3224896 - inSlope: -1.7673749 - outSlope: -1.7309732 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.76401573 - value: 1.3088735 - inSlope: -1.7309732 - outSlope: -1.695693 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.7718819 - value: 1.295535 - inSlope: -1.695693 - outSlope: -1.6614736 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.779748 - value: 1.2824656 - inSlope: -1.6614736 - outSlope: -1.6282848 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.78761417 - value: 1.2696573 - inSlope: -1.6282848 - outSlope: -1.5960962 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.7954803 - value: 1.2571021 - inSlope: -1.5960962 - outSlope: -1.564832 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.80334646 - value: 1.2447929 - inSlope: -1.564832 - outSlope: -1.5344887 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.81121254 - value: 1.2327225 - inSlope: -1.5344887 - outSlope: -1.5050048 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.81907874 - value: 1.2208838 - inSlope: -1.5050048 - outSlope: -1.4763738 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.8269449 - value: 1.2092705 - inSlope: -1.4763738 - outSlope: -1.4485649 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.83481103 - value: 1.1978759 - inSlope: -1.4485649 - outSlope: -1.4215137 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.8426772 - value: 1.186694 - inSlope: -1.4215137 - outSlope: -1.3952202 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.8505433 - value: 1.175719 - inSlope: -1.3952202 - outSlope: -1.369639 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.85840946 - value: 1.1649452 - inSlope: -1.369639 - outSlope: -1.3447852 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.8662756 - value: 1.154367 - inSlope: -1.3447852 - outSlope: -1.320568 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.87414175 - value: 1.1439792 - inSlope: -1.320568 - outSlope: -1.2970176 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.8820079 - value: 1.1337767 - inSlope: -1.2970176 - outSlope: -1.2740829 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.889874 - value: 1.1237546 - inSlope: -1.2740829 - outSlope: -1.2517655 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.8977401 - value: 1.113908 - inSlope: -1.2517655 - outSlope: -1.2300034 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.90560627 - value: 1.1042327 - inSlope: -1.2300034 - outSlope: -1.2088321 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.9134724 - value: 1.0947238 - inSlope: -1.2088321 - outSlope: -1.1881914 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.92133856 - value: 1.0853773 - inSlope: -1.1881914 - outSlope: -1.1680659 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.9292047 - value: 1.0761892 - inSlope: -1.1680659 - outSlope: -1.1484709 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.93707085 - value: 1.0671551 - inSlope: -1.1484709 - outSlope: -1.1293371 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.94493705 - value: 1.0582715 - inSlope: -1.1293371 - outSlope: -1.1106901 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.9528032 - value: 1.0495347 - inSlope: -1.1106901 - outSlope: -1.0925045 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.96066934 - value: 1.0409409 - inSlope: -1.0925045 - outSlope: -1.0747513 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.9685354 - value: 1.0324868 - inSlope: -1.0747513 - outSlope: -1.0574516 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.97640157 - value: 1.0241687 - inSlope: -1.0574516 - outSlope: -1.0405389 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.9842677 - value: 1.0159837 - inSlope: -1.0405389 - outSlope: -1.0240355 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.99213386 - value: 1.0079285 - inSlope: -1.0240355 - outSlope: -1.0079259 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: -1.0079259 - outSlope: 0 - tangentMode: 69 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - curveMax: 100 - _receivers: [] - - rid: 2262690579536937008 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Position - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690579536937007 - - rid: 2262690579536937009 - - rid: 2262690579536937009 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Velocity - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - nucleus: - rid: 2262690579536937008 - weight: 1 - - nucleus: - rid: 2262690579536937010 - weight: 1 - combinator: 0 - _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 - _receivers: [] - - rid: 2262690579536937010 - type: {class: MemoryCell, ns: , asm: Assembly-CSharp} - data: - name: New memory cell - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _curvePreset: 0 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - curveMax: 1 - _receivers: - - rid: 2262690579536937009 - staticMemory: 0 diff --git a/Samples/Clusters/Velocity.asset b/Samples/Clusters/Velocity.asset index 0001385..dda51b7 100644 --- a/Samples/Clusters/Velocity.asset +++ b/Samples/Clusters/Velocity.asset @@ -11,18 +11,18 @@ MonoBehaviour: m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 60a957541c24c57e78018c202ebb1d9b, type: 3} m_Name: Velocity - m_EditorClassIdentifier: Assembly-CSharp::ClusterPrefab + m_EditorClassIdentifier: Assembly-CSharp::NanoBrain.ClusterPrefab nuclei: - - rid: 2262690551513219315 - - rid: 2262690551513219316 - - rid: 2262690551513219317 + - rid: 2642584026360840192 + - rid: 2642584026360840193 + - rid: 2642584026360840194 references: version: 2 RefIds: - rid: -2 type: {class: , ns: , asm: } - - rid: 2262690551513219315 - type: {class: Neuron, ns: , asm: Assembly-CSharp} + - rid: 2642584026360840192 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} data: name: Velocity clusterPrefab: {fileID: 11400000} @@ -31,12 +31,12 @@ MonoBehaviour: trace: 0 bias: {x: 0, y: 0, z: 0} _synapses: - - nucleus: - rid: 2262690551513219316 - weight: 1 - - nucleus: - rid: 2262690551513219317 + - neuron: + rid: 2642584026360840193 weight: 1 + - neuron: + rid: 2642584026360840194 + weight: -1 combinator: 0 _curvePreset: 0 curve: @@ -65,8 +65,8 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 _receivers: [] - - rid: 2262690551513219316 - type: {class: Neuron, ns: , asm: Assembly-CSharp} + - rid: 2642584026360840193 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} data: name: Position clusterPrefab: {fileID: 11400000} @@ -103,17 +103,21 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 _receivers: - - rid: 2262690551513219315 - - rid: 2262690551513219317 - type: {class: MemoryCell, ns: , asm: Assembly-CSharp} + - rid: 2642584026360840192 + - rid: 2642584026360840194 + - rid: 2642584026360840194 + type: {class: MemoryCell, ns: NanoBrain, asm: Assembly-CSharp} data: - name: New memory cell + name: Last Position clusterPrefab: {fileID: 11400000} parent: rid: -2 trace: 0 bias: {x: 0, y: 0, z: 0} - _synapses: [] + _synapses: + - neuron: + rid: 2642584026360840193 + weight: 1 combinator: 0 _curvePreset: 0 curve: @@ -124,5 +128,5 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 _receivers: - - rid: 2262690551513219315 + - rid: 2642584026360840192 staticMemory: 0 diff --git a/Samples/Clusters/Velocity.asset.meta b/Samples/Clusters/Velocity.asset.meta index 38684df..17bd1f7 100644 --- a/Samples/Clusters/Velocity.asset.meta +++ b/Samples/Clusters/Velocity.asset.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c61aecac62c26de4aaefb2612bcc9a5d +guid: 61354a7773d5f24439c8ab5622728094 NativeFormatImporter: externalObjects: {} mainObjectFileID: 11400000 From c5808c5fb9558ca62381caf050fe1049872318bd Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Wed, 8 Apr 2026 09:38:05 +0200 Subject: [PATCH 07/38] Fix namespaces --- Runtime/Scripts/Ant.cs | 6 +++--- Runtime/Scripts/Mouth.cs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Runtime/Scripts/Ant.cs b/Runtime/Scripts/Ant.cs index 363329e..580251a 100644 --- a/Runtime/Scripts/Ant.cs +++ b/Runtime/Scripts/Ant.cs @@ -4,7 +4,7 @@ using NanoBrain; namespace Passer.CreatureControl { - [RequireComponent(typeof(NanoBrain.NanoBrain))] + [RequireComponent(typeof(Brain))] public class Ant : Insect { private readonly float inertia = 0.2f; private readonly float smellRadius = 0.2f; @@ -16,7 +16,7 @@ namespace Passer.CreatureControl { public AntennaTouch touchLeft; public AntennaTouch touchRight; - public NanoBrain.NanoBrain nanoBrain; + public Brain nanoBrain; // brain output public Neuron hasFood; // brain input @@ -37,7 +37,7 @@ namespace Passer.CreatureControl { if (this.targetRig != null) this.animator = this.targetRig.animator; - this.nanoBrain = GetComponentInChildren(); + this.nanoBrain = GetComponentInChildren(); } #endregion Init diff --git a/Runtime/Scripts/Mouth.cs b/Runtime/Scripts/Mouth.cs index 907af2a..1d70517 100644 --- a/Runtime/Scripts/Mouth.cs +++ b/Runtime/Scripts/Mouth.cs @@ -6,13 +6,13 @@ namespace Passer.CreatureControl { public class Mouth : MonoBehaviour { public GameObject foodPrefab; - public NanoBrain.NanoBrain nanoBrain; + public Brain nanoBrain; public Neuron havingFood; public Nucleus enableFoodPheromones; void Awake() { - this.nanoBrain = GetComponentInParent(); + this.nanoBrain = GetComponentInParent(); if (this.nanoBrain == null || this.nanoBrain.brain == null) return; From 05fd588f9bc41d84113d410a2ca992f1a2ee66e0 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Wed, 8 Apr 2026 09:38:11 +0200 Subject: [PATCH 08/38] Squashed 'NanoBrain/' changes from 3eb4ab7..832d849 832d849 Added doxygen files git-subtree-dir: NanoBrain git-subtree-split: 832d8492398553db3cebb4b249812c0c9908abf5 --- .gitignore | 3 +- doxygen/DoxyWarnLogfile.txt | 230 ++ doxygen/DoxyWarnLogfile.txt.meta | 7 + doxygen/Doxyfile | 2857 +++++++++++++++++ doxygen/Doxyfile.meta | 7 + doxygen/DoxygenLayout.xml | 226 ++ doxygen/DoxygenLayout.xml.meta | 7 + doxygen/custom_doxygen.css | 12 + doxygen/custom_doxygen.css.meta | 7 + doxygen/images.meta | 8 + doxygen/images/PasserLifeLogoRight1_300.png | Bin 0 -> 10323 bytes .../images/PasserLifeLogoRight1_300.png.meta | 117 + 12 files changed, 3480 insertions(+), 1 deletion(-) create mode 100644 doxygen/DoxyWarnLogfile.txt create mode 100644 doxygen/DoxyWarnLogfile.txt.meta create mode 100644 doxygen/Doxyfile create mode 100644 doxygen/Doxyfile.meta create mode 100644 doxygen/DoxygenLayout.xml create mode 100644 doxygen/DoxygenLayout.xml.meta create mode 100644 doxygen/custom_doxygen.css create mode 100644 doxygen/custom_doxygen.css.meta create mode 100644 doxygen/images.meta create mode 100644 doxygen/images/PasserLifeLogoRight1_300.png create mode 100644 doxygen/images/PasserLifeLogoRight1_300.png.meta diff --git a/.gitignore b/.gitignore index a761032..433de33 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -doxygen \ No newline at end of file +doxygen/html +doxygen/html.meta diff --git a/doxygen/DoxyWarnLogfile.txt b/doxygen/DoxyWarnLogfile.txt new file mode 100644 index 0000000..14f5b84 --- /dev/null +++ b/doxygen/DoxyWarnLogfile.txt @@ -0,0 +1,230 @@ +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Angle.cs:294: warning: Member pi (variable) of class LinearAlgebra.Angles is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Direction.cs:76: warning: Member ToString() (function) of struct LinearAlgebra.Direction is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Direction.cs:223: warning: Member Equals(object obj) (function) of struct LinearAlgebra.Direction is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Direction.cs:234: warning: Member GetHashCode() (function) of struct LinearAlgebra.Direction is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Direction.cs:191: warning: Member operator-(Direction d) (function) of struct LinearAlgebra.Direction is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Direction.cs:239: warning: Member UnsignedAngle(Direction d1, Direction d2) (function) of struct LinearAlgebra.Direction is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:12: warning: Unsupported xml/html tag found +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:75: warning: Member ToVector3() (function) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:92: warning: Member ToVector3() (function) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:111: warning: Member ToString() (function) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:151: warning: Member Equals(object o) (function) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:157: warning: Member GetHashCode() (function) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:43: warning: Member Radians(float distance, float horizontal, float vertical) (function) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:69: warning: Member FromVector3(Vector3 v) (function) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:81: warning: Member FromVector3(Vector3Float v) (function) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:128: warning: Member operator+(Spherical s1, Spherical s2) (function) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:138: warning: Member operator*(Spherical v, float d) (function) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:143: warning: Member operator==(Spherical v1, Spherical v2) (function) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:147: warning: Member operator!=(Spherical v1, Spherical v2) (function) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:161: warning: Member Distance(Spherical v1, Spherical v2) (function) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:187: warning: Member Average(Spherical v1, Spherical v2) (function) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:240: warning: Member Sum(List< Spherical > vectors) (function) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:256: warning: Member Average(List< Spherical > vectors) (function) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:116: warning: Member magnitude (property) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:118: warning: Member normalized (property) of struct LinearAlgebra.Spherical is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:16: warning: Member SwingTwist(Direction swing, AngleFloat twist) (function) of struct LinearAlgebra.SwingTwist is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:55: warning: Member ToAngleAxis() (function) of struct LinearAlgebra.SwingTwist is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:81: warning: Member ToQuaternion() (function) of struct LinearAlgebra.SwingTwist is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:93: warning: Member ToAngleAxis() (function) of struct LinearAlgebra.SwingTwist is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:119: warning: Member ToQuaternion() (function) of struct LinearAlgebra.SwingTwist is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:64: warning: Member FromAngleAxis(Spherical r) (function) of struct LinearAlgebra.SwingTwist is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:102: warning: Member FromAngleAxis(Spherical r) (function) of struct LinearAlgebra.SwingTwist is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:127: warning: Member FromQuat32(Quat32 q32) (function) of struct LinearAlgebra.SwingTwist is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:13: warning: Member swing (variable) of struct LinearAlgebra.SwingTwist is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:14: warning: Member twist (variable) of struct LinearAlgebra.SwingTwist is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:218: warning: Member SqrMagnitudeOf(Vector2Float v) (function) of struct LinearAlgebra.Vector2Float is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:227: warning: Member MagnitudeOf(Vector2Float v) (function) of struct LinearAlgebra.Vector2Float is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:244: warning: Member Normalize(Vector2Float v) (function) of struct LinearAlgebra.Vector2Float is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:428: warning: Member UnsignedAngle(Vector2Float from, Vector2Float to) (function) of struct LinearAlgebra.Vector2Float is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:335: warning: argument 'v1' from the argument list of LinearAlgebra.Vector2Float.operator== has multiple @param documentation sections +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:407: warning: argument 'axis' of command @param is not found in the argument list of LinearAlgebra.Vector2Float::SignedAngle(Vector2Float from, Vector2Float to) +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:102: warning: Member Vector3Float(Vector3Int v) (function) of struct LinearAlgebra.Vector3Float is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:122: warning: Member ToString() (function) of struct LinearAlgebra.Vector3Float is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:282: warning: Member Equals(object obj) (function) of struct LinearAlgebra.Vector3Float is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:289: warning: Member GetHashCode() (function) of struct LinearAlgebra.Vector3Float is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:108: warning: Member FromSpherical(Spherical s) (function) of struct LinearAlgebra.Vector3Float is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:256: warning: Member operator*(Vector3Float v1, float d) (function) of struct LinearAlgebra.Vector3Float is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:261: warning: Member operator*(float d, Vector3Float v1) (function) of struct LinearAlgebra.Vector3Float is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:266: warning: Member operator/(Vector3Float v1, float d) (function) of struct LinearAlgebra.Vector3Float is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:274: warning: Member operator==(Vector3Float v1, Vector3Float v2) (function) of struct LinearAlgebra.Vector3Float is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:278: warning: Member operator!=(Vector3Float v1, Vector3Float v2) (function) of struct LinearAlgebra.Vector3Float is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:31: warning: Member Vector3Int(int horizontal, int vertical, int depth) (function) of struct LinearAlgebra.Vector3Int is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:182: warning: Member Equals(Vector3Int v) (function) of struct LinearAlgebra.Vector3Int is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:184: warning: Member Equals(object obj) (function) of struct LinearAlgebra.Vector3Int is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:199: warning: Member GetHashCode() (function) of struct LinearAlgebra.Vector3Int is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:167: warning: Member operator*(Vector3Int v1, int d) (function) of struct LinearAlgebra.Vector3Int is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:172: warning: Member operator*(int d, Vector3Int v1) (function) of struct LinearAlgebra.Vector3Int is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:177: warning: Member operator/(Vector3Int v1, int d) (function) of struct LinearAlgebra.Vector3Int is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:191: warning: Member operator==(Vector3Int v1, Vector3Int v2) (function) of struct LinearAlgebra.Vector3Int is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:195: warning: Member operator!=(Vector3Int v1, Vector3Int v2) (function) of struct LinearAlgebra.Vector3Int is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/test/Vector2FloatTest.cs:5: warning: Member Vector2 (typedef) of namespace LinearAlgebra.Test is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/test/Vector3FloatTest.cs:5: warning: Member Vector3 (typedef) of namespace LinearAlgebra.Test is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:215: warning: Member Clone(ClusterPrefab parent) (function) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:239: warning: Member ShallowCloneTo(Cluster parent) (function) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:428: warning: Member TryGetNucleus(string nucleusName, out Nucleus foundNucleus) (function) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:440: warning: Member GetNucleus(string nucleusName) (function) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:476: warning: Member CollectReceivers() (function) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:493: warning: Member UpdateFromNucleus(Nucleus startNucleus) (function) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:516: warning: Member UpdateStateIsolated() (function) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:293: warning: Member GetNucleusIndex(List< Nucleus > nuclei, Nucleus nucleus) (function) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:306: warning: Member prefab (variable) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:310: warning: Member clusterNuclei (variable) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:313: warning: Member sortedNuclei (variable) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:316: warning: Member _inputs (variable) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:332: warning: Member computeOrders (variable) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:285: warning: Member GetNucleusIndex(Nucleus[] nuclei, Nucleus nucleus) (function) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:414: warning: Member _outputs (variable) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:317: warning: Member inputs (property) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:407: warning: Member defaultOutput (property) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:415: warning: Member outputs (property) of class NanoBrain.Cluster is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:79: warning: Member EnsureInitialization() (function) of class NanoBrain.ClusterPrefab is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:85: warning: Member GarbageCollection() (function) of class NanoBrain.ClusterPrefab is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:93: warning: Member MarkNuclei(HashSet< Nucleus > visitedNuclei, Nucleus nucleus) (function) of class NanoBrain.ClusterPrefab is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:124: warning: Member UpdateNuclei() (function) of class NanoBrain.ClusterPrefab is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:129: warning: Member GetNucleusIndex(Nucleus receiver) (function) of class NanoBrain.ClusterPrefab is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:26: warning: Member inputs (property) of class NanoBrain.ClusterPrefab is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:45: warning: Member outputs (property) of class NanoBrain.ClusterPrefab is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:24: warning: Unsupported xml/html tag found +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:24: warning: Unsupported xml/html tag found +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:18: warning: Unsupported xml/html tag found +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:18: warning: Unsupported xml/html tag found +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:15: warning: Member MemoryCell(ClusterPrefab cluster, string name) (function) of class NanoBrain.MemoryCell is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:16: warning: Member MemoryCell(Cluster parent, string name) (function) of class NanoBrain.MemoryCell is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:28: warning: Member ShallowCloneTo(Cluster newParent) (function) of class NanoBrain.MemoryCell is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:45: warning: Member UpdateStateIsolated() (function) of class NanoBrain.MemoryCell is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:83: warning: Member GenerateCurve() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:270: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:311: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:277: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:318: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:285: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:327: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:439: warning: Member AddReceiver(Nucleus receiverToAdd, float weight=1) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:444: warning: Member RemoveReceiver(Nucleus receiverToRemove) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:469: warning: Member ProcessStimulusDirect(Vector3 inputValue, int thingId=0, string thingName=null) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:218: warning: Member Delete(Nucleus nucleus) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:18: warning: Member staticMemory (variable) of class NanoBrain.MemoryCell is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:72: warning: Member _curvePreset (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:80: warning: Member curve (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:81: warning: Member curveMax (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:179: warning: Member WhenFiring (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:185: warning: Member stale (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:186: warning: Member staleValueForSleep (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:209: warning: Member CloneFields(Neuron clone) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:358: warning: Member ActivatorLinear(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:397: warning: Member ActivatorLinear(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:362: warning: Member ActivatorSqrt(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:401: warning: Member ActivatorSqrt(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:367: warning: Member ActivatorPower(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:406: warning: Member ActivatorPower(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:372: warning: Member ActivatorReciprocal(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:411: warning: Member ActivatorReciprocal(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:381: warning: Member ActivatorCustom(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:420: warning: Member ActivatorCustom(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:151: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:165: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:19: warning: Member isSleeping (property) of class NanoBrain.MemoryCell is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:73: warning: Member curvePreset (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:152: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:166: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:160: warning: Member outputMagnitude (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:161: warning: Member outputSqrMagnitude (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:178: warning: Member isFiring (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:263: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:304: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:350: warning: Member Activator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:389: warning: Member Activator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:434: warning: Member receivers (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:83: warning: Member GenerateCurve() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:254: warning: Member UpdateStateIsolated() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:270: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:277: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:285: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:311: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:318: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:327: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:439: warning: Member AddReceiver(Nucleus receiverToAdd, float weight=1) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:444: warning: Member RemoveReceiver(Nucleus receiverToRemove) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:469: warning: Member ProcessStimulusDirect(Vector3 inputValue, int thingId=0, string thingName=null) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:218: warning: Member Delete(Nucleus nucleus) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:72: warning: Member _curvePreset (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:80: warning: Member curve (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:81: warning: Member curveMax (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:179: warning: Member WhenFiring (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:185: warning: Member stale (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:186: warning: Member staleValueForSleep (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:209: warning: Member CloneFields(Neuron clone) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:358: warning: Member ActivatorLinear(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:362: warning: Member ActivatorSqrt(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:367: warning: Member ActivatorPower(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:372: warning: Member ActivatorReciprocal(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:381: warning: Member ActivatorCustom(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:397: warning: Member ActivatorLinear(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:401: warning: Member ActivatorSqrt(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:406: warning: Member ActivatorPower(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:411: warning: Member ActivatorReciprocal(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:420: warning: Member ActivatorCustom(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:151: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:165: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:73: warning: Member curvePreset (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:152: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:160: warning: Member outputMagnitude (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:161: warning: Member outputSqrMagnitude (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:166: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:178: warning: Member isFiring (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:182: warning: Member isSleeping (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:263: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:304: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:350: warning: Member Activator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:389: warning: Member Activator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:434: warning: Member receivers (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:189: warning: argument 'parent' of command @param is not found in the argument list of NanoBrain.Neuron::ShallowCloneTo(Cluster newParent) +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:189: warning: The following parameter of NanoBrain.Neuron.ShallowCloneTo(Cluster newParent) is not documented: + parameter 'newParent' +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/NucleusArray.cs:83: warning: Member thingReceivers (variable) of class NanoBrain.NucleusArray is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/NucleusArray.cs:22: warning: Member nuclei (property) of class NanoBrain.NucleusArray is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Receptor.cs:81: warning: Member UpdateStateIsolated() (function) of class NanoBrain.Receptor is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:83: warning: Member GenerateCurve() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:270: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:311: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:277: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:318: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:285: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:327: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:439: warning: Member AddReceiver(Nucleus receiverToAdd, float weight=1) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:444: warning: Member RemoveReceiver(Nucleus receiverToRemove) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:469: warning: Member ProcessStimulusDirect(Vector3 inputValue, int thingId=0, string thingName=null) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:218: warning: Member Delete(Nucleus nucleus) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:72: warning: Member _curvePreset (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:80: warning: Member curve (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:81: warning: Member curveMax (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:179: warning: Member WhenFiring (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:185: warning: Member stale (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:186: warning: Member staleValueForSleep (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:209: warning: Member CloneFields(Neuron clone) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:358: warning: Member ActivatorLinear(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:397: warning: Member ActivatorLinear(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:362: warning: Member ActivatorSqrt(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:401: warning: Member ActivatorSqrt(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:367: warning: Member ActivatorPower(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:406: warning: Member ActivatorPower(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:372: warning: Member ActivatorReciprocal(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:411: warning: Member ActivatorReciprocal(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:381: warning: Member ActivatorCustom(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:420: warning: Member ActivatorCustom(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:151: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:165: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Receptor.cs:60: warning: Member array (property) of class NanoBrain.Receptor is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:73: warning: Member curvePreset (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:152: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:166: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:160: warning: Member outputMagnitude (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:161: warning: Member outputSqrMagnitude (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:178: warning: Member isFiring (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:182: warning: Member isSleeping (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:263: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:304: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:350: warning: Member Activator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:389: warning: Member Activator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:434: warning: Member receivers (property) of class NanoBrain.Neuron is not documented. diff --git a/doxygen/DoxyWarnLogfile.txt.meta b/doxygen/DoxyWarnLogfile.txt.meta new file mode 100644 index 0000000..353ba7c --- /dev/null +++ b/doxygen/DoxyWarnLogfile.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7dc89c04dff68449ba4bedd238f53e26 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/doxygen/Doxyfile b/doxygen/Doxyfile new file mode 100644 index 0000000..3462c59 --- /dev/null +++ b/doxygen/Doxyfile @@ -0,0 +1,2857 @@ +# Doxyfile 1.9.8 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "Nano Brain for Unity" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = v0.1 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = images/PasserLifeLogoRight1_300.png + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = html + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = YES + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:^^" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = YES + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 2 + +# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to +# generate identifiers for the Markdown headings. Note: Every identifier is +# unique. +# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a +# sequence number starting at 0 and GITHUB use the lower case version of title +# with any whitespace replaced by '-' and punctuation characters removed. +# The default value is: DOXYGEN. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +MARKDOWN_ID_STYLE = DOXYGEN + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + +# If the TIMESTAMP tag is set different from NO then each generated page will +# contain the date or date and time when the page was generated. Setting this to +# NO can help when comparing the output of multiple runs. +# Possible values are: YES, NO, DATETIME and DATE. +# The default value is: NO. + +TIMESTAMP = NO + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = YES + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# declarations. If set to NO, these declarations will be included in the +# documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = YES + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = NO + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = NO + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = DoxygenLayout.xml + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about +# undocumented enumeration values. If set to NO, doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then doxygen behaves +# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined doxygen will not +# write the warning messages in between other messages but write them at the end +# of a run, in case a WARN_LOGFILE is defined the warning messages will be +# besides being in the defined file also be shown at the end of a run, unless +# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case +# the behavior will remain as with the setting FAIL_ON_WARNINGS. +# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). + +WARN_LOGFILE = DoxyWarnLogfile.txt + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = .. + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, +# *.cpp, *.cppm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, +# *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, *.php, +# *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be +# provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f \ + *.for \ + *.tcl \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# ANamespace::AClass, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = images + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: +# http://clang.llvm.org/) for more accurate parsing at the cost of reduced +# performance. This can be particularly helpful with template rich C++ code for +# which doxygen's built-in parser lacks the necessary type information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS +# tag is set to YES then doxygen will add the directory of each input to the +# include path. +# The default value is: YES. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_ADD_INC_PATHS = YES + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +# If clang assisted parsing is enabled you can provide the clang parser with the +# path to the directory containing a file called compile_commands.json. This +# file is the compilation database (see: +# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the +# options used when the source files were built. This is equivalent to +# specifying the -p option to a clang tool, such as clang-check. These options +# will then be passed to the parser. Any options specified with CLANG_OPTIONS +# will be added as well. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. + +CLANG_DATABASE_PATH = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = . + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = custom_doxygen.css + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generate light mode output, DARK always +# generate dark mode output, AUTO_LIGHT automatically set the mode according to +# the user preference, use light mode if no preference is set (the default), +# AUTO_DARK automatically set the mode according to the user preference, use +# dark mode if no preference is set and TOGGLE allow to user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = LIGHT + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a color-wheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 35 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use gray-scales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 0 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 103 + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be +# dynamically folded and expanded in the generated HTML source code. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_CODE_FOLDING = YES + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the main .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# The SITEMAP_URL tag is used to specify the full URL of the place where the +# generated documentation will be placed on the server by the user during the +# deployment of the documentation. The generated sitemap is called sitemap.xml +# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL +# is specified no sitemap is generated. For information about the sitemap +# protocol see https://www.sitemaps.org +# This tag requires that the tag GENERATE_HTML is set to YES. + +SITEMAP_URL = + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /Node, +# Edge and Graph Attributes specification You need to make sure dot is able +# to find the font, which can be done by putting it in a standard location or by +# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. Default graphviz fontsize is 14. +# The default value is: fontname=Helvetica,fontsize=10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" + +# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can +# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about +# arrows shapes. +# The default value is: labelfontname=Helvetica,labelfontsize=10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" + +# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes +# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification +# The default value is: shape=box,height=0.2,width=0.4. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" + +# You can set the path where dot can find font specified with fontname in +# DOT_COMMON_ATTR and others dot attributes. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTPATH = + +# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then doxygen will +# generate a graph for each documented class showing the direct and indirect +# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and +# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case +# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the +# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used. +# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance +# relations will be shown as texts / links. +# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN. +# The default value is: YES. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a +# graph for each documented class showing the direct and indirect implementation +# dependencies (inheritance, containment, and class references variables) of the +# class with other documented classes. Explicit enabling a collaboration graph, +# when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the +# command \collaborationgraph. Disabling a collaboration graph can be +# accomplished by means of the command \hidecollaborationgraph. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for +# groups, showing the direct groups dependencies. Explicit enabling a group +# dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means +# of the command \groupgraph. Disabling a directory graph can be accomplished by +# means of the command \hidegroupgraph. See also the chapter Grouping in the +# manual. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside the +# class node. If there are many fields or methods and many nodes the graph may +# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the +# number of items for each type to make the size more manageable. Set this to 0 +# for no limit. Note that the threshold may be exceeded by 50% before the limit +# is enforced. So when you set the threshold to 10, up to 15 fields may appear, +# but if the number exceeds 15, the total amount of fields shown is limited to +# 10. +# Minimum value: 0, maximum value: 100, default value: 10. +# This tag requires that the tag UML_LOOK is set to YES. + +UML_LIMIT_NUM_FIELDS = 10 + +# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and +# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS +# tag is set to YES, doxygen will add type and arguments for attributes and +# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen +# will not generate fields with class member information in the UML graphs. The +# class diagrams will look similar to the default class diagrams but using UML +# notation for the relationships. +# Possible values are: NO, YES and NONE. +# The default value is: NO. +# This tag requires that the tag UML_LOOK is set to YES. + +DOT_UML_DETAILS = NO + +# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters +# to display on a single line. If the actual line length exceeds this threshold +# significantly it will wrapped across multiple lines. Some heuristics are apply +# to avoid ugly line breaks. +# Minimum value: 0, maximum value: 1000, default value: 17. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_WRAP_THRESHOLD = 17 + +# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and +# collaboration graphs will show the relations between templates and their +# instances. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +TEMPLATE_RELATIONS = NO + +# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to +# YES then doxygen will generate a graph for each documented file showing the +# direct and indirect include dependencies of the file with other documented +# files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO, +# can be accomplished by means of the command \includegraph. Disabling an +# include graph can be accomplished by means of the command \hideincludegraph. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDE_GRAPH = YES + +# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are +# set to YES then doxygen will generate a graph for each documented file showing +# the direct and indirect include dependencies of the file with other documented +# files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set +# to NO, can be accomplished by means of the command \includedbygraph. Disabling +# an included by graph can be accomplished by means of the command +# \hideincludedbygraph. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH tag is set to YES then doxygen will generate a call +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. Disabling a call graph can be +# accomplished by means of the command \hidecallgraph. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. Disabling a caller graph can be +# accomplished by means of the command \hidecallergraph. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical +# hierarchy of all classes instead of a textual one. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the +# dependencies a directory has on other directories in a graphical way. The +# dependency relations are determined by the #include relations between the +# files in the directories. Explicit enabling a directory graph, when +# DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command +# \directorygraph. Disabling a directory graph can be accomplished by means of +# the command \hidedirectorygraph. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +DIRECTORY_GRAPH = YES + +# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels +# of child directories generated in directory dependency graphs by dot. +# Minimum value: 1, maximum value: 25, default value: 1. +# This tag requires that the tag DIRECTORY_GRAPH is set to YES. + +DIR_GRAPH_MAX_DEPTH = 1 + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. For an explanation of the image formats see the section +# output formats in the documentation of the dot tool (Graphviz (see: +# https://www.graphviz.org/)). +# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order +# to make the SVG files visible in IE 9+ (other browsers do not have this +# requirement). +# Possible values are: png, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, +# gif, gif:cairo, gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, +# png:cairo, png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and +# png:gdiplus:gdiplus. +# The default value is: png. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# +# Note that this requires a modern browser other than Internet Explorer. Tested +# and working are Firefox, Chrome, Safari, and Opera. +# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make +# the SVG files visible. Older versions of IE do not have SVG support. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +INTERACTIVE_SVG = NO + +# The DOT_PATH tag can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the \dotfile +# command). +# This tag requires that the tag HAVE_DOT is set to YES. + +DOTFILE_DIRS = + +# You can include diagrams made with dia in doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. + +DIA_PATH = + +# The DIAFILE_DIRS tag can be used to specify one or more directories that +# contain dia files that are included in the documentation (see the \diafile +# command). + +DIAFILE_DIRS = + +# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the +# path where java can find the plantuml.jar file or to the filename of jar file +# to be used. If left blank, it is assumed PlantUML is not used or called during +# a preprocessing step. Doxygen will generate a warning when it encounters a +# \startuml command in this case and will not generate output for the diagram. + +PLANTUML_JAR_PATH = + +# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a +# configuration file for plantuml. + +PLANTUML_CFG_FILE = + +# When using plantuml, the specified paths are searched for files specified by +# the !include statement in a plantuml block. + +PLANTUML_INCLUDE_PATH = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes +# that will be shown in the graph. If the number of nodes in a graph becomes +# larger than this value, doxygen will truncate the graph, which is visualized +# by representing a node as a red box. Note that doxygen if the number of direct +# children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that +# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. +# Minimum value: 0, maximum value: 10000, default value: 50. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs +# generated by dot. A depth value of 3 means that only nodes reachable from the +# root by following a path via at most 3 edges will be shown. Nodes that lay +# further from the root node will be omitted. Note that setting this option to 1 +# or 2 may greatly reduce the computation time needed for large code bases. Also +# note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. +# Minimum value: 0, maximum value: 1000, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) support +# this, this feature is disabled by default. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page +# explaining the meaning of the various boxes and arrows in the dot generated +# graphs. +# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal +# graphical representation for inheritance and collaboration diagrams is used. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate +# files that are used to generate the various graphs. +# +# Note: This setting is not only used for dot files but also for msc temporary +# files. +# The default value is: YES. + +DOT_CLEANUP = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. If the MSCGEN_TOOL tag is left empty (the default), then doxygen will +# use a built-in version of mscgen tool to produce the charts. Alternatively, +# the MSCGEN_TOOL tag can also specify the name an external tool. For instance, +# specifying prog as the value, doxygen will call the tool as prog -T +# -o . The external tool should support +# output file formats "png", "eps", "svg", and "ismap". + +MSCGEN_TOOL = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). + +MSCFILE_DIRS = diff --git a/doxygen/Doxyfile.meta b/doxygen/Doxyfile.meta new file mode 100644 index 0000000..bb9123d --- /dev/null +++ b/doxygen/Doxyfile.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d29141d97962eadb0987dd94469775b2 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/doxygen/DoxygenLayout.xml b/doxygen/DoxygenLayout.xml new file mode 100644 index 0000000..e63fba1 --- /dev/null +++ b/doxygen/DoxygenLayout.xml @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doxygen/DoxygenLayout.xml.meta b/doxygen/DoxygenLayout.xml.meta new file mode 100644 index 0000000..ba34775 --- /dev/null +++ b/doxygen/DoxygenLayout.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 250d7b61d86d1ead9be28587fc4e458e +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/doxygen/custom_doxygen.css b/doxygen/custom_doxygen.css new file mode 100644 index 0000000..b921a4d --- /dev/null +++ b/doxygen/custom_doxygen.css @@ -0,0 +1,12 @@ +/* Custom PasserVR CSS for DoxyGen */ + +a { + color: #e77505; +} +.contents a:visited { + color: #e77505; +} + +a:hover { + color: #10659C; +} \ No newline at end of file diff --git a/doxygen/custom_doxygen.css.meta b/doxygen/custom_doxygen.css.meta new file mode 100644 index 0000000..4fe89de --- /dev/null +++ b/doxygen/custom_doxygen.css.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d92f804eea6cfae5cbe26f54f689b2e3 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/doxygen/images.meta b/doxygen/images.meta new file mode 100644 index 0000000..42f81d7 --- /dev/null +++ b/doxygen/images.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 06bd8b52933667685b66deb631ec8a25 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/doxygen/images/PasserLifeLogoRight1_300.png b/doxygen/images/PasserLifeLogoRight1_300.png new file mode 100644 index 0000000000000000000000000000000000000000..7480553ab1bdec3bbcef46bae92a68325334b6f3 GIT binary patch literal 10323 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 F{|DE2^oRfe literal 0 HcmV?d00001 diff --git a/doxygen/images/PasserLifeLogoRight1_300.png.meta b/doxygen/images/PasserLifeLogoRight1_300.png.meta new file mode 100644 index 0000000..d1bbafe --- /dev/null +++ b/doxygen/images/PasserLifeLogoRight1_300.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: dfc7821ba4ea2748fbaa8a48f2434609 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: From 6fab0a35cf17da09c38115d9ca571289012f287c Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Wed, 8 Apr 2026 09:40:33 +0200 Subject: [PATCH 09/38] Fix brain namespaces --- Samples/Brain/Foraging.asset | 2358 +++++++++++++++++----------------- 1 file changed, 1179 insertions(+), 1179 deletions(-) diff --git a/Samples/Brain/Foraging.asset b/Samples/Brain/Foraging.asset index 430b8c7..25529d8 100644 --- a/Samples/Brain/Foraging.asset +++ b/Samples/Brain/Foraging.asset @@ -1,1179 +1,1179 @@ -%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: Foraging - m_EditorClassIdentifier: Assembly-CSharp::ClusterPrefab - nuclei: - - rid: 5479437209301418101 - - rid: 5479437233826299911 - - rid: 5479437233826299913 - - rid: 5479437301218279525 - - rid: 5479437301218279531 - - rid: 5479437301218279533 - - rid: 5479437301218279535 - - rid: 5479437321628549179 - - rid: 5479437321628549183 - - rid: 5479437321628549189 - - rid: 5479437344462864575 - - rid: 5479437344462864598 - - rid: 5479437349790417078 - - rid: 5479437349790417080 - - rid: 5479437349790417084 - - rid: 5479437349790417088 - - rid: 2262690603760877647 - - rid: 2262690603760877698 - - rid: 2262690603760877722 - - rid: 2262690603760877723 - - rid: 2262690603760877724 - - rid: 2262690603760877753 - - rid: 2262690603760877783 - - rid: 2262690603760877784 - - rid: 2262690603760877785 - - rid: 2262690603760877786 - references: - version: 2 - RefIds: - - rid: -2 - type: {class: , ns: , asm: } - - rid: 2262690603760877647 - type: {class: Receptor, ns: , asm: Assembly-CSharp} - data: - name: Food Receptor - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877783 - _array: - rid: 2262690603760877648 - - rid: 2262690603760877648 - type: {class: NucleusArray, ns: , asm: Assembly-CSharp} - data: - _nuclei: - - rid: 2262690603760877647 - - rid: 2262690603760877784 - - rid: 2262690603760877785 - - rid: 2262690603760877786 - - rid: 2262690603760877698 - type: {class: Receptor, ns: , asm: Assembly-CSharp} - data: - name: Home Receptor - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877753 - _array: - rid: 2262690603760877699 - - rid: 2262690603760877699 - type: {class: NucleusArray, ns: , asm: Assembly-CSharp} - data: - _nuclei: - - rid: 2262690603760877698 - - rid: 2262690603760877722 - - rid: 2262690603760877723 - - rid: 2262690603760877724 - - rid: 2262690603760877722 - type: {class: Receptor, ns: , asm: Assembly-CSharp} - data: - name: 'Home Receptor: 1' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877753 - _array: - rid: 2262690603760877699 - - rid: 2262690603760877723 - type: {class: Receptor, ns: , asm: Assembly-CSharp} - data: - name: 'Home Receptor: 2' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877753 - _array: - rid: 2262690603760877699 - - rid: 2262690603760877724 - type: {class: Receptor, ns: , asm: Assembly-CSharp} - data: - name: 'Home Receptor: 3' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877753 - _array: - rid: 2262690603760877699 - - rid: 2262690603760877753 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Home Smell - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 2262690603760877698 - weight: 1 - - neuron: - rid: 2262690603760877722 - weight: 1 - - neuron: - rid: 2262690603760877723 - weight: 1 - - neuron: - rid: 2262690603760877724 - weight: 1 - combinator: 0 - _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 - _receivers: - - rid: 5479437349790417084 - - rid: 2262690603760877783 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Food Smell - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 2262690603760877647 - weight: 1 - - neuron: - rid: 2262690603760877784 - weight: 1 - - neuron: - rid: 2262690603760877785 - weight: 1 - - neuron: - rid: 2262690603760877786 - weight: 1 - combinator: 0 - _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 - _receivers: - - rid: 5479437349790417078 - - rid: 2262690603760877784 - type: {class: Receptor, ns: , asm: Assembly-CSharp} - data: - name: 'Food Receptor: 1' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877783 - _array: - rid: 2262690603760877648 - - rid: 2262690603760877785 - type: {class: Receptor, ns: , asm: Assembly-CSharp} - data: - name: 'Food Receptor: 2' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877783 - _array: - rid: 2262690603760877648 - - rid: 2262690603760877786 - type: {class: Receptor, ns: , asm: Assembly-CSharp} - data: - name: 'Food Receptor: 3' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877783 - _array: - rid: 2262690603760877648 - - rid: 5479437209301418101 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Output - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 5479437344462864575 - weight: 4 - - neuron: - rid: 5479437344462864598 - weight: 1 - - neuron: - rid: 5479437349790417078 - weight: 1 - - neuron: - rid: 5479437349790417084 - weight: 1 - combinator: 0 - _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 - _receivers: [] - - rid: 5479437233826299911 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Hit Left - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 5479437344462864575 - - rid: 5479437301218279533 - - rid: 5479437233826299913 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Hit Right - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 5479437344462864575 - - rid: 5479437301218279533 - - rid: 5479437301218279525 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Home Pheromones - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0.5, y: 0.5, z: 0.5} - _synapses: - - neuron: - rid: 5479437301218279531 - weight: 1 - - neuron: - rid: 5479437321628549179 - weight: 1 - combinator: 1 - _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 - _receivers: [] - - rid: 5479437301218279531 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Beat - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 5479437301218279525 - - rid: 5479437301218279535 - - rid: 5479437301218279533 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Mouth - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 5479437233826299911 - weight: 1 - - neuron: - rid: 5479437233826299913 - weight: 1 - combinator: 0 - _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 - _receivers: [] - - rid: 5479437301218279535 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Food Pheromones - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 1, y: 1, z: 1} - _synapses: - - neuron: - rid: 5479437301218279531 - weight: 1 - - neuron: - rid: 5479437321628549183 - weight: 1 - combinator: 1 - _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 - _receivers: [] - - rid: 5479437321628549179 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Looking for food - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0.5, y: 0.5, z: 0.5} - _synapses: - - neuron: - rid: 5479437321628549189 - weight: -0.5 - combinator: 0 - _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 - _receivers: - - rid: 5479437301218279525 - - rid: 5479437321628549183 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Going home - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0.5, y: 0.5, z: 0.5} - _synapses: - - neuron: - rid: 5479437321628549189 - weight: 0.5 - combinator: 0 - _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 - _receivers: - - rid: 5479437301218279535 - - rid: 5479437321628549189 - type: {class: MemoryCell, ns: , asm: Assembly-CSharp} - data: - name: Having Food - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 5479437321628549179 - - rid: 5479437321628549183 - - rid: 5479437349790417088 - - rid: 5479437349790417080 - staticMemory: 1 - - rid: 5479437344462864575 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Collision Steering - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 5479437233826299911 - weight: -1 - - neuron: - rid: 5479437233826299913 - weight: -1 - combinator: 0 - _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 - _receivers: - - rid: 5479437209301418101 - - rid: 5479437344462864598 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Pheromone Steering - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 5479437209301418101 - - rid: 5479437349790417078 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Food steering - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 1, y: 1, z: 1} - _synapses: - - neuron: - rid: 5479437349790417080 - weight: 1 - - neuron: - rid: 2262690603760877783 - weight: 1 - combinator: 1 - _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 - _receivers: - - rid: 5479437209301418101 - - rid: 5479437349790417080 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Have no food - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0.5, y: 0.5, z: 0.5} - _synapses: - - neuron: - rid: 5479437321628549189 - weight: -0.5 - combinator: 0 - _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 - _receivers: - - rid: 5479437349790417078 - - rid: 5479437349790417084 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Home steering - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 1, y: 1, z: 1} - _synapses: - - neuron: - rid: 5479437349790417088 - weight: 1 - - neuron: - rid: 2262690603760877753 - weight: 1 - combinator: 1 - _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 - _receivers: - - rid: 5479437209301418101 - - rid: 5479437349790417088 - type: {class: Neuron, ns: , asm: Assembly-CSharp} - data: - name: Have Food - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0.5, y: 0.5, z: 0.5} - _synapses: - - neuron: - rid: 5479437321628549189 - weight: 0.5 - combinator: 0 - _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 - _receivers: - - rid: 5479437349790417084 +%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: Foraging + m_EditorClassIdentifier: Assembly-CSharp::ClusterPrefab + nuclei: + - rid: 5479437209301418101 + - rid: 5479437233826299911 + - rid: 5479437233826299913 + - rid: 5479437301218279525 + - rid: 5479437301218279531 + - rid: 5479437301218279533 + - rid: 5479437301218279535 + - rid: 5479437321628549179 + - rid: 5479437321628549183 + - rid: 5479437321628549189 + - rid: 5479437344462864575 + - rid: 5479437344462864598 + - rid: 5479437349790417078 + - rid: 5479437349790417080 + - rid: 5479437349790417084 + - rid: 5479437349790417088 + - rid: 2262690603760877647 + - rid: 2262690603760877698 + - rid: 2262690603760877722 + - rid: 2262690603760877723 + - rid: 2262690603760877724 + - rid: 2262690603760877753 + - rid: 2262690603760877783 + - rid: 2262690603760877784 + - rid: 2262690603760877785 + - rid: 2262690603760877786 + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: NanoBrain, asm: } + - rid: 2262690603760877647 + type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Food Receptor + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690603760877783 + _array: + rid: 2262690603760877648 + - rid: 2262690603760877648 + type: {class: NucleusArray, ns: NanoBrain, asm: Assembly-CSharp} + data: + _nuclei: + - rid: 2262690603760877647 + - rid: 2262690603760877784 + - rid: 2262690603760877785 + - rid: 2262690603760877786 + - rid: 2262690603760877698 + type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Home Receptor + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690603760877753 + _array: + rid: 2262690603760877699 + - rid: 2262690603760877699 + type: {class: NucleusArray, ns: NanoBrain, asm: Assembly-CSharp} + data: + _nuclei: + - rid: 2262690603760877698 + - rid: 2262690603760877722 + - rid: 2262690603760877723 + - rid: 2262690603760877724 + - rid: 2262690603760877722 + type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: 'Home Receptor: 1' + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690603760877753 + _array: + rid: 2262690603760877699 + - rid: 2262690603760877723 + type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: 'Home Receptor: 2' + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690603760877753 + _array: + rid: 2262690603760877699 + - rid: 2262690603760877724 + type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: 'Home Receptor: 3' + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690603760877753 + _array: + rid: 2262690603760877699 + - rid: 2262690603760877753 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Home Smell + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 2262690603760877698 + weight: 1 + - neuron: + rid: 2262690603760877722 + weight: 1 + - neuron: + rid: 2262690603760877723 + weight: 1 + - neuron: + rid: 2262690603760877724 + weight: 1 + combinator: 0 + _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 + _receivers: + - rid: 5479437349790417084 + - rid: 2262690603760877783 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Food Smell + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 2262690603760877647 + weight: 1 + - neuron: + rid: 2262690603760877784 + weight: 1 + - neuron: + rid: 2262690603760877785 + weight: 1 + - neuron: + rid: 2262690603760877786 + weight: 1 + combinator: 0 + _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 + _receivers: + - rid: 5479437349790417078 + - rid: 2262690603760877784 + type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: 'Food Receptor: 1' + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690603760877783 + _array: + rid: 2262690603760877648 + - rid: 2262690603760877785 + type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: 'Food Receptor: 2' + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690603760877783 + _array: + rid: 2262690603760877648 + - rid: 2262690603760877786 + type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: 'Food Receptor: 3' + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690603760877783 + _array: + rid: 2262690603760877648 + - rid: 5479437209301418101 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Output + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 5479437344462864575 + weight: 4 + - neuron: + rid: 5479437344462864598 + weight: 1 + - neuron: + rid: 5479437349790417078 + weight: 1 + - neuron: + rid: 5479437349790417084 + weight: 1 + combinator: 0 + _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 + _receivers: [] + - rid: 5479437233826299911 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Hit Left + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 5479437344462864575 + - rid: 5479437301218279533 + - rid: 5479437233826299913 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Hit Right + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 5479437344462864575 + - rid: 5479437301218279533 + - rid: 5479437301218279525 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Home Pheromones + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0.5, y: 0.5, z: 0.5} + _synapses: + - neuron: + rid: 5479437301218279531 + weight: 1 + - neuron: + rid: 5479437321628549179 + weight: 1 + combinator: 1 + _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 + _receivers: [] + - rid: 5479437301218279531 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Beat + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 5479437301218279525 + - rid: 5479437301218279535 + - rid: 5479437301218279533 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Mouth + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 5479437233826299911 + weight: 1 + - neuron: + rid: 5479437233826299913 + weight: 1 + combinator: 0 + _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 + _receivers: [] + - rid: 5479437301218279535 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Food Pheromones + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 1, y: 1, z: 1} + _synapses: + - neuron: + rid: 5479437301218279531 + weight: 1 + - neuron: + rid: 5479437321628549183 + weight: 1 + combinator: 1 + _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 + _receivers: [] + - rid: 5479437321628549179 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Looking for food + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0.5, y: 0.5, z: 0.5} + _synapses: + - neuron: + rid: 5479437321628549189 + weight: -0.5 + combinator: 0 + _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 + _receivers: + - rid: 5479437301218279525 + - rid: 5479437321628549183 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Going home + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0.5, y: 0.5, z: 0.5} + _synapses: + - neuron: + rid: 5479437321628549189 + weight: 0.5 + combinator: 0 + _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 + _receivers: + - rid: 5479437301218279535 + - rid: 5479437321628549189 + type: {class: MemoryCell, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Having Food + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 5479437321628549179 + - rid: 5479437321628549183 + - rid: 5479437349790417088 + - rid: 5479437349790417080 + staticMemory: 1 + - rid: 5479437344462864575 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Collision Steering + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 5479437233826299911 + weight: -1 + - neuron: + rid: 5479437233826299913 + weight: -1 + combinator: 0 + _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 + _receivers: + - rid: 5479437209301418101 + - rid: 5479437344462864598 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Pheromone Steering + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 5479437209301418101 + - rid: 5479437349790417078 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Food steering + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 1, y: 1, z: 1} + _synapses: + - neuron: + rid: 5479437349790417080 + weight: 1 + - neuron: + rid: 2262690603760877783 + weight: 1 + combinator: 1 + _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 + _receivers: + - rid: 5479437209301418101 + - rid: 5479437349790417080 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Have no food + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0.5, y: 0.5, z: 0.5} + _synapses: + - neuron: + rid: 5479437321628549189 + weight: -0.5 + combinator: 0 + _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 + _receivers: + - rid: 5479437349790417078 + - rid: 5479437349790417084 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Home steering + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 1, y: 1, z: 1} + _synapses: + - neuron: + rid: 5479437349790417088 + weight: 1 + - neuron: + rid: 2262690603760877753 + weight: 1 + combinator: 1 + _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 + _receivers: + - rid: 5479437209301418101 + - rid: 5479437349790417088 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Have Food + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0.5, y: 0.5, z: 0.5} + _synapses: + - neuron: + rid: 5479437321628549189 + weight: 0.5 + combinator: 0 + _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 + _receivers: + - rid: 5479437349790417084 From dce7835dfc52f5050a429b9f7de43ecf8e2eeed5 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Wed, 8 Apr 2026 16:50:09 +0200 Subject: [PATCH 10/38] Improved animations --- CreatureControl/Runtime/Scripts/Creature.cs | 189 ++- Runtime/Scripts/Ant.cs | 58 +- Samples/Animation/AntAnimator.controller | 4 +- Samples/Foraging.unity | 1463 ++++++++++++++++--- 4 files changed, 1498 insertions(+), 216 deletions(-) diff --git a/CreatureControl/Runtime/Scripts/Creature.cs b/CreatureControl/Runtime/Scripts/Creature.cs index 12922f3..b2a7f85 100644 --- a/CreatureControl/Runtime/Scripts/Creature.cs +++ b/CreatureControl/Runtime/Scripts/Creature.cs @@ -23,8 +23,33 @@ namespace Passer.CreatureControl { /// public Quaternion targetToModelRotation; + public Animator animator; + + /// + /// The maximum height of objects from the ground which do not stop the creature + /// + public float stepOffset = 0.3F; + + /// + /// If there is not static object below the feet of the avatar the avatar will fall down until it reaches solid ground + /// + public bool useGravity = true; + [Range(0f, 1f)] + public float slopeAlignment = 0.3f; + + /// + /// The velocity caused by gravity + /// + [HideInInspector] + protected Vector3 fallSpeed; + #region Init + protected virtual void Awake() { + CheckColliders(); + } + + /// /// Ensure a target rig is available /// @@ -76,7 +101,7 @@ namespace Passer.CreatureControl { else // Oops! There are multiple renders with different parents.... Debug.LogWarning("Unclear model root"); - // We still return a model root, but this may not be the correct one... + // We still return a model root, but this may not be the correct one... } return this.model != null; } @@ -115,6 +140,16 @@ namespace Passer.CreatureControl { targetRig.transform.SetPositionAndRotation(this.transform.position, this.transform.rotation); } + // void OnAnimatorMove() { + // if (animator == null || creatureRigidbody == null || creatureRigidbody.isKinematic ) + // return; + + // Vector3 delta = animator.deltaPosition; + // Quaternion rot = animator.deltaRotation; + // creatureRigidbody.MovePosition(creatureRigidbody.position + delta); + // creatureRigidbody.MoveRotation(creatureRigidbody.rotation * rot); + // } + /// /// Update the pose of the creature using the target rig /// @@ -135,6 +170,158 @@ namespace Passer.CreatureControl { this.model.SetPositionAndRotation(newPosition, newOrientation); } + #region Collisions + + [HideInInspector] + public Rigidbody creatureRigidbody; + + [HideInInspector] + public CapsuleCollider bodyCollider; + [HideInInspector] + public float colliderToGround; + + private void CheckColliders() { + creatureRigidbody = this.GetComponent(); + + if (bodyCollider != null) + return; + + bodyCollider = this.GetComponent(); + + // Assuming transform.position.y is on the ground + if (bodyCollider != null) { + Vector3 centerWorld = transform.TransformPoint(bodyCollider.center); + colliderToGround = centerWorld.y - transform.position.y; + colliderToGround -= bodyCollider.direction switch { + 0 => bodyCollider.radius, + 1 => bodyCollider.height / 2, + _ => bodyCollider.radius + }; + } + } + + #endregion Collisions + + #region Ground + + /// + /// The ground Transform on which the pawn is standing + /// + /// When the pawn is not standing on the ground, the value is null + public Transform ground; + + protected readonly float rotationSmoothTime = 0.06f; + protected void CheckGrounded() { + Vector3 footBase = this.transform.position; + + float distance = GetDistanceToGround(stepOffset, out ground, out Vector3 groundNormal); + if (distance <= 0) { + // We are on or under the ground + this.fallSpeed = Vector3.zero; + if (distance <= -stepOffset) + Debug.Log($"d: {-distance}"); + // Ensure that we are on the ground again + if (creatureRigidbody != null && creatureRigidbody.isKinematic == false) { + float requiredV0 = (-distance - 0.5f * Physics.gravity.y * Time.fixedDeltaTime * Time.fixedDeltaTime) / Time.fixedDeltaTime; + requiredV0 = Mathf.Clamp(requiredV0, -20, 20); + Vector3 v = creatureRigidbody.velocity; + v.y = requiredV0; + creatureRigidbody.velocity = v; + } + else + transform.Translate(0, -distance, 0, Space.World); + } + else { + // We are above the ground + ground = null; + if (useGravity) + Fall(distance); + } + if (slopeAlignment > 0f) { + Vector3 forward = Vector3.ProjectOnPlane(this.transform.forward, groundNormal).normalized; + if (forward.sqrMagnitude < 0.001f) + forward = this.transform.forward; + Quaternion targetRot = Quaternion.LookRotation(forward, groundNormal); + // blend between no-tilt and full alignment + targetRot = Quaternion.Slerp(this.transform.rotation, targetRot, slopeAlignment); + this.transform.rotation = Quaternion.Slerp(this.transform.rotation, targetRot, 1f - Mathf.Exp(-Time.deltaTime / rotationSmoothTime)); + } + } + + protected void Fall(float distanceToGround) { + Vector3 translation = fallSpeed * Time.deltaTime; + if (translation.magnitude > distanceToGround) + translation = Physics.gravity.normalized * distanceToGround; + + transform.Translate(translation); + + fallSpeed += Physics.gravity * Time.deltaTime; + } + + public float GetDistanceToGround(float maxDistance, out Transform ground, out Vector3 normal) { + normal = Physics.gravity.normalized; + + Vector3 rayDirection = -normal; + + int layerMask = Physics.DefaultRaycastLayers; + float distance = maxDistance; + RaycastHit[] hits; + + // - Why use Ray/CapsuleCast All? + // Because I need to ignore my own colliders and + // I don't want to force users to add some layer before this can be used + if (bodyCollider != null) { + Vector3 centerWorld = transform.TransformPoint(bodyCollider.center); + float half = (bodyCollider.height * 0.5f) - bodyCollider.radius; + Vector3 up = bodyCollider.direction switch { + 0 => transform.TransformDirection(Vector3.right), + 1 => transform.TransformDirection(Vector3.up), + _ => transform.TransformDirection(Vector3.forward), + }; + Vector3 p1 = centerWorld + up * half - normal * maxDistance; // top point + Vector3 p2 = centerWorld - up * half - normal * maxDistance; // bottom point + + // Debug.DrawRay(p1, 2 * maxDistance * -rayDirection, Color.magenta); + // Debug.DrawRay(p2, 2 * maxDistance * -rayDirection, Color.magenta); + hits = Physics.CapsuleCastAll(p1, p2, bodyCollider.radius, -rayDirection, maxDistance * 2, layerMask, QueryTriggerInteraction.Ignore); + maxDistance += colliderToGround; + } + else { + Vector3 rayStart = this.transform.position + normal * maxDistance; + // Debug.DrawRay(rayStart, 2 * maxDistance * rayDirection, Color.magenta); + hits = Physics.RaycastAll(rayStart, rayDirection, maxDistance * 2, layerMask, QueryTriggerInteraction.Ignore); + } + + if (hits.Length == 0) { + ground = null; + return maxDistance; + } + + int closestHitIx = 0; + bool foundClosest = false; + for (int i = 0; i < hits.Length; i++) { + if (hits[i].rigidbody == null && + hits[i].distance > 0 && + hits[i].distance <= hits[closestHitIx].distance) { + closestHitIx = i; + foundClosest = true; + } + } + if (!foundClosest) { + ground = null; + return maxDistance; + } + + RaycastHit closestHit = hits[closestHitIx]; + Debug.Log($"hit.distance {closestHit.distance} - {maxDistance}"); + ground = closestHit.transform; + normal = closestHit.normal; + distance = closestHit.distance - maxDistance; + return distance; + } + + #endregion Ground + #endregion Update #region Scene view diff --git a/Runtime/Scripts/Ant.cs b/Runtime/Scripts/Ant.cs index 580251a..93758c7 100644 --- a/Runtime/Scripts/Ant.cs +++ b/Runtime/Scripts/Ant.cs @@ -27,13 +27,13 @@ namespace Passer.CreatureControl { public Receptor foodReceptor; public Receptor homeReceptor; - public Animator animator; public Vector3 linearVelocity; public Vector3 angularVelocity; #region Init - protected virtual void Awake() { + protected override void Awake() { + base.Awake(); if (this.targetRig != null) this.animator = this.targetRig.animator; @@ -100,26 +100,50 @@ namespace Passer.CreatureControl { Vector3 localForce = nanoBrain.brain.defaultOutput.outputValue; this.linearVelocity = (1 - inertia) * (Time.deltaTime * localForce.normalized) + inertia * this.linearVelocity; - this.linearVelocity = this.linearVelocity.normalized * 0.2f; + this.linearVelocity = this.linearVelocity.normalized; // * this.forwardSpeed; - this.animator.SetFloat("Forward", this.forwardSpeed); //this.linearVelocity.z * this.forwardSpeed); + //this.animator.SetFloat("Forward", this.forwardSpeed); //this.linearVelocity.z * this.forwardSpeed); + float forwardParam = Mathf.Clamp01(this.linearVelocity.z); // / this.forwardSpeed); + float angleDeg = 0; + if (this.linearVelocity.magnitude > 1e-5f) + angleDeg = Mathf.Atan2(this.linearVelocity.x, this.linearVelocity.z) * Mathf.Rad2Deg; + + // base turn in -1..1 + float baseTurn = Mathf.Clamp(angleDeg / 45, -1f, 1f); + float turnParam = baseTurn; // * Mathf.Max(0.6f, 1 - forwardParam); // Rotate towards the movement direction - if (this.linearVelocity != Vector3.zero) { - Quaternion targetRotation = Quaternion.LookRotation(this.linearVelocity); - Quaternion worldRotation = transform.rotation * targetRotation; - Quaternion deltaRotation = worldRotation * Quaternion.Inverse(transform.rotation); + // if (this.linearVelocity != Vector3.zero) { + // Quaternion targetRotation = Quaternion.LookRotation(this.linearVelocity); + // Quaternion worldRotation = transform.rotation * targetRotation; + // Quaternion deltaRotation = worldRotation * Quaternion.Inverse(transform.rotation); - Vector3 eulerAngleChange = deltaRotation.eulerAngles; - // Normalize the Euler angles to avoid unexpected jumps due to 360-degree rotations - eulerAngleChange = new Vector3( - LinearAlgebra.Angles.Normalize(eulerAngleChange.x), - LinearAlgebra.Angles.Normalize(eulerAngleChange.y), - LinearAlgebra.Angles.Normalize(eulerAngleChange.z) - ); + // Vector3 eulerAngleChange = deltaRotation.eulerAngles; + // // Normalize the Euler angles to avoid unexpected jumps due to 360-degree rotations + // eulerAngleChange = new Vector3( + // LinearAlgebra.Angles.Normalize(eulerAngleChange.x), + // LinearAlgebra.Angles.Normalize(eulerAngleChange.y), + // LinearAlgebra.Angles.Normalize(eulerAngleChange.z) + // ); - this.animator.SetFloat("Rotate", eulerAngleChange.y / 45 * this.rotationSpeed); - } + // float rotSpeed = (eulerAngleChange.y / 45) * this.rotationSpeed; + // this.animator.SetFloat("Rotate", rotSpeed); + // Debug.Log($"fw {this.forwardSpeed} ang {rotSpeed}"); + // } + + // Smooth against current animator values + // float curF = animator.GetFloat("Forward"); + // float curT = animator.GetFloat("Turn"); + // forwardParam = Mathf.Lerp(curF, forwardParam, 1f - Mathf.Exp(-10 * Time.deltaTime)); + // turnParam = Mathf.Lerp(curT, turnParam, 1f - Mathf.Exp(-10 * Time.deltaTime)); + + + this.animator.SetFloat("Forward", forwardParam); + this.animator.SetFloat("Rotate", turnParam); + } + + public virtual void FixedUpdate() { + CheckGrounded(); } public float beatInterval = 3; diff --git a/Samples/Animation/AntAnimator.controller b/Samples/Animation/AntAnimator.controller index 7f03712..c14185c 100644 --- a/Samples/Animation/AntAnimator.controller +++ b/Samples/Animation/AntAnimator.controller @@ -25,7 +25,7 @@ BlendTree: m_DirectBlendParameter: Forward m_Mirror: 0 - serializedVersion: 2 - m_Motion: {fileID: 0} + m_Motion: {fileID: 7400000, guid: ab82ff68e62ea3b1c8e6523f8d46c142, type: 2} m_Threshold: 0.6666667 m_Position: {x: -1, y: 0} m_TimeScale: 1 @@ -33,7 +33,7 @@ BlendTree: m_DirectBlendParameter: Forward m_Mirror: 0 - serializedVersion: 2 - m_Motion: {fileID: 0} + m_Motion: {fileID: 7400000, guid: 91229db5e929c379bbfd5bf417848488, type: 2} m_Threshold: 1 m_Position: {x: 1, y: 0} m_TimeScale: 1 diff --git a/Samples/Foraging.unity b/Samples/Foraging.unity index e419c2f..41acb9f 100644 --- a/Samples/Foraging.unity +++ b/Samples/Foraging.unity @@ -1164,6 +1164,1072 @@ Transform: - {fileID: 1973137220} m_Father: {fileID: 1075240960} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &1282320487 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: -8003107013834283777, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_Constraints + value: 64 + objectReference: {fileID: 0} + - target: {fileID: -8003107013834283777, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_IsKinematic + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -0.01037 + objectReference: {fileID: 0} + - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 0.0000000037252903 + objectReference: {fileID: 0} + - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: -0.0015127966 + objectReference: {fileID: 0} + - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -0.000581027 + objectReference: {fileID: 0} + - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.95134765 + objectReference: {fileID: 0} + - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.16772105 + objectReference: {fileID: 0} + - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.2545455 + objectReference: {fileID: 0} + - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.044875965 + objectReference: {fileID: 0} + - target: {fileID: 234321254904069504, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_Enabled + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 234321254904069504, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: stepOffset + value: 0.005 + objectReference: {fileID: 0} + - target: {fileID: 234321254904069504, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: slopeAlignment + value: 0.3 + objectReference: {fileID: 0} + - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.33182296 + objectReference: {fileID: 0} + - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.49444485 + objectReference: {fileID: 0} + - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.5847301 + objectReference: {fileID: 0} + - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.5509162 + objectReference: {fileID: 0} + - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -2.3283064e-10 + objectReference: {fileID: 0} + - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 8.1490725e-10 + objectReference: {fileID: 0} + - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0030040143 + objectReference: {fileID: 0} + - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.6889717 + objectReference: {fileID: 0} + - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.72478825 + objectReference: {fileID: 0} + - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.000000044703484 + objectReference: {fileID: 0} + - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: length + value: 0.0072452417 + objectReference: {fileID: 0} + - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: femurLength + value: 0.0030040143 + objectReference: {fileID: 0} + - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: tibiaLength + value: 0.004241227 + objectReference: {fileID: 0} + - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.w + value: 0.6862775 + objectReference: {fileID: 0} + - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.x + value: 0.68627745 + objectReference: {fileID: 0} + - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.y + value: -0.17036225 + objectReference: {fileID: 0} + - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.z + value: -0.1703624 + objectReference: {fileID: 0} + - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.w + value: 0.68425715 + objectReference: {fileID: 0} + - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.x + value: 0.68425727 + objectReference: {fileID: 0} + - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.z + value: -0.17830373 + objectReference: {fileID: 0} + - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: length + value: 0.006537831 + objectReference: {fileID: 0} + - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: femurLength + value: 0.0024082726 + objectReference: {fileID: 0} + - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.w + value: 0.07596097 + objectReference: {fileID: 0} + - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.x + value: 0.07596083 + objectReference: {fileID: 0} + - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.y + value: -0.7030148 + objectReference: {fileID: 0} + - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.z + value: -0.7030151 + objectReference: {fileID: 0} + - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.x + value: -0.5739346 + objectReference: {fileID: 0} + - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.z + value: -0.4130365 + objectReference: {fileID: 0} + - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -0.0003301995 + objectReference: {fileID: 0} + - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: -0.2728942 + objectReference: {fileID: 0} + - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.07145226 + objectReference: {fileID: 0} + - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.928101 + objectReference: {fileID: 0} + - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.24300587 + objectReference: {fileID: 0} + - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: 3.12046e-11 + objectReference: {fileID: 0} + - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 9.313226e-10 + objectReference: {fileID: 0} + - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0041295565 + objectReference: {fileID: 0} + - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.96224785 + objectReference: {fileID: 0} + - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.27217498 + objectReference: {fileID: 0} + - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.00000009644475 + objectReference: {fileID: 0} + - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000117980434 + objectReference: {fileID: 0} + - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.45984125 + objectReference: {fileID: 0} + - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.6877812 + objectReference: {fileID: 0} + - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.5008278 + objectReference: {fileID: 0} + - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.2543121 + objectReference: {fileID: 0} + - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7692179 + objectReference: {fileID: 0} + - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.4836071 + objectReference: {fileID: 0} + - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.17796749 + objectReference: {fileID: 0} + - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.3778301 + objectReference: {fileID: 0} + - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -4.858776e-10 + objectReference: {fileID: 0} + - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 0.0000000018626451 + objectReference: {fileID: 0} + - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0041061193 + objectReference: {fileID: 0} + - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.948097 + objectReference: {fileID: 0} + - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.3179812 + objectReference: {fileID: 0} + - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.00000006637054 + objectReference: {fileID: 0} + - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.00000007448756 + objectReference: {fileID: 0} + - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: length + value: 0.007110139 + objectReference: {fileID: 0} + - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: femurLength + value: 0.0030040178 + objectReference: {fileID: 0} + - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: tibiaLength + value: 0.004106121 + objectReference: {fileID: 0} + - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.w + value: -0.42978364 + objectReference: {fileID: 0} + - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.x + value: -0.4297838 + objectReference: {fileID: 0} + - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.y + value: 0.5615034 + objectReference: {fileID: 0} + - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.z + value: 0.5615032 + objectReference: {fileID: 0} + - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.z + value: 0.12736641 + objectReference: {fileID: 0} + - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: 0.0048809894 + objectReference: {fileID: 0} + - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: -0.00054921303 + objectReference: {fileID: 0} + - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.74814796 + objectReference: {fileID: 0} + - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.17950992 + objectReference: {fileID: 0} + - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.62115854 + objectReference: {fileID: 0} + - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.14904019 + objectReference: {fileID: 0} + - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: -0.33122298 + objectReference: {fileID: 0} + - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.9063614 + objectReference: {fileID: 0} + - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.26013067 + objectReference: {fileID: 0} + - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.03365305 + objectReference: {fileID: 0} + - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.0644018 + objectReference: {fileID: 0} + - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.059745155 + objectReference: {fileID: 0} + - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.8554311 + objectReference: {fileID: 0} + - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.51041216 + objectReference: {fileID: 0} + - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.8352099 + objectReference: {fileID: 0} + - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.17726378 + objectReference: {fileID: 0} + - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.1985065 + objectReference: {fileID: 0} + - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.48124552 + objectReference: {fileID: 0} + - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -0.0018809726 + objectReference: {fileID: 0} + - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0012553632 + objectReference: {fileID: 0} + - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9065213 + objectReference: {fileID: 0} + - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.33378416 + objectReference: {fileID: 0} + - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.24255164 + objectReference: {fileID: 0} + - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.08930831 + objectReference: {fileID: 0} + - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: 0.0008435268 + objectReference: {fileID: 0} + - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7287947 + objectReference: {fileID: 0} + - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.2465918 + objectReference: {fileID: 0} + - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.60509014 + objectReference: {fileID: 0} + - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.20473568 + objectReference: {fileID: 0} + - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: 0.002248264 + objectReference: {fileID: 0} + - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0015912976 + objectReference: {fileID: 0} + - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.91944486 + objectReference: {fileID: 0} + - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.33498573 + objectReference: {fileID: 0} + - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.19348504 + objectReference: {fileID: 0} + - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.070493326 + objectReference: {fileID: 0} + - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: 5.680957e-10 + objectReference: {fileID: 0} + - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: -9.3132246e-10 + objectReference: {fileID: 0} + - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.004176515 + objectReference: {fileID: 0} + - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.96286833 + objectReference: {fileID: 0} + - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.2699717 + objectReference: {fileID: 0} + - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.000000102507784 + objectReference: {fileID: 0} + - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000110644734 + objectReference: {fileID: 0} + - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -0.00024004001 + objectReference: {fileID: 0} + - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.73313886 + objectReference: {fileID: 0} + - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.24335043 + objectReference: {fileID: 0} + - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.6027143 + objectReference: {fileID: 0} + - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.20005868 + objectReference: {fileID: 0} + - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -2.0372681e-10 + objectReference: {fileID: 0} + - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: -2.3283064e-10 + objectReference: {fileID: 0} + - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0024082726 + objectReference: {fileID: 0} + - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.67232114 + objectReference: {fileID: 0} + - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.74025965 + objectReference: {fileID: 0} + - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.0000002384186 + objectReference: {fileID: 0} + - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000044703487 + objectReference: {fileID: 0} + - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: 0.0032548942 + objectReference: {fileID: 0} + - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: -0.0060925954 + objectReference: {fileID: 0} + - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.26382607 + objectReference: {fileID: 0} + - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.06890167 + objectReference: {fileID: 0} + - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.93088377 + objectReference: {fileID: 0} + - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.24311262 + objectReference: {fileID: 0} + - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: 0.0000000021005535 + objectReference: {fileID: 0} + - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 9.3132246e-10 + objectReference: {fileID: 0} + - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0042412244 + objectReference: {fileID: 0} + - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9503331 + objectReference: {fileID: 0} + - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.3112346 + objectReference: {fileID: 0} + - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.000000050154085 + objectReference: {fileID: 0} + - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000010938996 + objectReference: {fileID: 0} + - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -0.0027482398 + objectReference: {fileID: 0} + - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: -0.005979649 + objectReference: {fileID: 0} + - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: -0.27477506 + objectReference: {fileID: 0} + - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.063838094 + objectReference: {fileID: 0} + - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.93449795 + objectReference: {fileID: 0} + - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.21711057 + objectReference: {fileID: 0} + - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: 0.0000000010598334 + objectReference: {fileID: 0} + - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: -2.3283064e-10 + objectReference: {fileID: 0} + - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0030214668 + objectReference: {fileID: 0} + - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.95781213 + objectReference: {fileID: 0} + - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.2873954 + objectReference: {fileID: 0} + - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.00000005828909 + objectReference: {fileID: 0} + - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000112478034 + objectReference: {fileID: 0} + - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -4.0745363e-10 + objectReference: {fileID: 0} + - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 2.910383e-10 + objectReference: {fileID: 0} + - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0019033398 + objectReference: {fileID: 0} + - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.6810774 + objectReference: {fileID: 0} + - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.7322114 + objectReference: {fileID: 0} + - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.00000035762787 + objectReference: {fileID: 0} + - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.00000017881393 + objectReference: {fileID: 0} + - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.40812185 + objectReference: {fileID: 0} + - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.27147034 + objectReference: {fileID: 0} + - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.85242325 + objectReference: {fileID: 0} + - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.1819752 + objectReference: {fileID: 0} + - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: 0.0011845138 + objectReference: {fileID: 0} + - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: -0.00082425796 + objectReference: {fileID: 0} + - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9623594 + objectReference: {fileID: 0} + - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.17736602 + objectReference: {fileID: 0} + - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.2025158 + objectReference: {fileID: 0} + - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.037324335 + objectReference: {fileID: 0} + - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -0.0042337636 + objectReference: {fileID: 0} + - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: -0.0006929303 + objectReference: {fileID: 0} + - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.75082076 + objectReference: {fileID: 0} + - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.18160486 + objectReference: {fileID: 0} + - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.6172505 + objectReference: {fileID: 0} + - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.14929757 + objectReference: {fileID: 0} + - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.34205782 + objectReference: {fileID: 0} + - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.9227911 + objectReference: {fileID: 0} + - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.1756374 + objectReference: {fileID: 0} + - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.024586445 + objectReference: {fileID: 0} + - target: {fileID: 6049855982455691338, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_Name + value: LowPolyAnt (1) + objectReference: {fileID: 0} + - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: femurLength + value: 0.0019033402 + objectReference: {fileID: 0} + - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: tibiaLength + value: 0.0030214665 + objectReference: {fileID: 0} + - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.w + value: 0.39405352 + objectReference: {fileID: 0} + - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.x + value: 0.39405334 + objectReference: {fileID: 0} + - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.y + value: -0.5871304 + objectReference: {fileID: 0} + - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.w + value: -0.16597605 + objectReference: {fileID: 0} + - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.x + value: -0.16597635 + objectReference: {fileID: 0} + - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.z + value: -0.68735147 + objectReference: {fileID: 0} + - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -3.4924597e-10 + objectReference: {fileID: 0} + - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: -2.3283064e-10 + objectReference: {fileID: 0} + - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0030040175 + objectReference: {fileID: 0} + - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.69097394 + objectReference: {fileID: 0} + - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.7228797 + objectReference: {fileID: 0} + - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.000000029802322 + objectReference: {fileID: 0} + - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000037252903 + objectReference: {fileID: 0} + - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.68892556 + objectReference: {fileID: 0} + - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.63667464 + objectReference: {fileID: 0} + - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.007983026 + objectReference: {fileID: 0} + - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.34635723 + objectReference: {fileID: 0} + - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: 2.0372681e-10 + objectReference: {fileID: 0} + - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 4.0745363e-10 + objectReference: {fileID: 0} + - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0024082721 + objectReference: {fileID: 0} + - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.67109257 + objectReference: {fileID: 0} + - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.74137366 + objectReference: {fileID: 0} + - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.000000059604645 + objectReference: {fileID: 0} + - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000014901161 + objectReference: {fileID: 0} + - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.5119412 + objectReference: {fileID: 0} + - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.32878813 + objectReference: {fileID: 0} + - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.46407005 + objectReference: {fileID: 0} + - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.64378065 + objectReference: {fileID: 0} + - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -5.820766e-10 + objectReference: {fileID: 0} + - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: -1.1641532e-10 + objectReference: {fileID: 0} + - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0019033403 + objectReference: {fileID: 0} + - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.6799132 + objectReference: {fileID: 0} + - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.73329264 + objectReference: {fileID: 0} + - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.0000001490116 + objectReference: {fileID: 0} + - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000083819025 + objectReference: {fileID: 0} + - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.6510875 + objectReference: {fileID: 0} + - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.41958776 + objectReference: {fileID: 0} + - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.16263537 + objectReference: {fileID: 0} + - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.61121273 + objectReference: {fileID: 0} + - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: -0.027075293 + objectReference: {fileID: 0} + - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.71349 + objectReference: {fileID: 0} + - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.68053895 + objectReference: {fileID: 0} + - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.16451639 + objectReference: {fileID: 0} + - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: femurLength + value: 0.0019033402 + objectReference: {fileID: 0} + - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: tibiaLength + value: 0.0029819128 + objectReference: {fileID: 0} + - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.w + value: 0.54446536 + objectReference: {fileID: 0} + - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.x + value: 0.5444652 + objectReference: {fileID: 0} + - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.y + value: -0.4511736 + objectReference: {fileID: 0} + - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.z + value: -0.45117366 + objectReference: {fileID: 0} + - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.x + value: 0.42917204 + objectReference: {fileID: 0} + - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.z + value: 0.56197107 + objectReference: {fileID: 0} + - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: 0.00093368813 + objectReference: {fileID: 0} + - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.2649386 + objectReference: {fileID: 0} + - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.06449178 + objectReference: {fileID: 0} + - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.93480915 + objectReference: {fileID: 0} + - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.22755279 + objectReference: {fileID: 0} + - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -4.5296267e-11 + objectReference: {fileID: 0} + - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 6.9849193e-10 + objectReference: {fileID: 0} + - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0029819123 + objectReference: {fileID: 0} + - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.95701724 + objectReference: {fileID: 0} + - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.2900312 + objectReference: {fileID: 0} + - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.00000022725318 + objectReference: {fileID: 0} + - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.00000032687367 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: + - {fileID: 8367929451558061141, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} --- !u!1 &1485508511 GameObject: m_ObjectHideFlags: 0 @@ -1503,63 +2569,63 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.8808468 + value: 0.96229064 objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: -0.39661363 + value: -0.08479436 objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: -0.2356808 + value: -0.2574721 objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.10611862 + value: -0.022687728 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.31954697 + value: 0.35347965 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: -0.509039 + value: -0.46614814 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: -0.5630976 + value: -0.62289244 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: 0.5671774 + value: 0.5193873 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: 2.910383e-10 + value: 3.4924597e-10 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: -9.313226e-10 + value: 6.9849193e-10 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z - value: 0.003004014 + value: 0.003004015 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.7612818 + value: 0.7605673 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.64842117 + value: 0.64925903 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: -0.000000014901159 + value: -0.00000022351739 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000014901159 + value: 0.00000008568167 objectReference: {fileID: 0} - target: {fileID: 1203350180057270885, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: targetToBoneFemur.x @@ -1615,27 +2681,27 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: -0.2611171 + value: -0.27560407 objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.10673723 + value: 0.060145106 objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.8880579 + value: 0.9373276 objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: 0.36301282 + value: 0.2045532 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: -6.1718836e-10 + value: -0.0000000012339093 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: 0.0000000013969839 + value: 9.313226e-10 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z @@ -1643,79 +2709,79 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: -0.4717387 + value: 0.9462641 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: -0.50375324 + value: -0.32339498 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: -0.39015236 + value: 0.00000006111418 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.60948867 + value: -0.00000005146697 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.5559828 + value: 0.5510152 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: -0.53405255 + value: -0.54386437 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: -0.6055388 + value: -0.6001283 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.19746868 + value: -0.2010968 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.6707801 + value: 0.7794766 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: -0.62887555 + value: -0.45697364 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.3249471 + value: 0.15323195 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.22131196 + value: -0.40013924 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: -1.4783896e-10 + value: -2.0764179e-10 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: 4.656613e-10 + value: -4.656613e-10 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z - value: 0.0041061165 + value: 0.0041061183 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: -0.83935857 + value: 0.8952937 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: -0.514283 + value: -0.44547638 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.16752288 + value: 0.00000012234558 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: 0.054094255 + value: -0.00000004957694 objectReference: {fileID: 0} - target: {fileID: 2828406421342858178, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: targetToBoneFemur.w @@ -1739,423 +2805,423 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: 0.005504689 + value: 0.0052875914 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: 0.0011504223 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z - value: -0.00043249875 + value: -0.00047311577 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.3618944 + value: 0.765696 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.09618694 + value: 0.07524493 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.09353513 + value: 0.6357241 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.92251384 + value: -0.062472604 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: -0.28775454 + value: -0.34168527 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.9565254 + value: 0.8755297 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.0314992 + value: 0.33673814 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.035559874 + value: 0.05750128 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.12661938 + value: 0.044686582 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.17008923 + value: 0.02497181 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.8228655 + value: 0.86257267 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.5271902 + value: -0.5033367 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.7874146 + value: 0.8559523 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: -0.2243757 + value: -0.15331742 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.17398311 + value: 0.20995085 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: 0.5471414 + value: 0.4469453 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: -0.0024971536 + value: -0.0022883713 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: 0.0021396556 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z - value: 0.0023244184 + value: 0.0019621917 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.6475289 + value: 0.96596956 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.10340203 + value: 0.009813044 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.19713913 + value: -0.2584564 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: 0.7288008 + value: 0.0026255941 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.7014135 + value: 0.7398055 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: -0.3161821 + value: -0.21128128 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.5823533 + value: 0.6142285 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: 0.2625123 + value: 0.17541778 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: 0.002816438 + value: 0.0025572483 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: 0.0015853117 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z - value: 0.0028815276 + value: 0.0022929558 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: -0.18079337 + value: 0.975634 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: -0.30181342 + value: 0.075717114 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: -0.7707286 + value: 0.2053081 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.53122497 + value: -0.015933573 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: 3.988585e-10 + value: -8.731149e-10 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: -4.6566123e-10 + value: 0.0000000037252899 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z - value: 0.0041765138 + value: 0.004176513 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.549503 + value: 0.9322789 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.5023687 + value: -0.36174053 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: -0.37666184 + value: -0.0000000139128655 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.5511788 + value: 0.000000021661 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.70263875 + value: 0.74063903 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: -0.32094938 + value: -0.21946165 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: -0.5776429 + value: -0.60888326 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.26385418 + value: -0.18042065 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: -2.3283064e-10 + value: 4.947651e-10 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: -5.820766e-10 + value: 5.820766e-11 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z - value: 0.0024082721 + value: 0.0024082726 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.6474483 + value: 0.7162002 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.76210946 + value: 0.69789493 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000005960465 + value: -0.000000029802322 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000029802326 + value: 0.000000067055225 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: 0.0038087836 + value: 0.0035498168 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: 0.0034997077 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z - value: -0.0069912216 + value: -0.0065710563 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.44412407 + value: 0.27152428 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.2524134 + value: -0.025051057 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.31570768 + value: 0.9580367 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.79960614 + value: 0.08838926 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: -0.000000001083361 + value: 6.176874e-11 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: -9.3132246e-10 + value: 9.3132246e-10 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z - value: 0.004241224 + value: 0.0042412234 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.57440317 + value: 0.82324034 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.7436549 + value: -0.56769305 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: -0.33051074 + value: 0.00000017635429 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: 0.088323936 + value: -0.00000010584033 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: -0.0032553582 + value: -0.0030170965 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: 0.0018025481 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z - value: -0.0067674974 + value: -0.006397361 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.0421324 + value: -0.28190595 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.3141117 + value: -0.010201837 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: -0.6442088 + value: 0.95876026 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: 0.696099 + value: -0.03469638 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: 2.809196e-10 + value: 7.578219e-10 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: -4.656613e-10 + value: 9.313226e-10 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z - value: 0.0030214663 + value: 0.003021466 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: -0.37577626 + value: 0.9046303 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: -0.077579685 + value: -0.42619717 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: -0.8577523 + value: 0.00000017793668 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.3421031 + value: -0.00000010228657 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: -5.820766e-11 + value: 4.0745363e-10 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: -2.3283064e-10 + value: 1.1641532e-10 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z - value: 0.0019033402 + value: 0.0019033398 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.7730133 + value: 0.8247887 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.63438994 + value: 0.5654412 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: -0.00000007450581 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000029802326 + value: 0.000000044703487 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.38135147 + value: 0.41524363 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.33248398 + value: 0.2525032 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.82204705 + value: 0.8596163 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.26127383 + value: -0.15771776 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.93386745 + value: 0.9735995 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: -0.29238063 + value: -0.09848211 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.19651881 + value: 0.20487994 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: 0.06152725 + value: 0.020724133 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: -0.004380448 + value: -0.00451589 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: 0.0007390736 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z - value: -0.00066403294 + value: -0.000637332 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: -0.22509165 + value: 0.76320106 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: -0.05136004 + value: 0.11930532 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.06238191 + value: -0.6274316 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.9709811 + value: 0.09808153 objectReference: {fileID: 0} - target: {fileID: 5641584351447400800, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: targetToBoneFemur.w @@ -2191,24 +3257,28 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.30004126 + value: 0.36751762 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.95133615 + value: 0.8959639 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.07000688 + value: 0.24529232 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: 0.0058093118 + value: -0.044846237 objectReference: {fileID: 0} - target: {fileID: 6049855982455691338, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_Name value: LowPolyAnt _Physics objectReference: {fileID: 0} + - target: {fileID: 6049855982455691338, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} - target: {fileID: 6090589349420666311, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: targetToBoneFemur.w value: 0.3940535 @@ -2239,55 +3309,55 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: -1.1641532e-10 + value: 6.4028427e-10 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: -3.4924597e-10 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z - value: 0.003004016 + value: 0.003004017 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.75527114 + value: 0.7565724 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.65541244 + value: 0.6539099 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.0000001490116 + value: -0.00000011920929 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: 0.0000000074505797 + value: 0.000000040978193 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.76123047 + value: 0.7605163 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.56959146 + value: 0.5703274 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: -0.008821632 + value: -0.008813451 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.3098642 + value: -0.3102643 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: 4.947651e-10 + value: 5.820766e-11 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: -1.1641532e-10 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z @@ -2295,95 +3365,95 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.70938045 + value: 0.7342231 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.7048258 + value: 0.67890835 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: -0.00000008940697 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0 + value: -0.000000052154064 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.5595789 + value: 0.56054306 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.2981022 + value: 0.29741916 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.5072533 + value: 0.50812733 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.58369577 + value: -0.5823573 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: 2.910383e-10 + value: 5.820766e-10 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: 2.910383e-10 + value: -4.0745363e-10 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z - value: 0.0019033395 + value: 0.0019033398 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.82206684 + value: 0.8147216 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.569391 + value: 0.57985234 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: -0.0000000745058 + value: -0.00000016391277 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.00000001117587 + value: 0.00000006146729 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.6882344 + value: 0.7123367 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.3989032 + value: 0.3842345 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: -0.17191266 + value: -0.17793313 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: -0.5810815 + value: -0.55971426 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: -0.03073109 + value: -0.032789294 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.61816937 + value: 0.5509836 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.7724022 + value: 0.8241366 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: 0.14253776 + value: 0.12704602 objectReference: {fileID: 0} - target: {fileID: 8412519912061285269, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: targetToBoneFemur.x @@ -2407,47 +3477,47 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.2370441 + value: 0.26751435 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: -0.13477074 + value: -0.052811496 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.8363777 + value: 0.9438883 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: 0.47552013 + value: 0.18633829 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.x - value: 3.0191144e-10 + value: -4.0379225e-10 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.y - value: -0.0000000016298145 + value: -9.313226e-10 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalPosition.z - value: 0.0029819126 + value: 0.0029819135 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.w - value: 0.6299031 + value: 0.87617916 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.x - value: 0.12825163 + value: -0.48198557 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.y - value: 0.5222316 + value: 0.00000009961857 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} propertyPath: m_LocalRotation.z - value: 0.56039965 + value: -0.00000006095228 objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] @@ -3842,3 +4912,4 @@ SceneRoots: - {fileID: 6563506007167416910} - {fileID: 1733975501} - {fileID: 1131923926} + - {fileID: 1282320487} From f0bb2a9fa458c5454e8ec7a02467febe42cd3087 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Thu, 9 Apr 2026 12:10:15 +0200 Subject: [PATCH 11/38] Aligned foot animations --- .../Editor/Scripts/Insect/InsectRig_Editor.cs | 43 + .../Scripts/Insect/InsectRig_Editor.cs.meta | 11 + .../Runtime/Scripts/Insect/InsectRig.cs | 8 + Runtime/Resources/InsectTargetRig.prefab | 31 +- Samples/Animation/AntAnimator.controller | 64 +- Samples/Animation/AntWalkForward.anim | 857 ++++++++++++++++++ ...alk.anim.meta => AntWalkForward.anim.meta} | 0 .../{AntWalk.anim => AntWalkLeft.anim} | 2 +- Samples/Animation/AntWalkLeft.anim.meta | 8 + Samples/Animation/AntWalkRight.anim | 53 ++ Samples/Animation/AntWalkRight.anim.meta | 8 + Samples/Animation/New Avatar Mask.mask | 131 +++ Samples/Animation/New Avatar Mask.mask.meta | 8 + Samples/Foraging.unity | 368 ++++---- Samples/Models/LowPolyAntRigged.fbx.meta | 6 +- 15 files changed, 1406 insertions(+), 192 deletions(-) create mode 100644 CreatureControl/Editor/Scripts/Insect/InsectRig_Editor.cs create mode 100644 CreatureControl/Editor/Scripts/Insect/InsectRig_Editor.cs.meta create mode 100644 Samples/Animation/AntWalkForward.anim rename Samples/Animation/{AntWalk.anim.meta => AntWalkForward.anim.meta} (100%) rename Samples/Animation/{AntWalk.anim => AntWalkLeft.anim} (99%) create mode 100644 Samples/Animation/AntWalkLeft.anim.meta create mode 100644 Samples/Animation/AntWalkRight.anim create mode 100644 Samples/Animation/AntWalkRight.anim.meta create mode 100644 Samples/Animation/New Avatar Mask.mask create mode 100644 Samples/Animation/New Avatar Mask.mask.meta diff --git a/CreatureControl/Editor/Scripts/Insect/InsectRig_Editor.cs b/CreatureControl/Editor/Scripts/Insect/InsectRig_Editor.cs new file mode 100644 index 0000000..519c9fc --- /dev/null +++ b/CreatureControl/Editor/Scripts/Insect/InsectRig_Editor.cs @@ -0,0 +1,43 @@ +using UnityEngine; +using UnityEditor; + +namespace Passer.CreatureControl { + [CustomEditor(typeof(InsectRig))] + public class InsectRigEditor : Editor { + SerializedProperty renderProp; + + void OnEnable() { + renderProp = serializedObject.FindProperty("render"); + } + + public override void OnInspectorGUI() { + serializedObject.Update(); + + // Draw the rest of the inspector normally + DrawPropertiesExcluding(serializedObject, "m_Script", "render"); + + // Render toggle with change detection + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(renderProp); + if (EditorGUI.EndChangeCheck()) { + serializedObject.ApplyModifiedProperties(); + + // Apply to children immediately and allow undo / prefab modifications + InsectRig rig = (InsectRig)target; + Undo.RecordObject(rig, "Toggle InsectRig render"); + // Mark scene dirty so change persists + EditorUtility.SetDirty(rig); + + // Apply to all child renderers, including inactive objects + rig.ApplyRenderToChildren(renderProp.boolValue); + + // If using prefab variants, register modification + PrefabUtility.RecordPrefabInstancePropertyModifications(rig); + } + else { + serializedObject.ApplyModifiedProperties(); + } + + } + } +} \ No newline at end of file diff --git a/CreatureControl/Editor/Scripts/Insect/InsectRig_Editor.cs.meta b/CreatureControl/Editor/Scripts/Insect/InsectRig_Editor.cs.meta new file mode 100644 index 0000000..a28366f --- /dev/null +++ b/CreatureControl/Editor/Scripts/Insect/InsectRig_Editor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: af7f92552fdf0cc46b98bf821dbf6a6e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/CreatureControl/Runtime/Scripts/Insect/InsectRig.cs b/CreatureControl/Runtime/Scripts/Insect/InsectRig.cs index 0e51dae..a89fe96 100644 --- a/CreatureControl/Runtime/Scripts/Insect/InsectRig.cs +++ b/CreatureControl/Runtime/Scripts/Insect/InsectRig.cs @@ -12,6 +12,8 @@ namespace Passer.CreatureControl { public TargetLeg rightMiddleLeg; public TargetLeg rightBackLeg; + public bool render; + public override void Pose() { this.leftBackLeg.PoseLimb(); this.leftMiddleLeg.PoseLimb(); @@ -41,6 +43,12 @@ namespace Passer.CreatureControl { this.rightBackLeg.MatchTo(insect.rightHindLeg); } + // Public helper you can call from editor or runtime + public void ApplyRenderToChildren(bool value) { + // Find all renderers under this GameObject (including inactive) + var renderers = GetComponentsInChildren(true); + foreach (var r in renderers) r.enabled = value; + } } } \ No newline at end of file diff --git a/Runtime/Resources/InsectTargetRig.prefab b/Runtime/Resources/InsectTargetRig.prefab index 868773d..945feb8 100644 --- a/Runtime/Resources/InsectTargetRig.prefab +++ b/Runtime/Resources/InsectTargetRig.prefab @@ -83,6 +83,9 @@ MonoBehaviour: target: {fileID: 8947192729555298471} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} + femurLength: 0 + tibiaLength: 0 + length: 0 --- !u!1 &714113386832462525 GameObject: m_ObjectHideFlags: 0 @@ -142,6 +145,7 @@ MonoBehaviour: rightFrontLeg: {fileID: 5856460076900731150} rightMiddleLeg: {fileID: 4196034226083389076} rightBackLeg: {fileID: 8323677930838830493} + render: 0 --- !u!95 &5843436816833865534 Animator: serializedVersion: 5 @@ -245,6 +249,9 @@ MonoBehaviour: target: {fileID: 2041764967651498327} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} + femurLength: 0 + tibiaLength: 0 + length: 0 --- !u!1 &1274558016778403244 GameObject: m_ObjectHideFlags: 0 @@ -404,7 +411,7 @@ MeshRenderer: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1361514731818578437} - m_Enabled: 1 + m_Enabled: 0 m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 @@ -511,6 +518,9 @@ MonoBehaviour: target: {fileID: 5692380185316106944} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} + femurLength: 0 + tibiaLength: 0 + length: 0 --- !u!1 &1713014906338526394 GameObject: m_ObjectHideFlags: 0 @@ -1087,7 +1097,7 @@ MeshRenderer: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5894983358397305477} - m_Enabled: 1 + m_Enabled: 0 m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 @@ -1194,6 +1204,9 @@ MonoBehaviour: target: {fileID: 2714894253296331867} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} + femurLength: 0 + tibiaLength: 0 + length: 0 --- !u!1 &6227205784071755847 GameObject: m_ObjectHideFlags: 0 @@ -1309,6 +1322,9 @@ MonoBehaviour: target: {fileID: 8660658904332009209} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} + femurLength: 0 + tibiaLength: 0 + length: 0 --- !u!1 &6934656281848074513 GameObject: m_ObjectHideFlags: 0 @@ -1389,7 +1405,7 @@ MeshRenderer: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7154771341835324246} - m_Enabled: 1 + m_Enabled: 0 m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 @@ -1494,7 +1510,7 @@ MeshRenderer: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7738229459793727928} - m_Enabled: 1 + m_Enabled: 0 m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 @@ -1599,7 +1615,7 @@ MeshRenderer: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8132734907093829157} - m_Enabled: 1 + m_Enabled: 0 m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 @@ -1768,7 +1784,7 @@ MeshRenderer: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8786064911351911589} - m_Enabled: 1 + m_Enabled: 0 m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 @@ -1875,6 +1891,9 @@ MonoBehaviour: target: {fileID: 5063380583403966759} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} + femurLength: 0 + tibiaLength: 0 + length: 0 --- !u!1 &9173392299445808517 GameObject: m_ObjectHideFlags: 0 diff --git a/Samples/Animation/AntAnimator.controller b/Samples/Animation/AntAnimator.controller index c14185c..2bf1bca 100644 --- a/Samples/Animation/AntAnimator.controller +++ b/Samples/Animation/AntAnimator.controller @@ -28,7 +28,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: ab82ff68e62ea3b1c8e6523f8d46c142, type: 2} m_Threshold: 0.6666667 m_Position: {x: -1, y: 0} - m_TimeScale: 1 + m_TimeScale: 2 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -36,7 +36,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: 91229db5e929c379bbfd5bf417848488, type: 2} m_Threshold: 1 m_Position: {x: 1, y: 0} - m_TimeScale: 1 + m_TimeScale: 2 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -73,6 +73,32 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: +--- !u!1102 &-885377640043731298 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: AntStrafeLeft + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 5cf4fc079a3b9b1829ba5801ee1523ec, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: --- !u!91 &9100000 AnimatorController: m_ObjectHideFlags: 0 @@ -107,6 +133,18 @@ AnimatorController: m_IKPass: 0 m_SyncedLayerAffectsTiming: 0 m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: Tunring + m_StateMachine: {fileID: 5637542894965970304} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 1 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} --- !u!1101 &2088305737403053393 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -144,6 +182,9 @@ AnimatorStateMachine: - serializedVersion: 1 m_State: {fileID: -2902313045677931162} m_Position: {x: 380, y: 150, z: 0} + - serializedVersion: 1 + m_State: {fileID: -885377640043731298} + m_Position: {x: 415, y: 215, z: 0} m_ChildStateMachines: [] m_AnyStateTransitions: [] m_EntryTransitions: [] @@ -181,3 +222,22 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: +--- !u!1107 &5637542894965970304 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Tunring + m_ChildStates: [] + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 0} diff --git a/Samples/Animation/AntWalkForward.anim b/Samples/Animation/AntWalkForward.anim new file mode 100644 index 0000000..2d2a388 --- /dev/null +++ b/Samples/Animation/AntWalkForward.anim @@ -0,0 +1,857 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: AntWalkForward + serializedVersion: 7 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: 0.002, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.20833333 + value: {x: 0, y: 0.0015, z: 0.001} + inSlope: {x: 0, y: -0.0048, z: 0.0048} + outSlope: {x: 0, y: -0.0048, z: 0.0048} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.41666666 + value: {x: 0, y: 0, z: 0.002} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.625 + value: {x: 0, y: 0, z: 0.001} + inSlope: {x: 0, y: 0, z: -0.0048} + outSlope: {x: 0, y: 0, z: -0.0048} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.8333333 + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: -0.0048000007} + outSlope: {x: 0, y: 0, z: -0.0048000007} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.0416666 + value: {x: 0, y: 0, z: -0.001} + inSlope: {x: 0, y: 0, z: -0.0048} + outSlope: {x: 0, y: 0, z: -0.0048} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.25 + value: {x: 0, y: 0, z: -0.002} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.4583334 + value: {x: 0, y: 0.0015, z: -0.001} + inSlope: {x: 0, y: 0.0048000007, z: 0.0048000007} + outSlope: {x: 0, y: 0.0048000007, z: 0.0048000007} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.6666666 + value: {x: 0, y: 0.002, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: Body/LeftFeetTarget + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.20833333 + value: {x: 0, y: 0.00027777773, z: -0.001} + inSlope: {x: 0, y: 0.0023999996, z: -0.0048} + outSlope: {x: 0, y: 0.0023999996, z: -0.0048} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.41666666 + value: {x: 0, y: 0.0008888887, z: -0.002} + inSlope: {x: 0, y: 0.0032, z: 0} + outSlope: {x: 0, y: 0.0032, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.625 + value: {x: 0, y: 0.0015, z: -0.001} + inSlope: {x: 0, y: 0.0024, z: 0.0048} + outSlope: {x: 0, y: 0.0024, z: 0.0048} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.8333333 + value: {x: 0, y: 0.002, z: 0} + inSlope: {x: 0, y: 0, z: 0.0048000007} + outSlope: {x: 0, y: 0, z: 0.0048000007} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.0416666 + value: {x: 0, y: 0.0015, z: 0.001} + inSlope: {x: 0, y: -0.0048, z: 0.0048} + outSlope: {x: 0, y: -0.0048, z: 0.0048} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.25 + value: {x: 0, y: 0, z: 0.002} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.4583334 + value: {x: 0, y: 0, z: 0.001} + inSlope: {x: 0, y: 0, z: -0.0048000007} + outSlope: {x: 0, y: 0, z: -0.0048000007} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.6666666 + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: Body/RightFeetTarget + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.20833333 + value: {x: 0, y: 0, z: 0.001} + inSlope: {x: 0, y: 0, z: 0.0048} + outSlope: {x: 0, y: 0, z: 0.0048} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.41666666 + value: {x: 0, y: 0, z: 0.002} + inSlope: {x: 0, y: 0, z: 0.0047999993} + outSlope: {x: 0, y: 0, z: 0.0047999993} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.625 + value: {x: 0, y: 0, z: 0.003} + inSlope: {x: 0, y: 0, z: 0.0048} + outSlope: {x: 0, y: 0, z: 0.0048} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.8333333 + value: {x: 0, y: 0, z: 0.004} + inSlope: {x: 0, y: 0, z: 0.0048} + outSlope: {x: 0, y: 0, z: 0.0048} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.0416666 + value: {x: 0, y: 0, z: 0.005} + inSlope: {x: 0, y: 0, z: 0.0047999993} + outSlope: {x: 0, y: 0, z: 0.0047999993} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.25 + value: {x: 0, y: 0, z: 0.006} + inSlope: {x: 0, y: 0, z: 0.0047999998} + outSlope: {x: 0, y: 0, z: 0.0047999998} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.4583334 + value: {x: 0, y: 0, z: 0.007} + inSlope: {x: 0, y: 0, z: 0.004800001} + outSlope: {x: 0, y: 0, z: 0.004800001} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.6666666 + value: {x: 0, y: 0, z: 0.008} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: [] + m_SampleRate: 24 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 683997697 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1250470035 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 0 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + pptrCurveMapping: [] + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 1.6666666 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.x + path: Body/LeftFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.20833333 + value: 0.0015 + inSlope: -0.0048 + outSlope: -0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.625 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8333333 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.0416666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.4583334 + value: 0.0015 + inSlope: 0.0048000007 + outSlope: 0.0048000007 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: Body/LeftFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.20833333 + value: 0.001 + inSlope: 0.0048 + outSlope: 0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: 0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.625 + value: 0.001 + inSlope: -0.0048 + outSlope: -0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8333333 + value: 0 + inSlope: -0.0048000007 + outSlope: -0.0048000007 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.0416666 + value: -0.001 + inSlope: -0.0048 + outSlope: -0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: -0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.4583334 + value: -0.001 + inSlope: 0.0048000007 + outSlope: 0.0048000007 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: Body/LeftFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.625 + value: 0.0015 + inSlope: 0.0024 + outSlope: 0.0024 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8333333 + value: 0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.0416666 + value: 0.0015 + inSlope: -0.0048 + outSlope: -0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: Body/RightFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.20833333 + value: -0.001 + inSlope: -0.0048 + outSlope: -0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: -0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.625 + value: -0.001 + inSlope: 0.0048 + outSlope: 0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8333333 + value: 0 + inSlope: 0.0048000007 + outSlope: 0.0048000007 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.0416666 + value: 0.001 + inSlope: 0.0048 + outSlope: 0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: 0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.4583334 + value: 0.001 + inSlope: -0.0048000007 + outSlope: -0.0048000007 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: Body/RightFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.20833333 + value: 0.001 + inSlope: 0.0048 + outSlope: 0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: 0.002 + inSlope: 0.0047999993 + outSlope: 0.0047999993 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.625 + value: 0.003 + inSlope: 0.0048 + outSlope: 0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8333333 + value: 0.004 + inSlope: 0.0048 + outSlope: 0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.0416666 + value: 0.005 + inSlope: 0.0047999993 + outSlope: 0.0047999993 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: 0.006 + inSlope: 0.0047999998 + outSlope: 0.0047999998 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.4583334 + value: 0.007 + inSlope: 0.004800001 + outSlope: 0.004800001 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0.008 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.x + path: + classID: 4 + script: {fileID: 0} + flags: 8 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: + classID: 4 + script: {fileID: 0} + flags: 8 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.x + path: Body/RightFeetTarget + classID: 4 + script: {fileID: 0} + flags: 8 + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 1 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/Samples/Animation/AntWalk.anim.meta b/Samples/Animation/AntWalkForward.anim.meta similarity index 100% rename from Samples/Animation/AntWalk.anim.meta rename to Samples/Animation/AntWalkForward.anim.meta diff --git a/Samples/Animation/AntWalk.anim b/Samples/Animation/AntWalkLeft.anim similarity index 99% rename from Samples/Animation/AntWalk.anim rename to Samples/Animation/AntWalkLeft.anim index 93ed7a6..1fe7ccd 100644 --- a/Samples/Animation/AntWalk.anim +++ b/Samples/Animation/AntWalkLeft.anim @@ -6,7 +6,7 @@ AnimationClip: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: AntWalk + m_Name: AntWalkLeft serializedVersion: 7 m_Legacy: 0 m_Compressed: 0 diff --git a/Samples/Animation/AntWalkLeft.anim.meta b/Samples/Animation/AntWalkLeft.anim.meta new file mode 100644 index 0000000..f78b722 --- /dev/null +++ b/Samples/Animation/AntWalkLeft.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 240c3a3c6c28272059bf7b591ff818b1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Animation/AntWalkRight.anim b/Samples/Animation/AntWalkRight.anim new file mode 100644 index 0000000..45097c5 --- /dev/null +++ b/Samples/Animation/AntWalkRight.anim @@ -0,0 +1,53 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: AntWalkRight + serializedVersion: 7 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: [] + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: [] + pptrCurveMapping: [] + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 1 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: [] + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/Samples/Animation/AntWalkRight.anim.meta b/Samples/Animation/AntWalkRight.anim.meta new file mode 100644 index 0000000..6d413e9 --- /dev/null +++ b/Samples/Animation/AntWalkRight.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 501d5503172629df192bb4ad015fb4f7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Animation/New Avatar Mask.mask b/Samples/Animation/New Avatar Mask.mask new file mode 100644 index 0000000..7a3b202 --- /dev/null +++ b/Samples/Animation/New Avatar Mask.mask @@ -0,0 +1,131 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: New Avatar Mask + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: Armature + m_Weight: 1 + - m_Path: Armature/Antennae_start.l + m_Weight: 1 + - m_Path: Armature/Antennae_start.l/Antennae_1.l + m_Weight: 1 + - m_Path: Armature/Antennae_start.l/Antennae_1.l/Antennae_2.l + m_Weight: 1 + - m_Path: Armature/Antennae_start.l/Antennae_1.l/Antennae_2.l/Antennae_3.l + m_Weight: 1 + - m_Path: Armature/Antennae_start.l/Antennae_1.l/Antennae_2.l/Antennae_3.l/Antennae_End.l + m_Weight: 1 + - m_Path: Armature/Antennae_start.l/Antennae_1.l/Antennae_2.l/Antennae_3.l/Antennae_End.l/Antennae_End.l_end + m_Weight: 1 + - m_Path: Armature/Antennae_start.l/Bone.013 + m_Weight: 1 + - m_Path: Armature/Antennae_start.l/Bone.013/Bone.018 + m_Weight: 1 + - m_Path: Armature/Antennae_start.l/Bone.013/Bone.018/Bone.019 + m_Weight: 1 + - m_Path: Armature/Antennae_start.l/Bone.013/Bone.018/Bone.019/Bone.020 + m_Weight: 1 + - m_Path: Armature/Antennae_start.l/Bone.013/Bone.018/Bone.019/Bone.020/Bone.022 + m_Weight: 1 + - m_Path: Armature/Antennae_start.l/Bone.013/Bone.018/Bone.019/Bone.020/Bone.022/Bone.022_end + m_Weight: 1 + - m_Path: Armature/Backleg_1.l.001 + m_Weight: 0 + - m_Path: Armature/Backleg_1.l.001/Backleg_2.l.001 + m_Weight: 1 + - m_Path: Armature/Backleg_1.l.001/Backleg_2.l.001/Backleg_3.l.001 + m_Weight: 1 + - m_Path: Armature/Backleg_1.l.001/Backleg_2.l.001/Backleg_3.l.001/Backleg_3.l.001_end + m_Weight: 1 + - m_Path: Armature/Bone.001 + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002 + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003 + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.004 + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.004/Bone.006 + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.004/Bone.006/Bone.006_end + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.004/Bone.021 + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.004/Bone.021/Backleg_start.l + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.004/Bone.021/Backleg_start.l/Backleg_1.l + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.004/Bone.021/Backleg_start.l/Backleg_1.l/Backleg_2.l + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.004/Bone.021/Backleg_start.l/Backleg_1.l/Backleg_2.l/Backleg_3.l + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.004/Bone.021/Backleg_start.l/Backleg_1.l/Backleg_2.l/Backleg_3.l/Backleg_3.l_end + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.004/Bone.021/Bone.011 + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.004/Bone.021/Bone.011/Bone.011_end + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.008 + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.008/Bone.009 + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.008/Bone.009/Bone.009_end + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.008/Middleleg_start.l + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.008/Middleleg_start.l/Middleleg_1.l + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.008/Middleleg_start.l/Middleleg_1.l/Bone.014 + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone.003/Bone.008/Middleleg_start.l/Middleleg_1.l/Bone.014/Bone.014_end + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone_010 + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone_010/Bone.010 + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone_010/Bone.010/Bone.010_end + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone_010/Frontleg_Start.l + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone_010/Frontleg_Start.l/Frontleg_1.l.001 + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone_010/Frontleg_Start.l/Frontleg_1.l.001/Frontleg_2.l.001 + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone_010/Frontleg_Start.l/Frontleg_1.l.001/Frontleg_2.l.001/Bone.015 + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone_010/Frontleg_Start.l/Frontleg_1.l.001/Frontleg_2.l.001/Bone.015/Bone.017 + m_Weight: 1 + - m_Path: Armature/Bone.001/Bone.002/Bone_010/Frontleg_Start.l/Frontleg_1.l.001/Frontleg_2.l.001/Bone.015/Bone.017/Bone.017_end + m_Weight: 1 + - m_Path: Armature/Frontleg_1.l.002 + m_Weight: 0 + - m_Path: Armature/Frontleg_1.l.002/Frontleg_2.l.002 + m_Weight: 1 + - m_Path: Armature/Frontleg_1.l.002/Frontleg_2.l.002/Bone.005 + m_Weight: 1 + - m_Path: Armature/Frontleg_1.l.002/Frontleg_2.l.002/Bone.005/Bone.016 + m_Weight: 1 + - m_Path: Armature/Frontleg_1.l.002/Frontleg_2.l.002/Bone.005/Bone.016/Bone.016_end + m_Weight: 1 + - m_Path: Armature/Middleleg_1.l.001 + m_Weight: 0 + - m_Path: Armature/Middleleg_1.l.001/Bone.007 + m_Weight: 1 + - m_Path: Armature/Middleleg_1.l.001/Bone.007/Bone.007_end + m_Weight: 1 + - m_Path: Cube + m_Weight: 1 + - m_Path: Empty + m_Weight: 1 + - m_Path: Empty.001 + m_Weight: 1 + - m_Path: Empty.002 + m_Weight: 1 diff --git a/Samples/Animation/New Avatar Mask.mask.meta b/Samples/Animation/New Avatar Mask.mask.meta new file mode 100644 index 0000000..2769439 --- /dev/null +++ b/Samples/Animation/New Avatar Mask.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 40cc826b39b62ff4299206777177a0f4 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Foraging.unity b/Samples/Foraging.unity index 41acb9f..c249e7d 100644 --- a/Samples/Foraging.unity +++ b/Samples/Foraging.unity @@ -1174,7 +1174,7 @@ PrefabInstance: m_Modifications: - target: {fileID: -8003107013834283777, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_Constraints - value: 64 + value: 112 objectReference: {fileID: 0} - target: {fileID: -8003107013834283777, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_IsKinematic @@ -1226,19 +1226,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.95134765 + value: 0.95134777 objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.16772105 + value: -0.16772102 objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.2545455 + value: -0.2545452 objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.044875965 + value: -0.04487591 objectReference: {fileID: 0} - target: {fileID: 234321254904069504, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_Enabled @@ -1248,53 +1248,61 @@ PrefabInstance: propertyPath: stepOffset value: 0.005 objectReference: {fileID: 0} + - target: {fileID: 234321254904069504, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: forwardSpeed + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 234321254904069504, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: rotationSpeed + value: 2 + objectReference: {fileID: 0} - target: {fileID: 234321254904069504, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: slopeAlignment value: 0.3 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.33182296 + value: 0.33182302 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.49444485 + value: -0.4944452 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.5847301 + value: -0.58472985 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.5509162 + value: 0.55091596 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -2.3283064e-10 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 8.1490725e-10 + value: 0.0000000011641532 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0030040143 + value: 0.0030040147 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6889717 + value: 0.68897134 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.72478825 + value: 0.7247886 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000044703484 + value: -0.0000001937151 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0 + value: 0.000000048428774 objectReference: {fileID: 0} - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: length @@ -1374,31 +1382,31 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.2728942 + value: -0.27289435 objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.07145226 + value: 0.0714522 objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.928101 + value: 0.92810106 objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.24300587 + value: 0.24300568 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 3.12046e-11 + value: -0.0000000014220263 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 9.313226e-10 + value: 4.656613e-10 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0041295565 + value: 0.0041295583 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -1406,35 +1414,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.27217498 + value: -0.27217475 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000009644475 + value: -0.00000004217841 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000117980434 + value: 0.0000000352125 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.45984125 + value: 0.45984116 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.6877812 + value: -0.68778175 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.5008278 + value: -0.50082767 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.2543121 + value: -0.25431108 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.7692179 + value: 0.76921797 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x @@ -1442,23 +1450,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.17796749 + value: 0.17796771 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.3778301 + value: -0.37783003 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -4.858776e-10 + value: 0.0000000011843688 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 0.0000000018626451 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0041061193 + value: 0.0041061174 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -1466,15 +1474,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.3179812 + value: -0.31798124 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000006637054 + value: 0.000000048019064 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.00000007448756 + value: -0.000000021561315 objectReference: {fileID: 0} - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: length @@ -1510,7 +1518,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0.0048809894 + value: 0.0048809904 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1518,31 +1526,31 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: -0.00054921303 + value: -0.0005492186 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.74814796 + value: 0.7481476 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.17950992 + value: 0.17950979 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.62115854 + value: 0.62115896 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.14904019 + value: -0.14904027 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.33122298 + value: -0.33122268 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.9063614 + value: 0.9063615 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y @@ -1550,27 +1558,27 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.03365305 + value: 0.03365326 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.0644018 + value: 0.06440154 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.059745155 + value: 0.059745103 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.8554311 + value: 0.8554312 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.51041216 + value: -0.5104121 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.8352099 + value: 0.8352101 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x @@ -1578,15 +1586,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.1985065 + value: 0.19850568 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.48124552 + value: 0.4812454 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -0.0018809726 + value: -0.0018809717 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1594,23 +1602,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0012553632 + value: 0.0012553646 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.9065213 + value: 0.9065215 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.33378416 + value: 0.33378398 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.24255164 + value: -0.24255136 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.08930831 + value: 0.08930815 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1618,23 +1626,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.7287947 + value: 0.7287942 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.2465918 + value: -0.24659176 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.60509014 + value: 0.6050906 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.20473568 + value: 0.20473601 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0.002248264 + value: 0.0022482676 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1642,31 +1650,31 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0015912976 + value: 0.0015912964 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.91944486 + value: 0.91944474 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.33498573 + value: 0.33498564 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.19348504 + value: 0.19348562 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.070493326 + value: -0.07049353 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 5.680957e-10 + value: -3.7980208e-10 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -9.3132246e-10 + value: -0.0000000013969836 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z @@ -1682,11 +1690,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000102507784 + value: -0.00000011393213 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000110644734 + value: 0.0000000763834 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1694,51 +1702,51 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.73313886 + value: 0.733139 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.24335043 + value: -0.24335082 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.6027143 + value: -0.60271394 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.20005868 + value: -0.20005886 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -2.0372681e-10 + value: 1.1641532e-10 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -2.3283064e-10 + value: -1.7462298e-10 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0024082726 + value: 0.0024082728 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.67232114 + value: 0.6723209 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.74025965 + value: 0.7402599 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.0000002384186 + value: 0.000000029802322 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000044703487 + value: 0.000000014901161 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0.0032548942 + value: 0.0032548946 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1746,31 +1754,31 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: -0.0060925954 + value: -0.006092592 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.26382607 + value: 0.26382625 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.06890167 + value: 0.06890188 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.93088377 + value: 0.9308836 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.24311262 + value: -0.24311315 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0.0000000021005535 + value: -0.0000000024141102 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 9.3132246e-10 + value: -0.0000000051222737 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z @@ -1782,19 +1790,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.3112346 + value: -0.31123453 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.000000050154085 + value: 0.000000098394835 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000010938996 + value: -0.00000009902294 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -0.0027482398 + value: -0.0027482407 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1802,35 +1810,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: -0.005979649 + value: -0.005979648 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.27477506 + value: -0.27477518 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.063838094 + value: -0.06383813 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.93449795 + value: 0.9344979 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.21711057 + value: -0.21711059 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0.0000000010598334 + value: 5.174054e-10 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -2.3283064e-10 + value: 6.9849193e-10 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0030214668 + value: 0.0030214672 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -1838,59 +1846,59 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.2873954 + value: -0.28739524 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000005828909 + value: 0.000000058589194 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000112478034 + value: -0.00000012289547 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -4.0745363e-10 + value: 5.820766e-11 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 2.910383e-10 + value: -1.1641532e-10 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0019033398 + value: 0.0019033395 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6810774 + value: 0.6810776 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.7322114 + value: 0.73221123 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000035762787 + value: -0.0000001937151 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.00000017881393 + value: 0.00000009685755 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.40812185 + value: 0.4081217 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.27147034 + value: 0.27147076 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.85242325 + value: 0.8524233 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.1819752 + value: -0.18197508 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1902,19 +1910,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.9623594 + value: 0.96235925 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.17736602 + value: -0.1773659 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.2025158 + value: 0.20251653 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.037324335 + value: 0.037324443 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1926,39 +1934,39 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: -0.0006929303 + value: -0.0006929275 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.75082076 + value: 0.7508209 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.18160486 + value: 0.18160503 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.6172505 + value: -0.61725026 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.14929757 + value: 0.1492976 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.34205782 + value: 0.34205842 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.9227911 + value: 0.922791 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.1756374 + value: 0.17563704 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.024586445 + value: -0.024586359 objectReference: {fileID: 0} - target: {fileID: 6049855982455691338, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_Name @@ -1998,55 +2006,55 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -3.4924597e-10 + value: 1.1641532e-10 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -2.3283064e-10 + value: -9.313226e-10 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0030040175 + value: 0.003004017 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.69097394 + value: 0.69097406 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.7228797 + value: 0.7228796 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y + value: -0.00000010430813 + objectReference: {fileID: 0} + - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z value: 0.000000029802322 objectReference: {fileID: 0} - - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.000000037252903 - objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.68892556 + value: 0.6889249 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.63667464 + value: 0.63667476 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.007983026 + value: -0.007983801 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.34635723 + value: -0.34635806 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 2.0372681e-10 + value: -8.731149e-11 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 4.0745363e-10 + value: 1.4551915e-10 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z @@ -2054,7 +2062,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.67109257 + value: 0.6710925 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x @@ -2062,87 +2070,87 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.000000059604645 + value: 0.000000059604645 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000014901161 + value: -0.000000059604645 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.5119412 + value: 0.5119414 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.32878813 + value: 0.32878837 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.46407005 + value: 0.46407017 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.64378065 + value: -0.64378047 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -5.820766e-10 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -1.1641532e-10 + value: -2.3283064e-10 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0019033403 + value: 0.0019033398 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6799132 + value: 0.6799134 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.73329264 + value: 0.73329246 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.0000001490116 + value: -0.00000017881393 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000083819025 + value: 0.000000115484 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6510875 + value: 0.6510879 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.41958776 + value: 0.41958743 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.16263537 + value: -0.16263406 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.61121273 + value: -0.61121297 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.027075293 + value: -0.027076023 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.71349 + value: 0.7134898 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.68053895 + value: 0.6805391 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.16451639 + value: 0.16451733 objectReference: {fileID: 0} - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: femurLength @@ -2182,23 +2190,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.2649386 + value: 0.26493874 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.06449178 + value: -0.06449182 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.93480915 + value: 0.9348091 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.22755279 + value: 0.22755282 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -4.5296267e-11 + value: 4.5714887e-10 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -2206,23 +2214,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0029819123 + value: 0.0029819126 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.95701724 + value: 0.9570172 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.2900312 + value: -0.29003125 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000022725318 + value: 0.00000013426725 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.00000032687367 + value: -0.00000018701589 objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: diff --git a/Samples/Models/LowPolyAntRigged.fbx.meta b/Samples/Models/LowPolyAntRigged.fbx.meta index d7fceb2..e534dd9 100644 --- a/Samples/Models/LowPolyAntRigged.fbx.meta +++ b/Samples/Models/LowPolyAntRigged.fbx.meta @@ -90,8 +90,8 @@ ModelImporter: armStretch: 0.05 legStretch: 0.05 feetSpacing: 0 - globalScale: 0.0005 - rootMotionBoneName: + globalScale: 0.05 + rootMotionBoneName: Armature hasTranslationDoF: 0 hasExtraRoot: 0 skeletonHasParents: 1 @@ -99,7 +99,7 @@ ModelImporter: autoGenerateAvatarMappingIfUnspecified: 1 animationType: 2 humanoidOversampling: 1 - avatarSetup: 0 + avatarSetup: 1 addHumanoidExtraRootOnlyWhenUsingAvatar: 1 importBlendShapeDeformPercent: 1 remapMaterialsIfMaterialImportModeIsNone: 0 From 7ced91909ac774f6ecfb7ca3807888bc5514118d Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Thu, 9 Apr 2026 12:53:00 +0200 Subject: [PATCH 12/38] Improved control --- Runtime/Scripts/Ant.cs | 2 + Samples/Animation/AntAnimator.controller | 70 +- Samples/Animation/AntRotateLeft.anim | 599 +++------------ Samples/Animation/AntRotateRight.anim | 465 ++---------- Samples/Animation/AntWalkForward.anim | 580 +++++++-------- Samples/Animation/AntWalkLeft.anim | 836 +++++++++++---------- Samples/Animation/AntWalkRight.anim | 888 ++++++++++++++++++++++- Samples/Foraging.unity | 662 ++++++++++++----- Samples/Prefabs/Food.prefab | 2 +- 9 files changed, 2301 insertions(+), 1803 deletions(-) diff --git a/Runtime/Scripts/Ant.cs b/Runtime/Scripts/Ant.cs index 93758c7..5bf6784 100644 --- a/Runtime/Scripts/Ant.cs +++ b/Runtime/Scripts/Ant.cs @@ -99,6 +99,8 @@ namespace Passer.CreatureControl { return; Vector3 localForce = nanoBrain.brain.defaultOutput.outputValue; + //Vector3 localForce = this.transform.InverseTransformDirection(worldForce); + this.linearVelocity = (1 - inertia) * (Time.deltaTime * localForce.normalized) + inertia * this.linearVelocity; this.linearVelocity = this.linearVelocity.normalized; // * this.forwardSpeed; diff --git a/Samples/Animation/AntAnimator.controller b/Samples/Animation/AntAnimator.controller index 2bf1bca..1c64d3e 100644 --- a/Samples/Animation/AntAnimator.controller +++ b/Samples/Animation/AntAnimator.controller @@ -18,15 +18,15 @@ BlendTree: m_Mirror: 0 - serializedVersion: 2 m_Motion: {fileID: 7400000, guid: b8a731a1533b8c960b3f3688d4922a24, type: 2} - m_Threshold: 0.33333334 + m_Threshold: 0.09600001 m_Position: {x: 0, y: 1} - m_TimeScale: 2 + m_TimeScale: 5 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 - serializedVersion: 2 m_Motion: {fileID: 7400000, guid: ab82ff68e62ea3b1c8e6523f8d46c142, type: 2} - m_Threshold: 0.6666667 + m_Threshold: 0.19200002 m_Position: {x: -1, y: 0} m_TimeScale: 2 m_CycleOffset: 0 @@ -34,16 +34,32 @@ BlendTree: m_Mirror: 0 - serializedVersion: 2 m_Motion: {fileID: 7400000, guid: 91229db5e929c379bbfd5bf417848488, type: 2} - m_Threshold: 1 + m_Threshold: 0.28800002 m_Position: {x: 1, y: 0} m_TimeScale: 2 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 + - serializedVersion: 2 + m_Motion: {fileID: 7400000, guid: 501d5503172629df192bb4ad015fb4f7, type: 2} + m_Threshold: 0.38400003 + m_Position: {x: 1, y: -1} + m_TimeScale: 1 + m_CycleOffset: 0 + m_DirectBlendParameter: Forward + m_Mirror: 0 + - serializedVersion: 2 + m_Motion: {fileID: 7400000, guid: 240c3a3c6c28272059bf7b591ff818b1, type: 2} + m_Threshold: 0.48000002 + m_Position: {x: -1, y: -1} + m_TimeScale: 1 + m_CycleOffset: 0 + m_DirectBlendParameter: Forward + m_Mirror: 0 m_BlendParameter: Rotate m_BlendParameterY: Forward m_MinThreshold: 0 - m_MaxThreshold: 1 + m_MaxThreshold: 0.48000002 m_UseAutomaticThresholds: 1 m_NormalizedBlendValues: 0 m_BlendType: 3 @@ -99,6 +115,47 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: +--- !u!206 &-844531329161772208 +BlendTree: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: BlendTree + m_Childs: [] + m_BlendParameter: Rotate + m_BlendParameterY: Blend + m_MinThreshold: 0 + m_MaxThreshold: 1 + m_UseAutomaticThresholds: 1 + m_NormalizedBlendValues: 0 + m_BlendType: 0 +--- !u!1102 &-477768274303629365 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: AntWalkRight + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 501d5503172629df192bb4ad015fb4f7, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: --- !u!91 &9100000 AnimatorController: m_ObjectHideFlags: 0 @@ -185,6 +242,9 @@ AnimatorStateMachine: - serializedVersion: 1 m_State: {fileID: -885377640043731298} m_Position: {x: 415, y: 215, z: 0} + - serializedVersion: 1 + m_State: {fileID: -477768274303629365} + m_Position: {x: 450, y: 280, z: 0} m_ChildStateMachines: [] m_AnyStateTransitions: [] m_EntryTransitions: [] diff --git a/Samples/Animation/AntRotateLeft.anim b/Samples/Animation/AntRotateLeft.anim index 39477ba..675cb1c 100644 --- a/Samples/Animation/AntRotateLeft.anim +++ b/Samples/Animation/AntRotateLeft.anim @@ -20,15 +20,6 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.083333336 - value: {x: 0, y: 5.625, z: 0} inSlope: {x: 0, y: 67.5, z: 0} outSlope: {x: 0, y: 67.5, z: 0} tangentMode: 0 @@ -38,53 +29,17 @@ AnimationClip: - serializedVersion: 3 time: 0.16666667 value: {x: 0, y: 11.25, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: -0.0000038146973, z: 0} + outSlope: {x: 0, y: -0.0000038146973, z: 0} tangentMode: 0 weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.25 - value: {x: 0, y: 5.625, z: 0} - inSlope: {x: 0, y: -67.5, z: 0} - outSlope: {x: 0, y: -67.5, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.33333334 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: -67.50001, z: 0} - outSlope: {x: 0, y: -67.50001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 - value: {x: 0, y: -5.625, z: 0} - inSlope: {x: 0, y: -67.50001, z: 0} - outSlope: {x: 0, y: -67.50001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + inWeight: {x: 0, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.5 value: {x: 0, y: -11.25, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.5833333 - value: {x: 0, y: -5.625, z: 0} - inSlope: {x: 0, y: 67.49999, z: 0} - outSlope: {x: 0, y: 67.49999, z: 0} + inSlope: {x: 0, y: -0.0000076293945, z: 0} + outSlope: {x: 0, y: -0.0000076293945, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -92,8 +47,8 @@ AnimationClip: - serializedVersion: 3 time: 0.6666667 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 67.49999, z: 0} + outSlope: {x: 0, y: 67.49999, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -108,15 +63,6 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.083333336 - value: {x: 0, y: -5.625, z: 0} inSlope: {x: 0, y: -67.5, z: 0} outSlope: {x: 0, y: -67.5, z: 0} tangentMode: 0 @@ -126,53 +72,17 @@ AnimationClip: - serializedVersion: 3 time: 0.16666667 value: {x: 0, y: -11.25, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0.0000038146973, z: 0} + outSlope: {x: 0, y: 0.0000038146973, z: 0} tangentMode: 0 weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.25 - value: {x: 0, y: -5.625, z: 0} - inSlope: {x: 0, y: 67.5, z: 0} - outSlope: {x: 0, y: 67.5, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.33333334 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 67.50001, z: 0} - outSlope: {x: 0, y: 67.50001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 - value: {x: 0, y: 5.625, z: 0} - inSlope: {x: 0, y: 67.50001, z: 0} - outSlope: {x: 0, y: 67.50001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + inWeight: {x: 0, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.5 value: {x: 0, y: 11.25, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.5833333 - value: {x: 0, y: 5.625, z: 0} - inSlope: {x: 0, y: -67.49999, z: 0} - outSlope: {x: 0, y: -67.49999, z: 0} + inSlope: {x: 0, y: 0.0000076293945, z: 0} + outSlope: {x: 0, y: 0.0000076293945, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -180,8 +90,8 @@ AnimationClip: - serializedVersion: 3 time: 0.6666667 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: -67.49999, z: 0} + outSlope: {x: 0, y: -67.49999, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -196,80 +106,17 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.083333336 - value: {x: 0, y: -5.625, z: 0} inSlope: {x: 0, y: -67.5, z: 0} outSlope: {x: 0, y: -67.5, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.16666667 - value: {x: 0, y: -11.25, z: 0} - inSlope: {x: 0, y: -67.50001, z: 0} - outSlope: {x: 0, y: -67.50001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.25 - value: {x: 0, y: -16.875, z: 0} - inSlope: {x: 0, y: -67.5, z: 0} - outSlope: {x: 0, y: -67.5, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.33333334 - value: {x: 0, y: -22.5, z: 0} - inSlope: {x: 0, y: -67.50001, z: 0} - outSlope: {x: 0, y: -67.50001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 - value: {x: 0, y: -28.125, z: 0} - inSlope: {x: 0, y: -67.50001, z: 0} - outSlope: {x: 0, y: -67.50001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.5 - value: {x: 0, y: -33.75, z: 0} - inSlope: {x: 0, y: -67.50001, z: 0} - outSlope: {x: 0, y: -67.50001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.5833333 - value: {x: 0, y: -39.375, z: 0} - inSlope: {x: 0, y: -67.49999, z: 0} - outSlope: {x: 0, y: -67.49999, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.6666667 value: {x: 0, y: -45, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: -67.5, z: 0} + outSlope: {x: 0, y: -67.5, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -551,81 +398,36 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.083333336 - value: 5.625 inSlope: 67.5 outSlope: 67.5 - tangentMode: 136 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.16666667 value: 11.25 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.25 - value: 5.625 - inSlope: -67.5 - outSlope: -67.5 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.33333334 - value: 0 - inSlope: -67.50001 - outSlope: -67.50001 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: -5.625 - inSlope: -67.50001 - outSlope: -67.50001 - tangentMode: 136 + inSlope: -0.0000038146973 + outSlope: -0.0000038146973 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.5 value: -11.25 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5833333 - value: -5.625 - inSlope: 67.49999 - outSlope: 67.49999 - tangentMode: 136 + inSlope: -0.0000076293945 + outSlope: -0.0000076293945 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.6666667 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: 67.49999 + outSlope: 67.49999 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -686,81 +488,36 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.083333336 - value: -5.625 inSlope: -67.5 outSlope: -67.5 - tangentMode: 136 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.16666667 value: -11.25 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.25 - value: -5.625 - inSlope: 67.5 - outSlope: 67.5 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.33333334 - value: 0 - inSlope: 67.50001 - outSlope: 67.50001 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 5.625 - inSlope: 67.50001 - outSlope: 67.50001 - tangentMode: 136 + inSlope: 0.0000038146973 + outSlope: 0.0000038146973 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.5 value: 11.25 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5833333 - value: 5.625 - inSlope: -67.49999 - outSlope: -67.49999 - tangentMode: 136 + inSlope: 0.0000076293945 + outSlope: 0.0000076293945 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.6666667 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: -67.49999 + outSlope: -67.49999 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -1067,69 +824,6 @@ AnimationClip: weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.083333336 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.16666667 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.25 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.33333334 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5833333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - serializedVersion: 3 time: 0.6666667 value: 0 @@ -1154,81 +848,18 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.083333336 - value: -5.625 inSlope: -67.5 outSlope: -67.5 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.16666667 - value: -11.25 - inSlope: -67.50001 - outSlope: -67.50001 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.25 - value: -16.875 - inSlope: -67.5 - outSlope: -67.5 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.33333334 - value: -22.5 - inSlope: -67.50001 - outSlope: -67.50001 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: -28.125 - inSlope: -67.50001 - outSlope: -67.50001 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5 - value: -33.75 - inSlope: -67.50001 - outSlope: -67.50001 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5833333 - value: -39.375 - inSlope: -67.49999 - outSlope: -67.49999 - tangentMode: 136 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.6666667 value: -45 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: -67.5 + outSlope: -67.5 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -1270,78 +901,6 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_LocalEulerAngles.z - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalEulerAngles.y - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalEulerAngles.x - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalEulerAngles.z - path: Body/RightFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalEulerAngles.y - path: Body/RightFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalEulerAngles.x - path: Body/RightFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalEulerAngles.x path: classID: 4 script: {fileID: 0} @@ -1358,6 +917,18 @@ AnimationClip: classID: 4 script: {fileID: 0} flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.x + path: + classID: 4 + script: {fileID: 0} + flags: 0 - serializedVersion: 2 curve: serializedVersion: 2 @@ -1366,7 +937,67 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_LocalEulerAngles.z - path: + path: Body/LeftFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.y + path: Body/LeftFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.x + path: Body/LeftFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.x + path: Body/RightFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.y + path: Body/RightFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.z + path: Body/RightFeetTarget classID: 4 script: {fileID: 0} flags: 0 diff --git a/Samples/Animation/AntRotateRight.anim b/Samples/Animation/AntRotateRight.anim index 0673f30..ccd6300 100644 --- a/Samples/Animation/AntRotateRight.anim +++ b/Samples/Animation/AntRotateRight.anim @@ -20,15 +20,6 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.083333336 - value: {x: 0, y: -5.625, z: 0} inSlope: {x: 0, y: -67.5, z: 0} outSlope: {x: 0, y: -67.5, z: 0} tangentMode: 0 @@ -38,53 +29,17 @@ AnimationClip: - serializedVersion: 3 time: 0.16666667 value: {x: 0, y: -11.25, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0.0000038146973, z: 0} + outSlope: {x: 0, y: 0.0000038146973, z: 0} tangentMode: 0 weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.25 - value: {x: 0, y: -5.625, z: 0} - inSlope: {x: 0, y: 67.5, z: 0} - outSlope: {x: 0, y: 67.5, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.33333334 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 67.50001, z: 0} - outSlope: {x: 0, y: 67.50001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 - value: {x: 0, y: 5.625, z: 0} - inSlope: {x: 0, y: 67.50001, z: 0} - outSlope: {x: 0, y: 67.50001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + inWeight: {x: 0, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.5 value: {x: 0, y: 11.25, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.5833333 - value: {x: 0, y: 5.625, z: 0} - inSlope: {x: 0, y: -67.49999, z: 0} - outSlope: {x: 0, y: -67.49999, z: 0} + inSlope: {x: 0, y: 0.0000076293945, z: 0} + outSlope: {x: 0, y: 0.0000076293945, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -92,8 +47,8 @@ AnimationClip: - serializedVersion: 3 time: 0.6666667 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: -67.49999, z: 0} + outSlope: {x: 0, y: -67.49999, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -108,15 +63,6 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.083333336 - value: {x: 0, y: 5.625, z: 0} inSlope: {x: 0, y: 67.5, z: 0} outSlope: {x: 0, y: 67.5, z: 0} tangentMode: 0 @@ -126,53 +72,17 @@ AnimationClip: - serializedVersion: 3 time: 0.16666667 value: {x: 0, y: 11.25, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: -0.0000038146973, z: 0} + outSlope: {x: 0, y: -0.0000038146973, z: 0} tangentMode: 0 weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.25 - value: {x: 0, y: 5.625, z: 0} - inSlope: {x: 0, y: -67.5, z: 0} - outSlope: {x: 0, y: -67.5, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.33333334 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: -67.50001, z: 0} - outSlope: {x: 0, y: -67.50001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 - value: {x: 0, y: -5.625, z: 0} - inSlope: {x: 0, y: -67.50001, z: 0} - outSlope: {x: 0, y: -67.50001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + inWeight: {x: 0, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.5 value: {x: 0, y: -11.25, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.5833333 - value: {x: 0, y: -5.625, z: 0} - inSlope: {x: 0, y: 67.49999, z: 0} - outSlope: {x: 0, y: 67.49999, z: 0} + inSlope: {x: 0, y: -0.0000076293945, z: 0} + outSlope: {x: 0, y: -0.0000076293945, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -180,8 +90,8 @@ AnimationClip: - serializedVersion: 3 time: 0.6666667 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 67.49999, z: 0} + outSlope: {x: 0, y: 67.49999, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -196,80 +106,17 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.083333336 - value: {x: 0, y: 5.625, z: 0} inSlope: {x: 0, y: 67.5, z: 0} outSlope: {x: 0, y: 67.5, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.16666667 - value: {x: 0, y: 11.25, z: 0} - inSlope: {x: 0, y: 67.50001, z: 0} - outSlope: {x: 0, y: 67.50001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.25 - value: {x: 0, y: 16.875, z: 0} - inSlope: {x: 0, y: 67.5, z: 0} - outSlope: {x: 0, y: 67.5, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.33333334 - value: {x: 0, y: 22.5, z: 0} - inSlope: {x: 0, y: 67.50001, z: 0} - outSlope: {x: 0, y: 67.50001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 - value: {x: 0, y: 28.125, z: 0} - inSlope: {x: 0, y: 67.50001, z: 0} - outSlope: {x: 0, y: 67.50001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.5 - value: {x: 0, y: 33.75, z: 0} - inSlope: {x: 0, y: 67.50001, z: 0} - outSlope: {x: 0, y: 67.50001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.5833333 - value: {x: 0, y: 39.375, z: 0} - inSlope: {x: 0, y: 67.49999, z: 0} - outSlope: {x: 0, y: 67.49999, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.6666667 value: {x: 0, y: 45, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 67.5, z: 0} + outSlope: {x: 0, y: 67.5, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -551,81 +398,36 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.083333336 - value: -5.625 inSlope: -67.5 outSlope: -67.5 - tangentMode: 136 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.16666667 value: -11.25 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.25 - value: -5.625 - inSlope: 67.5 - outSlope: 67.5 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.33333334 - value: 0 - inSlope: 67.50001 - outSlope: 67.50001 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 5.625 - inSlope: 67.50001 - outSlope: 67.50001 - tangentMode: 136 + inSlope: 0.0000038146973 + outSlope: 0.0000038146973 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.5 value: 11.25 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5833333 - value: 5.625 - inSlope: -67.49999 - outSlope: -67.49999 - tangentMode: 136 + inSlope: 0.0000076293945 + outSlope: 0.0000076293945 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.6666667 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: -67.49999 + outSlope: -67.49999 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -686,81 +488,36 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.083333336 - value: 5.625 inSlope: 67.5 outSlope: 67.5 - tangentMode: 136 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.16666667 value: 11.25 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.25 - value: 5.625 - inSlope: -67.5 - outSlope: -67.5 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.33333334 - value: 0 - inSlope: -67.50001 - outSlope: -67.50001 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: -5.625 - inSlope: -67.50001 - outSlope: -67.50001 - tangentMode: 136 + inSlope: -0.0000038146973 + outSlope: -0.0000038146973 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.5 value: -11.25 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5833333 - value: -5.625 - inSlope: 67.49999 - outSlope: 67.49999 - tangentMode: 136 + inSlope: -0.0000076293945 + outSlope: -0.0000076293945 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.6666667 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: 67.49999 + outSlope: 67.49999 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -1067,69 +824,6 @@ AnimationClip: weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.083333336 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.16666667 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.25 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.33333334 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5833333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - serializedVersion: 3 time: 0.6666667 value: 0 @@ -1154,81 +848,18 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.083333336 - value: 5.625 inSlope: 67.5 outSlope: 67.5 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.16666667 - value: 11.25 - inSlope: 67.50001 - outSlope: 67.50001 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.25 - value: 16.875 - inSlope: 67.5 - outSlope: 67.5 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.33333334 - value: 22.5 - inSlope: 67.50001 - outSlope: 67.50001 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 28.125 - inSlope: 67.50001 - outSlope: 67.50001 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5 - value: 33.75 - inSlope: 67.50001 - outSlope: 67.50001 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5833333 - value: 39.375 - inSlope: 67.49999 - outSlope: 67.49999 - tangentMode: 136 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.6666667 value: 45 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: 67.5 + outSlope: 67.5 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -1270,7 +901,7 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_LocalEulerAngles.z - path: Body/RightFeetTarget + path: Body/LeftFeetTarget classID: 4 script: {fileID: 0} flags: 0 @@ -1282,7 +913,7 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_LocalEulerAngles.y - path: Body/RightFeetTarget + path: Body/LeftFeetTarget classID: 4 script: {fileID: 0} flags: 0 @@ -1294,7 +925,7 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_LocalEulerAngles.x - path: Body/RightFeetTarget + path: Body/LeftFeetTarget classID: 4 script: {fileID: 0} flags: 0 @@ -1306,7 +937,7 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_LocalEulerAngles.z - path: Body/LeftFeetTarget + path: Body/RightFeetTarget classID: 4 script: {fileID: 0} flags: 0 @@ -1318,7 +949,7 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_LocalEulerAngles.y - path: Body/LeftFeetTarget + path: Body/RightFeetTarget classID: 4 script: {fileID: 0} flags: 0 @@ -1330,7 +961,7 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_LocalEulerAngles.x - path: Body/LeftFeetTarget + path: Body/RightFeetTarget classID: 4 script: {fileID: 0} flags: 0 diff --git a/Samples/Animation/AntWalkForward.anim b/Samples/Animation/AntWalkForward.anim index 2d2a388..13f9e78 100644 --- a/Samples/Animation/AntWalkForward.anim +++ b/Samples/Animation/AntWalkForward.anim @@ -15,6 +15,94 @@ AnimationClip: m_CompressedRotationCurves: [] m_EulerCurves: [] m_PositionCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.20833333 + value: {x: 0, y: 0, z: -0.001} + inSlope: {x: 0, y: 0, z: -0.0048} + outSlope: {x: 0, y: 0, z: -0.0048} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.41666666 + value: {x: 0, y: 0, z: -0.002} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.625 + value: {x: 0, y: 0.0015, z: -0.001} + inSlope: {x: 0, y: 0.0048, z: 0.0048} + outSlope: {x: 0, y: 0.0048, z: 0.0048} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.8333333 + value: {x: 0, y: 0.002, z: 0} + inSlope: {x: 0, y: 0, z: 0.0048000007} + outSlope: {x: 0, y: 0, z: 0.0048000007} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.0416666 + value: {x: 0, y: 0.0015, z: 0.001} + inSlope: {x: 0, y: -0.0048, z: 0.0048} + outSlope: {x: 0, y: -0.0048, z: 0.0048} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.25 + value: {x: 0, y: 0, z: 0.002} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.4583334 + value: {x: 0, y: 0, z: 0.001} + inSlope: {x: 0, y: 0, z: -0.0048000007} + outSlope: {x: 0, y: 0, z: -0.0048000007} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.6666666 + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: Body/LeftFeetTarget - curve: serializedVersion: 2 m_Curve: @@ -102,94 +190,6 @@ AnimationClip: m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 - path: Body/LeftFeetTarget - - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.20833333 - value: {x: 0, y: 0.00027777773, z: -0.001} - inSlope: {x: 0, y: 0.0023999996, z: -0.0048} - outSlope: {x: 0, y: 0.0023999996, z: -0.0048} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 - value: {x: 0, y: 0.0008888887, z: -0.002} - inSlope: {x: 0, y: 0.0032, z: 0} - outSlope: {x: 0, y: 0.0032, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.625 - value: {x: 0, y: 0.0015, z: -0.001} - inSlope: {x: 0, y: 0.0024, z: 0.0048} - outSlope: {x: 0, y: 0.0024, z: 0.0048} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.8333333 - value: {x: 0, y: 0.002, z: 0} - inSlope: {x: 0, y: 0, z: 0.0048000007} - outSlope: {x: 0, y: 0, z: 0.0048000007} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.0416666 - value: {x: 0, y: 0.0015, z: 0.001} - inSlope: {x: 0, y: -0.0048, z: 0.0048} - outSlope: {x: 0, y: -0.0048, z: 0.0048} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.25 - value: {x: 0, y: 0, z: 0.002} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.4583334 - value: {x: 0, y: 0, z: 0.001} - inSlope: {x: 0, y: 0, z: -0.0048000007} - outSlope: {x: 0, y: 0, z: -0.0048000007} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.6666666 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 path: Body/RightFeetTarget - curve: serializedVersion: 2 @@ -197,80 +197,17 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.20833333 - value: {x: 0, y: 0, z: 0.001} inSlope: {x: 0, y: 0, z: 0.0048} outSlope: {x: 0, y: 0, z: 0.0048} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 - value: {x: 0, y: 0, z: 0.002} - inSlope: {x: 0, y: 0, z: 0.0047999993} - outSlope: {x: 0, y: 0, z: 0.0047999993} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.625 - value: {x: 0, y: 0, z: 0.003} - inSlope: {x: 0, y: 0, z: 0.0048} - outSlope: {x: 0, y: 0, z: 0.0048} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.8333333 - value: {x: 0, y: 0, z: 0.004} - inSlope: {x: 0, y: 0, z: 0.0048} - outSlope: {x: 0, y: 0, z: 0.0048} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.0416666 - value: {x: 0, y: 0, z: 0.005} - inSlope: {x: 0, y: 0, z: 0.0047999993} - outSlope: {x: 0, y: 0, z: 0.0047999993} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.25 - value: {x: 0, y: 0, z: 0.006} - inSlope: {x: 0, y: 0, z: 0.0047999998} - outSlope: {x: 0, y: 0, z: 0.0047999998} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.4583334 - value: {x: 0, y: 0, z: 0.007} - inSlope: {x: 0, y: 0, z: 0.004800001} - outSlope: {x: 0, y: 0, z: 0.004800001} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 1.6666666 value: {x: 0, y: 0, z: 0.008} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0.0048} + outSlope: {x: 0, y: 0, z: 0.0048} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -328,7 +265,7 @@ AnimationClip: m_CycleOffset: 0 m_HasAdditiveReferencePose: 0 m_LoopTime: 1 - m_LoopBlend: 0 + m_LoopBlend: 1 m_LoopBlendOrientation: 0 m_LoopBlendPositionY: 0 m_LoopBlendPositionXZ: 0 @@ -365,7 +302,7 @@ AnimationClip: m_Curve: - serializedVersion: 3 time: 0 - value: 0.002 + value: 0 inSlope: 0 outSlope: 0 tangentMode: 136 @@ -374,9 +311,9 @@ AnimationClip: outWeight: 0.33333334 - serializedVersion: 3 time: 0.20833333 - value: 0.0015 - inSlope: -0.0048 - outSlope: -0.0048 + value: 0 + inSlope: 0 + outSlope: 0 tangentMode: 136 weightedMode: 0 inWeight: 0.33333334 @@ -392,82 +329,7 @@ AnimationClip: outWeight: 0.33333334 - serializedVersion: 3 time: 0.625 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.25 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 value: 0.0015 - inSlope: 0.0048000007 - outSlope: 0.0048000007 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 - value: 0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.y - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.20833333 - value: 0.001 inSlope: 0.0048 outSlope: 0.0048 tangentMode: 136 @@ -475,7 +337,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.41666666 + time: 0.8333333 value: 0.002 inSlope: 0 outSlope: 0 @@ -483,27 +345,9 @@ AnimationClip: weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: 0.001 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0 - inSlope: -0.0048000007 - outSlope: -0.0048000007 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - serializedVersion: 3 time: 1.0416666 - value: -0.001 + value: 0.0015 inSlope: -0.0048 outSlope: -0.0048 tangentMode: 136 @@ -512,7 +356,7 @@ AnimationClip: outWeight: 0.33333334 - serializedVersion: 3 time: 1.25 - value: -0.002 + value: 0 inSlope: 0 outSlope: 0 tangentMode: 136 @@ -521,9 +365,9 @@ AnimationClip: outWeight: 0.33333334 - serializedVersion: 3 time: 1.4583334 - value: -0.001 - inSlope: 0.0048000007 - outSlope: 0.0048000007 + value: 0 + inSlope: 0 + outSlope: 0 tangentMode: 136 weightedMode: 0 inWeight: 0.33333334 @@ -540,65 +384,8 @@ AnimationClip: m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 - attribute: m_LocalPosition.z - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: 0.0015 - inSlope: 0.0024 - outSlope: 0.0024 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: 0.0015 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.25 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 attribute: m_LocalPosition.y - path: Body/RightFeetTarget + path: Body/LeftFeetTarget classID: 4 script: {fileID: 0} flags: 0 @@ -691,6 +478,99 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_LocalPosition.z + path: Body/LeftFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.20833333 + value: 0.0015 + inSlope: -0.0048 + outSlope: -0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.625 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8333333 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.0416666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.4583334 + value: 0.0015 + inSlope: 0.0048000007 + outSlope: 0.0048000007 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y path: Body/RightFeetTarget classID: 4 script: {fileID: 0} @@ -720,63 +600,93 @@ AnimationClip: - serializedVersion: 3 time: 0.41666666 value: 0.002 - inSlope: 0.0047999993 - outSlope: 0.0047999993 + inSlope: 0 + outSlope: 0 tangentMode: 136 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.625 - value: 0.003 - inSlope: 0.0048 - outSlope: 0.0048 + value: 0.001 + inSlope: -0.0048 + outSlope: -0.0048 tangentMode: 136 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.8333333 - value: 0.004 - inSlope: 0.0048 - outSlope: 0.0048 + value: 0 + inSlope: -0.0048000007 + outSlope: -0.0048000007 tangentMode: 136 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 1.0416666 - value: 0.005 - inSlope: 0.0047999993 - outSlope: 0.0047999993 + value: -0.001 + inSlope: -0.0048 + outSlope: -0.0048 tangentMode: 136 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 1.25 - value: 0.006 - inSlope: 0.0047999998 - outSlope: 0.0047999998 + value: -0.002 + inSlope: 0 + outSlope: 0 tangentMode: 136 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 1.4583334 - value: 0.007 - inSlope: 0.004800001 - outSlope: 0.004800001 + value: -0.001 + inSlope: 0.0048000007 + outSlope: 0.0048000007 tangentMode: 136 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: Body/RightFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0.0048 + outSlope: 0.0048 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 - serializedVersion: 3 time: 1.6666666 value: 0.008 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: 0.0048 + outSlope: 0.0048 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 diff --git a/Samples/Animation/AntWalkLeft.anim b/Samples/Animation/AntWalkLeft.anim index 1fe7ccd..128ec6c 100644 --- a/Samples/Animation/AntWalkLeft.anim +++ b/Samples/Animation/AntWalkLeft.anim @@ -20,7 +20,7 @@ AnimationClip: m_Curve: - serializedVersion: 3 time: 0 - value: {x: 0, y: 0.002, z: 0} + value: {x: 0, y: 0, z: 0} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 @@ -29,16 +29,16 @@ AnimationClip: outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.20833333 - value: {x: 0, y: 0.0015, z: 0.001} - inSlope: {x: 0, y: -0.0048, z: 0.0048} - outSlope: {x: 0, y: -0.0048, z: 0.0048} + value: {x: 0.001, y: 0, z: 0} + inSlope: {x: 0.0048, y: 0, z: 0} + outSlope: {x: 0.0048, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.41666666 - value: {x: 0, y: 0, z: 0.002} + value: {x: 0.002, y: 0, z: 0} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 @@ -47,34 +47,34 @@ AnimationClip: outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.625 - value: {x: 0, y: 0, z: 0.001} - inSlope: {x: 0, y: 0, z: -0.0048} - outSlope: {x: 0, y: 0, z: -0.0048} + value: {x: 0.001, y: 0.0015, z: 0} + inSlope: {x: -0.0048, y: 0.0048, z: 0} + outSlope: {x: -0.0048, y: 0.0048, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.8333333 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: -0.0048000007} - outSlope: {x: 0, y: 0, z: -0.0048000007} + value: {x: 0, y: 0.002, z: 0} + inSlope: {x: -0.0048000007, y: 0, z: 0} + outSlope: {x: -0.0048000007, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 1.0416666 - value: {x: 0, y: 0, z: -0.001} - inSlope: {x: 0, y: 0, z: -0.0048} - outSlope: {x: 0, y: 0, z: -0.0048} + value: {x: -0.001, y: 0.0015, z: 0} + inSlope: {x: -0.0048, y: -0.0048, z: 0} + outSlope: {x: -0.0048, y: -0.0048, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 1.25 - value: {x: 0, y: 0, z: -0.002} + value: {x: -0.002, y: 0, z: 0} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 @@ -83,16 +83,16 @@ AnimationClip: outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 1.4583334 - value: {x: 0, y: 0.0015, z: -0.001} - inSlope: {x: 0, y: 0.0048000007, z: 0.0048000007} - outSlope: {x: 0, y: 0.0048000007, z: 0.0048000007} + value: {x: -0.001, y: 0, z: 0} + inSlope: {x: 0.0048000007, y: 0, z: 0} + outSlope: {x: 0.0048000007, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 1.6666666 - value: {x: 0, y: 0.002, z: 0} + value: {x: 0, y: 0, z: 0} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 @@ -108,7 +108,7 @@ AnimationClip: m_Curve: - serializedVersion: 3 time: 0 - value: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0.002, z: 0} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 @@ -117,52 +117,52 @@ AnimationClip: outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.20833333 - value: {x: 0, y: 0.00027777773, z: -0.001} - inSlope: {x: 0, y: 0.0023999996, z: -0.0048} - outSlope: {x: 0, y: 0.0023999996, z: -0.0048} + value: {x: -0.001, y: 0.0015, z: 0} + inSlope: {x: -0.0048, y: -0.0048, z: 0} + outSlope: {x: -0.0048, y: -0.0048, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.41666666 - value: {x: 0, y: 0.0008888887, z: -0.002} - inSlope: {x: 0, y: 0.0032, z: 0} - outSlope: {x: 0, y: 0.0032, z: 0} + value: {x: -0.002, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.625 - value: {x: 0, y: 0.0015, z: -0.001} - inSlope: {x: 0, y: 0.0024, z: 0.0048} - outSlope: {x: 0, y: 0.0024, z: 0.0048} + value: {x: -0.001, y: 0, z: 0} + inSlope: {x: 0.0048, y: 0, z: 0} + outSlope: {x: 0.0048, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.8333333 - value: {x: 0, y: 0.002, z: 0} - inSlope: {x: 0, y: 0, z: 0.0048000007} - outSlope: {x: 0, y: 0, z: 0.0048000007} + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0.0048000007, y: 0, z: 0} + outSlope: {x: 0.0048000007, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 1.0416666 - value: {x: 0, y: 0.0015, z: 0.001} - inSlope: {x: 0, y: -0.0048, z: 0.0048} - outSlope: {x: 0, y: -0.0048, z: 0.0048} + value: {x: 0.001, y: 0, z: 0} + inSlope: {x: 0.0048, y: 0, z: 0} + outSlope: {x: 0.0048, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 1.25 - value: {x: 0, y: 0, z: 0.002} + value: {x: 0.002, y: 0, z: 0} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 @@ -171,16 +171,16 @@ AnimationClip: outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 1.4583334 - value: {x: 0, y: 0, z: 0.001} - inSlope: {x: 0, y: 0, z: -0.0048000007} - outSlope: {x: 0, y: 0, z: -0.0048000007} + value: {x: 0.001, y: 0.0015, z: 0} + inSlope: {x: -0.0048000007, y: 0.0048000007, z: 0} + outSlope: {x: -0.0048000007, y: 0.0048000007, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 1.6666666 - value: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0.002, z: 0} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 @@ -197,80 +197,17 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.20833333 - value: {x: 0, y: 0, z: 0.001} - inSlope: {x: 0, y: 0, z: 0.0048} - outSlope: {x: 0, y: 0, z: 0.0048} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 - value: {x: 0, y: 0, z: 0.002} - inSlope: {x: 0, y: 0, z: 0.0047999993} - outSlope: {x: 0, y: 0, z: 0.0047999993} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.625 - value: {x: 0, y: 0, z: 0.003} - inSlope: {x: 0, y: 0, z: 0.0048} - outSlope: {x: 0, y: 0, z: 0.0048} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.8333333 - value: {x: 0, y: 0, z: 0.004} - inSlope: {x: 0, y: 0, z: 0.0048} - outSlope: {x: 0, y: 0, z: 0.0048} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.0416666 - value: {x: 0, y: 0, z: 0.005} - inSlope: {x: 0, y: 0, z: 0.0047999993} - outSlope: {x: 0, y: 0, z: 0.0047999993} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.25 - value: {x: 0, y: 0, z: 0.006} - inSlope: {x: 0, y: 0, z: 0.0047999998} - outSlope: {x: 0, y: 0, z: 0.0047999998} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.4583334 - value: {x: 0, y: 0, z: 0.007} - inSlope: {x: 0, y: 0, z: 0.004800001} - outSlope: {x: 0, y: 0, z: 0.004800001} + inSlope: {x: -0.0048, y: 0, z: 0} + outSlope: {x: -0.0048, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 1.6666666 - value: {x: 0, y: 0, z: 0.008} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + value: {x: -0.008, y: 0, z: 0} + inSlope: {x: -0.0048, y: 0, z: 0} + outSlope: {x: -0.0048, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -328,7 +265,7 @@ AnimationClip: m_CycleOffset: 0 m_HasAdditiveReferencePose: 0 m_LoopTime: 1 - m_LoopBlend: 0 + m_LoopBlend: 1 m_LoopBlendOrientation: 0 m_LoopBlendPositionY: 0 m_LoopBlendPositionXZ: 0 @@ -338,120 +275,6 @@ AnimationClip: m_HeightFromFeet: 0 m_Mirror: 0 m_EditorCurves: - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.x - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.20833333 - value: 0.0015 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.25 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 - value: 0.0015 - inSlope: 0.0048000007 - outSlope: 0.0048000007 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 - value: 0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.y - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - serializedVersion: 2 curve: serializedVersion: 2 @@ -540,7 +363,7 @@ AnimationClip: m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 - attribute: m_LocalPosition.z + attribute: m_LocalPosition.x path: Body/LeftFeetTarget classID: 4 script: {fileID: 0} @@ -558,11 +381,29 @@ AnimationClip: weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.20833333 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 - serializedVersion: 3 time: 0.625 value: 0.0015 - inSlope: 0.0024 - outSlope: 0.0024 + inSlope: 0.0048 + outSlope: 0.0048 tangentMode: 136 weightedMode: 0 inWeight: 0.33333334 @@ -594,6 +435,210 @@ AnimationClip: weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.4583334 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: Body/LeftFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.20833333 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.625 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8333333 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.0416666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.4583334 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: Body/LeftFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.20833333 + value: 0.0015 + inSlope: -0.0048 + outSlope: -0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.625 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8333333 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.0416666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.4583334 + value: 0.0015 + inSlope: 0.0048000007 + outSlope: 0.0048000007 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 @@ -602,6 +647,189 @@ AnimationClip: classID: 4 script: {fileID: 0} flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.20833333 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.625 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8333333 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.0416666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.4583334 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: Body/RightFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: -0.0048 + outSlope: -0.0048 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: -0.008 + inSlope: -0.0048 + outSlope: -0.0048 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.x + path: + classID: 4 + script: {fileID: 0} + flags: 8 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: + classID: 4 + script: {fileID: 0} + flags: 8 - serializedVersion: 2 curve: serializedVersion: 2 @@ -690,162 +918,6 @@ AnimationClip: m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 - attribute: m_LocalPosition.z - path: Body/RightFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.20833333 - value: 0.001 - inSlope: 0.0048 - outSlope: 0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 0.002 - inSlope: 0.0047999993 - outSlope: 0.0047999993 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: 0.003 - inSlope: 0.0048 - outSlope: 0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0.004 - inSlope: 0.0048 - outSlope: 0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: 0.005 - inSlope: 0.0047999993 - outSlope: 0.0047999993 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.25 - value: 0.006 - inSlope: 0.0047999998 - outSlope: 0.0047999998 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 - value: 0.007 - inSlope: 0.004800001 - outSlope: 0.004800001 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 - value: 0.008 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.z - path: - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.x - path: - classID: 4 - script: {fileID: 0} - flags: 8 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.y - path: - classID: 4 - script: {fileID: 0} - flags: 8 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 attribute: m_LocalPosition.x path: Body/RightFeetTarget classID: 4 diff --git a/Samples/Animation/AntWalkRight.anim b/Samples/Animation/AntWalkRight.anim index 45097c5..e16c3ef 100644 --- a/Samples/Animation/AntWalkRight.anim +++ b/Samples/Animation/AntWalkRight.anim @@ -14,24 +14,252 @@ AnimationClip: m_RotationCurves: [] m_CompressedRotationCurves: [] m_EulerCurves: [] - m_PositionCurves: [] + m_PositionCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0.0048, y: 0, z: 0} + outSlope: {x: 0.0048, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.6666666 + value: {x: 0.008, y: 0, z: 0} + inSlope: {x: 0.0048, y: 0, z: 0} + outSlope: {x: 0.0048, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.20833333 + value: {x: -0.001, y: 0, z: 0} + inSlope: {x: -0.0048, y: 0, z: 0} + outSlope: {x: -0.0048, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.41666666 + value: {x: -0.002, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.625 + value: {x: -0.001, y: 0.0015, z: 0} + inSlope: {x: 0.0048, y: 0.0048, z: 0} + outSlope: {x: 0.0048, y: 0.0048, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.8333333 + value: {x: 0, y: 0.002, z: 0} + inSlope: {x: 0.0048000007, y: 0, z: 0} + outSlope: {x: 0.0048000007, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.0416666 + value: {x: 0.001, y: 0.0015, z: 0} + inSlope: {x: 0.0048, y: -0.0048, z: 0} + outSlope: {x: 0.0048, y: -0.0048, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.25 + value: {x: 0.002, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.4583334 + value: {x: 0.001, y: 0, z: 0} + inSlope: {x: -0.0048000007, y: 0, z: 0} + outSlope: {x: -0.0048000007, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.6666666 + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: Body/LeftFeetTarget + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: 0.002, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.20833333 + value: {x: 0.001, y: 0.0015, z: 0} + inSlope: {x: 0.0048, y: -0.0048, z: 0} + outSlope: {x: 0.0048, y: -0.0048, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.41666666 + value: {x: 0.002, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.625 + value: {x: 0.001, y: 0, z: 0} + inSlope: {x: -0.0048, y: 0, z: 0} + outSlope: {x: -0.0048, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.8333333 + value: {x: 0, y: 0, z: 0} + inSlope: {x: -0.0048000007, y: 0, z: 0} + outSlope: {x: -0.0048000007, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.0416666 + value: {x: -0.001, y: 0, z: 0} + inSlope: {x: -0.0048, y: 0, z: 0} + outSlope: {x: -0.0048, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.25 + value: {x: -0.002, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.4583334 + value: {x: -0.001, y: 0.0015, z: 0} + inSlope: {x: 0.0048000007, y: 0.0048000007, z: 0} + outSlope: {x: 0.0048000007, y: 0.0048000007, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.6666666 + value: {x: 0, y: 0.002, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: Body/RightFeetTarget m_ScaleCurves: [] m_FloatCurves: [] m_PPtrCurves: [] - m_SampleRate: 60 + m_SampleRate: 24 m_WrapMode: 0 m_Bounds: m_Center: {x: 0, y: 0, z: 0} m_Extent: {x: 0, y: 0, z: 0} m_ClipBindingConstant: - genericBindings: [] + genericBindings: + - serializedVersion: 2 + path: 0 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 683997697 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1250470035 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 pptrCurveMapping: [] m_AnimationClipSettings: serializedVersion: 2 m_AdditiveReferencePoseClip: {fileID: 0} m_AdditiveReferencePoseTime: 0 m_StartTime: 0 - m_StopTime: 1 + m_StopTime: 1.6666666 m_OrientationOffsetY: 0 m_Level: 0 m_CycleOffset: 0 @@ -46,8 +274,656 @@ AnimationClip: m_KeepOriginalPositionXZ: 0 m_HeightFromFeet: 0 m_Mirror: 0 - m_EditorCurves: [] + m_EditorCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0.0048 + outSlope: 0.0048 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0.008 + inSlope: 0.0048 + outSlope: 0.0048 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.x + path: + classID: 4 + script: {fileID: 0} + flags: 8 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: + classID: 4 + script: {fileID: 0} + flags: 8 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.20833333 + value: -0.001 + inSlope: -0.0048 + outSlope: -0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: -0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.625 + value: -0.001 + inSlope: 0.0048 + outSlope: 0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8333333 + value: 0 + inSlope: 0.0048000007 + outSlope: 0.0048000007 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.0416666 + value: 0.001 + inSlope: 0.0048 + outSlope: 0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: 0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.4583334 + value: 0.001 + inSlope: -0.0048000007 + outSlope: -0.0048000007 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.x + path: Body/LeftFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.20833333 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.625 + value: 0.0015 + inSlope: 0.0048 + outSlope: 0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8333333 + value: 0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.0416666 + value: 0.0015 + inSlope: -0.0048 + outSlope: -0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.4583334 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: Body/LeftFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.20833333 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.625 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8333333 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.0416666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.4583334 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: Body/LeftFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.20833333 + value: 0.001 + inSlope: 0.0048 + outSlope: 0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: 0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.625 + value: 0.001 + inSlope: -0.0048 + outSlope: -0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8333333 + value: 0 + inSlope: -0.0048000007 + outSlope: -0.0048000007 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.0416666 + value: -0.001 + inSlope: -0.0048 + outSlope: -0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: -0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.4583334 + value: -0.001 + inSlope: 0.0048000007 + outSlope: 0.0048000007 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.x + path: Body/RightFeetTarget + classID: 4 + script: {fileID: 0} + flags: 8 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.20833333 + value: 0.0015 + inSlope: -0.0048 + outSlope: -0.0048 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.625 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8333333 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.0416666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.4583334 + value: 0.0015 + inSlope: 0.0048000007 + outSlope: 0.0048000007 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: Body/RightFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.20833333 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.625 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8333333 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.0416666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.4583334 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: Body/RightFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 m_EulerEditorCurves: [] - m_HasGenericRootTransform: 0 + m_HasGenericRootTransform: 1 m_HasMotionFloatCurves: 0 m_Events: [] diff --git a/Samples/Foraging.unity b/Samples/Foraging.unity index c249e7d..6082a7c 100644 --- a/Samples/Foraging.unity +++ b/Samples/Foraging.unity @@ -245,7 +245,7 @@ Transform: serializedVersion: 2 m_LocalRotation: {x: 0, y: 0.7071068, z: -0, w: -0.7071068} m_LocalPosition: {x: 0.15, y: 0, z: -0.15} - m_LocalScale: {x: 0.1, y: 0.1, z: 0.5} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 467453032} @@ -321,6 +321,41 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 232829777} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &233567076 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 233567077} + m_Layer: 0 + m_Name: Close Food + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &233567077 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 233567076} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1413549758} + - {fileID: 691526235} + - {fileID: 834383115} + - {fileID: 1880435926} + m_Father: {fileID: 1075240960} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &266176282 GameObject: m_ObjectHideFlags: 0 @@ -504,7 +539,7 @@ Transform: serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0.15, y: 0, z: 0.15} - m_LocalScale: {x: 0.1, y: 0.1, z: 0.5} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 467453032} @@ -685,6 +720,76 @@ Transform: m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} m_PrefabInstance: {fileID: 566787347} m_PrefabAsset: {fileID: 0} +--- !u!1001 &691526234 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 233567077} + m_Modifications: + - target: {fileID: 2538506557068565745, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_Name + value: Food (1) + objectReference: {fileID: 0} + - target: {fileID: 2538506557068565745, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_StaticEditorFlags + value: 2147483647 + objectReference: {fileID: 0} + - target: {fileID: 2967757113827150429, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_StaticEditorFlags + value: 2147483647 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalPosition.x + value: -0.1 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalPosition.y + value: 0.003 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalPosition.z + value: 0.1 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} +--- !u!4 &691526235 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + m_PrefabInstance: {fileID: 691526234} + m_PrefabAsset: {fileID: 0} --- !u!1 &775612060 GameObject: m_ObjectHideFlags: 0 @@ -777,6 +882,76 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!1001 &834383114 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 233567077} + m_Modifications: + - target: {fileID: 2538506557068565745, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_Name + value: Food (2) + objectReference: {fileID: 0} + - target: {fileID: 2538506557068565745, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_StaticEditorFlags + value: 2147483647 + objectReference: {fileID: 0} + - target: {fileID: 2967757113827150429, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_StaticEditorFlags + value: 2147483647 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalPosition.x + value: -0.1 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalPosition.y + value: 0.003 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalPosition.z + value: -0.1 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} +--- !u!4 &834383115 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + m_PrefabInstance: {fileID: 834383114} + m_PrefabAsset: {fileID: 0} --- !u!1 &906427684 GameObject: m_ObjectHideFlags: 0 @@ -806,7 +981,7 @@ Transform: serializedVersion: 2 m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068} m_LocalPosition: {x: -0.15, y: 0, z: 0.15} - m_LocalScale: {x: 0.1, y: 0.1, z: 0.5} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 467453032} @@ -1022,6 +1197,7 @@ Transform: - {fileID: 467453032} - {fileID: 1670418293} - {fileID: 1671462291} + - {fileID: 233567077} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1131923922 @@ -1226,19 +1402,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.95134777 + value: 0.95134753 objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.16772102 + value: -0.16772129 objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.2545452 + value: -0.25454587 objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.04487591 + value: -0.04487608 objectReference: {fileID: 0} - target: {fileID: 234321254904069504, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_Enabled @@ -1262,47 +1438,47 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.33182302 + value: 0.33182317 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.4944452 + value: -0.49444517 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.58472985 + value: -0.5847297 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.55091596 + value: 0.5509161 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: -1.1641532e-10 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 0.0000000011641532 + value: 6.9849193e-10 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0030040147 + value: 0.0030040143 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.68897134 + value: 0.6889715 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.7247886 + value: 0.7247884 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.0000001937151 + value: 0.00000011920929 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000048428774 + value: -0.000000048428774 objectReference: {fileID: 0} - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: length @@ -1382,11 +1558,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.27289435 + value: -0.27289423 objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.0714522 + value: 0.07145224 objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y @@ -1394,55 +1570,55 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.24300568 + value: 0.24300586 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -0.0000000014220263 + value: 0.0000000013203623 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 4.656613e-10 + value: -4.656613e-10 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0041295583 + value: 0.0041295574 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.96224785 + value: 0.9622479 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.27217475 + value: -0.27217472 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000004217841 + value: 0.000000040577216 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.0000000352125 + value: -0.000000053103072 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.45984116 + value: 0.45984164 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.68778175 + value: -0.68778104 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.50082767 + value: -0.5008279 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.25431108 + value: -0.25431153 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.76921797 + value: 0.7692176 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x @@ -1450,23 +1626,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.17796771 + value: 0.17796785 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.37783003 + value: -0.3778305 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0.0000000011843688 + value: 3.4668957e-10 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: 0.0000000023283064 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0041061174 + value: 0.0041061183 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -1478,11 +1654,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000048019064 + value: -0.000000027814497 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000021561315 + value: 0.000000041375255 objectReference: {fileID: 0} - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: length @@ -1526,7 +1702,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: -0.0005492186 + value: -0.0005492179 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -1538,39 +1714,39 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.62115896 + value: 0.6211589 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.14904027 + value: -0.14904024 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.33122268 + value: -0.33122343 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.9063615 + value: 0.9063613 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.26013067 + value: 0.2601305 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.03365326 + value: 0.03365275 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.06440154 + value: 0.06440168 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.059745103 + value: 0.059745185 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.8554312 + value: 0.85543114 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z @@ -1578,23 +1754,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.8352101 + value: 0.8352102 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.17726378 + value: -0.17726342 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.19850568 + value: 0.19850585 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.4812454 + value: 0.48124528 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -0.0018809717 + value: -0.0018809745 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1602,23 +1778,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0012553646 + value: 0.0012553625 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.9065215 + value: 0.9065212 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.33378398 + value: 0.33378425 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.24255136 + value: -0.24255198 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.08930815 + value: 0.08930847 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1626,11 +1802,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.7287942 + value: 0.7287944 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.24659176 + value: -0.24659169 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y @@ -1638,7 +1814,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.20473601 + value: 0.2047358 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1650,7 +1826,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0015912964 + value: 0.0015912962 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -1658,27 +1834,27 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.33498564 + value: 0.33498555 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.19348562 + value: 0.1934857 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.07049353 + value: -0.07049354 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -3.7980208e-10 + value: -0.0000000024213385 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -0.0000000013969836 + value: -9.3132246e-10 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.004176515 + value: 0.0041765147 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -1686,15 +1862,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.2699717 + value: -0.26997173 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000011393213 + value: 0.000000042094776 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.0000000763834 + value: -0.000000002094536 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1702,31 +1878,31 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.733139 + value: 0.7331393 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.24335082 + value: -0.24335077 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.60271394 + value: -0.6027137 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.20005886 + value: -0.20005867 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 1.1641532e-10 + value: 4.3655746e-10 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -1.7462298e-10 + value: -2.910383e-10 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0024082728 + value: 0.0024082726 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -1738,15 +1914,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000029802322 + value: -0.000000029802322 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000014901161 + value: 0.000000029802322 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0.0032548946 + value: 0.003254891 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1754,35 +1930,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: -0.006092592 + value: -0.006092595 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.26382625 + value: 0.2638258 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.06890188 + value: 0.06890166 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.9308836 + value: 0.9308838 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.24311315 + value: -0.24311285 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -0.0000000024141102 + value: 2.6061558e-10 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -0.0000000051222737 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0042412244 + value: 0.004241223 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -1790,19 +1966,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.31123453 + value: -0.31123468 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000098394835 + value: -0.00000014193735 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.00000009902294 + value: 0.00000012441576 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -0.0027482407 + value: -0.0027482398 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1818,71 +1994,71 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.06383813 + value: -0.06383811 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.9344979 + value: 0.93449795 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.21711059 + value: -0.21711054 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 5.174054e-10 + value: 9.05997e-10 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 6.9849193e-10 + value: 2.3283064e-10 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0030214672 + value: 0.0030214668 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.95781213 + value: 0.9578121 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.28739524 + value: -0.2873953 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000058589194 + value: -0.00000023597144 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.00000012289547 + value: 0.00000035965832 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x + value: -4.0745363e-10 + objectReference: {fileID: 0} + - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y value: 5.820766e-11 objectReference: {fileID: 0} - - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: -1.1641532e-10 - objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0019033395 + value: 0.00190334 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6810776 + value: 0.68107736 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.73221123 + value: 0.73221153 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.0000001937151 + value: 0.00000026822093 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.00000009685755 + value: -0.00000014901163 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -1890,15 +2066,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.27147076 + value: 0.271471 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.8524233 + value: 0.85242313 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.18197508 + value: -0.181975 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1914,19 +2090,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.1773659 + value: -0.17736576 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.20251653 + value: 0.20251656 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.037324443 + value: 0.03732442 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -0.0042337636 + value: -0.0042337617 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1934,39 +2110,39 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: -0.0006929275 + value: -0.0006929245 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.7508209 + value: 0.7508211 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.18160503 + value: 0.18160522 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.61725026 + value: -0.6172499 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.1492976 + value: 0.14929762 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.34205842 + value: 0.34205857 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.922791 + value: 0.92279077 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.17563704 + value: 0.1756375 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.024586359 + value: -0.024586199 objectReference: {fileID: 0} - target: {fileID: 6049855982455691338, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_Name @@ -2010,51 +2186,51 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -9.313226e-10 + value: -1.1641532e-10 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.003004017 + value: 0.0030040166 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.69097406 + value: 0.690974 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.7228796 + value: 0.72287965 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000010430813 + value: 0.000000074505806 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000029802322 + value: -0.000000026077032 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6889249 + value: 0.6889251 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.63667476 + value: 0.63667446 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.007983801 + value: -0.007984279 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.34635806 + value: -0.34635833 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -8.731149e-11 + value: 8.731149e-11 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 1.4551915e-10 + value: -2.0372681e-10 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z @@ -2062,31 +2238,31 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6710925 + value: 0.6710926 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.74137366 + value: 0.7413736 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000059604645 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000059604645 + value: -0 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.5119414 + value: 0.5119411 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.32878837 + value: 0.32878852 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.46407017 + value: 0.46407023 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z @@ -2094,15 +2270,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: -9.895302e-10 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -2.3283064e-10 + value: 6.4028427e-10 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0019033398 + value: 0.0019033401 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -2110,15 +2286,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.73329246 + value: 0.7332924 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000017881393 + value: 0.00000037252903 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000115484 + value: -0.00000018253922 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -2126,31 +2302,31 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.41958743 + value: 0.41958752 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.16263406 + value: -0.16263409 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.61121297 + value: -0.6112128 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.027076023 + value: -0.02707527 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.7134898 + value: 0.7134899 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.6805391 + value: 0.6805392 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.16451733 + value: 0.16451626 objectReference: {fileID: 0} - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: femurLength @@ -2190,15 +2366,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.26493874 + value: 0.26493827 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.06449182 + value: -0.06449169 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.9348091 + value: 0.9348092 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z @@ -2206,31 +2382,31 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 4.5714887e-10 + value: -7.273371e-10 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 6.9849193e-10 + value: -0.0000000016298145 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0029819126 + value: 0.0029819133 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.9570172 + value: 0.9570173 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.29003125 + value: -0.2900309 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000013426725 + value: -0.00000017317032 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.00000018701589 + value: 0.0000002485179 objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: @@ -2238,6 +2414,76 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} +--- !u!1001 &1413549757 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 233567077} + m_Modifications: + - target: {fileID: 2538506557068565745, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_Name + value: Food (0) + objectReference: {fileID: 0} + - target: {fileID: 2538506557068565745, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_StaticEditorFlags + value: 2147483647 + objectReference: {fileID: 0} + - target: {fileID: 2967757113827150429, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_StaticEditorFlags + value: 2147483647 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalPosition.x + value: 0.1 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalPosition.y + value: 0.003 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalPosition.z + value: 0.1 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} +--- !u!4 &1413549758 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + m_PrefabInstance: {fileID: 1413549757} + m_PrefabAsset: {fileID: 0} --- !u!1 &1485508511 GameObject: m_ObjectHideFlags: 0 @@ -2439,7 +2685,7 @@ Transform: serializedVersion: 2 m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} m_LocalPosition: {x: -0.15, y: 0, z: -0.15} - m_LocalScale: {x: 0.1, y: 0.1, z: 0.5} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 467453032} @@ -3707,6 +3953,76 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1854230099} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1001 &1880435925 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 233567077} + m_Modifications: + - target: {fileID: 2538506557068565745, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_Name + value: Food (3) + objectReference: {fileID: 0} + - target: {fileID: 2538506557068565745, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_StaticEditorFlags + value: 2147483647 + objectReference: {fileID: 0} + - target: {fileID: 2967757113827150429, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_StaticEditorFlags + value: 2147483647 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalPosition.x + value: 0.1 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalPosition.y + value: 0.003 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalPosition.z + value: -0.1 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} +--- !u!4 &1880435926 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} + m_PrefabInstance: {fileID: 1880435925} + m_PrefabAsset: {fileID: 0} --- !u!1 &1953862409 GameObject: m_ObjectHideFlags: 0 diff --git a/Samples/Prefabs/Food.prefab b/Samples/Prefabs/Food.prefab index 2c05960..8fa9452 100644 --- a/Samples/Prefabs/Food.prefab +++ b/Samples/Prefabs/Food.prefab @@ -145,7 +145,7 @@ SphereCollider: serializedVersion: 2 m_Bits: 0 m_LayerOverridePriority: 0 - m_IsTrigger: 0 + m_IsTrigger: 1 m_ProvidesContacts: 0 m_Enabled: 1 serializedVersion: 3 From f2884327cffe979a4becd2e2417ed978f3e5fa40 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Thu, 9 Apr 2026 15:46:29 +0200 Subject: [PATCH 13/38] Initial Doxygen documentation --- Documentation.meta | 8 + Documentation/Ant2.md | 14 + Documentation/Ant2.md.meta | 7 + Documentation/GettingStarted.md | 2 + Documentation/GettingStarted.md.meta | 7 + Documentation/Installation.md | 9 + Documentation/Installation.md.meta | 7 + README.md | 8 +- Runtime/Scripts/Ant.cs | 156 ++++---- Runtime/Scripts/Odorant.cs | 5 +- Samples/Animation/AntAnimator.controller | 4 +- Samples/Foraging.unity | 468 +++++++++++------------ 12 files changed, 378 insertions(+), 317 deletions(-) create mode 100644 Documentation.meta create mode 100644 Documentation/Ant2.md create mode 100644 Documentation/Ant2.md.meta create mode 100644 Documentation/GettingStarted.md create mode 100644 Documentation/GettingStarted.md.meta create mode 100644 Documentation/Installation.md create mode 100644 Documentation/Installation.md.meta diff --git a/Documentation.meta b/Documentation.meta new file mode 100644 index 0000000..47df66c --- /dev/null +++ b/Documentation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c2c74f5b3b38f630c9211ae171b6c481 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/Ant2.md b/Documentation/Ant2.md new file mode 100644 index 0000000..90be602 --- /dev/null +++ b/Documentation/Ant2.md @@ -0,0 +1,14 @@ +Lorum ipsum + +Heading level 1 +=============== + +Lorum ipsum + +Heading Level 2 +--------------- + +Lorum ipsum + +here is a an image: +![Passer Logo](images/PasserLifeLogoRight1_300.png) \ No newline at end of file diff --git a/Documentation/Ant2.md.meta b/Documentation/Ant2.md.meta new file mode 100644 index 0000000..fe53eae --- /dev/null +++ b/Documentation/Ant2.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e216f4e0f4902417980c167612b0e0c1 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/GettingStarted.md b/Documentation/GettingStarted.md new file mode 100644 index 0000000..f94617e --- /dev/null +++ b/Documentation/GettingStarted.md @@ -0,0 +1,2 @@ +/// \page GettingStarted Getttting Started +Getting starttted \ No newline at end of file diff --git a/Documentation/GettingStarted.md.meta b/Documentation/GettingStarted.md.meta new file mode 100644 index 0000000..4da78ea --- /dev/null +++ b/Documentation/GettingStarted.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 02f2904aebc8f9475b2ab67bc25205f8 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/Installation.md b/Documentation/Installation.md new file mode 100644 index 0000000..210c5dc --- /dev/null +++ b/Documentation/Installation.md @@ -0,0 +1,9 @@ +/// \page Installation Installation + +You can import the NanoBrain Ant package in Unity directly with the Package Manager git package importer. + +See Unity: [Installing from a Git URL](https://docs.unity3d.com/Manual/upm-ui-giturl.html) + +Use the link from 'Clone with HTTP' (for example: https://git.passer.life/CreatureControl/Ant.git) In this way you can always retrieve the latest version by pressing the Update button in the Package Manager. + +Optionally, you can use a tag to retrieve a specific version. For example: https://git.passer.life/CreatureControl/Ant.git#0.1.0. This will give you a stable version which does not change. Updating can be done by retrieving the package with a link to a new release. \ No newline at end of file diff --git a/Documentation/Installation.md.meta b/Documentation/Installation.md.meta new file mode 100644 index 0000000..853edc0 --- /dev/null +++ b/Documentation/Installation.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c97243ffb6244df0d9470dd96c86f8fc +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/README.md b/README.md index c0eb862..4b15254 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,6 @@ -# Ant - +# %NanoBrain Ant + +Table of Contents +----------------- +- [Installation](\ref Installation) +- [Getting started](\ref GettingStarted) \ No newline at end of file diff --git a/Runtime/Scripts/Ant.cs b/Runtime/Scripts/Ant.cs index 5bf6784..6c9f875 100644 --- a/Runtime/Scripts/Ant.cs +++ b/Runtime/Scripts/Ant.cs @@ -1,13 +1,28 @@ +using System.Collections; using System.Collections.Generic; using UnityEngine; using NanoBrain; namespace Passer.CreatureControl { + /// + /// Simulated ant using a NanoBrain + /// [RequireComponent(typeof(Brain))] public class Ant : Insect { + /// + /// inertia controls how quickly the ant can change it direction + /// private readonly float inertia = 0.2f; + /// + /// The maximum distance at which the ant can smell things + /// + /// The strength of the smell decreases with the inverse square law + /// to zero at this distance private readonly float smellRadius = 0.2f; + /// + /// The angle to the left and right within the ant can smell things + /// private readonly float smellAngle = 80.0f; public GameObject homePheromonePrefab; @@ -18,16 +33,25 @@ namespace Passer.CreatureControl { public Brain nanoBrain; // brain output + public Neuron targetDirection; public Neuron hasFood; + // brain input + + /// + /// The (heart) beat for the brain + /// + /// It is used by the brain to do things periodically + /// like placing pheromones + public Nucleus beat; + public Nucleus pheromoneSteering; public Nucleus hitLeft; public Nucleus hitRight; - public Nucleus beat; public Receptor foodReceptor; public Receptor homeReceptor; - public Vector3 linearVelocity; + public Vector3 linearVelocity = Vector3.forward; public Vector3 angularVelocity; #region Init @@ -49,30 +73,37 @@ namespace Passer.CreatureControl { Cluster brain = this.nanoBrain.brain; if (brain != null) { - // brain outputs - this.pheromoneSteering = brain.GetNucleus("Pheromone Steering"); + //--- brain inputs - if (brain.GetNucleus("Home Pheromones") is Neuron homePheromones) - homePheromones.WhenFiring += PlaceHomePheromone; - if (brain.GetNucleus("Food Pheromones") is Neuron foodPheromones) - foodPheromones.WhenFiring += PlaceFoodPheromone; - - this.hasFood = brain.GetNucleus("Having Food") as Neuron; - // brain inputs this.beat = brain.GetNucleus("Beat"); this.hitLeft = brain.GetNucleus("Hit Left"); this.hitRight = brain.GetNucleus("Hit Right"); this.foodReceptor = brain.GetNucleus("Food Receptor") as Receptor; this.homeReceptor = brain.GetNucleus("Home Receptor") as Receptor; + this.pheromoneSteering = brain.GetNucleus("Pheromone Steering"); + + //--- brain outputs + this.targetDirection = brain.defaultOutput; + + // Try to find the Home Pheromones Neuron + if (brain.GetNucleus("Home Pheromones") is Neuron homePheromones) + // and call PlaceHomePheromone when it is firing + homePheromones.WhenFiring += PlaceHomePheromone; + // Try to find the Food Pheromones Neuron + if (brain.GetNucleus("Food Pheromones") is Neuron foodPheromones) + // and call PlaceFoodPheromone when it is firing + foodPheromones.WhenFiring += PlaceFoodPheromone; + + this.hasFood = brain.GetNucleus("Having Food") as Neuron; } - this.linearVelocity = Vector3.forward; - + // Initialize the callbacks for the antenna colliders if (touchLeft != null) touchLeft.touched += OnAntennaTouchLeft; if (touchRight != null) touchRight.touched += OnAntennaTouchRight; + StartCoroutine(Beat()); } #endregion Start @@ -88,86 +119,56 @@ namespace Passer.CreatureControl { pheromoneObj.transform.position = this.model.position; } - // Update is called once per frame public override void Update() { base.Update(); - UpdateBeat(); UpdateSmell(); - - if (this.nanoBrain == null || this.nanoBrain.brain == null || this.animator == null) - return; - - Vector3 localForce = nanoBrain.brain.defaultOutput.outputValue; - //Vector3 localForce = this.transform.InverseTransformDirection(worldForce); - - this.linearVelocity = (1 - inertia) * (Time.deltaTime * localForce.normalized) + inertia * this.linearVelocity; - this.linearVelocity = this.linearVelocity.normalized; // * this.forwardSpeed; - - //this.animator.SetFloat("Forward", this.forwardSpeed); //this.linearVelocity.z * this.forwardSpeed); - float forwardParam = Mathf.Clamp01(this.linearVelocity.z); // / this.forwardSpeed); - float angleDeg = 0; - if (this.linearVelocity.magnitude > 1e-5f) - angleDeg = Mathf.Atan2(this.linearVelocity.x, this.linearVelocity.z) * Mathf.Rad2Deg; - - // base turn in -1..1 - float baseTurn = Mathf.Clamp(angleDeg / 45, -1f, 1f); - float turnParam = baseTurn; // * Mathf.Max(0.6f, 1 - forwardParam); - - // Rotate towards the movement direction - // if (this.linearVelocity != Vector3.zero) { - // Quaternion targetRotation = Quaternion.LookRotation(this.linearVelocity); - // Quaternion worldRotation = transform.rotation * targetRotation; - // Quaternion deltaRotation = worldRotation * Quaternion.Inverse(transform.rotation); - - // Vector3 eulerAngleChange = deltaRotation.eulerAngles; - // // Normalize the Euler angles to avoid unexpected jumps due to 360-degree rotations - // eulerAngleChange = new Vector3( - // LinearAlgebra.Angles.Normalize(eulerAngleChange.x), - // LinearAlgebra.Angles.Normalize(eulerAngleChange.y), - // LinearAlgebra.Angles.Normalize(eulerAngleChange.z) - // ); - - // float rotSpeed = (eulerAngleChange.y / 45) * this.rotationSpeed; - // this.animator.SetFloat("Rotate", rotSpeed); - // Debug.Log($"fw {this.forwardSpeed} ang {rotSpeed}"); - // } - - // Smooth against current animator values - // float curF = animator.GetFloat("Forward"); - // float curT = animator.GetFloat("Turn"); - // forwardParam = Mathf.Lerp(curF, forwardParam, 1f - Mathf.Exp(-10 * Time.deltaTime)); - // turnParam = Mathf.Lerp(curT, turnParam, 1f - Mathf.Exp(-10 * Time.deltaTime)); - - - this.animator.SetFloat("Forward", forwardParam); - this.animator.SetFloat("Rotate", turnParam); + UpdateMovement(); } public virtual void FixedUpdate() { CheckGrounded(); } - public float beatInterval = 3; - float lastBeatTime = 0; - void UpdateBeat() { - if (lastBeatTime == 0) { - ulong delay = (ulong)(Random.value * beatInterval); - lastBeatTime = Time.time - delay; - } - if (Time.time - lastBeatTime >= beatInterval) { - lastBeatTime = Time.time; - beat?.SetBias(Vector3.one); //, 0); + protected void UpdateMovement() { + if (this.targetDirection == null || this.animator == null) + return; + Vector3 movementDir = this.targetDirection.outputValue; + this.linearVelocity = + (1 - this.inertia) * (Time.deltaTime * movementDir.normalized) + + this.inertia * this.linearVelocity; + this.linearVelocity = this.linearVelocity.normalized; + + float forwardParam = this.linearVelocity.z; + + float angleRad = this.linearVelocity.sqrMagnitude > 1e-10f ? + Mathf.Atan2(this.linearVelocity.x, this.linearVelocity.z) : + 0; + // map -20..20 degrees to -1..1 + float rotateParam = Mathf.Clamp(angleRad * 3, -1f, 1f); + + this.animator.SetFloat("Forward", forwardParam); + this.animator.SetFloat("Rotate", rotateParam); + } + + private static readonly WaitForSeconds _waitForSeconds3 = new(3); + IEnumerator Beat() { + while (Application.isPlaying) { + // Beat signal to the brain + beat?.SetBias(Vector3.one); + + // Set random direction to simulate noisy smells perception + // which will result in a bit of random walking when no clear + // smells are received float randomAngle = Random.Range(-smellAngle, smellAngle); - Vector3 randomDirection = Quaternion.AngleAxis(randomAngle, Vector3.up) * Vector3.forward * 1.01f; - pheromoneSteering?.SetBias(randomDirection); //, 0, "random"); + Vector3 randomDirection = Quaternion.AngleAxis(randomAngle, Vector3.up) * Vector3.forward; + pheromoneSteering?.SetBias(randomDirection); + yield return _waitForSeconds3; } } void UpdateSmell() { - // To generate random basic movement, we add a small with a random direction with low intensity - Collider[] colliders = Physics.OverlapSphere(this.transform.position, smellRadius); foreach (Collider collider in colliders) { SmellPheromones(collider); @@ -199,7 +200,6 @@ namespace Passer.CreatureControl { } //Debug.DrawLine(this.transform.position, pheromone.transform.position, Color.magenta); } - } void SmellFood(Collider thing) { diff --git a/Runtime/Scripts/Odorant.cs b/Runtime/Scripts/Odorant.cs index 7e4b8f3..3008e0d 100644 --- a/Runtime/Scripts/Odorant.cs +++ b/Runtime/Scripts/Odorant.cs @@ -6,7 +6,10 @@ namespace Passer.CreatureControl { public float strength = 1; public float StrengthAt(float distance) { - float intensity = this.strength * (1 / distance); + if (distance <= 0) + return this.strength; + + float intensity = this.strength / (4.0f * Mathf.PI * distance * distance); return intensity; } } diff --git a/Samples/Animation/AntAnimator.controller b/Samples/Animation/AntAnimator.controller index 1c64d3e..47a6742 100644 --- a/Samples/Animation/AntAnimator.controller +++ b/Samples/Animation/AntAnimator.controller @@ -28,7 +28,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: ab82ff68e62ea3b1c8e6523f8d46c142, type: 2} m_Threshold: 0.19200002 m_Position: {x: -1, y: 0} - m_TimeScale: 2 + m_TimeScale: 5 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -36,7 +36,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: 91229db5e929c379bbfd5bf417848488, type: 2} m_Threshold: 0.28800002 m_Position: {x: 1, y: 0} - m_TimeScale: 2 + m_TimeScale: 1 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 diff --git a/Samples/Foraging.unity b/Samples/Foraging.unity index 6082a7c..1d4b56b 100644 --- a/Samples/Foraging.unity +++ b/Samples/Foraging.unity @@ -1218,7 +1218,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 2147483647 - m_IsActive: 1 + m_IsActive: 0 --- !u!65 &1131923923 BoxCollider: m_ObjectHideFlags: 0 @@ -1402,19 +1402,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.95134753 + value: 0.9513476 objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.16772129 + value: -0.16772108 objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.25454587 + value: -0.2545458 objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.04487608 + value: -0.044876024 objectReference: {fileID: 0} - target: {fileID: 234321254904069504, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_Enabled @@ -1438,27 +1438,27 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.33182317 + value: 0.3318227 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.49444517 + value: -0.4944449 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.5847297 + value: -0.58473 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.5509161 + value: 0.5509164 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -1.1641532e-10 + value: 6.9849193e-10 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 6.9849193e-10 + value: 1.1641532e-10 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z @@ -1466,19 +1466,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6889715 + value: 0.68897164 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.7247884 + value: 0.72478837 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000011920929 + value: -0.00000016391277 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000048428774 + value: 0.000000033527613 objectReference: {fileID: 0} - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: length @@ -1558,107 +1558,107 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.27289423 + value: -0.272894 objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.07145224 + value: 0.07145218 objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.92810106 + value: 0.9281011 objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.24300586 + value: 0.24300589 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0.0000000013203623 + value: 0.0000000022237239 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 4.656613e-10 + objectReference: {fileID: 0} + - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0041295583 + objectReference: {fileID: 0} + - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.96224797 + objectReference: {fileID: 0} + - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.27217463 + objectReference: {fileID: 0} + - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.00000006898425 + objectReference: {fileID: 0} + - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -9.073631e-11 + objectReference: {fileID: 0} + - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.45984083 + objectReference: {fileID: 0} + - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.68778163 + objectReference: {fileID: 0} + - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.500828 + objectReference: {fileID: 0} + - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.25431123 + objectReference: {fileID: 0} + - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.769217 + objectReference: {fileID: 0} + - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.4836072 + objectReference: {fileID: 0} + - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.17796797 + objectReference: {fileID: 0} + - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.37783155 + objectReference: {fileID: 0} + - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -0.0000000014405929 + objectReference: {fileID: 0} + - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y value: -4.656613e-10 objectReference: {fileID: 0} - - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: 0.0041295574 - objectReference: {fileID: 0} - - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.9622479 - objectReference: {fileID: 0} - - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.27217472 - objectReference: {fileID: 0} - - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.000000040577216 - objectReference: {fileID: 0} - - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.000000053103072 - objectReference: {fileID: 0} - - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.45984164 - objectReference: {fileID: 0} - - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.68778104 - objectReference: {fileID: 0} - - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: -0.5008279 - objectReference: {fileID: 0} - - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.25431153 - objectReference: {fileID: 0} - - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.7692176 - objectReference: {fileID: 0} - - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.4836071 - objectReference: {fileID: 0} - - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.17796785 - objectReference: {fileID: 0} - - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.3778305 - objectReference: {fileID: 0} - - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: 3.4668957e-10 - objectReference: {fileID: 0} - - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: 0.0000000023283064 - objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0041061183 + value: 0.0041061174 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.948097 + value: 0.94809705 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.31798124 + value: -0.31798112 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.000000027814497 + value: -0.00000009805181 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000041375255 + value: 0.000000096782095 objectReference: {fileID: 0} - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: length @@ -1694,7 +1694,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0.0048809904 + value: 0.004880991 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1702,71 +1702,71 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: -0.0005492179 + value: -0.00054922234 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.7481476 + value: 0.74814737 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.17950979 + value: 0.17950949 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.6211589 + value: 0.6211594 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.14904024 + value: -0.14904016 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.33122343 + value: -0.3312234 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.9063613 + value: 0.9063612 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.2601305 + value: 0.26013055 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.03365275 + value: 0.033653017 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.06440168 + value: 0.06440171 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.059745185 + value: 0.059745155 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.85543114 + value: 0.855431 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.5104121 + value: -0.5104123 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.8352102 + value: 0.8352103 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.17726342 + value: -0.17726402 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.19850585 + value: 0.19850641 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.48124528 + value: 0.48124456 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1778,23 +1778,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0012553625 + value: 0.0012553632 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.9065212 + value: 0.9065213 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.33378425 + value: 0.33378392 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.24255198 + value: -0.24255197 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.08930847 + value: 0.08930837 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1802,23 +1802,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.7287944 + value: 0.7287941 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.24659169 + value: -0.24659131 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.6050906 + value: 0.60509104 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.2047358 + value: 0.20473573 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0.0022482676 + value: 0.0022482648 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1826,51 +1826,51 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0015912962 + value: 0.0015912973 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.91944474 + value: 0.9194448 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.33498555 + value: 0.33498567 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.1934857 + value: 0.19348523 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.07049354 + value: -0.070493385 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -0.0000000024213385 + value: 0.0000000018912174 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -9.3132246e-10 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0041765147 + value: 0.0041765133 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.96286833 + value: 0.9628682 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.26997173 + value: -0.2699721 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000042094776 + value: -0.00000005668256 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000002094536 + value: 0.00000007023554 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1878,51 +1878,51 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.7331393 + value: 0.7331392 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.24335077 + value: -0.24335083 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.6027137 + value: -0.60271376 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.20005867 + value: -0.20005876 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 4.3655746e-10 + value: 3.783498e-10 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -2.910383e-10 + value: -1.4551915e-10 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0024082726 + value: 0.0024082728 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6723209 + value: 0.672321 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.7402599 + value: 0.74025977 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.000000029802322 + value: 0.000000029802319 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000029802322 + value: 0.00000004470348 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0.003254891 + value: 0.003254884 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1930,55 +1930,55 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: -0.006092595 + value: -0.006092598 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.2638258 + value: 0.26382497 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.06890166 + value: 0.068901405 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.9308838 + value: 0.9308841 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.24311285 + value: -0.24311279 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 2.6061558e-10 + value: -0.0000000022489963 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: -0.0000000023283062 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.004241223 + value: 0.0042412207 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.9503331 + value: 0.950333 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.31123468 + value: -0.31123504 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000014193735 + value: 0.0000001429927 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.00000012441576 + value: -0.00000015506907 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -0.0027482398 + value: -0.002748237 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1990,11 +1990,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.27477518 + value: -0.2747748 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.06383811 + value: -0.06383809 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y @@ -2002,19 +2002,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.21711054 + value: -0.21711075 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 9.05997e-10 + value: -8.8455504e-10 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 2.3283064e-10 + value: -2.3283064e-10 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0030214668 + value: 0.003021467 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -2022,59 +2022,59 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.2873953 + value: -0.28739524 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000023597144 + value: 0.0000001529377 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.00000035965832 + value: -0.00000023046644 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -4.0745363e-10 + value: 3.4924597e-10 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 5.820766e-11 + value: -1.1641532e-10 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.00190334 + value: 0.0019033393 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.68107736 + value: 0.68107766 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.73221153 + value: 0.73221123 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000026822093 + value: -0.00000013411045 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.00000014901163 + value: 0.00000008568168 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.4081217 + value: 0.40812165 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.271471 + value: 0.27147096 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.85242313 + value: 0.8524232 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.181975 + value: -0.18197511 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -2086,23 +2086,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.96235925 + value: 0.96235937 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.17736576 + value: -0.177366 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.20251656 + value: 0.20251597 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.03732442 + value: 0.037324358 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -0.0042337617 + value: -0.0042337636 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -2110,39 +2110,39 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: -0.0006929245 + value: -0.0006929247 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.7508211 + value: 0.75082105 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.18160522 + value: 0.1816051 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.6172499 + value: -0.61725 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.14929762 + value: 0.14929754 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.34205857 + value: 0.34205794 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.92279077 + value: 0.9227911 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.1756375 + value: 0.17563729 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.024586199 + value: -0.024586415 objectReference: {fileID: 0} - target: {fileID: 6049855982455691338, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_Name @@ -2182,55 +2182,55 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 1.1641532e-10 - objectReference: {fileID: 0} - - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y value: -1.1641532e-10 objectReference: {fileID: 0} + - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: -8.1490725e-10 + objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0030040166 + value: 0.0030040161 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.690974 + value: 0.6909739 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.72287965 + value: 0.72287977 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000074505806 + value: 0.000000044703484 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000026077032 + value: -0.000000018626451 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6889251 + value: 0.68892515 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.63667446 + value: 0.6366751 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.007984279 + value: -0.007983622 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.34635833 + value: -0.34635717 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 8.731149e-11 + value: 2.910383e-11 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -2.0372681e-10 + value: 6.1118044e-10 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z @@ -2238,95 +2238,95 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6710926 + value: 0.6710928 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.7413736 + value: 0.74137336 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: 0.00000008940696 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0 + value: -0.000000014901159 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.5119411 + value: 0.51194155 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.32878852 + value: 0.32878798 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.46407023 + value: 0.4640696 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.64378047 + value: -0.6437807 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -9.895302e-10 - objectReference: {fileID: 0} - - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y value: 6.4028427e-10 objectReference: {fileID: 0} + - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 2.3283064e-10 + objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0019033401 + value: 0.00190334 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6799134 + value: 0.67991334 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.7332924 + value: 0.7332926 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000037252903 + value: -0.0000001937151 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.00000018253922 + value: 0.00000009685755 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6510879 + value: 0.6510881 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.41958752 + value: 0.41958794 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.16263409 + value: -0.16263422 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.6112128 + value: -0.61121225 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.02707527 + value: -0.02707541 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.7134899 + value: 0.71348983 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.6805392 + value: 0.68053913 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.16451626 + value: 0.1645168 objectReference: {fileID: 0} - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: femurLength @@ -2366,31 +2366,31 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.26493827 + value: 0.26493755 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.06449169 + value: -0.064491406 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.9348092 + value: 0.93480957 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.22755282 + value: 0.22755253 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -7.273371e-10 + value: 3.2407493e-10 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -0.0000000016298145 + value: 0.0000000016298145 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0029819133 + value: 0.0029819123 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -2398,15 +2398,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.2900309 + value: -0.29003108 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000017317032 + value: 0.00000005248068 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.0000002485179 + value: -0.00000011970675 objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: From 0e31a37068563adafe1241ca69be9480eb438857 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Thu, 9 Apr 2026 15:54:17 +0200 Subject: [PATCH 14/38] Improved README --- Documentation/Installation.md | 2 +- README.md | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Documentation/Installation.md b/Documentation/Installation.md index 210c5dc..496edb1 100644 --- a/Documentation/Installation.md +++ b/Documentation/Installation.md @@ -1,4 +1,4 @@ -/// \page Installation Installation +/// \page Installation Package Installation You can import the NanoBrain Ant package in Unity directly with the Package Manager git package importer. diff --git a/README.md b/README.md index 4b15254..9a218d0 100644 --- a/README.md +++ b/README.md @@ -2,5 +2,9 @@ Table of Contents ----------------- +- [Installation](Documentation/Installation.md) + + \ No newline at end of file From 08a3a7da56cb138867ff416d780c35e5f0e7b3ba Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Thu, 9 Apr 2026 17:14:20 +0200 Subject: [PATCH 15/38] Trying to fix documentation links --- Documentation/Installation.md | 4 ++-- Documentation/ToC.md | 6 ++++++ README.md | 8 +------- 3 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 Documentation/ToC.md diff --git a/Documentation/Installation.md b/Documentation/Installation.md index 496edb1..fdb7b13 100644 --- a/Documentation/Installation.md +++ b/Documentation/Installation.md @@ -1,4 +1,4 @@ -/// \page Installation Package Installation +# Package Installation You can import the NanoBrain Ant package in Unity directly with the Package Manager git package importer. @@ -6,4 +6,4 @@ See Unity: [Installing from a Git URL](https://docs.unity3d.com/Manual/upm-ui-gi Use the link from 'Clone with HTTP' (for example: https://git.passer.life/CreatureControl/Ant.git) In this way you can always retrieve the latest version by pressing the Update button in the Package Manager. -Optionally, you can use a tag to retrieve a specific version. For example: https://git.passer.life/CreatureControl/Ant.git#0.1.0. This will give you a stable version which does not change. Updating can be done by retrieving the package with a link to a new release. \ No newline at end of file +Optionally, you can use a tag to retrieve a specific version. For example: https://git.passer.life/CreatureControl/Ant.git#0.1.0. This will give you a stable version which does not change. Updating can be done by retrieving the package with a link to a new release. diff --git a/Documentation/ToC.md b/Documentation/ToC.md new file mode 100644 index 0000000..97e524f --- /dev/null +++ b/Documentation/ToC.md @@ -0,0 +1,6 @@ +\mainpage + +Table of Contents +----------------- +- [Installation](Installation.md) + diff --git a/README.md b/README.md index 9a218d0..02c5d8f 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,4 @@ # %NanoBrain Ant -Table of Contents ------------------ -- [Installation](Documentation/Installation.md) +Documentation is found in the [Documentation folder](Documentation/ToC.md) - \ No newline at end of file From 0a66372c3fcc9db0bff10c6bff447a62c4b643f0 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Thu, 9 Apr 2026 17:36:19 +0200 Subject: [PATCH 16/38] Extended docs --- Documentation/Animations.md | 9 +++++++++ Documentation/Installation.md | 7 ++++++- Documentation/Models.md | 6 ++++++ Documentation/Models.md.meta | 7 +++++++ Documentation/ToC.md | 3 ++- Documentation/ToC.md.meta | 7 +++++++ 6 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 Documentation/Animations.md create mode 100644 Documentation/Models.md create mode 100644 Documentation/Models.md.meta create mode 100644 Documentation/ToC.md.meta diff --git a/Documentation/Animations.md b/Documentation/Animations.md new file mode 100644 index 0000000..e014d71 --- /dev/null +++ b/Documentation/Animations.md @@ -0,0 +1,9 @@ +Animations +========== +The NanoBrain Ant comes with walking animations and an animator. These can be used with any hexapod model but as the rigs of these hexapods can be very different[1](#notes-1) our software provides an animation projection to solve this. H2O + +Notes +===== +1. + The animation retargeting of Unity's Mecanim only works for Humanoid models. +2. bla bla \ No newline at end of file diff --git a/Documentation/Installation.md b/Documentation/Installation.md index fdb7b13..c89f3d1 100644 --- a/Documentation/Installation.md +++ b/Documentation/Installation.md @@ -1,4 +1,5 @@ -# Package Installation +Package Installation +==================== You can import the NanoBrain Ant package in Unity directly with the Package Manager git package importer. @@ -7,3 +8,7 @@ See Unity: [Installing from a Git URL](https://docs.unity3d.com/Manual/upm-ui-gi Use the link from 'Clone with HTTP' (for example: https://git.passer.life/CreatureControl/Ant.git) In this way you can always retrieve the latest version by pressing the Update button in the Package Manager. Optionally, you can use a tag to retrieve a specific version. For example: https://git.passer.life/CreatureControl/Ant.git#0.1.0. This will give you a stable version which does not change. Updating can be done by retrieving the package with a link to a new release. + +Samples Installation +-------------------- +In the Unity Package manager, select the NanoBrain Ant package and look for the `Samples` tab in the details pane on the right. There you can import the `Models`. \ No newline at end of file diff --git a/Documentation/Models.md b/Documentation/Models.md new file mode 100644 index 0000000..2fff92d --- /dev/null +++ b/Documentation/Models.md @@ -0,0 +1,6 @@ +Models +====== + +The package comes with a number of models which can be found in the [Samples][1] folder. These models are rigged and can be used in combination with the [Animations](Animations.md). + +[1]: Installation.md (How to install the Samples) \ No newline at end of file diff --git a/Documentation/Models.md.meta b/Documentation/Models.md.meta new file mode 100644 index 0000000..d109915 --- /dev/null +++ b/Documentation/Models.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 731873261aa9ec328a9dc16c8544f77e +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/ToC.md b/Documentation/ToC.md index 97e524f..f081963 100644 --- a/Documentation/ToC.md +++ b/Documentation/ToC.md @@ -3,4 +3,5 @@ Table of Contents ----------------- - [Installation](Installation.md) - +- [Models](Models.md) +- [Animations](Animations.md) \ No newline at end of file diff --git a/Documentation/ToC.md.meta b/Documentation/ToC.md.meta new file mode 100644 index 0000000..e28cc36 --- /dev/null +++ b/Documentation/ToC.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b701b64b684e35fe59bf744821ec5ed6 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From 742fc3f323f6d1537abdb33439b348b2b8a1e28c Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Fri, 10 Apr 2026 09:32:16 +0200 Subject: [PATCH 17/38] Better animations, 3DoF animator --- Documentation/Animations.md.meta | 7 + ...tor.controller => AntAnimator2.controller} | 140 +------ ...ller.meta => AntAnimator2.controller.meta} | 0 Samples/Animation/AntAnimator3.controller | 238 +++++++++++ .../Animation/AntAnimator3.controller.meta | 8 + Samples/Animation/AntWalkForward.anim | 372 ++---------------- Samples/Foraging.unity | 370 ++++++++--------- 7 files changed, 490 insertions(+), 645 deletions(-) create mode 100644 Documentation/Animations.md.meta rename Samples/Animation/{AntAnimator.controller => AntAnimator2.controller} (58%) rename Samples/Animation/{AntAnimator.controller.meta => AntAnimator2.controller.meta} (100%) create mode 100644 Samples/Animation/AntAnimator3.controller create mode 100644 Samples/Animation/AntAnimator3.controller.meta diff --git a/Documentation/Animations.md.meta b/Documentation/Animations.md.meta new file mode 100644 index 0000000..82e03e3 --- /dev/null +++ b/Documentation/Animations.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 738ed559f22ef85869721895e1f184a5 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Animation/AntAnimator.controller b/Samples/Animation/AntAnimator2.controller similarity index 58% rename from Samples/Animation/AntAnimator.controller rename to Samples/Animation/AntAnimator2.controller index 47a6742..90ba122 100644 --- a/Samples/Animation/AntAnimator.controller +++ b/Samples/Animation/AntAnimator2.controller @@ -18,7 +18,7 @@ BlendTree: m_Mirror: 0 - serializedVersion: 2 m_Motion: {fileID: 7400000, guid: b8a731a1533b8c960b3f3688d4922a24, type: 2} - m_Threshold: 0.09600001 + m_Threshold: 0.072000004 m_Position: {x: 0, y: 1} m_TimeScale: 5 m_CycleOffset: 0 @@ -26,7 +26,7 @@ BlendTree: m_Mirror: 0 - serializedVersion: 2 m_Motion: {fileID: 7400000, guid: ab82ff68e62ea3b1c8e6523f8d46c142, type: 2} - m_Threshold: 0.19200002 + m_Threshold: 0.14400001 m_Position: {x: -1, y: 0} m_TimeScale: 5 m_CycleOffset: 0 @@ -34,87 +34,27 @@ BlendTree: m_Mirror: 0 - serializedVersion: 2 m_Motion: {fileID: 7400000, guid: 91229db5e929c379bbfd5bf417848488, type: 2} - m_Threshold: 0.28800002 + m_Threshold: 0.21600002 m_Position: {x: 1, y: 0} - m_TimeScale: 1 + m_TimeScale: 5 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 - serializedVersion: 2 - m_Motion: {fileID: 7400000, guid: 501d5503172629df192bb4ad015fb4f7, type: 2} - m_Threshold: 0.38400003 - m_Position: {x: 1, y: -1} - m_TimeScale: 1 - m_CycleOffset: 0 - m_DirectBlendParameter: Forward - m_Mirror: 0 - - serializedVersion: 2 - m_Motion: {fileID: 7400000, guid: 240c3a3c6c28272059bf7b591ff818b1, type: 2} - m_Threshold: 0.48000002 - m_Position: {x: -1, y: -1} - m_TimeScale: 1 + m_Motion: {fileID: 7400000, guid: b8a731a1533b8c960b3f3688d4922a24, type: 2} + m_Threshold: 0.28800002 + m_Position: {x: 0, y: -1} + m_TimeScale: -5 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 m_BlendParameter: Rotate m_BlendParameterY: Forward m_MinThreshold: 0 - m_MaxThreshold: 0.48000002 + m_MaxThreshold: 0.28800002 m_UseAutomaticThresholds: 1 m_NormalizedBlendValues: 0 m_BlendType: 3 ---- !u!1102 &-2902313045677931162 -AnimatorState: - serializedVersion: 6 - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Idle - m_Speed: 1 - m_CycleOffset: 0 - m_Transitions: [] - m_StateMachineBehaviours: [] - m_Position: {x: 50, y: 50, z: 0} - m_IKOnFeet: 0 - m_WriteDefaultValues: 1 - m_Mirror: 0 - m_SpeedParameterActive: 0 - m_MirrorParameterActive: 0 - m_CycleOffsetParameterActive: 0 - m_TimeParameterActive: 0 - m_Motion: {fileID: 0} - m_Tag: - m_SpeedParameter: - m_MirrorParameter: - m_CycleOffsetParameter: - m_TimeParameter: ---- !u!1102 &-885377640043731298 -AnimatorState: - serializedVersion: 6 - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: AntStrafeLeft - m_Speed: 1 - m_CycleOffset: 0 - m_Transitions: [] - m_StateMachineBehaviours: [] - m_Position: {x: 50, y: 50, z: 0} - m_IKOnFeet: 0 - m_WriteDefaultValues: 1 - m_Mirror: 0 - m_SpeedParameterActive: 0 - m_MirrorParameterActive: 0 - m_CycleOffsetParameterActive: 0 - m_TimeParameterActive: 0 - m_Motion: {fileID: 7400000, guid: 5cf4fc079a3b9b1829ba5801ee1523ec, type: 2} - m_Tag: - m_SpeedParameter: - m_MirrorParameter: - m_CycleOffsetParameter: - m_TimeParameter: --- !u!206 &-844531329161772208 BlendTree: m_ObjectHideFlags: 1 @@ -130,39 +70,13 @@ BlendTree: m_UseAutomaticThresholds: 1 m_NormalizedBlendValues: 0 m_BlendType: 0 ---- !u!1102 &-477768274303629365 -AnimatorState: - serializedVersion: 6 - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: AntWalkRight - m_Speed: 1 - m_CycleOffset: 0 - m_Transitions: [] - m_StateMachineBehaviours: [] - m_Position: {x: 50, y: 50, z: 0} - m_IKOnFeet: 0 - m_WriteDefaultValues: 1 - m_Mirror: 0 - m_SpeedParameterActive: 0 - m_MirrorParameterActive: 0 - m_CycleOffsetParameterActive: 0 - m_TimeParameterActive: 0 - m_Motion: {fileID: 7400000, guid: 501d5503172629df192bb4ad015fb4f7, type: 2} - m_Tag: - m_SpeedParameter: - m_MirrorParameter: - m_CycleOffsetParameter: - m_TimeParameter: --- !u!91 &9100000 AnimatorController: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: AntAnimator + m_Name: AntAnimator2 serializedVersion: 5 m_AnimatorParameters: - m_Name: Forward @@ -202,28 +116,6 @@ AnimatorController: m_IKPass: 0 m_SyncedLayerAffectsTiming: 0 m_Controller: {fileID: 9100000} ---- !u!1101 &2088305737403053393 -AnimatorStateTransition: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: - m_Conditions: [] - m_DstStateMachine: {fileID: 0} - m_DstState: {fileID: 0} - m_Solo: 0 - m_Mute: 0 - m_IsExit: 1 - serializedVersion: 3 - m_TransitionDuration: 0.25 - m_TransitionOffset: 0 - m_ExitTime: 0.75 - m_HasExitTime: 1 - m_HasFixedDuration: 1 - m_InterruptionSource: 0 - m_OrderedInterruption: 1 - m_CanTransitionToSelf: 1 --- !u!1107 &2310030155210667225 AnimatorStateMachine: serializedVersion: 6 @@ -236,15 +128,6 @@ AnimatorStateMachine: - serializedVersion: 1 m_State: {fileID: 5197032680816450026} m_Position: {x: 80, y: 250, z: 0} - - serializedVersion: 1 - m_State: {fileID: -2902313045677931162} - m_Position: {x: 380, y: 150, z: 0} - - serializedVersion: 1 - m_State: {fileID: -885377640043731298} - m_Position: {x: 415, y: 215, z: 0} - - serializedVersion: 1 - m_State: {fileID: -477768274303629365} - m_Position: {x: 450, y: 280, z: 0} m_ChildStateMachines: [] m_AnyStateTransitions: [] m_EntryTransitions: [] @@ -265,8 +148,7 @@ AnimatorState: m_Name: AntWalk m_Speed: 1 m_CycleOffset: 0 - m_Transitions: - - {fileID: 2088305737403053393} + m_Transitions: [] m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 diff --git a/Samples/Animation/AntAnimator.controller.meta b/Samples/Animation/AntAnimator2.controller.meta similarity index 100% rename from Samples/Animation/AntAnimator.controller.meta rename to Samples/Animation/AntAnimator2.controller.meta diff --git a/Samples/Animation/AntAnimator3.controller b/Samples/Animation/AntAnimator3.controller new file mode 100644 index 0000000..623e9db --- /dev/null +++ b/Samples/Animation/AntAnimator3.controller @@ -0,0 +1,238 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!206 &-7807188484574405462 +BlendTree: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Blend Tree + m_Childs: + - serializedVersion: 2 + m_Motion: {fileID: 7400000, guid: ab82ff68e62ea3b1c8e6523f8d46c142, type: 2} + m_Threshold: -1 + m_Position: {x: 0, y: 1} + m_TimeScale: 5 + m_CycleOffset: 0 + m_DirectBlendParameter: Forward + m_Mirror: 0 + - serializedVersion: 2 + m_Motion: {fileID: -6247285785558794827} + m_Threshold: 0 + m_Position: {x: 0, y: 0.5} + m_TimeScale: 1 + m_CycleOffset: 0 + m_DirectBlendParameter: Forward + m_Mirror: 0 + - serializedVersion: 2 + m_Motion: {fileID: 7400000, guid: 91229db5e929c379bbfd5bf417848488, type: 2} + m_Threshold: 1 + m_Position: {x: 1, y: 0} + m_TimeScale: 5 + m_CycleOffset: 0 + m_DirectBlendParameter: Forward + m_Mirror: 0 + m_BlendParameter: Rotate + m_BlendParameterY: Forward + m_MinThreshold: -1 + m_MaxThreshold: 1 + m_UseAutomaticThresholds: 0 + m_NormalizedBlendValues: 0 + m_BlendType: 0 +--- !u!206 &-6247285785558794827 +BlendTree: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: BlendTree + m_Childs: + - serializedVersion: 2 + m_Motion: {fileID: 7400000, guid: 138594cdb62397137913b39c26d3de5a, type: 2} + m_Threshold: 0 + m_Position: {x: 0, y: 0} + m_TimeScale: 1 + m_CycleOffset: 0 + m_DirectBlendParameter: Forward + m_Mirror: 0 + - serializedVersion: 2 + m_Motion: {fileID: 7400000, guid: b8a731a1533b8c960b3f3688d4922a24, type: 2} + m_Threshold: 0.25 + m_Position: {x: 0, y: 1} + m_TimeScale: 5 + m_CycleOffset: 0 + m_DirectBlendParameter: Forward + m_Mirror: 0 + - serializedVersion: 2 + m_Motion: {fileID: 7400000, guid: 240c3a3c6c28272059bf7b591ff818b1, type: 2} + m_Threshold: 0.5 + m_Position: {x: -1, y: 0} + m_TimeScale: 5 + m_CycleOffset: 0 + m_DirectBlendParameter: Forward + m_Mirror: 0 + - serializedVersion: 2 + m_Motion: {fileID: 7400000, guid: 501d5503172629df192bb4ad015fb4f7, type: 2} + m_Threshold: 0.75 + m_Position: {x: 1, y: 0} + m_TimeScale: 5 + m_CycleOffset: 0 + m_DirectBlendParameter: Forward + m_Mirror: 0 + - serializedVersion: 2 + m_Motion: {fileID: 7400000, guid: b8a731a1533b8c960b3f3688d4922a24, type: 2} + m_Threshold: 1 + m_Position: {x: 0, y: -1} + m_TimeScale: -5 + m_CycleOffset: 0 + m_DirectBlendParameter: Forward + m_Mirror: 0 + m_BlendParameter: Strafe + m_BlendParameterY: Forward + m_MinThreshold: 0 + m_MaxThreshold: 1 + m_UseAutomaticThresholds: 1 + m_NormalizedBlendValues: 0 + m_BlendType: 2 +--- !u!206 &-844531329161772208 +BlendTree: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: BlendTree + m_Childs: [] + m_BlendParameter: Rotate + m_BlendParameterY: Blend + m_MinThreshold: 0 + m_MaxThreshold: 1 + m_UseAutomaticThresholds: 1 + m_NormalizedBlendValues: 0 + m_BlendType: 0 +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: AntAnimator3 + serializedVersion: 5 + m_AnimatorParameters: + - m_Name: Forward + m_Type: 1 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: Rotate + m_Type: 1 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: Strafe + m_Type: 1 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Base Layer + m_StateMachine: {fileID: 2310030155210667225} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1107 &2310030155210667225 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Base Layer + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 5197032680816450026} + m_Position: {x: 80, y: 250, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 40, y: 90, z: 0} + m_ExitPosition: {x: 40, y: 500, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 5197032680816450026} +--- !u!206 &2428509168228285792 +BlendTree: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: BlendTree + m_Childs: + - serializedVersion: 2 + m_Motion: {fileID: 7400000, guid: ab82ff68e62ea3b1c8e6523f8d46c142, type: 2} + m_Threshold: -1 + m_Position: {x: 0, y: 0} + m_TimeScale: 1 + m_CycleOffset: 0 + m_DirectBlendParameter: Forward + m_Mirror: 0 + - serializedVersion: 2 + m_Motion: {fileID: 7400000, guid: 91229db5e929c379bbfd5bf417848488, type: 2} + m_Threshold: 1 + m_Position: {x: 0, y: 0} + m_TimeScale: 1 + m_CycleOffset: 0 + m_DirectBlendParameter: Forward + m_Mirror: 0 + - serializedVersion: 2 + m_Motion: {fileID: 7400000, guid: 138594cdb62397137913b39c26d3de5a, type: 2} + m_Threshold: 3 + m_Position: {x: 0, y: 0} + m_TimeScale: 1 + m_CycleOffset: 0 + m_DirectBlendParameter: Forward + m_Mirror: 0 + m_BlendParameter: Rotate + m_BlendParameterY: Blend + m_MinThreshold: -1 + m_MaxThreshold: 3 + m_UseAutomaticThresholds: 0 + m_NormalizedBlendValues: 0 + m_BlendType: 0 +--- !u!1102 &5197032680816450026 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: AntWalk + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -7807188484574405462} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: diff --git a/Samples/Animation/AntAnimator3.controller.meta b/Samples/Animation/AntAnimator3.controller.meta new file mode 100644 index 0000000..b6ff759 --- /dev/null +++ b/Samples/Animation/AntAnimator3.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ba169e741a830f910bdde9e04f7c88f4 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Animation/AntWalkForward.anim b/Samples/Animation/AntWalkForward.anim index 13f9e78..0ef3519 100644 --- a/Samples/Animation/AntWalkForward.anim +++ b/Samples/Animation/AntWalkForward.anim @@ -21,15 +21,6 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.20833333 - value: {x: 0, y: 0, z: -0.001} inSlope: {x: 0, y: 0, z: -0.0048} outSlope: {x: 0, y: 0, z: -0.0048} tangentMode: 0 @@ -39,16 +30,7 @@ AnimationClip: - serializedVersion: 3 time: 0.41666666 value: {x: 0, y: 0, z: -0.002} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.625 - value: {x: 0, y: 0.0015, z: -0.001} - inSlope: {x: 0, y: 0.0048, z: 0.0048} + inSlope: {x: 0, y: -0, z: -0.0048} outSlope: {x: 0, y: 0.0048, z: 0.0048} tangentMode: 0 weightedMode: 0 @@ -56,18 +38,9 @@ AnimationClip: outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.8333333 - value: {x: 0, y: 0.002, z: 0} - inSlope: {x: 0, y: 0, z: 0.0048000007} - outSlope: {x: 0, y: 0, z: 0.0048000007} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.0416666 - value: {x: 0, y: 0.0015, z: 0.001} - inSlope: {x: 0, y: -0.0048, z: 0.0048} - outSlope: {x: 0, y: -0.0048, z: 0.0048} + value: {x: 0, y: 0.002, z: -2.3283064e-10} + inSlope: {x: 0, y: 0, z: 0.0047999993} + outSlope: {x: 0, y: 0, z: 0.0047999993} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -75,16 +48,7 @@ AnimationClip: - serializedVersion: 3 time: 1.25 value: {x: 0, y: 0, z: 0.002} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.4583334 - value: {x: 0, y: 0, z: 0.001} - inSlope: {x: 0, y: 0, z: -0.0048000007} + inSlope: {x: 0, y: 0, z: 0.0048} outSlope: {x: 0, y: 0, z: -0.0048000007} tangentMode: 0 weightedMode: 0 @@ -93,8 +57,8 @@ AnimationClip: - serializedVersion: 3 time: 1.6666666 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: -0.0048000007} + outSlope: {x: 0, y: 0, z: -0.0048000007} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -109,17 +73,8 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0.002, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.20833333 - value: {x: 0, y: 0.0015, z: 0.001} - inSlope: {x: 0, y: -0.0048, z: 0.0048} - outSlope: {x: 0, y: -0.0048, z: 0.0048} + inSlope: {x: 0, y: 0, z: 0.0048} + outSlope: {x: 0, y: 0, z: 0.0048} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -127,34 +82,7 @@ AnimationClip: - serializedVersion: 3 time: 0.41666666 value: {x: 0, y: 0, z: 0.002} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.625 - value: {x: 0, y: 0, z: 0.001} - inSlope: {x: 0, y: 0, z: -0.0048} - outSlope: {x: 0, y: 0, z: -0.0048} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.8333333 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: -0.0048000007} - outSlope: {x: 0, y: 0, z: -0.0048000007} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.0416666 - value: {x: 0, y: 0, z: -0.001} - inSlope: {x: 0, y: 0, z: -0.0048} + inSlope: {x: 0, y: -0.0048, z: 0.0048} outSlope: {x: 0, y: 0, z: -0.0048} tangentMode: 0 weightedMode: 0 @@ -163,16 +91,7 @@ AnimationClip: - serializedVersion: 3 time: 1.25 value: {x: 0, y: 0, z: -0.002} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.4583334 - value: {x: 0, y: 0.0015, z: -0.001} - inSlope: {x: 0, y: 0.0048000007, z: 0.0048000007} + inSlope: {x: 0, y: -0, z: -0.0048} outSlope: {x: 0, y: 0.0048000007, z: 0.0048000007} tangentMode: 0 weightedMode: 0 @@ -181,8 +100,8 @@ AnimationClip: - serializedVersion: 3 time: 1.6666666 value: {x: 0, y: 0.002, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0.0048000007} + outSlope: {x: 0, y: 0, z: 0.0048000007} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -284,55 +203,16 @@ AnimationClip: value: 0 inSlope: 0 outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.x - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.20833333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.41666666 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: 0.0015 - inSlope: 0.0048 + inSlope: -0 outSlope: 0.0048 - tangentMode: 136 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -341,16 +221,7 @@ AnimationClip: value: 0.002 inSlope: 0 outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: 0.0015 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 136 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -359,16 +230,7 @@ AnimationClip: value: 0 inSlope: 0 outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + tangentMode: 65 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -377,7 +239,7 @@ AnimationClip: value: 0 inSlope: 0 outSlope: 0 - tangentMode: 136 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -396,81 +258,36 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.20833333 - value: -0.001 inSlope: -0.0048 outSlope: -0.0048 - tangentMode: 136 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.41666666 value: -0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: -0.001 - inSlope: 0.0048 + inSlope: -0.0048 outSlope: 0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0 - inSlope: 0.0048000007 - outSlope: 0.0048000007 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: 0.001 - inSlope: 0.0048 - outSlope: 0.0048 - tangentMode: 136 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 1.25 value: 0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 - value: 0.001 - inSlope: -0.0048000007 + inSlope: 0.0048 outSlope: -0.0048000007 - tangentMode: 136 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 1.6666666 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: -0.0048000007 + outSlope: -0.0048000007 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -495,66 +312,21 @@ AnimationClip: weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.20833333 - value: 0.0015 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - serializedVersion: 3 time: 0.41666666 value: 0 - inSlope: 0 + inSlope: -0.0048 outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 1.25 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 - value: 0.0015 - inSlope: 0.0048000007 + inSlope: -0 outSlope: 0.0048000007 - tangentMode: 136 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -582,81 +354,36 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.20833333 - value: 0.001 inSlope: 0.0048 outSlope: 0.0048 - tangentMode: 136 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.41666666 value: 0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: 0.001 - inSlope: -0.0048 + inSlope: 0.0048 outSlope: -0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0 - inSlope: -0.0048000007 - outSlope: -0.0048000007 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: -0.001 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 136 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 1.25 value: -0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 - value: -0.001 - inSlope: 0.0048000007 + inSlope: -0.0048 outSlope: 0.0048000007 - tangentMode: 136 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 1.6666666 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: 0.0048000007 + outSlope: 0.0048000007 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -740,27 +467,6 @@ AnimationClip: classID: 4 script: {fileID: 0} flags: 8 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.x - path: Body/RightFeetTarget - classID: 4 - script: {fileID: 0} - flags: 8 m_EulerEditorCurves: [] m_HasGenericRootTransform: 1 m_HasMotionFloatCurves: 0 diff --git a/Samples/Foraging.unity b/Samples/Foraging.unity index 1d4b56b..22ce533 100644 --- a/Samples/Foraging.unity +++ b/Samples/Foraging.unity @@ -1402,19 +1402,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.9513476 + value: 0.95134753 objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.16772108 + value: -0.16772145 objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.2545458 + value: -0.2545459 objectReference: {fileID: 0} - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.044876024 + value: -0.044876143 objectReference: {fileID: 0} - target: {fileID: 234321254904069504, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_Enabled @@ -1438,47 +1438,47 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.3318227 + value: 0.33182314 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.4944449 + value: -0.49444538 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.58473 + value: -0.5847298 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.5509164 + value: 0.5509158 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 6.9849193e-10 + value: 0.0000000010477379 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 1.1641532e-10 + value: -3.4924597e-10 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0030040143 + value: 0.0030040161 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.68897164 + value: 0.6889717 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.72478837 + value: 0.7247883 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000016391277 + value: -0.00000016391276 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000033527613 + value: 0.00000006332993 objectReference: {fileID: 0} - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: length @@ -1558,87 +1558,87 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.272894 + value: -0.27289417 objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.07145218 + value: 0.07145223 objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.9281011 + value: 0.92810106 objectReference: {fileID: 0} - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.24300589 + value: 0.24300592 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0.0000000022237239 + value: 4.2024412e-10 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 4.656613e-10 + value: -9.313226e-10 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0041295583 + value: 0.004129558 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.96224797 + value: 0.9622479 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.27217463 + value: -0.2721745 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000006898425 + value: 0.000000067463276 objectReference: {fileID: 0} - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -9.073631e-11 + value: -0.000000050987605 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.45984083 + value: 0.45984197 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.68778163 + value: -0.6877811 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.500828 + value: -0.5008271 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.25431123 + value: -0.2543124 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.769217 + value: 0.76921755 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.4836072 + value: -0.48360723 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.17796797 + value: 0.17796776 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.37783155 + value: -0.37783065 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -0.0000000014405929 + value: -5.0543536e-10 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -4.656613e-10 + value: 9.313226e-10 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z @@ -1646,20 +1646,24 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.94809705 + value: 0.948097 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.31798112 + value: -0.3179813 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000009805181 + value: -0.00000007940766 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000096782095 + value: 0.00000006468157 objectReference: {fileID: 0} + - target: {fileID: 2692911006928419026, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_Controller + value: + objectReference: {fileID: 9100000, guid: ba169e741a830f910bdde9e04f7c88f4, type: 2} - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: length value: 0.007110139 @@ -1694,7 +1698,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0.004880991 + value: 0.0048809913 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1702,39 +1706,39 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: -0.00054922234 + value: -0.0005492205 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.74814737 + value: 0.7481474 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.17950949 + value: 0.17950971 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.6211594 + value: 0.6211592 objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.14904016 + value: -0.1490403 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.3312234 + value: -0.33122328 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.9063612 + value: 0.90636134 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.26013055 + value: 0.26013014 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.033653017 + value: 0.03365269 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -1742,31 +1746,31 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.059745155 + value: 0.059745185 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.855431 + value: 0.85543114 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.5104123 + value: -0.51041204 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.8352103 + value: 0.83521044 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.17726402 + value: -0.17726359 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.19850641 + value: 0.19850598 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.48124456 + value: 0.48124483 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1778,23 +1782,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0012553632 + value: 0.0012553621 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.9065213 + value: 0.9065212 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.33378392 + value: 0.33378425 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.24255197 + value: -0.242552 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.08930837 + value: 0.089308485 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1802,23 +1806,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.7287941 + value: 0.7287942 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.24659131 + value: -0.24659143 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.60509104 + value: 0.6050909 objectReference: {fileID: 0} - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.20473573 + value: 0.20473577 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0.0022482648 + value: 0.0022482695 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1826,35 +1830,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0015912973 + value: 0.0015912955 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.9194448 + value: 0.9194447 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.33498567 + value: 0.33498552 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.19348523 + value: 0.193486 objectReference: {fileID: 0} - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.070493385 + value: -0.070493646 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0.0000000018912174 + value: -1.4643946e-10 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: -4.6566123e-10 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0041765133 + value: 0.004176514 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -1862,15 +1866,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.2699721 + value: -0.26997188 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000005668256 + value: -0.000000062902416 objectReference: {fileID: 0} - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.00000007023554 + value: 0.000000075457855 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1878,51 +1882,51 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.7331392 + value: 0.73313934 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.24335083 + value: -0.24335097 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.60271376 + value: -0.6027135 objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.20005876 + value: -0.20005873 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 3.783498e-10 + value: 4.656613e-10 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -1.4551915e-10 + value: 4.0745363e-10 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0024082728 + value: 0.0024082721 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.672321 + value: 0.67232096 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.74025977 + value: 0.7402598 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000029802319 + value: -0.000000059604645 objectReference: {fileID: 0} - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.00000004470348 + value: -0.000000014901161 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 0.003254884 + value: 0.003254889 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1930,55 +1934,55 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: -0.006092598 + value: -0.0060925996 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.26382497 + value: 0.26382536 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.068901405 + value: 0.068901524 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.9308841 + value: 0.930884 objectReference: {fileID: 0} - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.24311279 + value: -0.2431128 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -0.0000000022489963 + value: -0.0000000012189263 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -0.0000000023283062 + value: 0.0000000013969836 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0042412207 + value: 0.0042412244 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.950333 + value: 0.9503331 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.31123504 + value: -0.31123465 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.0000001429927 + value: 0.00000016342258 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.00000015506907 + value: -0.00000016900565 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -0.002748237 + value: -0.002748238 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -1986,35 +1990,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: -0.005979648 + value: -0.005979646 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.2747748 + value: -0.27477506 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.06383809 + value: -0.06383813 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.93449795 + value: 0.9344979 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.21711075 + value: -0.2171107 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -8.8455504e-10 + value: 0.000000001378122 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -2.3283064e-10 + value: 0.0000000011641532 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.003021467 + value: 0.0030214668 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -2026,55 +2030,55 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.0000001529377 + value: -0.0000000011394262 objectReference: {fileID: 0} - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.00000023046644 + value: 3.0993516e-10 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 3.4924597e-10 + value: 5.820766e-10 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -1.1641532e-10 + value: -6.4028427e-10 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0019033393 + value: 0.0019033392 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.68107766 + value: 0.6810773 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.73221123 + value: 0.7322116 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000013411045 + value: -0.00000023841855 objectReference: {fileID: 0} - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.00000008568168 + value: 0.00000014156102 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.40812165 + value: 0.40812153 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.27147096 + value: 0.2714713 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.8524232 + value: 0.85242325 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.18197511 + value: -0.18197484 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -2086,23 +2090,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.96235937 + value: 0.9623592 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.177366 + value: -0.17736581 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.20251597 + value: 0.20251691 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.037324358 + value: 0.03732453 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: -0.0042337636 + value: -0.0042337617 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y @@ -2110,39 +2114,39 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: -0.0006929247 + value: -0.00069292285 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.75082105 + value: 0.75082123 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.1816051 + value: 0.18160525 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.61725 + value: -0.6172498 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.14929754 + value: 0.14929758 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.34205794 + value: 0.34205884 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.9227911 + value: 0.9227909 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.17563729 + value: 0.17563702 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.024586415 + value: -0.02458617 objectReference: {fileID: 0} - target: {fileID: 6049855982455691338, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_Name @@ -2186,63 +2190,63 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: -8.1490725e-10 + value: 0.0000000010477379 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0030040161 + value: 0.0030040157 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6909739 + value: 0.69097376 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.72287977 + value: 0.7228799 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000044703484 + value: 0.0000000745058 objectReference: {fileID: 0} - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000018626451 + value: -0.0000000037252899 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.68892515 + value: 0.6889254 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.6366751 + value: 0.6366744 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.007983622 + value: -0.007984172 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.34635717 + value: -0.3463581 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 2.910383e-11 + value: -7.858034e-10 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 6.1118044e-10 + value: -4.656613e-10 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0024082721 + value: 0.0024082735 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6710928 + value: 0.6710927 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.74137336 + value: 0.7413735 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y @@ -2250,83 +2254,83 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000014901159 + value: -0.00000004470348 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.51194155 + value: 0.5119409 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.32878798 + value: 0.3287885 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.4640696 + value: 0.4640702 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.6437807 + value: -0.64378065 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 6.4028427e-10 + value: 1.7462298e-10 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 2.3283064e-10 + value: -2.910383e-10 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.00190334 + value: 0.0019033398 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.67991334 + value: 0.6799135 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.7332926 + value: 0.7332924 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.0000001937151 + value: -0.000000074505806 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.00000009685755 + value: 0.000000007450581 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6510881 + value: 0.65108824 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.41958794 + value: 0.41958734 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.16263422 + value: -0.16263431 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.61121225 + value: -0.61121243 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.02707541 + value: -0.027075963 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.71348983 + value: 0.71348995 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.68053913 + value: 0.6805388 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.1645168 + value: 0.1645173 objectReference: {fileID: 0} - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: femurLength @@ -2366,31 +2370,31 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.26493755 + value: 0.26493794 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.064491406 + value: -0.06449161 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.93480957 + value: 0.9348094 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.22755253 + value: 0.22755273 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x - value: 3.2407493e-10 + value: -0.0000000010156647 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.y - value: 0.0000000016298145 + value: 2.3283064e-10 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.z - value: 0.0029819123 + value: 0.002981913 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w @@ -2398,15 +2402,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.29003108 + value: -0.29003084 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000005248068 + value: 0.00000013207135 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.00000011970675 + value: -0.0000002448431 objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: From 38391181af60df8532075f38bbc0ccddf9bd2280 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Fri, 10 Apr 2026 17:43:44 +0200 Subject: [PATCH 18/38] Animation scaling step 1 --- .../Editor/Scripts/AnimationEditor.cs | 117 +++++ .../Editor/Scripts/AnimationEditor.cs.meta | 11 + .../Editor/Scripts/Creature_Editor.cs | 2 +- .../Editor/Scripts/Insect/InsectRig_Editor.cs | 15 +- .../Editor/Scripts/Insect/Insect_Editor.cs | 108 +++- CreatureControl/Editor/Scripts/Leg_Editor.cs | 9 +- .../Editor/Scripts/TargetLeg_Editor.cs | 44 ++ .../Editor/Scripts/TargetLeg_Editor.cs.meta | 11 + CreatureControl/Runtime/Scripts/Creature.cs | 3 +- .../Runtime/Scripts/Insect/Insect.cs | 9 +- .../Runtime/Scripts/Insect/InsectRig.cs | 44 +- CreatureControl/Runtime/Scripts/Leg.cs | 46 +- CreatureControl/Runtime/Scripts/LegTarget.cs | 2 +- CreatureControl/Runtime/Scripts/TargetLeg.cs | 108 ++-- CreatureControl/Runtime/Scripts/TargetRig.cs | 7 +- Documentation/Animations.md | 36 +- Documentation/{Ant2.md => Ant.md} | 0 Documentation/{Ant2.md.meta => Ant.md.meta} | 0 Documentation/Models.md | 12 +- Editor/Scripts/Ant_Editor.cs | 2 +- Runtime/Resources/InsectTargetRig.prefab | 70 ++- Runtime/Scripts/Ant.cs | 5 +- Runtime/Scripts/AntsNest.cs | 2 +- Runtime/Scripts/Food.cs | 2 +- Runtime/Scripts/Mouth.cs | 2 +- Runtime/Scripts/Odorant.cs | 2 +- Runtime/Scripts/Pheromone.cs | 2 +- Samples/Animation/AntWalkForward 1.anim | 473 ++++++++++++++++++ Samples/Animation/AntWalkForward 1.anim.meta | 8 + 29 files changed, 1009 insertions(+), 143 deletions(-) create mode 100644 CreatureControl/Editor/Scripts/AnimationEditor.cs create mode 100644 CreatureControl/Editor/Scripts/AnimationEditor.cs.meta create mode 100644 CreatureControl/Editor/Scripts/TargetLeg_Editor.cs create mode 100644 CreatureControl/Editor/Scripts/TargetLeg_Editor.cs.meta rename Documentation/{Ant2.md => Ant.md} (100%) rename Documentation/{Ant2.md.meta => Ant.md.meta} (100%) create mode 100644 Samples/Animation/AntWalkForward 1.anim create mode 100644 Samples/Animation/AntWalkForward 1.anim.meta diff --git a/CreatureControl/Editor/Scripts/AnimationEditor.cs b/CreatureControl/Editor/Scripts/AnimationEditor.cs new file mode 100644 index 0000000..56dcca0 --- /dev/null +++ b/CreatureControl/Editor/Scripts/AnimationEditor.cs @@ -0,0 +1,117 @@ +using System.IO; +using UnityEditor; +using UnityEngine; +using System.Collections.Generic; + +public class AnimationEditor { + [MenuItem("Assets/Scale Animation Transforms...", true)] + private static bool ValidateScaleMenu() { + // enable only when an AnimationClip is selected + return Selection.objects != null && Selection.objects.Length > 0 && System.Array.Exists(Selection.objects, o => o is AnimationClip); + } + + [MenuItem("Assets/Scale Animation Transforms...")] + private static void ScaleSelectedClips() { + // default scale - you can change or prompt + float scale = 2.0f; + + var clips = new List(); + foreach (var o in Selection.objects) + if (o is AnimationClip clip) + clips.Add(clip); + + if (clips.Count == 0) { + EditorUtility.DisplayDialog("Scale Animation", "No AnimationClip selected.", "OK"); + return; + } + + if (!EditorUtility.DisplayDialog("Scale Animation", $"Scale translations in {clips.Count} clip(s) by {scale}?", "Yes", "No")) + return; + + foreach (AnimationClip clip in clips) { + ScaleClip(clip, scale); + } + + EditorUtility.DisplayDialog("Scale Animation", "Done scaling selected clips.", "OK"); + } + + public static void ScaleClip(AnimationClip clip, float scale, string saveFolder) { + string origPath = AssetDatabase.GetAssetPath(clip); + + string ext = Path.GetExtension(origPath); + string nameNoExt = Path.GetFileNameWithoutExtension(origPath); + string fileName = $"{nameNoExt}_scaled{ext}"; + string savePath = Path.Combine(saveFolder, fileName).Replace("\\", "/"); + + if (AssetDatabase.LoadAssetAtPath(savePath) != null) { + if (!AssetDatabase.DeleteAsset(savePath)) { + Debug.LogError($"Failed to delete existing asset at {savePath}"); + return; + } + Debug.Log($"Deleted old {savePath}"); + AssetDatabase.Refresh(); + } + + if (!AssetDatabase.CopyAsset(origPath, savePath)) { + Debug.LogError($"Failed to duplicate asset: {origPath} -> {savePath}"); + return; + } + + AssetDatabase.ImportAsset(savePath); + AnimationClip newClip = AssetDatabase.LoadAssetAtPath(savePath); + if (newClip == null) { + Debug.LogError($"Failed to load duplicated clip at: {savePath}"); + return; + } + ScaleClip(newClip, scale); + + } + + public static void ScaleClip(AnimationClip clip, float scale) { + // make editable copy if needed (if clip is in model import, make sure to duplicate or modify import settings) + Undo.RegisterCompleteObjectUndo(clip, "Scale Animation Translations"); + + // Collect curve bindings for position-like properties. + EditorCurveBinding[] bindings = AnimationUtility.GetCurveBindings(clip); + foreach (EditorCurveBinding binding in bindings) { + string prop = binding.propertyName; + if (string.IsNullOrEmpty(prop)) + continue; + + // Identify position/localPosition/property patterns to scale: + // common property names: + // "m_LocalPosition.x", "m_LocalPosition.y", "m_LocalPosition.z" + // "localPosition.x", etc. or custom paths that animate transform.localPosition + // We'll scale any curve with "position" or "LocalPosition" in propertyName (case-insensitive). + + string lower = prop.ToLowerInvariant(); + bool isPos = + lower.Contains("m_localposition") || + lower.Contains("localposition") || + lower.Contains(".position") || + lower == "position.x" || lower == "position.y" || lower == "position.z"; + + if (!isPos) + continue; + + AnimationCurve curve = AnimationUtility.GetEditorCurve(clip, binding); + if (curve == null) continue; + + // scale each keyframe value + Keyframe[] keys = curve.keys; + for (int i = 0; i < keys.Length; i++) { + Keyframe k = keys[i]; + k.value *= scale; + k.inTangent *= scale; + k.outTangent *= scale; + keys[i] = k; + } + + curve.keys = keys; + AnimationUtility.SetEditorCurve(clip, binding, curve); + } + + EditorUtility.SetDirty(clip); + AssetDatabase.SaveAssets(); + } +} \ No newline at end of file diff --git a/CreatureControl/Editor/Scripts/AnimationEditor.cs.meta b/CreatureControl/Editor/Scripts/AnimationEditor.cs.meta new file mode 100644 index 0000000..e0ff648 --- /dev/null +++ b/CreatureControl/Editor/Scripts/AnimationEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 60521eca66eefeadc8700de028cfc181 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/CreatureControl/Editor/Scripts/Creature_Editor.cs b/CreatureControl/Editor/Scripts/Creature_Editor.cs index e60705c..50151cf 100644 --- a/CreatureControl/Editor/Scripts/Creature_Editor.cs +++ b/CreatureControl/Editor/Scripts/Creature_Editor.cs @@ -1,7 +1,7 @@ using UnityEditor; using UnityEditor.SceneManagement; -namespace Passer.CreatureControl { +namespace CreatureControl { [CustomEditor(typeof(Creature), true)] public class Creature_Editor : Editor { diff --git a/CreatureControl/Editor/Scripts/Insect/InsectRig_Editor.cs b/CreatureControl/Editor/Scripts/Insect/InsectRig_Editor.cs index 519c9fc..2c77f04 100644 --- a/CreatureControl/Editor/Scripts/Insect/InsectRig_Editor.cs +++ b/CreatureControl/Editor/Scripts/Insect/InsectRig_Editor.cs @@ -1,13 +1,23 @@ -using UnityEngine; using UnityEditor; -namespace Passer.CreatureControl { +namespace CreatureControl { + [CustomEditor(typeof(InsectRig))] public class InsectRigEditor : Editor { SerializedProperty renderProp; void OnEnable() { + InsectRig insectRig = (InsectRig) target; + renderProp = serializedObject.FindProperty("render"); + + insectRig.legLength = float.PositiveInfinity; + foreach (TargetLeg leg in insectRig.legs) { + float legLength = leg.bones.length; + if (legLength > 0 && legLength < insectRig.legLength) + insectRig.legLength = legLength; + } + } public override void OnInspectorGUI() { @@ -40,4 +50,5 @@ namespace Passer.CreatureControl { } } + } \ No newline at end of file diff --git a/CreatureControl/Editor/Scripts/Insect/Insect_Editor.cs b/CreatureControl/Editor/Scripts/Insect/Insect_Editor.cs index e2a08d9..370896a 100644 --- a/CreatureControl/Editor/Scripts/Insect/Insect_Editor.cs +++ b/CreatureControl/Editor/Scripts/Insect/Insect_Editor.cs @@ -1,7 +1,9 @@ +using System.Collections.Generic; using UnityEditor; using UnityEngine; +using UnityEditor.Animations; -namespace Passer.CreatureControl { +namespace CreatureControl { [CustomEditor(typeof(Insect), true)] public class Insect_Editor : Creature_Editor { @@ -16,6 +18,46 @@ namespace Passer.CreatureControl { anythingChanged |= insect.CheckTargetRig("InsectRig"); insect.insectRig.MatchTo(insect, ref anythingChanged); + float prefabLegLength = 0.003f; + float modelLegLength = insect.insectRig.legLength; + float scale = prefabLegLength / modelLegLength; + Animator animator = insect.insectRig.GetComponent(); + + RuntimeAnimatorController rac = animator.runtimeAnimatorController; + if (rac == null) { + EditorUtility.DisplayDialog("No Controller", "Animator has no RuntimeAnimatorController assigned.", "OK"); + return; + } + + // Collect unique clips from controller, including BlendTree children + List clips = new(); + foreach (AnimationClip c in rac.animationClips) { + if (c != null && !clips.Contains(c)) + clips.Add(c); + } + + // Some clips referenced via AnimatorController layers/states (BlendTrees) may already be in animationClips, + // but to be thorough (and to access BlendTree children) we inspect the controller asset when possible. + string path = AssetDatabase.GetAssetPath(rac); + AnimatorController ac = AssetDatabase.LoadAssetAtPath(path); + if (ac != null) { + foreach (AnimatorControllerLayer layer in ac.layers) { + CollectFromStateMachine(layer.stateMachine, clips); + } + } + + if (clips.Count == 0) { + EditorUtility.DisplayDialog("No Clips", "No AnimationClips found on the controller.", "OK"); + return; + } + + if (insect.updateAnimations) { + AnimationEditor.ScaleClip(clips[0], scale, insect.animationsPath); + Debug.Log($"Scaled{clips[0].name} with {scale} and saved it to {insect.animationsPath}"); + } + else { + Debug.Log($"Did not scale {clips[0].name} with scale {scale} and save it to {insect.animationsPath}"); + } if (anythingChanged) { EditorUtility.SetDirty(creature); @@ -23,6 +65,33 @@ namespace Passer.CreatureControl { } } + + static void CollectFromStateMachine(AnimatorStateMachine sm, List outList) { + foreach (var state in sm.states) { + var motion = state.state.motion; + if (motion is AnimationClip clip) { + if (!outList.Contains(clip)) outList.Add(clip); + } + else if (motion is BlendTree bt) { + CollectFromBlendTree(bt, outList); + } + } + + foreach (var child in sm.stateMachines) + CollectFromStateMachine(child.stateMachine, outList); + } + + static void CollectFromBlendTree(BlendTree tree, List outList) { + foreach (var child in tree.children) { + if (child.motion is AnimationClip clip) { + if (!outList.Contains(clip)) outList.Add(clip); + } + else if (child.motion is BlendTree bt) { + CollectFromBlendTree(bt, outList); + } + } + } + #region Inspector public override void OnInspectorGUI() { @@ -38,6 +107,18 @@ namespace Passer.CreatureControl { static bool showTargets; private void TargetsInspector() { + bool configurationIncomplete = false; + if (!insect.leftFrontLeg.isConfigured || + !insect.leftMiddleLeg.isConfigured || + !insect.leftHindLeg.isConfigured || + !insect.rightFrontLeg.isConfigured || + !insect.rightMiddleLeg.isConfigured || + !insect.rightHindLeg.isConfigured) { + + showTargets = true; + configurationIncomplete = true; + } + GUIContent text = new( "Targets", "The target transforms controlling the body parts" @@ -46,7 +127,9 @@ namespace Passer.CreatureControl { if (showTargets) { EditorGUI.indentLevel++; - + if (configurationIncomplete) { + EditorGUILayout.HelpBox("Not all legs are configured", MessageType.Warning); + } SerializedProperty leftFrontLegProp = serializedObject.FindProperty(nameof(Insect.leftFrontLeg)); Leg_Editor.Inspector(leftFrontLegProp); SerializedProperty leftMiddleLegProp = serializedObject.FindProperty(nameof(Insect.leftMiddleLeg)); @@ -67,18 +150,25 @@ namespace Passer.CreatureControl { private void AnimatorInspector() { GUIContent text = new( - "Animator", - "Standard Unity Animator Controller for animating the character" + "Animator Controller", + "Unity Animator Controller for animating the character" ); SerializedProperty targetRigProp = serializedObject.FindProperty(nameof(Insect.targetRig)); if (targetRigProp == null) return; - SerializedObject targetRigObj = new(targetRigProp.objectReferenceValue); + TargetRig targetRig = targetRigProp.objectReferenceValue as TargetRig; + Animator animator = targetRig.GetComponent(); + if (animator == null) + return; - SerializedProperty animatorControllerProp = targetRigObj.FindProperty(nameof(InsectRig.animator)); - animatorControllerProp.objectReferenceValue = (Animator)EditorGUILayout.ObjectField(text, animatorControllerProp.objectReferenceValue, typeof(Animator), true); + SerializedObject animatorObj = new(animator); + + SerializedProperty animatorControllerProp = animatorObj.FindProperty("m_Controller"); + animatorControllerProp.objectReferenceValue = + (RuntimeAnimatorController)EditorGUILayout.ObjectField(text, animatorControllerProp.objectReferenceValue, typeof(RuntimeAnimatorController), true); + animatorObj.ApplyModifiedProperties(); EditorGUI.indentLevel++; ForwardSpeedInspector(); @@ -93,7 +183,7 @@ namespace Passer.CreatureControl { ); SerializedProperty forwardSpeedProp = serializedObject.FindProperty(nameof(Insect.forwardSpeed)); - forwardSpeedProp.floatValue = EditorGUILayout.FloatField(text, forwardSpeedProp.floatValue); + forwardSpeedProp.floatValue = EditorGUILayout.FloatField(text, forwardSpeedProp.floatValue); } private void RotationSpeedInspector() { @@ -103,7 +193,7 @@ namespace Passer.CreatureControl { ); SerializedProperty rotationSpeedProp = serializedObject.FindProperty(nameof(Insect.rotationSpeed)); - rotationSpeedProp.floatValue = EditorGUILayout.FloatField(text, rotationSpeedProp.floatValue); + rotationSpeedProp.floatValue = EditorGUILayout.FloatField(text, rotationSpeedProp.floatValue); } #endregion Inspector diff --git a/CreatureControl/Editor/Scripts/Leg_Editor.cs b/CreatureControl/Editor/Scripts/Leg_Editor.cs index 20256d3..5f7cace 100644 --- a/CreatureControl/Editor/Scripts/Leg_Editor.cs +++ b/CreatureControl/Editor/Scripts/Leg_Editor.cs @@ -1,16 +1,12 @@ using UnityEditor; using UnityEngine; -namespace Passer.CreatureControl { +namespace CreatureControl { public class Leg_Editor { - //private string label = ""; + private static bool showfield = false; - public void Enable() { - - } - public static void Inspector(SerializedProperty legProp) { GUIStyle foldoutStyle = new(EditorStyles.foldout) { margin = EditorStyles.objectField.margin @@ -45,6 +41,7 @@ namespace Passer.CreatureControl { EditorGUI.indentLevel++; tibiaProp.objectReferenceValue = (Transform)EditorGUILayout.ObjectField("Lower Leg", tibiaProp.objectReferenceValue, typeof(Transform), true); tarsusProp.objectReferenceValue = (Transform)EditorGUILayout.ObjectField("Foot", tarsusProp.objectReferenceValue, typeof(Transform), true); + // Need to check if anythingChanged and update the projection if it did EditorGUI.indentLevel--; } } diff --git a/CreatureControl/Editor/Scripts/TargetLeg_Editor.cs b/CreatureControl/Editor/Scripts/TargetLeg_Editor.cs new file mode 100644 index 0000000..9886259 --- /dev/null +++ b/CreatureControl/Editor/Scripts/TargetLeg_Editor.cs @@ -0,0 +1,44 @@ +using UnityEngine; +using UnityEditor; + +namespace CreatureControl { + + [CustomEditor(typeof(TargetLeg))] + public class TargetLeg_Editor : Editor { + + protected TargetLeg targetLeg; + + private void OnEnable() { + targetLeg = (TargetLeg)target; + CheckLegTarget(targetLeg); + } + + void CheckLegTarget(TargetLeg targetLeg) { + LegTarget legTarget = targetLeg.target.GetComponent(); + if (legTarget == null) + legTarget = targetLeg.target.gameObject.AddComponent(); + legTarget.leg = targetLeg; + + } + + public override void OnInspectorGUI() { + base.OnInspectorGUI(); + + EditorGUI.BeginDisabledGroup(true); + EditorGUILayout.FloatField("Femur Length", targetLeg.bones.femurLength); + EditorGUI.EndDisabledGroup(); + } + + public float PrefabFemurLength() { + Object prefabSource = PrefabUtility.GetCorrespondingObjectFromSource(serializedObject.targetObject); + if (prefabSource == null) + return 0; + + SerializedObject targetLegPrefabObj = new(prefabSource); + SerializedProperty targetBonesPrefabProp = targetLegPrefabObj.FindProperty(nameof(TargetLeg.bones)); + + return 0; + } + } + +} \ No newline at end of file diff --git a/CreatureControl/Editor/Scripts/TargetLeg_Editor.cs.meta b/CreatureControl/Editor/Scripts/TargetLeg_Editor.cs.meta new file mode 100644 index 0000000..02da72b --- /dev/null +++ b/CreatureControl/Editor/Scripts/TargetLeg_Editor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4c107e681ddd2a9ae833061e44e8a7d2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/CreatureControl/Runtime/Scripts/Creature.cs b/CreatureControl/Runtime/Scripts/Creature.cs index b2a7f85..019f022 100644 --- a/CreatureControl/Runtime/Scripts/Creature.cs +++ b/CreatureControl/Runtime/Scripts/Creature.cs @@ -1,6 +1,6 @@ using UnityEngine; -namespace Passer.CreatureControl { +namespace CreatureControl { public class Creature : MonoBehaviour { /// @@ -24,6 +24,7 @@ namespace Passer.CreatureControl { public Quaternion targetToModelRotation; public Animator animator; + public string animationsPath = "Assets"; /// /// The maximum height of objects from the ground which do not stop the creature diff --git a/CreatureControl/Runtime/Scripts/Insect/Insect.cs b/CreatureControl/Runtime/Scripts/Insect/Insect.cs index c9e7fca..f798ea8 100644 --- a/CreatureControl/Runtime/Scripts/Insect/Insect.cs +++ b/CreatureControl/Runtime/Scripts/Insect/Insect.cs @@ -1,5 +1,8 @@ -namespace Passer.CreatureControl { +namespace CreatureControl { + /// + /// A creature with six legs + /// public class Insect : Creature { public InsectRig insectRig; @@ -13,7 +16,9 @@ namespace Passer.CreatureControl { public Leg rightFrontLeg; public Leg rightMiddleLeg; - public Leg rightHindLeg; + public Leg rightHindLeg; + + public bool updateAnimations = false; #region Init diff --git a/CreatureControl/Runtime/Scripts/Insect/InsectRig.cs b/CreatureControl/Runtime/Scripts/Insect/InsectRig.cs index a89fe96..64a2800 100644 --- a/CreatureControl/Runtime/Scripts/Insect/InsectRig.cs +++ b/CreatureControl/Runtime/Scripts/Insect/InsectRig.cs @@ -1,19 +1,58 @@ +using System.Collections.Generic; using UnityEngine; -namespace Passer.CreatureControl { +namespace CreatureControl { - // An insect target rig.... + /// + /// A rig or skeleton for a six-legged insect + /// public class InsectRig : TargetRig { + /// + /// The left front leg + /// public TargetLeg leftFrontLeg; + /// + /// The left middle leg + /// public TargetLeg leftMiddleLeg; + /// + /// The left hind leg + /// public TargetLeg leftBackLeg; + /// + /// The right front leg + /// public TargetLeg rightFrontLeg; + /// + /// The right middle leg + /// public TargetLeg rightMiddleLeg; + /// + /// The right hindLeg + /// public TargetLeg rightBackLeg; + private TargetLeg[] _legs; + public TargetLeg[] legs { + get { + if (_legs == null) { + _legs = new TargetLeg[6]; + _legs[0] = leftFrontLeg; + _legs[1] = leftMiddleLeg; + _legs[2] = leftBackLeg; + _legs[3] = rightFrontLeg; + _legs[4] = rightMiddleLeg; + _legs[5] = rightBackLeg; + } + return _legs; + } + } + public bool render; + public float legLength; // smalled leg length + public override void Pose() { this.leftBackLeg.PoseLimb(); this.leftMiddleLeg.PoseLimb(); @@ -43,7 +82,6 @@ namespace Passer.CreatureControl { this.rightBackLeg.MatchTo(insect.rightHindLeg); } - // Public helper you can call from editor or runtime public void ApplyRenderToChildren(bool value) { // Find all renderers under this GameObject (including inactive) var renderers = GetComponentsInChildren(true); diff --git a/CreatureControl/Runtime/Scripts/Leg.cs b/CreatureControl/Runtime/Scripts/Leg.cs index 8940f64..cad5e56 100644 --- a/CreatureControl/Runtime/Scripts/Leg.cs +++ b/CreatureControl/Runtime/Scripts/Leg.cs @@ -1,8 +1,44 @@ using UnityEngine; -[System.Serializable] -public class Leg { - public Transform femur; // UpperLeg, Thigh - public Transform tibia; // LowerLeg, Shank - public Transform tarsus; // Foot +namespace CreatureControl { + + /// + /// A leg of a creature + /// + [System.Serializable] + public class Leg { + /// + /// The upper leg or thigh bone + /// + public Transform femur; + /// + /// The lower leg or shank bone + /// + public Transform tibia; + /// + /// The foot bone + /// + public Transform tarsus; + + [SerializeField] + private float _femurLength; + public float femurLength { + get { + if (_femurLength <= 0) + _femurLength = Vector3.Distance(this.femur.position, this.tibia.position); + return _femurLength; + } + } + // A bit inefficient is this is used a lot... + public float tibiaLength => Vector3.Distance(this.tibia.position, this.tarsus.position); + public float length => femurLength + tibiaLength; + + + /// + /// Check if all bones of the legs have been configured + /// + /// True when all bones are configured + public bool isConfigured => femur != null && tibia != null && tarsus != null; + } + } \ No newline at end of file diff --git a/CreatureControl/Runtime/Scripts/LegTarget.cs b/CreatureControl/Runtime/Scripts/LegTarget.cs index 4710f60..003096b 100644 --- a/CreatureControl/Runtime/Scripts/LegTarget.cs +++ b/CreatureControl/Runtime/Scripts/LegTarget.cs @@ -1,6 +1,6 @@ using UnityEngine; -namespace Passer.CreatureControl { +namespace CreatureControl { public class LegTarget : MonoBehaviour { public TargetLeg leg; diff --git a/CreatureControl/Runtime/Scripts/TargetLeg.cs b/CreatureControl/Runtime/Scripts/TargetLeg.cs index 5a7f9b4..69dff5a 100644 --- a/CreatureControl/Runtime/Scripts/TargetLeg.cs +++ b/CreatureControl/Runtime/Scripts/TargetLeg.cs @@ -1,83 +1,60 @@ using UnityEngine; -namespace Passer.CreatureControl { +namespace CreatureControl { + /// + /// A leg in a TargetRig which is used to control a leg in a model + /// [System.Serializable] public class TargetLeg : MonoBehaviour { - public Transform femurTarget; // UpperLeg, Thigh - public Transform tibiaTarget; // LowerLeg, Shank - public Transform tarsusTarget; // Foot + public Leg bones; public Transform target; // for the tarsus - protected LegTarget legTarget; public Quaternion targetToBoneFemur; public Quaternion targetToBoneTibia; - public float femurLength; - public float tibiaLength; - public float length; - - /// - /// Update the lenghts of the leg bones - /// - private void CalculateLengths() { - this.femurLength = Vector3.Distance(this.femurTarget.position, this.tibiaTarget.position); - this.tibiaLength = Vector3.Distance(this.tibiaTarget.position, this.tarsusTarget.position); - this.length = femurLength + tibiaLength; - } - public void MatchTo(Leg leg) { - this.femurTarget.position = leg.femur.position; - this.tibiaTarget.position = leg.tibia.position; - this.tarsusTarget.position = leg.tarsus.position; + if (this.bones.femur == null || this.bones.tibia == null || this.bones.tarsus == null) + return; + if (leg.femur == null || leg.tibia == null || leg.tarsus == null) + return; + + this.bones.femur.position = leg.femur.position; + this.bones.tibia.position = leg.tibia.position; + this.bones.tarsus.position = leg.tarsus.position; + targetToBoneFemur = TargetRig.TargetToBoneRotation(leg.femur, leg.tibia); targetToBoneTibia = TargetRig.TargetToBoneRotation(leg.tibia, leg.tarsus); - CalculateLengths(); + float modelLegLength = leg.length; + float targetLegLength = this.bones.length; + Debug.Log($"model: {modelLegLength} rig: {targetLegLength}"); // Put the end-effector target for IK in a sensible place - Vector3 legDirection = (this.tarsusTarget.position - this.femurTarget.position).normalized; - Vector3 targetPosition = this.femurTarget.position + 0.7f * this.length * legDirection.normalized; + Vector3 legDirection = (this.bones.tarsus.position - this.bones.femur.position).normalized; + Vector3 targetPosition = this.bones.femur.position + 0.7f * this.bones.length * legDirection.normalized; Quaternion targetRotation = Quaternion.LookRotation(legDirection); this.target.SetPositionAndRotation(targetPosition, targetRotation); this.target.localPosition = new(this.target.localPosition.x, 0, this.target.localPosition.z); } - public virtual void OnDrawGizmosSelected() { - if (this.enabled == false) - return; - - if (target != null && legTarget == null) { - legTarget = target.GetComponent(); - if (legTarget == null) - legTarget = target.gameObject.AddComponent(); - legTarget.leg = this; - } - - Gizmos.color = Color.white; - if (this.femurTarget != null && this.tibiaTarget != null) - Gizmos.DrawLine(this.femurTarget.position, this.tibiaTarget.position); - if (tibiaTarget != null && this.tarsusTarget != null) - Gizmos.DrawLine(this.tibiaTarget.position, this.tarsusTarget.position); - - PoseLimb(); - } - /// /// Pose the target limb /// public void PoseLimb() { if (target == null) return; + if (bones.femur == null || bones.tibia == null || bones.tarsus == null) + return; Quaternion femurOrientation = FemurRotation(target.position); Quaternion tibiaOrientation = TibiaRotation(target.position); Quaternion tarsusOrientation = TarsusRotation(target.rotation); - femurTarget.rotation = femurOrientation; - tibiaTarget.rotation = tibiaOrientation; - tarsusTarget.rotation = tarsusOrientation; + bones.femur.rotation = femurOrientation; + bones.tibia.rotation = tibiaOrientation; + bones.tarsus.rotation = tarsusOrientation; } public void UpdateBones(Leg leg) { @@ -86,14 +63,14 @@ namespace Passer.CreatureControl { } protected Quaternion FemurRotation(Vector3 targetPosition) { - if (this.femurTarget == null || this.tibiaTarget == null || this.tarsusTarget == null) + if (this.bones.femur == null || this.bones.tibia == null || this.bones.tarsus == null) return Quaternion.identity; - Vector3 toTarget = targetPosition - this.femurTarget.position; + Vector3 toTarget = targetPosition - this.bones.femur.position; // Debug.DrawRay(femur.position, toTarget, Color.magenta); float targetDistance = toTarget.magnitude; - float femurLength = Vector3.Distance(this.femurTarget.position, this.tibiaTarget.position); - float tibiaLength = Vector3.Distance(this.tibiaTarget.position, this.tarsusTarget.position); + float femurLength = Vector3.Distance(this.bones.femur.position, this.bones.tibia.position); + float tibiaLength = Vector3.Distance(this.bones.tibia.position, this.bones.tarsus.position); float hipAngle = CosineRule(targetDistance, femurLength, tibiaLength); // NaN happens when the distance to the footTarget is longer than the length of the leg @@ -110,10 +87,10 @@ namespace Passer.CreatureControl { } protected Quaternion TibiaRotation(Vector3 targetPosition) { - if (this.tibiaTarget == null) + if (this.bones.tibia == null) return Quaternion.identity; - Vector3 directionToTarget = targetPosition - this.tibiaTarget.position; + Vector3 directionToTarget = targetPosition - this.bones.tibia.position; Quaternion tibiaOrientation = Quaternion.LookRotation(directionToTarget, Vector3.up); // femur.up); return tibiaOrientation; // In world space @@ -124,17 +101,17 @@ namespace Passer.CreatureControl { } public void UpdateFemur(Transform femurBone) { - if (femurBone == null || this.femurTarget == null) + if (femurBone == null || this.bones.femur == null) return; - femurBone.rotation = this.femurTarget.rotation * targetToBoneFemur; + femurBone.rotation = this.bones.femur.rotation * targetToBoneFemur; } public void UpdateTibia(Transform tibiaBone) { - if (tibiaBone == null || this.tibiaTarget == null) + if (tibiaBone == null || this.bones.tibia == null) return; - tibiaBone.rotation = this.tibiaTarget.rotation * targetToBoneTibia; + tibiaBone.rotation = this.bones.tibia.rotation * targetToBoneTibia; } #region Math @@ -151,6 +128,23 @@ namespace Passer.CreatureControl { } #endregion Math + + #region Scene + + public virtual void OnDrawGizmosSelected() { + if (this.enabled == false) + return; + + Gizmos.color = Color.white; + if (this.bones.femur != null && this.bones.tibia != null) + Gizmos.DrawLine(this.bones.femur.position, this.bones.tibia.position); + if (bones.tibia != null && this.bones.tarsus != null) + Gizmos.DrawLine(this.bones.tibia.position, this.bones.tarsus.position); + + PoseLimb(); + } + + #endregion Scene } } \ No newline at end of file diff --git a/CreatureControl/Runtime/Scripts/TargetRig.cs b/CreatureControl/Runtime/Scripts/TargetRig.cs index 0232505..23452e7 100644 --- a/CreatureControl/Runtime/Scripts/TargetRig.cs +++ b/CreatureControl/Runtime/Scripts/TargetRig.cs @@ -1,14 +1,11 @@ using UnityEngine; -namespace Passer.CreatureControl { +namespace CreatureControl { /// - /// A target rig for a creature + /// A target rig or skeleton for a creature /// public class TargetRig : MonoBehaviour { - - public Animator animator; - /// /// Pose the target rig using the IK targets /// diff --git a/Documentation/Animations.md b/Documentation/Animations.md index e014d71..f292b09 100644 --- a/Documentation/Animations.md +++ b/Documentation/Animations.md @@ -1,9 +1,37 @@ Animations ========== -The NanoBrain Ant comes with walking animations and an animator. These can be used with any hexapod model but as the rigs of these hexapods can be very different[1](#notes-1) our software provides an animation projection to solve this. H2O +The NanoBrain [Ant](#CreatureControl.Ant) comes with walking animations and an animator. These can be used with any insect model but as the rigs of these hexapods can be very different[1](#notes-1) our software provides an animation projection to solve this. -Notes -===== +The animations are designed to work with the InsectTargetRig found in `Runtime/Resources`. When this is used with any other insect model, you will probably see only root motion and no leg movement. This is because there is no mapping from the animation to the bones in the rig of that model. + +If you want to use the animations on a different insect model, you should place the +[Insect component](#CreatureControl.Insect)[2](#notes-2) + on that model and assign the animator contoller to the `Animator Controller` parameter. *Do not* assign the animator to the Controller parameter of the models Animator component! Note that you probably also need to [configure the leg bones of the model](Models.md#custom-models). + +Animators +--------- +The package provides an animator In `Samples/Animation` called AntAnimator3. This provides a full 3 Degrees-of-Freedom walking with the following parameters: +- Forward: Forward/backward walking +- Rotate: Rotate left/right +- Strafe: Move sideward left/right +The corresponding animations will be blended together in a resulting walking animation. + +The [Ant component](#CreatureControl.Ant) only uses the Forward and Rotate parameters to move the ant. + +Animations +---------- +The package provides different walking animations, found in `Samples/Animation`: +- AntIdle: No movement +- AntWalkForward: Forward walking, can be reversed to backward walking +- AntWalkLeft: Left sideward walking +- AntWalkRight: Right sideward walking +- AntRotateLeft: Anti-clockwise turning on the spot +- AntRotateRight: Clockwise turning on the spot + +These animations are blended by the AntAnimator3 to enable all possible walking movements. + + +### Notes 1. The animation retargeting of Unity's Mecanim only works for Humanoid models. -2. bla bla \ No newline at end of file +2. or any other component derived from [Insect](#CreatureControl.Insect) \ No newline at end of file diff --git a/Documentation/Ant2.md b/Documentation/Ant.md similarity index 100% rename from Documentation/Ant2.md rename to Documentation/Ant.md diff --git a/Documentation/Ant2.md.meta b/Documentation/Ant.md.meta similarity index 100% rename from Documentation/Ant2.md.meta rename to Documentation/Ant.md.meta diff --git a/Documentation/Models.md b/Documentation/Models.md index 2fff92d..66baf5f 100644 --- a/Documentation/Models.md +++ b/Documentation/Models.md @@ -3,4 +3,14 @@ Models The package comes with a number of models which can be found in the [Samples][1] folder. These models are rigged and can be used in combination with the [Animations](Animations.md). -[1]: Installation.md (How to install the Samples) \ No newline at end of file +Custom Models +------------- +To use custom insect models, the [Insect component](#CreatureControl.Insect)[2](#notes-2) should be added to the model. +Additionally, the leg bones of the insect should be configured as the package is not able to find these automatically. +In most cases, only the upper leg bone (the femur) need to be configures, the lower leg (tibia) and foot (tarsus) bones are then assumed to be the descendant bones of the femur if those bones have only one child bone each. If this approach does not work, it is always possible to override the identified bones by manually replacing them by the correct bone. + +#### Notes + + +[1]: Installation.md (How to install the Samples) +2. or any other component derived from the Insect component \ No newline at end of file diff --git a/Editor/Scripts/Ant_Editor.cs b/Editor/Scripts/Ant_Editor.cs index f954a68..72b5f76 100644 --- a/Editor/Scripts/Ant_Editor.cs +++ b/Editor/Scripts/Ant_Editor.cs @@ -1,7 +1,7 @@ using UnityEditor; using UnityEngine; -namespace Passer.CreatureControl { +namespace CreatureControl { [CustomEditor(typeof(Ant))] public class Ant_Editor : Insect_Editor { diff --git a/Runtime/Resources/InsectTargetRig.prefab b/Runtime/Resources/InsectTargetRig.prefab index 945feb8..e2de42f 100644 --- a/Runtime/Resources/InsectTargetRig.prefab +++ b/Runtime/Resources/InsectTargetRig.prefab @@ -77,15 +77,14 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} m_Name: m_EditorClassIdentifier: - femurTarget: {fileID: 2087731612450819825} - tibiaTarget: {fileID: 7566832081299524197} - tarsusTarget: {fileID: 7011186323915432702} + bones: + femur: {fileID: 2087731612450819825} + tibia: {fileID: 7566832081299524197} + tarsus: {fileID: 7011186323915432702} + _femurLength: 0.004816547 target: {fileID: 8947192729555298471} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} - femurLength: 0 - tibiaLength: 0 - length: 0 --- !u!1 &714113386832462525 GameObject: m_ObjectHideFlags: 0 @@ -138,7 +137,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: a25e8575da1d1cba48dc2b8da7a2b0ab, type: 3} m_Name: m_EditorClassIdentifier: - animator: {fileID: 5843436816833865534} leftFrontLeg: {fileID: 5655676289343650514} leftMiddleLeg: {fileID: 6327345715726789984} leftBackLeg: {fileID: 3124099709297356894} @@ -146,6 +144,7 @@ MonoBehaviour: rightMiddleLeg: {fileID: 4196034226083389076} rightBackLeg: {fileID: 8323677930838830493} render: 0 + legLength: 0.009770508 --- !u!95 &5843436816833865534 Animator: serializedVersion: 5 @@ -156,7 +155,7 @@ Animator: m_GameObject: {fileID: 714113386832462525} m_Enabled: 1 m_Avatar: {fileID: 0} - m_Controller: {fileID: 9100000, guid: d4b9f32bef604abd5953647ad53ca0f7, type: 2} + m_Controller: {fileID: 9100000, guid: ba169e741a830f910bdde9e04f7c88f4, type: 2} m_CullingMode: 0 m_UpdateMode: 0 m_ApplyRootMotion: 1 @@ -243,15 +242,14 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} m_Name: m_EditorClassIdentifier: - femurTarget: {fileID: 976560727556484423} - tibiaTarget: {fileID: 3873135409852464941} - tarsusTarget: {fileID: 3355004770557811387} + bones: + femur: {fileID: 976560727556484423} + tibia: {fileID: 3873135409852464941} + tarsus: {fileID: 3355004770557811387} + _femurLength: 0.003806679 target: {fileID: 2041764967651498327} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} - femurLength: 0 - tibiaLength: 0 - length: 0 --- !u!1 &1274558016778403244 GameObject: m_ObjectHideFlags: 0 @@ -512,15 +510,14 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} m_Name: m_EditorClassIdentifier: - femurTarget: {fileID: 7879963364189984297} - tibiaTarget: {fileID: 8557148899078362646} - tarsusTarget: {fileID: 2520372565419969361} + bones: + femur: {fileID: 7879963364189984297} + tibia: {fileID: 8557148899078362646} + tarsus: {fileID: 2520372565419969361} + _femurLength: 0.006008031 target: {fileID: 5692380185316106944} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} - femurLength: 0 - tibiaLength: 0 - length: 0 --- !u!1 &1713014906338526394 GameObject: m_ObjectHideFlags: 0 @@ -1198,15 +1195,14 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} m_Name: m_EditorClassIdentifier: - femurTarget: {fileID: 1138231466888029713} - tibiaTarget: {fileID: 6229249450306020558} - tarsusTarget: {fileID: 3473835942814004862} + bones: + femur: {fileID: 1138231466888029713} + tibia: {fileID: 6229249450306020558} + tarsus: {fileID: 3473835942814004862} + _femurLength: 0.0031432603 target: {fileID: 2714894253296331867} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} - femurLength: 0 - tibiaLength: 0 - length: 0 --- !u!1 &6227205784071755847 GameObject: m_ObjectHideFlags: 0 @@ -1316,15 +1312,14 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} m_Name: m_EditorClassIdentifier: - femurTarget: {fileID: 5158943779127512027} - tibiaTarget: {fileID: 5102382635668602733} - tarsusTarget: {fileID: 5832494694235077857} + bones: + femur: {fileID: 5158943779127512027} + tibia: {fileID: 5102382635668602733} + tarsus: {fileID: 5832494694235077857} + _femurLength: 0.004816545 target: {fileID: 8660658904332009209} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} - femurLength: 0 - tibiaLength: 0 - length: 0 --- !u!1 &6934656281848074513 GameObject: m_ObjectHideFlags: 0 @@ -1885,15 +1880,14 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} m_Name: m_EditorClassIdentifier: - femurTarget: {fileID: 7827425323228862897} - tibiaTarget: {fileID: 8607306932134183899} - tarsusTarget: {fileID: 5350519918537018444} + bones: + femur: {fileID: 7827425323228862897} + tibia: {fileID: 8607306932134183899} + tarsus: {fileID: 5350519918537018444} + _femurLength: 0.00380668 target: {fileID: 5063380583403966759} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} - femurLength: 0 - tibiaLength: 0 - length: 0 --- !u!1 &9173392299445808517 GameObject: m_ObjectHideFlags: 0 diff --git a/Runtime/Scripts/Ant.cs b/Runtime/Scripts/Ant.cs index 6c9f875..628967e 100644 --- a/Runtime/Scripts/Ant.cs +++ b/Runtime/Scripts/Ant.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using UnityEngine; using NanoBrain; -namespace Passer.CreatureControl { +namespace CreatureControl { /// /// Simulated ant using a NanoBrain @@ -58,8 +58,9 @@ namespace Passer.CreatureControl { protected override void Awake() { base.Awake(); + if (this.targetRig != null) - this.animator = this.targetRig.animator; + this.animator = this.targetRig.GetComponent(); this.nanoBrain = GetComponentInChildren(); } diff --git a/Runtime/Scripts/AntsNest.cs b/Runtime/Scripts/AntsNest.cs index 841dfe0..f32aa22 100644 --- a/Runtime/Scripts/AntsNest.cs +++ b/Runtime/Scripts/AntsNest.cs @@ -1,7 +1,7 @@ using System.Collections; using UnityEngine; -namespace Passer.CreatureControl { +namespace CreatureControl { public class AntsNest : Odorant { public Ant antPrefab; diff --git a/Runtime/Scripts/Food.cs b/Runtime/Scripts/Food.cs index 2d4c443..2fd366f 100644 --- a/Runtime/Scripts/Food.cs +++ b/Runtime/Scripts/Food.cs @@ -1,6 +1,6 @@ using UnityEngine; -namespace Passer.CreatureControl { +namespace CreatureControl { public class Food : Odorant { diff --git a/Runtime/Scripts/Mouth.cs b/Runtime/Scripts/Mouth.cs index 1d70517..80e6ac9 100644 --- a/Runtime/Scripts/Mouth.cs +++ b/Runtime/Scripts/Mouth.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using UnityEngine; using NanoBrain; -namespace Passer.CreatureControl { +namespace CreatureControl { public class Mouth : MonoBehaviour { public GameObject foodPrefab; diff --git a/Runtime/Scripts/Odorant.cs b/Runtime/Scripts/Odorant.cs index 3008e0d..0046e4f 100644 --- a/Runtime/Scripts/Odorant.cs +++ b/Runtime/Scripts/Odorant.cs @@ -1,6 +1,6 @@ using UnityEngine; -namespace Passer.CreatureControl { +namespace CreatureControl { public class Odorant : MonoBehaviour { public float strength = 1; diff --git a/Runtime/Scripts/Pheromone.cs b/Runtime/Scripts/Pheromone.cs index 3dd260f..cf162bc 100644 --- a/Runtime/Scripts/Pheromone.cs +++ b/Runtime/Scripts/Pheromone.cs @@ -1,6 +1,6 @@ using UnityEngine; -namespace Passer.CreatureControl { +namespace CreatureControl { public class Pheromone : Odorant { public float duration = 30; // seconds diff --git a/Samples/Animation/AntWalkForward 1.anim b/Samples/Animation/AntWalkForward 1.anim new file mode 100644 index 0000000..6f0b52f --- /dev/null +++ b/Samples/Animation/AntWalkForward 1.anim @@ -0,0 +1,473 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: AntWalkForward 1 + serializedVersion: 7 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: -0.0096} + outSlope: {x: 0, y: 0, z: -0.0096} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.41666666 + value: {x: 0, y: 0, z: -0.004} + inSlope: {x: 0, y: -0, z: -0.0096} + outSlope: {x: 0, y: 0.0096, z: 0.0096} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.8333333 + value: {x: 0, y: 0.004, z: -4.656613e-10} + inSlope: {x: 0, y: 0, z: 0.009599999} + outSlope: {x: 0, y: 0, z: 0.009599999} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.25 + value: {x: 0, y: 0, z: 0.004} + inSlope: {x: 0, y: 0, z: 0.0096} + outSlope: {x: 0, y: 0, z: -0.009600001} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.6666666 + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: -0.009600001} + outSlope: {x: 0, y: 0, z: -0.009600001} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: Body/LeftFeetTarget + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: 0.004, z: 0} + inSlope: {x: 0, y: 0, z: 0.0096} + outSlope: {x: 0, y: 0, z: 0.0096} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.41666666 + value: {x: 0, y: 0, z: 0.004} + inSlope: {x: 0, y: -0.0096, z: 0.0096} + outSlope: {x: 0, y: 0, z: -0.0096} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.25 + value: {x: 0, y: 0, z: -0.004} + inSlope: {x: 0, y: -0, z: -0.0096} + outSlope: {x: 0, y: 0.009600001, z: 0.009600001} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.6666666 + value: {x: 0, y: 0.004, z: 0} + inSlope: {x: 0, y: 0, z: 0.009600001} + outSlope: {x: 0, y: 0, z: 0.009600001} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: Body/RightFeetTarget + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0.0096} + outSlope: {x: 0, y: 0, z: 0.0096} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1.6666666 + value: {x: 0, y: 0, z: 0.016} + inSlope: {x: 0, y: 0, z: 0.0096} + outSlope: {x: 0, y: 0, z: 0.0096} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: [] + m_SampleRate: 24 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 683997697 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1250470035 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 0 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + pptrCurveMapping: [] + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 1.6666666 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 1 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: 0 + inSlope: -0 + outSlope: 0.0096 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8333333 + value: 0.004 + inSlope: 0 + outSlope: 0 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 65 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: Body/LeftFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: -0.0096 + outSlope: -0.0096 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: -0.004 + inSlope: -0.0096 + outSlope: 0.0096 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: 0.004 + inSlope: 0.0096 + outSlope: -0.009600001 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: -0.009600001 + outSlope: -0.009600001 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: Body/LeftFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.004 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: 0 + inSlope: -0.0096 + outSlope: 0 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: 0 + inSlope: -0 + outSlope: 0.009600001 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0.004 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: Body/RightFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0.0096 + outSlope: 0.0096 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41666666 + value: 0.004 + inSlope: 0.0096 + outSlope: -0.0096 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.25 + value: -0.004 + inSlope: -0.0096 + outSlope: 0.009600001 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0 + inSlope: 0.009600001 + outSlope: 0.009600001 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: Body/RightFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0.0096 + outSlope: 0.0096 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1.6666666 + value: 0.016 + inSlope: 0.0096 + outSlope: 0.0096 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.x + path: + classID: 4 + script: {fileID: 0} + flags: 8 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: + classID: 4 + script: {fileID: 0} + flags: 8 + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 1 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/Samples/Animation/AntWalkForward 1.anim.meta b/Samples/Animation/AntWalkForward 1.anim.meta new file mode 100644 index 0000000..16f15af --- /dev/null +++ b/Samples/Animation/AntWalkForward 1.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c216474961242cb2ca482c52ec68c790 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: From b71115d8238fc103ac419452a812d5a557baf915 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Mon, 13 Apr 2026 14:54:52 +0200 Subject: [PATCH 19/38] Inverse Root Motion --- .../Editor/Scripts/CreatureAnimator_Editor.cs | 163 +++ .../Scripts/CreatureAnimator_Editor.cs.meta | 11 + .../Editor/Scripts/Creature_Editor.cs | 3 + CreatureControl/Runtime/Scripts/Creature.cs | 15 +- .../Runtime/Scripts/CreatureAnimator.cs | 110 ++ .../Runtime/Scripts/CreatureAnimator.cs.meta | 11 + Runtime/Resources/InsectTargetRig.prefab | 14 +- Runtime/Scripts/Ant.cs | 3 - Samples/Animation/AntAnimator3.controller | 14 +- Samples/Animation/AntRotateLeft.anim | 194 +--- Samples/Animation/AntRotateRight.anim | 368 ++---- Samples/Animation/AntWalkForward.anim | 142 +-- Samples/Animation/AntWalkLeft.anim | 724 ++---------- Samples/Animation/AntWalkRight.anim | 1026 +++++------------ 14 files changed, 888 insertions(+), 1910 deletions(-) create mode 100644 CreatureControl/Editor/Scripts/CreatureAnimator_Editor.cs create mode 100644 CreatureControl/Editor/Scripts/CreatureAnimator_Editor.cs.meta create mode 100644 CreatureControl/Runtime/Scripts/CreatureAnimator.cs create mode 100644 CreatureControl/Runtime/Scripts/CreatureAnimator.cs.meta diff --git a/CreatureControl/Editor/Scripts/CreatureAnimator_Editor.cs b/CreatureControl/Editor/Scripts/CreatureAnimator_Editor.cs new file mode 100644 index 0000000..b7177d8 --- /dev/null +++ b/CreatureControl/Editor/Scripts/CreatureAnimator_Editor.cs @@ -0,0 +1,163 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace CreatureControl { + [CustomEditor(typeof(CreatureAnimator))] + class CreatureAnimator_Editor : Editor { + + CreatureAnimator animator; + + void OnEnable() { + animator = (CreatureAnimator)target; + } + + private bool showRootVelocities = false; + public override void OnInspectorGUI() { + base.OnInspectorGUI(); + + serializedObject.Update(); + + ComputeRootVelocities(animator); + + // showRootVelocities = EditorGUILayout.Foldout(showRootVelocities, "Root Velocities", true); + // if (showRootVelocities) { + // EditorGUI.indentLevel++; + // foreach (CreatureAnimator.RootMotion rm in animator.rootVelocities) { + + // //foreach (KeyValuePair kvp in animator.rootVelocities) { + // EditorGUILayout.LabelField(rm.animationClipName); + // EditorGUI.indentLevel++; + // EditorGUILayout.Vector3Field("Linear Velocity", rm.linearVelocity); + // EditorGUILayout.Vector3Field("Angular Velocity", rm.angularVelocity); + // EditorGUI.indentLevel--; + // } + // EditorGUI.indentLevel--; + // } + + EditorUtility.SetDirty(animator); + serializedObject.ApplyModifiedProperties(); + } + + private static void ComputeRootVelocities(CreatureAnimator animator) { + if (animator != null && animator.animatorController != null) { + AnimationClip[] clips = animator.animatorController.animationClips;//GetAnimationClips(animator.animator); + + int clipIx = 0; + while (clipIx < clips.Length) { + AnimationClip clip = clips[clipIx]; + CreatureAnimator.RootMotion rootVelocity = CalculateRootVelocity(clip); + CreatureAnimator.RootMotion existingRootMotion = animator.GetRootMotion(rootVelocity.clipName); + if (existingRootMotion == null) + animator.rootVelocities.Add(rootVelocity); + else { + existingRootMotion.linearVelocity = rootVelocity.linearVelocity; + existingRootMotion.angularVelocity = rootVelocity.angularVelocity; + } + clipIx++; + } + } + } + + public static CreatureAnimator.RootMotion CalculateRootVelocity(AnimationClip clip) { + float duration = clip.length; + if (duration == 0) + return CreatureAnimator.RootMotion.zero; + + // Collect curve bindings for position-like properties. + EditorCurveBinding[] bindings = AnimationUtility.GetCurveBindings(clip); + foreach (EditorCurveBinding binding in bindings) { + string prop = binding.propertyName; + if (string.IsNullOrEmpty(prop)) + continue; + + // Check if the binding is for the root motion (usually the hip or root) + if (binding.path == "" && binding.type == typeof(Transform)) { + // Found the root transform, look for position curves + + Vector3 linearTranslation = ComputeTranslation(clip); + Vector3 linearVelocity = linearTranslation / duration; + Vector3 angularRotation = ComputeRotation(clip); + Vector3 angularVelocity = angularRotation / duration; + CreatureAnimator.RootMotion rootMotion = new() { + clipName = clip.name, + linearVelocity = linearVelocity, + angularVelocity = angularVelocity + }; + return rootMotion; + } + } + return CreatureAnimator.RootMotion.zero; + } + + public static Vector3 ComputeTranslation(AnimationClip clip) { + // Retrieve the x, y, z curves + AnimationCurve xCurve = null; + AnimationCurve yCurve = null; + AnimationCurve zCurve = null; + + EditorCurveBinding[] bindings = AnimationUtility.GetCurveBindings(clip); + foreach (EditorCurveBinding binding in bindings) { + if (binding.propertyName.StartsWith("m_LocalPosition.x")) { + xCurve = AnimationUtility.GetEditorCurve(clip, binding); + } + else if (binding.propertyName.StartsWith("m_LocalPosition.y")) { + yCurve = AnimationUtility.GetEditorCurve(clip, binding); + } + else if (binding.propertyName.StartsWith("m_LocalPosition.z")) { + zCurve = AnimationUtility.GetEditorCurve(clip, binding); + } + } + + float totalTranslationX = ComputeTotalChange(xCurve); + float totalTranslationY = ComputeTotalChange(yCurve); + float totalTranslationZ = ComputeTotalChange(zCurve); + + return new Vector3(totalTranslationX, totalTranslationY, totalTranslationZ); + } + + public static Vector3 ComputeRotation(AnimationClip clip) { + // Retrieve the x, y, z curves + AnimationCurve xCurve = null; + AnimationCurve yCurve = null; + AnimationCurve zCurve = null; + + EditorCurveBinding[] bindings = AnimationUtility.GetCurveBindings(clip); + foreach (EditorCurveBinding binding in bindings) { + if (binding.propertyName.StartsWith("localEulerAnglesRaw.x")) { + xCurve = AnimationUtility.GetEditorCurve(clip, binding); + } + else if (binding.propertyName.StartsWith("localEulerAnglesRaw.y")) { + yCurve = AnimationUtility.GetEditorCurve(clip, binding); + } + else if (binding.propertyName.StartsWith("localEulerAnglesRaw.z")) { + zCurve = AnimationUtility.GetEditorCurve(clip, binding); + } + } + + float totalRotationX = ComputeTotalChange(xCurve); + float totalRotationY = ComputeTotalChange(yCurve); + float totalRotationZ = ComputeTotalChange(zCurve); + + return new Vector3(totalRotationX, totalRotationY, totalRotationZ); + } + + private static float ComputeTotalChange(AnimationCurve curve) { + if (curve == null || curve.keys.Length < 2) { + //Debug.LogWarning("Not enough keyframes to compute translation for this axis."); + return 0f; // Return 0 or handle appropriately + } + + float totalChange = 0f; + Keyframe[] keyframes = curve.keys; + + for (int i = 0; i < keyframes.Length - 1; i++) { + float delta = keyframes[i + 1].value - keyframes[i].value; + totalChange += delta; + } + + return totalChange; + } + + } +} \ No newline at end of file diff --git a/CreatureControl/Editor/Scripts/CreatureAnimator_Editor.cs.meta b/CreatureControl/Editor/Scripts/CreatureAnimator_Editor.cs.meta new file mode 100644 index 0000000..5f7b203 --- /dev/null +++ b/CreatureControl/Editor/Scripts/CreatureAnimator_Editor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dbefe8b30fcec3e90949aee1bb24b514 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/CreatureControl/Editor/Scripts/Creature_Editor.cs b/CreatureControl/Editor/Scripts/Creature_Editor.cs index 50151cf..c7e5eb1 100644 --- a/CreatureControl/Editor/Scripts/Creature_Editor.cs +++ b/CreatureControl/Editor/Scripts/Creature_Editor.cs @@ -1,5 +1,6 @@ using UnityEditor; using UnityEditor.SceneManagement; +using UnityEngine; namespace CreatureControl { @@ -18,6 +19,8 @@ namespace CreatureControl { /// public virtual void OnEnable() { this.creature = target as Creature; + if (creature.targetRig != null) + creature.animator = creature.targetRig.GetComponent(); // Keep track if anything changed while enabling the creature editor bool anythingChanged = false; diff --git a/CreatureControl/Runtime/Scripts/Creature.cs b/CreatureControl/Runtime/Scripts/Creature.cs index 019f022..feac06e 100644 --- a/CreatureControl/Runtime/Scripts/Creature.cs +++ b/CreatureControl/Runtime/Scripts/Creature.cs @@ -47,6 +47,9 @@ namespace CreatureControl { #region Init protected virtual void Awake() { + if (this.targetRig != null) + this.animator = this.targetRig.GetComponent(); + CheckColliders(); } @@ -132,13 +135,13 @@ namespace CreatureControl { // Without a target rig, the creature cannot move return; - UpdatePose(); + // UpdatePose(); - // copy animator root motion to the creature - this.transform.SetPositionAndRotation(targetRig.transform.position, targetRig.transform.rotation); - // As target rig is probably a child of this.transform, - // We need to restore the position/rotation of the targetsRig. - targetRig.transform.SetPositionAndRotation(this.transform.position, this.transform.rotation); + // // copy animator root motion to the creature + // this.transform.SetPositionAndRotation(targetRig.transform.position, targetRig.transform.rotation); + // // As target rig is probably a child of this.transform, + // // We need to restore the position/rotation of the targetsRig. + // targetRig.transform.SetPositionAndRotation(this.transform.position, this.transform.rotation); } // void OnAnimatorMove() { diff --git a/CreatureControl/Runtime/Scripts/CreatureAnimator.cs b/CreatureControl/Runtime/Scripts/CreatureAnimator.cs new file mode 100644 index 0000000..6085e73 --- /dev/null +++ b/CreatureControl/Runtime/Scripts/CreatureAnimator.cs @@ -0,0 +1,110 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEditor.Animations; + +namespace CreatureControl { + + public class CreatureAnimator : MonoBehaviour { + public Creature creature; + public RuntimeAnimatorController animatorController; + private Animator animator; + + public enum RootMotionMode { + Normal, + Inverse + }; + public RootMotionMode rootMotionMode = RootMotionMode.Normal; + + [System.Serializable] + public class RootMotion { + public string clipName; + public Vector3 linearVelocity; + public Vector3 angularVelocity; + + public readonly static RootMotion zero = new() { + linearVelocity = Vector3.zero, + angularVelocity = Vector3.zero + }; + } + //public Dictionary rootVelocities = new(); + public List rootVelocities = new(); + public RootMotion GetRootMotion(string name) { + return this.rootVelocities.Find(rm => rm.clipName == name); + } + + public Dictionary animationDirections = new(); + + + protected virtual void Awake() { + this.creature = GetComponent(); + this.animator = creature.animator; // GetComponent(); + + this.animator.applyRootMotion = this.rootMotionMode == RootMotionMode.Normal; + } + + protected virtual void Update() { + if (rootMotionMode == RootMotionMode.Inverse) { + Vector3 speed = new(0, 0, 0.024f); + this.transform.localPosition += speed * Time.deltaTime; //0.0048f * Time.deltaTime * this.transform.forward; + InverseRootMotionUpdate(); + } + else { + this.animator.SetFloat("Forward", 1f); + // Ensure that the pose of the model matches the target rig + this.creature.targetRig.transform.GetPositionAndRotation(out Vector3 targetRigPosition, out Quaternion targetRigOrientation); + this.creature.transform.SetPositionAndRotation(targetRigPosition, targetRigOrientation); + this.creature.targetRig.transform.SetPositionAndRotation(targetRigPosition, targetRigOrientation); + } + } + + private Vector3 lastPosition; + protected void InverseRootMotionUpdate() { + if (lastPosition.sqrMagnitude > 0) { + Vector3 translation = this.transform.position - lastPosition; + Vector3 worldVelocity = translation / Time.deltaTime; + Vector3 localVelocity = transform.InverseTransformDirection(worldVelocity); + + RootMotion rootMotion = this.GetRootMotion("AntWalkForward"); + Vector3 animationVelocity = rootMotion.linearVelocity; // rootVelocities["AntWalkForward"].linearVelocity; + + float fwdAnimationSpeed = localVelocity.z / animationVelocity.z; + this.animator.SetFloat("Forward", fwdAnimationSpeed); + } + lastPosition = this.transform.position; + } + + void RetrieveBlendTreeAnimations(Animator animator, string parameterName, float targetValue) { + AnimatorController ac = animator.runtimeAnimatorController as AnimatorController; + // Check if the Animator Controller is valid + if (ac == null) { + Debug.LogError("Animator Controller is not set correctly."); + return; + } + + // Iterate through each layer in the Animator Controller + foreach (AnimatorControllerLayer layer in ac.layers) { + // Access the state machine + foreach (ChildAnimatorState state in layer.stateMachine.states) { + // Check if the state contains a Blend Tree + if (state.state.motion is BlendTree blendTree) { + // Iterate through blend tree children + foreach (ChildMotion child in blendTree.children) { + if (child.directBlendParameter == parameterName) { + // Simulate parameter setting + //animator.SetFloat(parameterName, targetValue); + + // Get the animation clip information + if (child.motion is AnimationClip clip) { + Debug.Log($"Animation Clip: {clip.name}, Speed: {child.timeScale}"); + } + } + } + } + } + } + } + + + } + +} \ No newline at end of file diff --git a/CreatureControl/Runtime/Scripts/CreatureAnimator.cs.meta b/CreatureControl/Runtime/Scripts/CreatureAnimator.cs.meta new file mode 100644 index 0000000..b075cef --- /dev/null +++ b/CreatureControl/Runtime/Scripts/CreatureAnimator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d5fac3088e8f605ce9a8560b7d815904 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Resources/InsectTargetRig.prefab b/Runtime/Resources/InsectTargetRig.prefab index e2de42f..b6cbe68 100644 --- a/Runtime/Resources/InsectTargetRig.prefab +++ b/Runtime/Resources/InsectTargetRig.prefab @@ -143,7 +143,7 @@ MonoBehaviour: rightFrontLeg: {fileID: 5856460076900731150} rightMiddleLeg: {fileID: 4196034226083389076} rightBackLeg: {fileID: 8323677930838830493} - render: 0 + render: 1 legLength: 0.009770508 --- !u!95 &5843436816833865534 Animator: @@ -409,7 +409,7 @@ MeshRenderer: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1361514731818578437} - m_Enabled: 0 + m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 @@ -1094,7 +1094,7 @@ MeshRenderer: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5894983358397305477} - m_Enabled: 0 + m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 @@ -1400,7 +1400,7 @@ MeshRenderer: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7154771341835324246} - m_Enabled: 0 + m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 @@ -1505,7 +1505,7 @@ MeshRenderer: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7738229459793727928} - m_Enabled: 0 + m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 @@ -1610,7 +1610,7 @@ MeshRenderer: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8132734907093829157} - m_Enabled: 0 + m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 @@ -1779,7 +1779,7 @@ MeshRenderer: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8786064911351911589} - m_Enabled: 0 + m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 diff --git a/Runtime/Scripts/Ant.cs b/Runtime/Scripts/Ant.cs index 628967e..5e4008d 100644 --- a/Runtime/Scripts/Ant.cs +++ b/Runtime/Scripts/Ant.cs @@ -59,9 +59,6 @@ namespace CreatureControl { protected override void Awake() { base.Awake(); - if (this.targetRig != null) - this.animator = this.targetRig.GetComponent(); - this.nanoBrain = GetComponentInChildren(); } diff --git a/Samples/Animation/AntAnimator3.controller b/Samples/Animation/AntAnimator3.controller index 623e9db..6ea2b31 100644 --- a/Samples/Animation/AntAnimator3.controller +++ b/Samples/Animation/AntAnimator3.controller @@ -12,7 +12,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: ab82ff68e62ea3b1c8e6523f8d46c142, type: 2} m_Threshold: -1 m_Position: {x: 0, y: 1} - m_TimeScale: 5 + m_TimeScale: 1 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -28,7 +28,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: 91229db5e929c379bbfd5bf417848488, type: 2} m_Threshold: 1 m_Position: {x: 1, y: 0} - m_TimeScale: 5 + m_TimeScale: 1 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -59,7 +59,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: b8a731a1533b8c960b3f3688d4922a24, type: 2} m_Threshold: 0.25 m_Position: {x: 0, y: 1} - m_TimeScale: 5 + m_TimeScale: 1 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -67,7 +67,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: 240c3a3c6c28272059bf7b591ff818b1, type: 2} m_Threshold: 0.5 m_Position: {x: -1, y: 0} - m_TimeScale: 5 + m_TimeScale: 1 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -75,7 +75,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: 501d5503172629df192bb4ad015fb4f7, type: 2} m_Threshold: 0.75 m_Position: {x: 1, y: 0} - m_TimeScale: 5 + m_TimeScale: 1 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -83,7 +83,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: b8a731a1533b8c960b3f3688d4922a24, type: 2} m_Threshold: 1 m_Position: {x: 0, y: -1} - m_TimeScale: -5 + m_TimeScale: -1 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -93,7 +93,7 @@ BlendTree: m_MaxThreshold: 1 m_UseAutomaticThresholds: 1 m_NormalizedBlendValues: 0 - m_BlendType: 2 + m_BlendType: 1 --- !u!206 &-844531329161772208 BlendTree: m_ObjectHideFlags: 1 diff --git a/Samples/Animation/AntRotateLeft.anim b/Samples/Animation/AntRotateLeft.anim index 675cb1c..b3475f5 100644 --- a/Samples/Animation/AntRotateLeft.anim +++ b/Samples/Animation/AntRotateLeft.anim @@ -139,32 +139,14 @@ AnimationClip: inWeight: {x: 0, y: 0.33333334, z: 0.33333334} outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.083333336 + time: 0.16666667 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: -0, z: 0} + outSlope: {x: 0, y: 0.012, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0, y: 0.33333334, z: 0.33333334} outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.16666667 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.25 - value: {x: 0, y: 0.0015, z: 0} - inSlope: {x: 0, y: 0.012, z: 0} - outSlope: {x: 0, y: 0.012, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.33333334 value: {x: 0, y: 0.002, z: 0} @@ -174,28 +156,10 @@ AnimationClip: weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 - value: {x: 0, y: 0.0015, z: 0} - inSlope: {x: 0, y: -0.012000001, z: 0} - outSlope: {x: 0, y: -0.012000001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.5 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.5833333 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: -0.012000001, z: 0} outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 weightedMode: 0 @@ -218,63 +182,18 @@ AnimationClip: inWeight: {x: 0, y: 0.33333334, z: 0.33333334} outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.083333336 - value: {x: 0, y: 0.0015, z: 0} + time: 0.16666667 + value: {x: 0, y: 0, z: 0} inSlope: {x: 0, y: -0.012, z: 0} - outSlope: {x: 0, y: -0.012, z: 0} + outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0, y: 0.33333334, z: 0.33333334} outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.16666667 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.25 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.33333334 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 time: 0.5 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.5833333 - value: {x: 0, y: 0.0015, z: 0} - inSlope: {x: 0, y: 0.011999999, z: 0} + inSlope: {x: 0, y: -0, z: 0} outSlope: {x: 0, y: 0.011999999, z: 0} tangentMode: 0 weightedMode: 0 @@ -584,30 +503,12 @@ AnimationClip: weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.083333336 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - serializedVersion: 3 time: 0.16666667 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.25 - value: 0.0015 - inSlope: 0.012 + inSlope: -0 outSlope: 0.012 - tangentMode: 136 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -620,30 +521,12 @@ AnimationClip: weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 0.0015 - inSlope: -0.012000001 - outSlope: -0.012000001 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - serializedVersion: 3 time: 0.5 value: 0 - inSlope: 0 + inSlope: -0.012000001 outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5833333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -710,66 +593,21 @@ AnimationClip: weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.083333336 - value: 0.0015 - inSlope: -0.012 - outSlope: -0.012 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - serializedVersion: 3 time: 0.16666667 value: 0 - inSlope: 0 + inSlope: -0.012 outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.25 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.33333334 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 time: 0.5 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5833333 - value: 0.0015 - inSlope: 0.011999999 + inSlope: -0 outSlope: 0.011999999 - tangentMode: 136 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 diff --git a/Samples/Animation/AntRotateRight.anim b/Samples/Animation/AntRotateRight.anim index ccd6300..43b88f1 100644 --- a/Samples/Animation/AntRotateRight.anim +++ b/Samples/Animation/AntRotateRight.anim @@ -20,35 +20,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: -67.5, z: 0} - outSlope: {x: 0, y: -67.5, z: 0} + inSlope: {x: 0, y: -168.74998, z: 0} + outSlope: {x: 0, y: -168.74998, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0, y: 0.33333334, z: 0.33333334} outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.16666667 + time: 0.06666667 value: {x: 0, y: -11.25, z: 0} - inSlope: {x: 0, y: 0.0000038146973, z: 0} - outSlope: {x: 0, y: 0.0000038146973, z: 0} + inSlope: {x: 0, y: 0.000015258789, z: 0} + outSlope: {x: 0, y: 0.000015258789, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0, y: 0.33333334, z: 0.33333334} outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.5 + time: 0.2 value: {x: 0, y: 11.25, z: 0} - inSlope: {x: 0, y: 0.0000076293945, z: 0} - outSlope: {x: 0, y: 0.0000076293945, z: 0} + inSlope: {x: 0, y: 0.000022888184, z: 0} + outSlope: {x: 0, y: 0.000022888184, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.6666667 + time: 0.26666668 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: -67.49999, z: 0} - outSlope: {x: 0, y: -67.49999, z: 0} + inSlope: {x: 0, y: -168.74997, z: 0} + outSlope: {x: 0, y: -168.74997, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -63,35 +63,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 67.5, z: 0} - outSlope: {x: 0, y: 67.5, z: 0} + inSlope: {x: 0, y: 168.74998, z: 0} + outSlope: {x: 0, y: 168.74998, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0, y: 0.33333334, z: 0.33333334} outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.16666667 + time: 0.06666667 value: {x: 0, y: 11.25, z: 0} - inSlope: {x: 0, y: -0.0000038146973, z: 0} - outSlope: {x: 0, y: -0.0000038146973, z: 0} + inSlope: {x: 0, y: -0.000015258789, z: 0} + outSlope: {x: 0, y: -0.000015258789, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0, y: 0.33333334, z: 0.33333334} outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.5 + time: 0.2 value: {x: 0, y: -11.25, z: 0} - inSlope: {x: 0, y: -0.0000076293945, z: 0} - outSlope: {x: 0, y: -0.0000076293945, z: 0} + inSlope: {x: 0, y: -0.000022888184, z: 0} + outSlope: {x: 0, y: -0.000022888184, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.6666667 + time: 0.26666668 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 67.49999, z: 0} - outSlope: {x: 0, y: 67.49999, z: 0} + inSlope: {x: 0, y: 168.74997, z: 0} + outSlope: {x: 0, y: 168.74997, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -106,17 +106,17 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 67.5, z: 0} - outSlope: {x: 0, y: 67.5, z: 0} + inSlope: {x: 0, y: 168.74998, z: 0} + outSlope: {x: 0, y: 168.74998, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.6666667 + time: 0.26666668 value: {x: 0, y: 45, z: 0} - inSlope: {x: 0, y: 67.5, z: 0} - outSlope: {x: 0, y: 67.5, z: 0} + inSlope: {x: 0, y: 168.74998, z: 0} + outSlope: {x: 0, y: 168.74998, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -139,34 +139,16 @@ AnimationClip: inWeight: {x: 0, y: 0.33333334, z: 0.33333334} outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: -0, z: 0} + outSlope: {x: 0, y: 0.03, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0, y: 0.33333334, z: 0.33333334} outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.16666667 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.25 - value: {x: 0, y: 0.0015, z: 0} - inSlope: {x: 0, y: 0.012, z: 0} - outSlope: {x: 0, y: 0.012, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.33333334 + time: 0.13333334 value: {x: 0, y: 0.002, z: 0} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} @@ -175,27 +157,9 @@ AnimationClip: inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.41666666 - value: {x: 0, y: 0.0015, z: 0} - inSlope: {x: 0, y: -0.012000001, z: 0} - outSlope: {x: 0, y: -0.012000001, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.5 + time: 0.2 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.5833333 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: -0.030000003, z: 0} outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 weightedMode: 0 @@ -218,70 +182,25 @@ AnimationClip: inWeight: {x: 0, y: 0.33333334, z: 0.33333334} outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.083333336 - value: {x: 0, y: 0.0015, z: 0} - inSlope: {x: 0, y: -0.012, z: 0} - outSlope: {x: 0, y: -0.012, z: 0} + time: 0.06666667 + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: -0.03, z: 0} + outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0, y: 0.33333334, z: 0.33333334} outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.16666667 + time: 0.2 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: -0, z: 0} + outSlope: {x: 0, y: 0.029999996, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.25 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.33333334 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.5 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.5833333 - value: {x: 0, y: 0.0015, z: 0} - inSlope: {x: 0, y: 0.011999999, z: 0} - outSlope: {x: 0, y: 0.011999999, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.6666667 + time: 0.26666668 value: {x: 0, y: 0.002, z: 0} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} @@ -296,7 +215,7 @@ AnimationClip: m_ScaleCurves: [] m_FloatCurves: [] m_PPtrCurves: [] - m_SampleRate: 60 + m_SampleRate: 30 m_WrapMode: 0 m_Bounds: m_Center: {x: 0, y: 0, z: 0} @@ -354,7 +273,7 @@ AnimationClip: m_AdditiveReferencePoseClip: {fileID: 0} m_AdditiveReferencePoseTime: 0 m_StartTime: 0 - m_StopTime: 0.6666667 + m_StopTime: 0.26666668 m_OrientationOffsetY: 0 m_Level: 0 m_CycleOffset: 0 @@ -398,35 +317,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: -67.5 - outSlope: -67.5 + inSlope: -168.74998 + outSlope: -168.74998 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.16666667 + time: 0.06666667 value: -11.25 - inSlope: 0.0000038146973 - outSlope: 0.0000038146973 + inSlope: 0.000015258789 + outSlope: 0.000015258789 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.5 + time: 0.2 value: 11.25 - inSlope: 0.0000076293945 - outSlope: 0.0000076293945 + inSlope: 0.000022888184 + outSlope: 0.000022888184 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.6666667 + time: 0.26666668 value: 0 - inSlope: -67.49999 - outSlope: -67.49999 + inSlope: -168.74997 + outSlope: -168.74997 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 @@ -488,35 +407,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 67.5 - outSlope: 67.5 + inSlope: 168.74998 + outSlope: 168.74998 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.16666667 + time: 0.06666667 value: 11.25 - inSlope: -0.0000038146973 - outSlope: -0.0000038146973 + inSlope: -0.000015258789 + outSlope: -0.000015258789 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.5 + time: 0.2 value: -11.25 - inSlope: -0.0000076293945 - outSlope: -0.0000076293945 + inSlope: -0.000022888184 + outSlope: -0.000022888184 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.6666667 + time: 0.26666668 value: 0 - inSlope: 67.49999 - outSlope: 67.49999 + inSlope: 168.74997 + outSlope: 168.74997 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 @@ -585,34 +504,16 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: -0 + outSlope: 0.03 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.16666667 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.25 - value: 0.0015 - inSlope: 0.012 - outSlope: 0.012 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.33333334 + time: 0.13333334 value: 0.002 inSlope: 0 outSlope: 0 @@ -621,29 +522,11 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.41666666 - value: 0.0015 - inSlope: -0.012000001 - outSlope: -0.012000001 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5 + time: 0.2 value: 0 - inSlope: 0 + inSlope: -0.030000003 outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5833333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -711,70 +594,25 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.083333336 - value: 0.0015 - inSlope: -0.012 - outSlope: -0.012 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.16666667 + time: 0.06666667 value: 0 - inSlope: 0 + inSlope: -0.03 outSlope: 0 - tangentMode: 136 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.25 + time: 0.2 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: -0 + outSlope: 0.029999996 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.5833333 - value: 0.0015 - inSlope: 0.011999999 - outSlope: 0.011999999 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.6666667 + time: 0.26666668 value: 0.002 inSlope: 0 outSlope: 0 @@ -825,7 +663,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.6666667 + time: 0.26666668 value: 0 inSlope: 0 outSlope: 0 @@ -848,17 +686,17 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 67.5 - outSlope: 67.5 + inSlope: 168.74998 + outSlope: 168.74998 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.6666667 + time: 0.26666668 value: 45 - inSlope: 67.5 - outSlope: 67.5 + inSlope: 168.74998 + outSlope: 168.74998 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 @@ -937,7 +775,7 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_LocalEulerAngles.z - path: Body/RightFeetTarget + path: classID: 4 script: {fileID: 0} flags: 0 @@ -949,19 +787,7 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_LocalEulerAngles.y - path: Body/RightFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalEulerAngles.x - path: Body/RightFeetTarget + path: classID: 4 script: {fileID: 0} flags: 0 @@ -977,6 +803,18 @@ AnimationClip: classID: 4 script: {fileID: 0} flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.x + path: Body/RightFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 - serializedVersion: 2 curve: serializedVersion: 2 @@ -985,7 +823,7 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_LocalEulerAngles.y - path: + path: Body/RightFeetTarget classID: 4 script: {fileID: 0} flags: 0 @@ -997,7 +835,7 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_LocalEulerAngles.z - path: + path: Body/RightFeetTarget classID: 4 script: {fileID: 0} flags: 0 diff --git a/Samples/Animation/AntWalkForward.anim b/Samples/Animation/AntWalkForward.anim index 0ef3519..f2202c1 100644 --- a/Samples/Animation/AntWalkForward.anim +++ b/Samples/Animation/AntWalkForward.anim @@ -21,44 +21,44 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: -0.0048} - outSlope: {x: 0, y: 0, z: -0.0048} + inSlope: {x: 0, y: 0, z: -0.024} + outSlope: {x: 0, y: 0, z: -0.024} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.41666666 + time: 0.083333336 value: {x: 0, y: 0, z: -0.002} - inSlope: {x: 0, y: -0, z: -0.0048} - outSlope: {x: 0, y: 0.0048, z: 0.0048} + inSlope: {x: 0, y: -0, z: -0.024} + outSlope: {x: 0, y: 0.024, z: 0.024000002} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.8333333 - value: {x: 0, y: 0.002, z: -2.3283064e-10} - inSlope: {x: 0, y: 0, z: 0.0047999993} - outSlope: {x: 0, y: 0, z: 0.0047999993} + time: 0.16666667 + value: {x: 0, y: 0.002, z: 3.4924597e-10} + inSlope: {x: 0, y: -9.313226e-10, z: 0.024000008} + outSlope: {x: 0, y: -9.313226e-10, z: 0.024000008} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 1.25 + time: 0.25 value: {x: 0, y: 0, z: 0.002} - inSlope: {x: 0, y: 0, z: 0.0048} - outSlope: {x: 0, y: 0, z: -0.0048000007} + inSlope: {x: 0, y: 0, z: 0.024000002} + outSlope: {x: 0, y: 0, z: -0.023999998} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 1.6666666 + time: 0.33333334 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: -0.0048000007} - outSlope: {x: 0, y: 0, z: -0.0048000007} + inSlope: {x: 0, y: 0, z: -0.023999998} + outSlope: {x: 0, y: 0, z: -0.023999998} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -73,35 +73,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0.002, z: 0} - inSlope: {x: 0, y: 0, z: 0.0048} - outSlope: {x: 0, y: 0, z: 0.0048} + inSlope: {x: 0, y: 0, z: 0.024} + outSlope: {x: 0, y: 0, z: 0.024} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.41666666 + time: 0.083333336 value: {x: 0, y: 0, z: 0.002} - inSlope: {x: 0, y: -0.0048, z: 0.0048} - outSlope: {x: 0, y: 0, z: -0.0048} + inSlope: {x: 0, y: -0.024, z: 0.024} + outSlope: {x: 0, y: 0, z: -0.024000002} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 1.25 + time: 0.25 value: {x: 0, y: 0, z: -0.002} - inSlope: {x: 0, y: -0, z: -0.0048} - outSlope: {x: 0, y: 0.0048000007, z: 0.0048000007} + inSlope: {x: 0, y: -0, z: -0.024000002} + outSlope: {x: 0, y: 0.023999998, z: 0.023999998} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 1.6666666 + time: 0.33333334 value: {x: 0, y: 0.002, z: 0} - inSlope: {x: 0, y: 0, z: 0.0048000007} - outSlope: {x: 0, y: 0, z: 0.0048000007} + inSlope: {x: 0, y: 0, z: 0.023999998} + outSlope: {x: 0, y: 0, z: 0.023999998} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -116,17 +116,17 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0.0048} - outSlope: {x: 0, y: 0, z: 0.0048} + inSlope: {x: 0, y: 0, z: 0.024} + outSlope: {x: 0, y: 0, z: 0.024} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 1.6666666 + time: 0.33333334 value: {x: 0, y: 0, z: 0.008} - inSlope: {x: 0, y: 0, z: 0.0048} - outSlope: {x: 0, y: 0, z: 0.0048} + inSlope: {x: 0, y: 0, z: 0.024} + outSlope: {x: 0, y: 0, z: 0.024} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -178,7 +178,7 @@ AnimationClip: m_AdditiveReferencePoseClip: {fileID: 0} m_AdditiveReferencePoseTime: 0 m_StartTime: 0 - m_StopTime: 1.6666666 + m_StopTime: 0.33333334 m_OrientationOffsetY: 0 m_Level: 0 m_CycleOffset: 0 @@ -208,25 +208,25 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.41666666 + time: 0.083333336 value: 0 inSlope: -0 - outSlope: 0.0048 + outSlope: 0.024 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.8333333 + time: 0.16666667 value: 0.002 - inSlope: 0 - outSlope: 0 + inSlope: -9.313226e-10 + outSlope: -9.313226e-10 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.25 + time: 0.25 value: 0 inSlope: 0 outSlope: 0 @@ -235,7 +235,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6666666 + time: 0.33333334 value: 0 inSlope: 0 outSlope: 0 @@ -258,35 +258,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: -0.0048 - outSlope: -0.0048 + inSlope: -0.024 + outSlope: -0.024 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.41666666 + time: 0.083333336 value: -0.002 - inSlope: -0.0048 - outSlope: 0.0048 + inSlope: -0.024 + outSlope: 0.024000002 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.25 + time: 0.25 value: 0.002 - inSlope: 0.0048 - outSlope: -0.0048000007 + inSlope: 0.024000002 + outSlope: -0.023999998 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6666666 + time: 0.33333334 value: 0 - inSlope: -0.0048000007 - outSlope: -0.0048000007 + inSlope: -0.023999998 + outSlope: -0.023999998 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 @@ -313,25 +313,25 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.41666666 + time: 0.083333336 value: 0 - inSlope: -0.0048 + inSlope: -0.024 outSlope: 0 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.25 + time: 0.25 value: 0 inSlope: -0 - outSlope: 0.0048000007 + outSlope: 0.023999998 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6666666 + time: 0.33333334 value: 0.002 inSlope: 0 outSlope: 0 @@ -354,35 +354,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0.0048 - outSlope: 0.0048 + inSlope: 0.024 + outSlope: 0.024 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.41666666 + time: 0.083333336 value: 0.002 - inSlope: 0.0048 - outSlope: -0.0048 + inSlope: 0.024 + outSlope: -0.024000002 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.25 + time: 0.25 value: -0.002 - inSlope: -0.0048 - outSlope: 0.0048000007 + inSlope: -0.024000002 + outSlope: 0.023999998 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6666666 + time: 0.33333334 value: 0 - inSlope: 0.0048000007 - outSlope: 0.0048000007 + inSlope: 0.023999998 + outSlope: 0.023999998 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 @@ -402,17 +402,17 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0.0048 - outSlope: 0.0048 + inSlope: 0.024 + outSlope: 0.024 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6666666 + time: 0.33333334 value: 0.008 - inSlope: 0.0048 - outSlope: 0.0048 + inSlope: 0.024 + outSlope: 0.024 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 diff --git a/Samples/Animation/AntWalkLeft.anim b/Samples/Animation/AntWalkLeft.anim index 128ec6c..ee03b1a 100644 --- a/Samples/Animation/AntWalkLeft.anim +++ b/Samples/Animation/AntWalkLeft.anim @@ -21,80 +21,44 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0.024, y: 0, z: 0} + outSlope: {x: 0.024, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.20833333 - value: {x: 0.001, y: 0, z: 0} - inSlope: {x: 0.0048, y: 0, z: 0} - outSlope: {x: 0.0048, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 + time: 0.083333336 value: {x: 0.002, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0.024, y: -0, z: 0} + outSlope: {x: -0.024000002, y: 0.024, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.625 - value: {x: 0.001, y: 0.0015, z: 0} - inSlope: {x: -0.0048, y: 0.0048, z: 0} - outSlope: {x: -0.0048, y: 0.0048, z: 0} + time: 0.16666667 + value: {x: -3.4924597e-10, y: 0.002, z: 0} + inSlope: {x: -0.024000008, y: 0, z: 0} + outSlope: {x: -0.024000008, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.8333333 - value: {x: 0, y: 0.002, z: 0} - inSlope: {x: -0.0048000007, y: 0, z: 0} - outSlope: {x: -0.0048000007, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.0416666 - value: {x: -0.001, y: 0.0015, z: 0} - inSlope: {x: -0.0048, y: -0.0048, z: 0} - outSlope: {x: -0.0048, y: -0.0048, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.25 + time: 0.25 value: {x: -0.002, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: -0.024000002, y: -0.024000002, z: 0} + outSlope: {x: 0.023999998, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 1.4583334 - value: {x: -0.001, y: 0, z: 0} - inSlope: {x: 0.0048000007, y: 0, z: 0} - outSlope: {x: 0.0048000007, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.6666666 + time: 0.33333334 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0.023999998, y: 0, z: 0} + outSlope: {x: 0.023999998, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -109,80 +73,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0.002, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: -0.024, y: 0, z: 0} + outSlope: {x: -0.024, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.20833333 - value: {x: -0.001, y: 0.0015, z: 0} - inSlope: {x: -0.0048, y: -0.0048, z: 0} - outSlope: {x: -0.0048, y: -0.0048, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 + time: 0.083333336 value: {x: -0.002, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: -0.024, y: -0.024, z: 0} + outSlope: {x: 0.024000002, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.625 - value: {x: -0.001, y: 0, z: 0} - inSlope: {x: 0.0048, y: 0, z: 0} - outSlope: {x: 0.0048, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.8333333 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0.0048000007, y: 0, z: 0} - outSlope: {x: 0.0048000007, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.0416666 - value: {x: 0.001, y: 0, z: 0} - inSlope: {x: 0.0048, y: 0, z: 0} - outSlope: {x: 0.0048, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.25 + time: 0.25 value: {x: 0.002, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0.024000002, y: -0, z: 0} + outSlope: {x: -0.023999998, y: 0.023999998, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 1.4583334 - value: {x: 0.001, y: 0.0015, z: 0} - inSlope: {x: -0.0048000007, y: 0.0048000007, z: 0} - outSlope: {x: -0.0048000007, y: 0.0048000007, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.6666666 + time: 0.33333334 value: {x: 0, y: 0.002, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: -0.023999998, y: 0, z: 0} + outSlope: {x: -0.023999998, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -197,17 +116,17 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: -0.0048, y: 0, z: 0} - outSlope: {x: -0.0048, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 1.6666666 - value: {x: -0.008, y: 0, z: 0} - inSlope: {x: -0.0048, y: 0, z: 0} - outSlope: {x: -0.0048, y: 0, z: 0} + time: 0.33333334 + value: {x: -0.008000012, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -259,7 +178,7 @@ AnimationClip: m_AdditiveReferencePoseClip: {fileID: 0} m_AdditiveReferencePoseTime: 0 m_StartTime: 0 - m_StopTime: 1.6666666 + m_StopTime: 0.33333334 m_OrientationOffsetY: 0 m_Level: 0 m_CycleOffset: 0 @@ -282,81 +201,36 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: 0.024 + outSlope: 0.024 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.20833333 - value: 0.001 - inSlope: 0.0048 - outSlope: 0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 + time: 0.083333336 value: 0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: 0.024 + outSlope: -0.024000002 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.625 - value: 0.001 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0 - inSlope: -0.0048000007 - outSlope: -0.0048000007 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: -0.001 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.25 + time: 0.25 value: -0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: -0.024000002 + outSlope: 0.023999998 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.4583334 - value: -0.001 - inSlope: 0.0048000007 - outSlope: 0.0048000007 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 + time: 0.33333334 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: 0.023999998 + outSlope: 0.023999998 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -377,39 +251,21 @@ AnimationClip: value: 0 inSlope: 0 outSlope: 0 - tangentMode: 136 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.20833333 + time: 0.083333336 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: -0 + outSlope: 0.024 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.41666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: 0.0015 - inSlope: 0.0048 - outSlope: 0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 + time: 0.16666667 value: 0.002 inSlope: 0 outSlope: 0 @@ -418,38 +274,20 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.0416666 - value: 0.0015 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 136 + time: 0.25 + value: 0 + inSlope: -0.024000002 + outSlope: 0 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.25 + time: 0.33333334 value: 0 inSlope: 0 outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -461,99 +299,6 @@ AnimationClip: classID: 4 script: {fileID: 0} flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.20833333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.25 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.z - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - serializedVersion: 2 curve: serializedVersion: 2 @@ -568,70 +313,25 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.20833333 - value: 0.0015 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 + time: 0.083333336 value: 0 - inSlope: 0 + inSlope: -0.024 outSlope: 0 - tangentMode: 136 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.625 + time: 0.25 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: -0 + outSlope: 0.023999998 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.8333333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.25 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 - value: 0.0015 - inSlope: 0.0048000007 - outSlope: 0.0048000007 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 + time: 0.33333334 value: 0.002 inSlope: 0 outSlope: 0 @@ -654,264 +354,36 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.20833333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.25 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.z - path: Body/RightFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 + inSlope: -0.024 + outSlope: -0.024 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 34 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.z - path: - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 34 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 - value: -0.008 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 34 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.x - path: - classID: 4 - script: {fileID: 0} - flags: 8 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.y - path: - classID: 4 - script: {fileID: 0} - flags: 8 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.20833333 - value: -0.001 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 + time: 0.083333336 value: -0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: -0.024 + outSlope: 0.024000002 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.625 - value: -0.001 - inSlope: 0.0048 - outSlope: 0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0 - inSlope: 0.0048000007 - outSlope: 0.0048000007 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: 0.001 - inSlope: 0.0048 - outSlope: 0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.25 + time: 0.25 value: 0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: 0.024000002 + outSlope: -0.023999998 + tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.4583334 - value: 0.001 - inSlope: -0.0048000007 - outSlope: -0.0048000007 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 + time: 0.33333334 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: -0.023999998 + outSlope: -0.023999998 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -923,6 +395,36 @@ AnimationClip: classID: 4 script: {fileID: 0} flags: 8 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33333334 + value: -0.008000012 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.x + path: + classID: 4 + script: {fileID: 0} + flags: 0 m_EulerEditorCurves: [] m_HasGenericRootTransform: 1 m_HasMotionFloatCurves: 0 diff --git a/Samples/Animation/AntWalkRight.anim b/Samples/Animation/AntWalkRight.anim index e16c3ef..a6fc699 100644 --- a/Samples/Animation/AntWalkRight.anim +++ b/Samples/Animation/AntWalkRight.anim @@ -15,31 +15,6 @@ AnimationClip: m_CompressedRotationCurves: [] m_EulerCurves: [] m_PositionCurves: - - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0.0048, y: 0, z: 0} - outSlope: {x: 0.0048, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.6666666 - value: {x: 0.008, y: 0, z: 0} - inSlope: {x: 0.0048, y: 0, z: 0} - outSlope: {x: 0.0048, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - path: - curve: serializedVersion: 2 m_Curve: @@ -47,78 +22,42 @@ AnimationClip: time: 0 value: {x: 0, y: 0, z: 0} inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + outSlope: {x: -0.024, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.20833333 - value: {x: -0.001, y: 0, z: 0} - inSlope: {x: -0.0048, y: 0, z: 0} - outSlope: {x: -0.0048, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 + time: 0.083333336 value: {x: -0.002, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: -0.024, y: -0, z: 0} + outSlope: {x: 0.024000002, y: 0.024, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.625 - value: {x: -0.001, y: 0.0015, z: 0} - inSlope: {x: 0.0048, y: 0.0048, z: 0} - outSlope: {x: 0.0048, y: 0.0048, z: 0} + time: 0.16666667 + value: {x: 3.4924597e-10, y: 0.002, z: 0} + inSlope: {x: 0.024000008, y: -9.313226e-10, z: 0} + outSlope: {x: 0.024000008, y: -9.313226e-10, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.8333333 - value: {x: 0, y: 0.002, z: 0} - inSlope: {x: 0.0048000007, y: 0, z: 0} - outSlope: {x: 0.0048000007, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.0416666 - value: {x: 0.001, y: 0.0015, z: 0} - inSlope: {x: 0.0048, y: -0.0048, z: 0} - outSlope: {x: 0.0048, y: -0.0048, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.25 + time: 0.25 value: {x: 0.002, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0.024000002, y: -0.024000002, z: 0} + outSlope: {x: -0.023999998, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 1.4583334 - value: {x: 0.001, y: 0, z: 0} - inSlope: {x: -0.0048000007, y: 0, z: 0} - outSlope: {x: -0.0048000007, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.6666666 + time: 0.33333334 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} + inSlope: {x: -0.023999998, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 weightedMode: 0 @@ -135,78 +74,33 @@ AnimationClip: time: 0 value: {x: 0, y: 0.002, z: 0} inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0.024, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.20833333 - value: {x: 0.001, y: 0.0015, z: 0} - inSlope: {x: 0.0048, y: -0.0048, z: 0} - outSlope: {x: 0.0048, y: -0.0048, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 + time: 0.083333336 value: {x: 0.002, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0.024, y: -0.024, z: 0} + outSlope: {x: -0.024000002, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.625 - value: {x: 0.001, y: 0, z: 0} - inSlope: {x: -0.0048, y: 0, z: 0} - outSlope: {x: -0.0048, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.8333333 - value: {x: 0, y: 0, z: 0} - inSlope: {x: -0.0048000007, y: 0, z: 0} - outSlope: {x: -0.0048000007, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.0416666 - value: {x: -0.001, y: 0, z: 0} - inSlope: {x: -0.0048, y: 0, z: 0} - outSlope: {x: -0.0048, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.25 + time: 0.25 value: {x: -0.002, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: -0.024000002, y: -0, z: 0} + outSlope: {x: 0.023999998, y: 0.023999998, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 1.4583334 - value: {x: -0.001, y: 0.0015, z: 0} - inSlope: {x: 0.0048000007, y: 0.0048000007, z: 0} - outSlope: {x: 0.0048000007, y: 0.0048000007, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1.6666666 + time: 0.33333334 value: {x: 0, y: 0.002, z: 0} - inSlope: {x: 0, y: 0, z: 0} + inSlope: {x: 0.023999998, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 weightedMode: 0 @@ -216,6 +110,31 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 path: Body/RightFeetTarget + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0.024000023, y: 0, z: 0} + outSlope: {x: 0.024000023, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.33333334 + value: {x: 0.008000008, y: 0, z: 0} + inSlope: {x: 0.024000023, y: 0, z: 0} + outSlope: {x: 0.024000023, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: m_ScaleCurves: [] m_FloatCurves: [] m_PPtrCurves: [] @@ -226,15 +145,6 @@ AnimationClip: m_Extent: {x: 0, y: 0, z: 0} m_ClipBindingConstant: genericBindings: - - serializedVersion: 2 - path: 0 - attribute: 1 - script: {fileID: 0} - typeID: 4 - customType: 0 - isPPtrCurve: 0 - isIntCurve: 0 - isSerializeReferenceCurve: 0 - serializedVersion: 2 path: 683997697 attribute: 1 @@ -253,13 +163,22 @@ AnimationClip: isPPtrCurve: 0 isIntCurve: 0 isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 0 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 pptrCurveMapping: [] m_AnimationClipSettings: serializedVersion: 2 m_AdditiveReferencePoseClip: {fileID: 0} m_AdditiveReferencePoseTime: 0 m_StartTime: 0 - m_StopTime: 1.6666666 + m_StopTime: 0.33333334 m_OrientationOffsetY: 0 m_Level: 0 m_CycleOffset: 0 @@ -282,17 +201,218 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0.0048 - outSlope: 0.0048 + inSlope: 0 + outSlope: -0.024 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.083333336 + value: -0.002 + inSlope: -0.024 + outSlope: 0.024000002 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25 + value: 0.002 + inSlope: 0.024000002 + outSlope: -0.023999998 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33333334 + value: 0 + inSlope: -0.023999998 + outSlope: 0 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.x + path: Body/LeftFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.083333336 + value: 0 + inSlope: -0 + outSlope: 0.024 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16666667 + value: 0.002 + inSlope: -9.313226e-10 + outSlope: -9.313226e-10 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6666666 - value: 0.008 - inSlope: 0.0048 - outSlope: 0.0048 + time: 0.25 + value: 0 + inSlope: -0.024000002 + outSlope: 0 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33333334 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: Body/LeftFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0.024 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.083333336 + value: 0.002 + inSlope: 0.024 + outSlope: -0.024000002 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25 + value: -0.002 + inSlope: -0.024000002 + outSlope: 0.023999998 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33333334 + value: 0 + inSlope: 0.023999998 + outSlope: 0 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.x + path: Body/RightFeetTarget + classID: 4 + script: {fileID: 0} + flags: 8 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.083333336 + value: 0 + inSlope: -0.024 + outSlope: 0 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25 + value: 0 + inSlope: -0 + outSlope: 0.023999998 + tangentMode: 69 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33333334 + value: 0.002 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: Body/RightFeetTarget + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0.024000023 + outSlope: 0.024000023 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33333334 + value: 0.008000008 + inSlope: 0.024000023 + outSlope: 0.024000023 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 @@ -304,624 +424,6 @@ AnimationClip: path: classID: 4 script: {fileID: 0} - flags: 8 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.y - path: - classID: 4 - script: {fileID: 0} - flags: 8 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.z - path: - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.20833333 - value: -0.001 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: -0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: -0.001 - inSlope: 0.0048 - outSlope: 0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0 - inSlope: 0.0048000007 - outSlope: 0.0048000007 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: 0.001 - inSlope: 0.0048 - outSlope: 0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.25 - value: 0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 - value: 0.001 - inSlope: -0.0048000007 - outSlope: -0.0048000007 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.x - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.20833333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: 0.0015 - inSlope: 0.0048 - outSlope: 0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: 0.0015 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.25 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.y - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.20833333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.25 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.z - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.20833333 - value: 0.001 - inSlope: 0.0048 - outSlope: 0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: 0.001 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0 - inSlope: -0.0048000007 - outSlope: -0.0048000007 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: -0.001 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.25 - value: -0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 - value: -0.001 - inSlope: 0.0048000007 - outSlope: 0.0048000007 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.x - path: Body/RightFeetTarget - classID: 4 - script: {fileID: 0} - flags: 8 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.20833333 - value: 0.0015 - inSlope: -0.0048 - outSlope: -0.0048 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.25 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 - value: 0.0015 - inSlope: 0.0048000007 - outSlope: 0.0048000007 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 - value: 0.002 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.y - path: Body/RightFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.20833333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.625 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.0416666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.25 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.4583334 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.6666666 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.z - path: Body/RightFeetTarget - classID: 4 - script: {fileID: 0} flags: 0 m_EulerEditorCurves: [] m_HasGenericRootTransform: 1 From 7c1061ade5d929f9fd273500b2110e218d09ae4d Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Mon, 13 Apr 2026 16:39:32 +0200 Subject: [PATCH 20/38] Fixed issues with inverse root motion --- .../Editor/Scripts/CreatureAnimator_Editor.cs | 16 +- .../Runtime/Scripts/CreatureAnimator.cs | 56 ++- Samples/Animation/AntAnimator3.controller | 8 +- Samples/Animation/AntIdle.anim | 28 +- Samples/Animation/AntRotateLeft.anim | 406 +++++------------- Samples/Animation/AntRotateRight.anim | 2 +- Samples/Animation/AntWalkForward.anim | 142 +++--- Samples/Animation/AntWalkLeft.anim | 144 +++---- Samples/Animation/AntWalkRight.anim | 130 +++--- 9 files changed, 378 insertions(+), 554 deletions(-) diff --git a/CreatureControl/Editor/Scripts/CreatureAnimator_Editor.cs b/CreatureControl/Editor/Scripts/CreatureAnimator_Editor.cs index b7177d8..adaff4e 100644 --- a/CreatureControl/Editor/Scripts/CreatureAnimator_Editor.cs +++ b/CreatureControl/Editor/Scripts/CreatureAnimator_Editor.cs @@ -20,21 +20,6 @@ namespace CreatureControl { ComputeRootVelocities(animator); - // showRootVelocities = EditorGUILayout.Foldout(showRootVelocities, "Root Velocities", true); - // if (showRootVelocities) { - // EditorGUI.indentLevel++; - // foreach (CreatureAnimator.RootMotion rm in animator.rootVelocities) { - - // //foreach (KeyValuePair kvp in animator.rootVelocities) { - // EditorGUILayout.LabelField(rm.animationClipName); - // EditorGUI.indentLevel++; - // EditorGUILayout.Vector3Field("Linear Velocity", rm.linearVelocity); - // EditorGUILayout.Vector3Field("Angular Velocity", rm.angularVelocity); - // EditorGUI.indentLevel--; - // } - // EditorGUI.indentLevel--; - // } - EditorUtility.SetDirty(animator); serializedObject.ApplyModifiedProperties(); } @@ -56,6 +41,7 @@ namespace CreatureControl { } clipIx++; } + animator.CalculateRootMotionScale(); } } diff --git a/CreatureControl/Runtime/Scripts/CreatureAnimator.cs b/CreatureControl/Runtime/Scripts/CreatureAnimator.cs index 6085e73..19037d6 100644 --- a/CreatureControl/Runtime/Scripts/CreatureAnimator.cs +++ b/CreatureControl/Runtime/Scripts/CreatureAnimator.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using UnityEngine; using UnityEditor.Animations; +using LinearAlgebra; namespace CreatureControl { @@ -28,14 +29,46 @@ namespace CreatureControl { } //public Dictionary rootVelocities = new(); public List rootVelocities = new(); - public RootMotion GetRootMotion(string name) { + public RootMotion GetRootMotion(string name) { return this.rootVelocities.Find(rm => rm.clipName == name); } public Dictionary animationDirections = new(); + public float rootMotionScaleForward = 1; + public float rootMotionScaleRight = 1; + public float rootMotionScaleRotate = 1; + public void CalculateRootMotionScale() { + this.rootMotionScaleForward = 0; + this.rootMotionScaleRight = 0; + this.rootMotionScaleRotate = 0; + // We may want to check for consistency: + // rm scale for an axis should be the same for all animations + foreach (RootMotion rootVelocity in this.rootVelocities) { + if (IsDirectionCloseTo(Vector3.forward, rootVelocity.linearVelocity)) { + if (rootVelocity.linearVelocity.z > 0) + this.rootMotionScaleForward = rootVelocity.linearVelocity.z; + } + else if (IsDirectionCloseTo(Vector3.right, rootVelocity.linearVelocity)) { + if (rootVelocity.linearVelocity.x > 0) + this.rootMotionScaleRight = rootVelocity.linearVelocity.x; + } + else if (IsDirectionCloseTo(Vector3.up, rootVelocity.angularVelocity)) { + if (rootVelocity.angularVelocity.y > 0) + this.rootMotionScaleRotate = rootVelocity.angularVelocity.y; + } + } + } - protected virtual void Awake() { + private bool IsDirectionCloseTo(Vector3 direction, Vector3 vector, float threshold = 0.9f) { + if (vector.sqrMagnitude == 0) + return false; + // Normalize the target vector to ensure comparisons are based on direction + Vector3 normalizedTarget = vector.normalized; + return Vector3.Dot(normalizedTarget, direction) > threshold; + } + + protected virtual void Start() { this.creature = GetComponent(); this.animator = creature.animator; // GetComponent(); @@ -44,13 +77,9 @@ namespace CreatureControl { protected virtual void Update() { if (rootMotionMode == RootMotionMode.Inverse) { - Vector3 speed = new(0, 0, 0.024f); - this.transform.localPosition += speed * Time.deltaTime; //0.0048f * Time.deltaTime * this.transform.forward; InverseRootMotionUpdate(); } else { - this.animator.SetFloat("Forward", 1f); - // Ensure that the pose of the model matches the target rig this.creature.targetRig.transform.GetPositionAndRotation(out Vector3 targetRigPosition, out Quaternion targetRigOrientation); this.creature.transform.SetPositionAndRotation(targetRigPosition, targetRigOrientation); this.creature.targetRig.transform.SetPositionAndRotation(targetRigPosition, targetRigOrientation); @@ -58,19 +87,26 @@ namespace CreatureControl { } private Vector3 lastPosition; + private Quaternion lastOrientation; protected void InverseRootMotionUpdate() { if (lastPosition.sqrMagnitude > 0) { Vector3 translation = this.transform.position - lastPosition; Vector3 worldVelocity = translation / Time.deltaTime; Vector3 localVelocity = transform.InverseTransformDirection(worldVelocity); - RootMotion rootMotion = this.GetRootMotion("AntWalkForward"); - Vector3 animationVelocity = rootMotion.linearVelocity; // rootVelocities["AntWalkForward"].linearVelocity; - - float fwdAnimationSpeed = localVelocity.z / animationVelocity.z; + float fwdAnimationSpeed = localVelocity.z / rootMotionScaleForward; this.animator.SetFloat("Forward", fwdAnimationSpeed); + float rightAnimationSpeed = localVelocity.x / rootMotionScaleRight; + this.animator.SetFloat("Right", rightAnimationSpeed); + + Quaternion rotation = this.transform.rotation * Quaternion.Inverse(lastOrientation); + float rotationAngleY = Angles.Normalize(rotation.eulerAngles.y); + float rotationSpeed = rotationAngleY / Time.deltaTime; + float rotAnimationSpeed = rotationSpeed / rootMotionScaleRotate; + this.animator.SetFloat("Rotation", rotAnimationSpeed); } lastPosition = this.transform.position; + lastOrientation = this.transform.rotation; } void RetrieveBlendTreeAnimations(Animator animator, string parameterName, float targetValue) { diff --git a/Samples/Animation/AntAnimator3.controller b/Samples/Animation/AntAnimator3.controller index 6ea2b31..3548c46 100644 --- a/Samples/Animation/AntAnimator3.controller +++ b/Samples/Animation/AntAnimator3.controller @@ -32,7 +32,7 @@ BlendTree: m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 - m_BlendParameter: Rotate + m_BlendParameter: Rotation m_BlendParameterY: Forward m_MinThreshold: -1 m_MaxThreshold: 1 @@ -87,7 +87,7 @@ BlendTree: m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 - m_BlendParameter: Strafe + m_BlendParameter: Right m_BlendParameterY: Forward m_MinThreshold: 0 m_MaxThreshold: 1 @@ -124,13 +124,13 @@ AnimatorController: m_DefaultInt: 0 m_DefaultBool: 0 m_Controller: {fileID: 9100000} - - m_Name: Rotate + - m_Name: Rotation m_Type: 1 m_DefaultFloat: 0 m_DefaultInt: 0 m_DefaultBool: 0 m_Controller: {fileID: 9100000} - - m_Name: Strafe + - m_Name: Right m_Type: 1 m_DefaultFloat: 0 m_DefaultInt: 0 diff --git a/Samples/Animation/AntIdle.anim b/Samples/Animation/AntIdle.anim index 51d876e..1afe677 100644 --- a/Samples/Animation/AntIdle.anim +++ b/Samples/Animation/AntIdle.anim @@ -28,7 +28,7 @@ AnimationClip: inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 1.6666666 + time: 0.26666668 value: {x: 0, y: 0, z: 0} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} @@ -53,7 +53,7 @@ AnimationClip: inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 1.6666666 + time: 0.26666668 value: {x: 0, y: 0, z: 0} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} @@ -78,7 +78,7 @@ AnimationClip: inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 1.6666666 + time: 0.26666668 value: {x: 0, y: 0, z: 0} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} @@ -93,7 +93,7 @@ AnimationClip: m_ScaleCurves: [] m_FloatCurves: [] m_PPtrCurves: [] - m_SampleRate: 24 + m_SampleRate: 30 m_WrapMode: 0 m_Bounds: m_Center: {x: 0, y: 0, z: 0} @@ -133,7 +133,7 @@ AnimationClip: m_AdditiveReferencePoseClip: {fileID: 0} m_AdditiveReferencePoseTime: 0 m_StartTime: 0 - m_StopTime: 1.6666666 + m_StopTime: 0.26666668 m_OrientationOffsetY: 0 m_Level: 0 m_CycleOffset: 0 @@ -163,7 +163,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6666666 + time: 0.26666668 value: 0 inSlope: 0 outSlope: 0 @@ -193,7 +193,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6666666 + time: 0.26666668 value: 0 inSlope: 0 outSlope: 0 @@ -223,7 +223,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6666666 + time: 0.26666668 value: 0 inSlope: 0 outSlope: 0 @@ -253,7 +253,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6666666 + time: 0.26666668 value: 0 inSlope: 0 outSlope: 0 @@ -283,7 +283,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6666666 + time: 0.26666668 value: 0 inSlope: 0 outSlope: 0 @@ -313,7 +313,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6666666 + time: 0.26666668 value: 0 inSlope: 0 outSlope: 0 @@ -343,7 +343,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6666666 + time: 0.26666668 value: 0 inSlope: 0 outSlope: 0 @@ -373,7 +373,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6666666 + time: 0.26666668 value: 0 inSlope: 0 outSlope: 0 @@ -403,7 +403,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6666666 + time: 0.26666668 value: 0 inSlope: 0 outSlope: 0 diff --git a/Samples/Animation/AntRotateLeft.anim b/Samples/Animation/AntRotateLeft.anim index b3475f5..ee8b745 100644 --- a/Samples/Animation/AntRotateLeft.anim +++ b/Samples/Animation/AntRotateLeft.anim @@ -20,35 +20,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 67.5, z: 0} - outSlope: {x: 0, y: 67.5, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.16666667 - value: {x: 0, y: 11.25, z: 0} - inSlope: {x: 0, y: -0.0000038146973, z: 0} - outSlope: {x: 0, y: -0.0000038146973, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.5 - value: {x: 0, y: -11.25, z: 0} - inSlope: {x: 0, y: -0.0000076293945, z: 0} - outSlope: {x: 0, y: -0.0000076293945, z: 0} + inSlope: {x: 0, y: 168.74998, z: 0} + outSlope: {x: 0, y: 168.74998, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.6666667 + time: 0.06666667 + value: {x: 0, y: 11.25, z: 0} + inSlope: {x: 0, y: -0.000015258789, z: 0} + outSlope: {x: 0, y: -0.000015258789, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.2 + value: {x: 0, y: -11.25, z: 0} + inSlope: {x: 0, y: -0.000022888184, z: 0} + outSlope: {x: 0, y: -0.000022888184, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.26666668 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 67.49999, z: 0} - outSlope: {x: 0, y: 67.49999, z: 0} + inSlope: {x: 0, y: 168.74997, z: 0} + outSlope: {x: 0, y: 168.74997, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -63,35 +63,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: -67.5, z: 0} - outSlope: {x: 0, y: -67.5, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.16666667 - value: {x: 0, y: -11.25, z: 0} - inSlope: {x: 0, y: 0.0000038146973, z: 0} - outSlope: {x: 0, y: 0.0000038146973, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.5 - value: {x: 0, y: 11.25, z: 0} - inSlope: {x: 0, y: 0.0000076293945, z: 0} - outSlope: {x: 0, y: 0.0000076293945, z: 0} + inSlope: {x: 0, y: -168.74998, z: 0} + outSlope: {x: 0, y: -168.74998, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.6666667 + time: 0.06666667 + value: {x: 0, y: -11.25, z: 0} + inSlope: {x: 0, y: 0.000015258789, z: 0} + outSlope: {x: 0, y: 0.000015258789, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.2 + value: {x: 0, y: 11.25, z: 0} + inSlope: {x: 0, y: 0.000022888184, z: 0} + outSlope: {x: 0, y: 0.000022888184, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.26666668 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: -67.49999, z: 0} - outSlope: {x: 0, y: -67.49999, z: 0} + inSlope: {x: 0, y: -168.74997, z: 0} + outSlope: {x: 0, y: -168.74997, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -106,17 +106,17 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: -67.5, z: 0} - outSlope: {x: 0, y: -67.5, z: 0} + inSlope: {x: 0, y: -168.74998, z: 0} + outSlope: {x: 0, y: -168.74998, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.6666667 + time: 0.26666668 value: {x: 0, y: -45, z: 0} - inSlope: {x: 0, y: -67.5, z: 0} - outSlope: {x: 0, y: -67.5, z: 0} + inSlope: {x: 0, y: -168.74998, z: 0} + outSlope: {x: 0, y: -168.74998, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -139,16 +139,16 @@ AnimationClip: inWeight: {x: 0, y: 0.33333334, z: 0.33333334} outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.16666667 + time: 0.06666667 value: {x: 0, y: 0, z: 0} inSlope: {x: 0, y: -0, z: 0} - outSlope: {x: 0, y: 0.012, z: 0} + outSlope: {x: 0, y: 0.03, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0, y: 0.33333334, z: 0.33333334} outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.33333334 + time: 0.13333334 value: {x: 0, y: 0.002, z: 0} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} @@ -157,9 +157,9 @@ AnimationClip: inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.5 + time: 0.2 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: -0.012000001, z: 0} + inSlope: {x: 0, y: -0.030000003, z: 0} outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 weightedMode: 0 @@ -182,25 +182,25 @@ AnimationClip: inWeight: {x: 0, y: 0.33333334, z: 0.33333334} outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.16666667 + time: 0.06666667 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: -0.012, z: 0} + inSlope: {x: 0, y: -0.03, z: 0} outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0, y: 0.33333334, z: 0.33333334} outWeight: {x: 0, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.5 + time: 0.2 value: {x: 0, y: 0, z: 0} inSlope: {x: 0, y: -0, z: 0} - outSlope: {x: 0, y: 0.011999999, z: 0} + outSlope: {x: 0, y: 0.029999996, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.6666667 + time: 0.26666668 value: {x: 0, y: 0.002, z: 0} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} @@ -215,7 +215,7 @@ AnimationClip: m_ScaleCurves: [] m_FloatCurves: [] m_PPtrCurves: [] - m_SampleRate: 60 + m_SampleRate: 30 m_WrapMode: 0 m_Bounds: m_Center: {x: 0, y: 0, z: 0} @@ -273,13 +273,13 @@ AnimationClip: m_AdditiveReferencePoseClip: {fileID: 0} m_AdditiveReferencePoseTime: 0 m_StartTime: 0 - m_StopTime: 0.6666667 + m_StopTime: 0.26666668 m_OrientationOffsetY: 0 m_Level: 0 m_CycleOffset: 0 m_HasAdditiveReferencePose: 0 m_LoopTime: 1 - m_LoopBlend: 0 + m_LoopBlend: 1 m_LoopBlendOrientation: 0 m_LoopBlendPositionY: 0 m_LoopBlendPositionXZ: 0 @@ -296,56 +296,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: localEulerAnglesRaw.x - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 67.5 - outSlope: 67.5 + inSlope: 168.74998 + outSlope: 168.74998 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.16666667 + time: 0.06666667 value: 11.25 - inSlope: -0.0000038146973 - outSlope: -0.0000038146973 + inSlope: -0.000015258789 + outSlope: -0.000015258789 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.5 + time: 0.2 value: -11.25 - inSlope: -0.0000076293945 - outSlope: -0.0000076293945 + inSlope: -0.000022888184 + outSlope: -0.000022888184 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.6666667 + time: 0.26666668 value: 0 - inSlope: 67.49999 - outSlope: 67.49999 + inSlope: 168.74997 + outSlope: 168.74997 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 @@ -365,77 +344,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: localEulerAnglesRaw.z - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: localEulerAnglesRaw.x - path: Body/RightFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: -67.5 - outSlope: -67.5 + inSlope: -168.74998 + outSlope: -168.74998 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.16666667 + time: 0.06666667 value: -11.25 - inSlope: 0.0000038146973 - outSlope: 0.0000038146973 + inSlope: 0.000015258789 + outSlope: 0.000015258789 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.5 + time: 0.2 value: 11.25 - inSlope: 0.0000076293945 - outSlope: 0.0000076293945 + inSlope: 0.000022888184 + outSlope: 0.000022888184 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.6666667 + time: 0.26666668 value: 0 - inSlope: -67.49999 - outSlope: -67.49999 + inSlope: -168.74997 + outSlope: -168.74997 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 @@ -448,27 +385,6 @@ AnimationClip: classID: 4 script: {fileID: 0} flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: localEulerAnglesRaw.z - path: Body/RightFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - serializedVersion: 2 curve: serializedVersion: 2 @@ -504,16 +420,16 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.16666667 + time: 0.06666667 value: 0 inSlope: -0 - outSlope: 0.012 + outSlope: 0.03 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 + time: 0.13333334 value: 0.002 inSlope: 0 outSlope: 0 @@ -522,9 +438,9 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.5 + time: 0.2 value: 0 - inSlope: -0.012000001 + inSlope: -0.030000003 outSlope: 0 tangentMode: 69 weightedMode: 0 @@ -538,27 +454,6 @@ AnimationClip: classID: 4 script: {fileID: 0} flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.z - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - serializedVersion: 2 curve: serializedVersion: 2 @@ -594,25 +489,25 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.16666667 + time: 0.06666667 value: 0 - inSlope: -0.012 + inSlope: -0.03 outSlope: 0 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.5 + time: 0.2 value: 0 inSlope: -0 - outSlope: 0.011999999 + outSlope: 0.029999996 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.6666667 + time: 0.26666668 value: 0.002 inSlope: 0 outSlope: 0 @@ -628,27 +523,6 @@ AnimationClip: classID: 4 script: {fileID: 0} flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalPosition.z - path: Body/RightFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - serializedVersion: 2 curve: serializedVersion: 2 @@ -663,7 +537,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.6666667 + time: 0.26666668 value: 0 inSlope: 0 outSlope: 0 @@ -686,17 +560,17 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: -67.5 - outSlope: -67.5 + inSlope: -168.74998 + outSlope: -168.74998 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.6666667 + time: 0.26666668 value: -45 - inSlope: -67.5 - outSlope: -67.5 + inSlope: -168.74998 + outSlope: -168.74998 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 @@ -738,7 +612,7 @@ AnimationClip: m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 - attribute: m_LocalEulerAngles.z + attribute: m_LocalEulerAngles.x path: classID: 4 script: {fileID: 0} @@ -762,83 +636,11 @@ AnimationClip: m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 - attribute: m_LocalEulerAngles.x + attribute: m_LocalEulerAngles.z path: classID: 4 script: {fileID: 0} flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalEulerAngles.z - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalEulerAngles.y - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalEulerAngles.x - path: Body/LeftFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalEulerAngles.x - path: Body/RightFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalEulerAngles.y - path: Body/RightFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 - - serializedVersion: 2 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalEulerAngles.z - path: Body/RightFeetTarget - classID: 4 - script: {fileID: 0} - flags: 0 m_HasGenericRootTransform: 1 m_HasMotionFloatCurves: 0 m_Events: [] diff --git a/Samples/Animation/AntRotateRight.anim b/Samples/Animation/AntRotateRight.anim index 43b88f1..94332f8 100644 --- a/Samples/Animation/AntRotateRight.anim +++ b/Samples/Animation/AntRotateRight.anim @@ -279,7 +279,7 @@ AnimationClip: m_CycleOffset: 0 m_HasAdditiveReferencePose: 0 m_LoopTime: 1 - m_LoopBlend: 0 + m_LoopBlend: 1 m_LoopBlendOrientation: 0 m_LoopBlendPositionY: 0 m_LoopBlendPositionXZ: 0 diff --git a/Samples/Animation/AntWalkForward.anim b/Samples/Animation/AntWalkForward.anim index f2202c1..6dbe9c8 100644 --- a/Samples/Animation/AntWalkForward.anim +++ b/Samples/Animation/AntWalkForward.anim @@ -21,44 +21,44 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: -0.024} - outSlope: {x: 0, y: 0, z: -0.024} + inSlope: {x: 0, y: 0, z: -0.03} + outSlope: {x: 0, y: 0, z: -0.03} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: {x: 0, y: 0, z: -0.002} - inSlope: {x: 0, y: -0, z: -0.024} - outSlope: {x: 0, y: 0.024, z: 0.024000002} + inSlope: {x: 0, y: -0, z: -0.03} + outSlope: {x: 0, y: 0.03, z: 0.030000003} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.16666667 + time: 0.13333334 value: {x: 0, y: 0.002, z: 3.4924597e-10} - inSlope: {x: 0, y: -9.313226e-10, z: 0.024000008} - outSlope: {x: 0, y: -9.313226e-10, z: 0.024000008} + inSlope: {x: 0, y: -0.0000000018626451, z: 0.03000001} + outSlope: {x: 0, y: -0.0000000018626451, z: 0.03000001} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.25 + time: 0.2 value: {x: 0, y: 0, z: 0.002} - inSlope: {x: 0, y: 0, z: 0.024000002} - outSlope: {x: 0, y: 0, z: -0.023999998} + inSlope: {x: 0, y: 0, z: 0.030000003} + outSlope: {x: 0, y: 0, z: -0.029999996} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: -0.023999998} - outSlope: {x: 0, y: 0, z: -0.023999998} + inSlope: {x: 0, y: 0, z: -0.029999996} + outSlope: {x: 0, y: 0, z: -0.029999996} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -73,35 +73,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0.002, z: 0} - inSlope: {x: 0, y: 0, z: 0.024} - outSlope: {x: 0, y: 0, z: 0.024} + inSlope: {x: 0, y: 0, z: 0.03} + outSlope: {x: 0, y: 0, z: 0.03} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: {x: 0, y: 0, z: 0.002} - inSlope: {x: 0, y: -0.024, z: 0.024} - outSlope: {x: 0, y: 0, z: -0.024000002} + inSlope: {x: 0, y: -0.03, z: 0.03} + outSlope: {x: 0, y: 0, z: -0.030000003} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.25 + time: 0.2 value: {x: 0, y: 0, z: -0.002} - inSlope: {x: 0, y: -0, z: -0.024000002} - outSlope: {x: 0, y: 0.023999998, z: 0.023999998} + inSlope: {x: 0, y: -0, z: -0.030000003} + outSlope: {x: 0, y: 0.029999996, z: 0.029999996} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: {x: 0, y: 0.002, z: 0} - inSlope: {x: 0, y: 0, z: 0.023999998} - outSlope: {x: 0, y: 0, z: 0.023999998} + inSlope: {x: 0, y: 0, z: 0.029999996} + outSlope: {x: 0, y: 0, z: 0.029999996} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -116,17 +116,17 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0.024} - outSlope: {x: 0, y: 0, z: 0.024} + inSlope: {x: 0, y: 0, z: 0.03} + outSlope: {x: 0, y: 0, z: 0.03} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: {x: 0, y: 0, z: 0.008} - inSlope: {x: 0, y: 0, z: 0.024} - outSlope: {x: 0, y: 0, z: 0.024} + inSlope: {x: 0, y: 0, z: 0.03} + outSlope: {x: 0, y: 0, z: 0.03} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -138,7 +138,7 @@ AnimationClip: m_ScaleCurves: [] m_FloatCurves: [] m_PPtrCurves: [] - m_SampleRate: 24 + m_SampleRate: 30 m_WrapMode: 0 m_Bounds: m_Center: {x: 0, y: 0, z: 0} @@ -178,7 +178,7 @@ AnimationClip: m_AdditiveReferencePoseClip: {fileID: 0} m_AdditiveReferencePoseTime: 0 m_StartTime: 0 - m_StopTime: 0.33333334 + m_StopTime: 0.26666668 m_OrientationOffsetY: 0 m_Level: 0 m_CycleOffset: 0 @@ -208,25 +208,25 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: 0 inSlope: -0 - outSlope: 0.024 + outSlope: 0.03 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.16666667 + time: 0.13333334 value: 0.002 - inSlope: -9.313226e-10 - outSlope: -9.313226e-10 + inSlope: -0.0000000018626451 + outSlope: -0.0000000018626451 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.25 + time: 0.2 value: 0 inSlope: 0 outSlope: 0 @@ -235,7 +235,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: 0 inSlope: 0 outSlope: 0 @@ -258,35 +258,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: -0.024 - outSlope: -0.024 + inSlope: -0.03 + outSlope: -0.03 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: -0.002 - inSlope: -0.024 - outSlope: 0.024000002 + inSlope: -0.03 + outSlope: 0.030000003 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.25 + time: 0.2 value: 0.002 - inSlope: 0.024000002 - outSlope: -0.023999998 + inSlope: 0.030000003 + outSlope: -0.029999996 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: 0 - inSlope: -0.023999998 - outSlope: -0.023999998 + inSlope: -0.029999996 + outSlope: -0.029999996 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 @@ -313,25 +313,25 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: 0 - inSlope: -0.024 + inSlope: -0.03 outSlope: 0 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.25 + time: 0.2 value: 0 inSlope: -0 - outSlope: 0.023999998 + outSlope: 0.029999996 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: 0.002 inSlope: 0 outSlope: 0 @@ -354,35 +354,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0.024 - outSlope: 0.024 + inSlope: 0.03 + outSlope: 0.03 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: 0.002 - inSlope: 0.024 - outSlope: -0.024000002 + inSlope: 0.03 + outSlope: -0.030000003 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.25 + time: 0.2 value: -0.002 - inSlope: -0.024000002 - outSlope: 0.023999998 + inSlope: -0.030000003 + outSlope: 0.029999996 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: 0 - inSlope: 0.023999998 - outSlope: 0.023999998 + inSlope: 0.029999996 + outSlope: 0.029999996 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 @@ -402,17 +402,17 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0.024 - outSlope: 0.024 + inSlope: 0.03 + outSlope: 0.03 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: 0.008 - inSlope: 0.024 - outSlope: 0.024 + inSlope: 0.03 + outSlope: 0.03 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 diff --git a/Samples/Animation/AntWalkLeft.anim b/Samples/Animation/AntWalkLeft.anim index ee03b1a..3ff3c2f 100644 --- a/Samples/Animation/AntWalkLeft.anim +++ b/Samples/Animation/AntWalkLeft.anim @@ -21,44 +21,44 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0.024, y: 0, z: 0} - outSlope: {x: 0.024, y: 0, z: 0} + inSlope: {x: 0.03, y: 0, z: 0} + outSlope: {x: 0.03, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: {x: 0.002, y: 0, z: 0} - inSlope: {x: 0.024, y: -0, z: 0} - outSlope: {x: -0.024000002, y: 0.024, z: 0} + inSlope: {x: 0.03, y: -0, z: 0} + outSlope: {x: -0.030000003, y: 0.03, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.16666667 + time: 0.13333334 value: {x: -3.4924597e-10, y: 0.002, z: 0} - inSlope: {x: -0.024000008, y: 0, z: 0} - outSlope: {x: -0.024000008, y: 0, z: 0} + inSlope: {x: -0.03000001, y: 0, z: 0} + outSlope: {x: -0.03000001, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.25 + time: 0.2 value: {x: -0.002, y: 0, z: 0} - inSlope: {x: -0.024000002, y: -0.024000002, z: 0} - outSlope: {x: 0.023999998, y: 0, z: 0} + inSlope: {x: -0.030000003, y: -0.030000003, z: 0} + outSlope: {x: 0.029999996, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0.023999998, y: 0, z: 0} - outSlope: {x: 0.023999998, y: 0, z: 0} + inSlope: {x: 0.029999996, y: 0, z: 0} + outSlope: {x: 0.029999996, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -73,35 +73,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0.002, z: 0} - inSlope: {x: -0.024, y: 0, z: 0} - outSlope: {x: -0.024, y: 0, z: 0} + inSlope: {x: -0.03, y: 0, z: 0} + outSlope: {x: -0.03, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: {x: -0.002, y: 0, z: 0} - inSlope: {x: -0.024, y: -0.024, z: 0} - outSlope: {x: 0.024000002, y: 0, z: 0} + inSlope: {x: -0.03, y: -0.03, z: 0} + outSlope: {x: 0.030000003, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.25 + time: 0.2 value: {x: 0.002, y: 0, z: 0} - inSlope: {x: 0.024000002, y: -0, z: 0} - outSlope: {x: -0.023999998, y: 0.023999998, z: 0} + inSlope: {x: 0.030000003, y: -0, z: 0} + outSlope: {x: -0.029999996, y: 0.029999996, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: {x: 0, y: 0.002, z: 0} - inSlope: {x: -0.023999998, y: 0, z: 0} - outSlope: {x: -0.023999998, y: 0, z: 0} + inSlope: {x: -0.029999996, y: 0, z: 0} + outSlope: {x: -0.029999996, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -116,17 +116,17 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: -0.030000042, y: 0, z: 0} + outSlope: {x: -0.030000042, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: {x: -0.008000012, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} + inSlope: {x: -0.030000042, y: 0, z: 0} + outSlope: {x: -0.030000042, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -138,7 +138,7 @@ AnimationClip: m_ScaleCurves: [] m_FloatCurves: [] m_PPtrCurves: [] - m_SampleRate: 24 + m_SampleRate: 30 m_WrapMode: 0 m_Bounds: m_Center: {x: 0, y: 0, z: 0} @@ -178,7 +178,7 @@ AnimationClip: m_AdditiveReferencePoseClip: {fileID: 0} m_AdditiveReferencePoseTime: 0 m_StartTime: 0 - m_StopTime: 0.33333334 + m_StopTime: 0.26666668 m_OrientationOffsetY: 0 m_Level: 0 m_CycleOffset: 0 @@ -201,35 +201,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0.024 - outSlope: 0.024 + inSlope: 0.03 + outSlope: 0.03 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: 0.002 - inSlope: 0.024 - outSlope: -0.024000002 + inSlope: 0.03 + outSlope: -0.030000003 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.25 + time: 0.2 value: -0.002 - inSlope: -0.024000002 - outSlope: 0.023999998 + inSlope: -0.030000003 + outSlope: 0.029999996 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: 0 - inSlope: 0.023999998 - outSlope: 0.023999998 + inSlope: 0.029999996 + outSlope: 0.029999996 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 @@ -256,16 +256,16 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: 0 inSlope: -0 - outSlope: 0.024 + outSlope: 0.03 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.16666667 + time: 0.13333334 value: 0.002 inSlope: 0 outSlope: 0 @@ -274,16 +274,16 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.25 + time: 0.2 value: 0 - inSlope: -0.024000002 + inSlope: -0.030000003 outSlope: 0 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: 0 inSlope: 0 outSlope: 0 @@ -313,25 +313,25 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: 0 - inSlope: -0.024 + inSlope: -0.03 outSlope: 0 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.25 + time: 0.2 value: 0 inSlope: -0 - outSlope: 0.023999998 + outSlope: 0.029999996 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: 0.002 inSlope: 0 outSlope: 0 @@ -354,35 +354,35 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: -0.024 - outSlope: -0.024 + inSlope: -0.03 + outSlope: -0.03 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: -0.002 - inSlope: -0.024 - outSlope: 0.024000002 + inSlope: -0.03 + outSlope: 0.030000003 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.25 + time: 0.2 value: 0.002 - inSlope: 0.024000002 - outSlope: -0.023999998 + inSlope: 0.030000003 + outSlope: -0.029999996 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: 0 - inSlope: -0.023999998 - outSlope: -0.023999998 + inSlope: -0.029999996 + outSlope: -0.029999996 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 @@ -402,18 +402,18 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: -0.030000042 + outSlope: -0.030000042 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: -0.008000012 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + inSlope: -0.030000042 + outSlope: -0.030000042 + tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 diff --git a/Samples/Animation/AntWalkRight.anim b/Samples/Animation/AntWalkRight.anim index a6fc699..b2c7fcc 100644 --- a/Samples/Animation/AntWalkRight.anim +++ b/Samples/Animation/AntWalkRight.anim @@ -22,42 +22,42 @@ AnimationClip: time: 0 value: {x: 0, y: 0, z: 0} inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: -0.024, y: 0, z: 0} + outSlope: {x: -0.03, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: {x: -0.002, y: 0, z: 0} - inSlope: {x: -0.024, y: -0, z: 0} - outSlope: {x: 0.024000002, y: 0.024, z: 0} + inSlope: {x: -0.03, y: -0, z: 0} + outSlope: {x: 0.030000003, y: 0.03, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.16666667 + time: 0.13333334 value: {x: 3.4924597e-10, y: 0.002, z: 0} - inSlope: {x: 0.024000008, y: -9.313226e-10, z: 0} - outSlope: {x: 0.024000008, y: -9.313226e-10, z: 0} + inSlope: {x: 0.03000001, y: -0.0000000018626451, z: 0} + outSlope: {x: 0.03000001, y: -0.0000000018626451, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.25 + time: 0.2 value: {x: 0.002, y: 0, z: 0} - inSlope: {x: 0.024000002, y: -0.024000002, z: 0} - outSlope: {x: -0.023999998, y: 0, z: 0} + inSlope: {x: 0.030000003, y: -0.030000003, z: 0} + outSlope: {x: -0.029999996, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: {x: 0, y: 0, z: 0} - inSlope: {x: -0.023999998, y: 0, z: 0} + inSlope: {x: -0.029999996, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 weightedMode: 0 @@ -74,33 +74,33 @@ AnimationClip: time: 0 value: {x: 0, y: 0.002, z: 0} inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0.024, y: 0, z: 0} + outSlope: {x: 0.03, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: {x: 0.002, y: 0, z: 0} - inSlope: {x: 0.024, y: -0.024, z: 0} - outSlope: {x: -0.024000002, y: 0, z: 0} + inSlope: {x: 0.03, y: -0.03, z: 0} + outSlope: {x: -0.030000003, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.25 + time: 0.2 value: {x: -0.002, y: 0, z: 0} - inSlope: {x: -0.024000002, y: -0, z: 0} - outSlope: {x: 0.023999998, y: 0.023999998, z: 0} + inSlope: {x: -0.030000003, y: -0, z: 0} + outSlope: {x: 0.029999996, y: 0.029999996, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: {x: 0, y: 0.002, z: 0} - inSlope: {x: 0.023999998, y: 0, z: 0} + inSlope: {x: 0.029999996, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 weightedMode: 0 @@ -116,17 +116,17 @@ AnimationClip: - serializedVersion: 3 time: 0 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0.024000023, y: 0, z: 0} - outSlope: {x: 0.024000023, y: 0, z: 0} + inSlope: {x: 0.030000027, y: 0, z: 0} + outSlope: {x: 0.030000027, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: {x: 0.008000008, y: 0, z: 0} - inSlope: {x: 0.024000023, y: 0, z: 0} - outSlope: {x: 0.024000023, y: 0, z: 0} + inSlope: {x: 0.030000027, y: 0, z: 0} + outSlope: {x: 0.030000027, y: 0, z: 0} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} @@ -138,7 +138,7 @@ AnimationClip: m_ScaleCurves: [] m_FloatCurves: [] m_PPtrCurves: [] - m_SampleRate: 24 + m_SampleRate: 30 m_WrapMode: 0 m_Bounds: m_Center: {x: 0, y: 0, z: 0} @@ -178,13 +178,13 @@ AnimationClip: m_AdditiveReferencePoseClip: {fileID: 0} m_AdditiveReferencePoseTime: 0 m_StartTime: 0 - m_StopTime: 0.33333334 + m_StopTime: 0.26666668 m_OrientationOffsetY: 0 m_Level: 0 m_CycleOffset: 0 m_HasAdditiveReferencePose: 0 m_LoopTime: 1 - m_LoopBlend: 0 + m_LoopBlend: 1 m_LoopBlendOrientation: 0 m_LoopBlendPositionY: 0 m_LoopBlendPositionXZ: 0 @@ -202,33 +202,33 @@ AnimationClip: time: 0 value: 0 inSlope: 0 - outSlope: -0.024 + outSlope: -0.03 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: -0.002 - inSlope: -0.024 - outSlope: 0.024000002 + inSlope: -0.03 + outSlope: 0.030000003 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.25 + time: 0.2 value: 0.002 - inSlope: 0.024000002 - outSlope: -0.023999998 + inSlope: 0.030000003 + outSlope: -0.029999996 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: 0 - inSlope: -0.023999998 + inSlope: -0.029999996 outSlope: 0 tangentMode: 69 weightedMode: 0 @@ -256,34 +256,34 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: 0 inSlope: -0 - outSlope: 0.024 + outSlope: 0.03 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.16666667 + time: 0.13333334 value: 0.002 - inSlope: -9.313226e-10 - outSlope: -9.313226e-10 + inSlope: -0.0000000018626451 + outSlope: -0.0000000018626451 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.25 + time: 0.2 value: 0 - inSlope: -0.024000002 + inSlope: -0.030000003 outSlope: 0 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: 0 inSlope: 0 outSlope: 0 @@ -307,33 +307,33 @@ AnimationClip: time: 0 value: 0 inSlope: 0 - outSlope: 0.024 + outSlope: 0.03 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: 0.002 - inSlope: 0.024 - outSlope: -0.024000002 + inSlope: 0.03 + outSlope: -0.030000003 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.25 + time: 0.2 value: -0.002 - inSlope: -0.024000002 - outSlope: 0.023999998 + inSlope: -0.030000003 + outSlope: 0.029999996 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: 0 - inSlope: 0.023999998 + inSlope: 0.029999996 outSlope: 0 tangentMode: 69 weightedMode: 0 @@ -361,25 +361,25 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.083333336 + time: 0.06666667 value: 0 - inSlope: -0.024 + inSlope: -0.03 outSlope: 0 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.25 + time: 0.2 value: 0 inSlope: -0 - outSlope: 0.023999998 + outSlope: 0.029999996 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: 0.002 inSlope: 0 outSlope: 0 @@ -402,17 +402,17 @@ AnimationClip: - serializedVersion: 3 time: 0 value: 0 - inSlope: 0.024000023 - outSlope: 0.024000023 + inSlope: 0.030000027 + outSlope: 0.030000027 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.33333334 + time: 0.26666668 value: 0.008000008 - inSlope: 0.024000023 - outSlope: 0.024000023 + inSlope: 0.030000027 + outSlope: 0.030000027 tangentMode: 34 weightedMode: 0 inWeight: 0.33333334 From ae035d4672bbff094c1c7d813953592a181998a3 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Mon, 13 Apr 2026 17:42:21 +0200 Subject: [PATCH 21/38] Fix Ant --- .../Editor/Scripts/CreatureAnimator_Editor.cs | 2 +- .../Editor/Scripts/Creature_Editor.cs | 17 +- .../Editor/Scripts/Insect/Insect_Editor.cs | 58 ++-- CreatureControl/Editor/Scripts/Leg_Editor.cs | 7 +- CreatureControl/Runtime/Scripts/Creature.cs | 26 +- .../Runtime/Scripts/CreatureAnimator.cs | 36 +- .../Runtime/Scripts/Insect/InsectRig.cs | 4 +- CreatureControl/Runtime/Scripts/Leg.cs | 12 +- CreatureControl/Runtime/Scripts/TargetLeg.cs | 4 - Runtime/Scripts/Ant.cs | 5 +- Samples/Foraging.unity | 309 ++++++++++++++---- 11 files changed, 322 insertions(+), 158 deletions(-) diff --git a/CreatureControl/Editor/Scripts/CreatureAnimator_Editor.cs b/CreatureControl/Editor/Scripts/CreatureAnimator_Editor.cs index adaff4e..a942bc2 100644 --- a/CreatureControl/Editor/Scripts/CreatureAnimator_Editor.cs +++ b/CreatureControl/Editor/Scripts/CreatureAnimator_Editor.cs @@ -12,7 +12,7 @@ namespace CreatureControl { animator = (CreatureAnimator)target; } - private bool showRootVelocities = false; + //private bool showRootVelocities = false; public override void OnInspectorGUI() { base.OnInspectorGUI(); diff --git a/CreatureControl/Editor/Scripts/Creature_Editor.cs b/CreatureControl/Editor/Scripts/Creature_Editor.cs index c7e5eb1..5e1b77c 100644 --- a/CreatureControl/Editor/Scripts/Creature_Editor.cs +++ b/CreatureControl/Editor/Scripts/Creature_Editor.cs @@ -23,19 +23,20 @@ namespace CreatureControl { creature.animator = creature.targetRig.GetComponent(); // Keep track if anything changed while enabling the creature editor - bool anythingChanged = false; + bool somethingChanged = false; - if (IsPrefab(this.creature) == false) { - // Only do this when it is not a prefab - anythingChanged |= this.creature.CheckTargetRig(); - anythingChanged |= this.creature.CheckModel(); - } + // if (IsPrefab(this.creature) == false) { + // // Only do this when it is not a prefab + // somethingChanged |= this.creature.CheckTargetRig(); + // somethingChanged |= this.creature.CheckModel(); + // } - this.creature.targetRig.MatchTo(this.creature, ref anythingChanged); + this.creature.targetRig.MatchTo(this.creature, ref somethingChanged); // As the above functions do not use the serialized object // We need to manually persist the changes. - if (anythingChanged) { + if (somethingChanged) { + Debug.Log("something has changed"); EditorUtility.SetDirty(this.creature); AssetDatabase.SaveAssets(); } diff --git a/CreatureControl/Editor/Scripts/Insect/Insect_Editor.cs b/CreatureControl/Editor/Scripts/Insect/Insect_Editor.cs index 370896a..714e789 100644 --- a/CreatureControl/Editor/Scripts/Insect/Insect_Editor.cs +++ b/CreatureControl/Editor/Scripts/Insect/Insect_Editor.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using UnityEditor; -using UnityEngine; using UnityEditor.Animations; +using UnityEngine; namespace CreatureControl { @@ -14,10 +14,14 @@ namespace CreatureControl { insect = target as Insect; - bool anythingChanged = false; + //bool anythingChanged = false; + + //anythingChanged |= insect.CheckTargetRig("InsectRig"); + // We already do this in Creature_Editor... + //this.creature.targetRig.MatchTo(this.creature, ref anythingChanged); + //insect.insectRig.MatchTo(insect, ref anythingChanged); + /* - anythingChanged |= insect.CheckTargetRig("InsectRig"); - insect.insectRig.MatchTo(insect, ref anythingChanged); float prefabLegLength = 0.003f; float modelLegLength = insect.insectRig.legLength; float scale = prefabLegLength / modelLegLength; @@ -51,21 +55,21 @@ namespace CreatureControl { return; } - if (insect.updateAnimations) { - AnimationEditor.ScaleClip(clips[0], scale, insect.animationsPath); - Debug.Log($"Scaled{clips[0].name} with {scale} and saved it to {insect.animationsPath}"); - } - else { - Debug.Log($"Did not scale {clips[0].name} with scale {scale} and save it to {insect.animationsPath}"); - } + // if (insect.updateAnimations) { + // AnimationEditor.ScaleClip(clips[0], scale, insect.animationsPath); + // Debug.Log($"Scaled{clips[0].name} with {scale} and saved it to {insect.animationsPath}"); + // } + // else { + // Debug.Log($"Did not scale {clips[0].name} with scale {scale} and save it to {insect.animationsPath}"); + // } + */ - if (anythingChanged) { - EditorUtility.SetDirty(creature); - AssetDatabase.SaveAssets(); - } + // if (anythingChanged) { + // EditorUtility.SetDirty(creature); + // AssetDatabase.SaveAssets(); + // } } - static void CollectFromStateMachine(AnimatorStateMachine sm, List outList) { foreach (var state in sm.states) { var motion = state.state.motion; @@ -124,27 +128,35 @@ namespace CreatureControl { "The target transforms controlling the body parts" ); showTargets = EditorGUILayout.Foldout(showTargets, text, true); - if (showTargets) { + bool somethingChanged = false; EditorGUI.indentLevel++; if (configurationIncomplete) { EditorGUILayout.HelpBox("Not all legs are configured", MessageType.Warning); } SerializedProperty leftFrontLegProp = serializedObject.FindProperty(nameof(Insect.leftFrontLeg)); - Leg_Editor.Inspector(leftFrontLegProp); + somethingChanged |= Leg_Editor.Inspector(leftFrontLegProp, insect.insectRig.leftFrontLeg, insect.leftFrontLeg); SerializedProperty leftMiddleLegProp = serializedObject.FindProperty(nameof(Insect.leftMiddleLeg)); - Leg_Editor.Inspector(leftMiddleLegProp); + somethingChanged |= Leg_Editor.Inspector(leftMiddleLegProp, insect.insectRig.leftMiddleLeg, insect.leftMiddleLeg); SerializedProperty leftHindLegProp = serializedObject.FindProperty(nameof(Insect.leftHindLeg)); - Leg_Editor.Inspector(leftHindLegProp); + somethingChanged |= Leg_Editor.Inspector(leftHindLegProp, insect.insectRig.leftBackLeg, insect.leftHindLeg); SerializedProperty rightFrontLegProp = serializedObject.FindProperty(nameof(Insect.rightFrontLeg)); - Leg_Editor.Inspector(rightFrontLegProp); + somethingChanged |= Leg_Editor.Inspector(rightFrontLegProp, insect.insectRig.rightFrontLeg, insect.rightFrontLeg); SerializedProperty rightMiddleLegProp = serializedObject.FindProperty(nameof(Insect.rightMiddleLeg)); - Leg_Editor.Inspector(rightMiddleLegProp); + somethingChanged |= Leg_Editor.Inspector(rightMiddleLegProp, insect.insectRig.rightMiddleLeg, insect.rightMiddleLeg); SerializedProperty rightHindLegProp = serializedObject.FindProperty(nameof(Insect.rightHindLeg)); - Leg_Editor.Inspector(rightHindLegProp); + somethingChanged |= Leg_Editor.Inspector(rightHindLegProp, insect.insectRig.rightBackLeg, insect.rightHindLeg); EditorGUI.indentLevel--; + + if (somethingChanged) { + Debug.Log("seomthin has changed"); + // don't know if this apply/update is really needed.... + serializedObject.ApplyModifiedProperties(); + insect.insectRig.MatchTo(insect, ref somethingChanged); + serializedObject.Update(); + } } } diff --git a/CreatureControl/Editor/Scripts/Leg_Editor.cs b/CreatureControl/Editor/Scripts/Leg_Editor.cs index 5f7cace..e325521 100644 --- a/CreatureControl/Editor/Scripts/Leg_Editor.cs +++ b/CreatureControl/Editor/Scripts/Leg_Editor.cs @@ -7,7 +7,9 @@ namespace CreatureControl { private static bool showfield = false; - public static void Inspector(SerializedProperty legProp) { + public static bool Inspector(SerializedProperty legProp, TargetLeg targetLeg, Leg leg) { + bool anythingChanged = false; + GUIStyle foldoutStyle = new(EditorStyles.foldout) { margin = EditorStyles.objectField.margin }; @@ -21,6 +23,7 @@ namespace CreatureControl { Transform newFemur = (Transform)EditorGUILayout.ObjectField(femurProp.objectReferenceValue, typeof(Transform), true); if (newFemur != femurProp.objectReferenceValue) { + // Try to determine further bones when the femur has been updated femurProp.objectReferenceValue = newFemur; if (newFemur != null) { if (tibiaProp.objectReferenceValue == null && newFemur.childCount == 1) @@ -31,6 +34,7 @@ namespace CreatureControl { tarsusProp.objectReferenceValue = tibia.GetChild(0); } } + anythingChanged = true; } EditorGUILayout.EndHorizontal(); @@ -44,6 +48,7 @@ namespace CreatureControl { // Need to check if anythingChanged and update the projection if it did EditorGUI.indentLevel--; } + return anythingChanged; } private static string ConvertCamelCase(string text) { diff --git a/CreatureControl/Runtime/Scripts/Creature.cs b/CreatureControl/Runtime/Scripts/Creature.cs index feac06e..52287e3 100644 --- a/CreatureControl/Runtime/Scripts/Creature.cs +++ b/CreatureControl/Runtime/Scripts/Creature.cs @@ -135,25 +135,15 @@ namespace CreatureControl { // Without a target rig, the creature cannot move return; - // UpdatePose(); + UpdatePose(); - // // copy animator root motion to the creature - // this.transform.SetPositionAndRotation(targetRig.transform.position, targetRig.transform.rotation); - // // As target rig is probably a child of this.transform, - // // We need to restore the position/rotation of the targetsRig. - // targetRig.transform.SetPositionAndRotation(this.transform.position, this.transform.rotation); + // copy animator root motion to the creature + this.transform.SetPositionAndRotation(targetRig.transform.position, targetRig.transform.rotation); + // As target rig is probably a child of this.transform, + // We need to restore the position/rotation of the targetsRig. + targetRig.transform.SetPositionAndRotation(this.transform.position, this.transform.rotation); } - // void OnAnimatorMove() { - // if (animator == null || creatureRigidbody == null || creatureRigidbody.isKinematic ) - // return; - - // Vector3 delta = animator.deltaPosition; - // Quaternion rot = animator.deltaRotation; - // creatureRigidbody.MovePosition(creatureRigidbody.position + delta); - // creatureRigidbody.MoveRotation(creatureRigidbody.rotation * rot); - // } - /// /// Update the pose of the creature using the target rig /// @@ -317,7 +307,7 @@ namespace CreatureControl { } RaycastHit closestHit = hits[closestHitIx]; - Debug.Log($"hit.distance {closestHit.distance} - {maxDistance}"); + //Debug.Log($"hit.distance {closestHit.distance} - {maxDistance}"); ground = closestHit.transform; normal = closestHit.normal; distance = closestHit.distance - maxDistance; @@ -333,7 +323,7 @@ namespace CreatureControl { /// /// Update the pose of the creature when the application is not running /// - void OnDrawGizmos() { + private void OnDrawGizmos() { // This ensures that the model is always following the target rig if (Application.isPlaying == false) { this.UpdatePose(); diff --git a/CreatureControl/Runtime/Scripts/CreatureAnimator.cs b/CreatureControl/Runtime/Scripts/CreatureAnimator.cs index 19037d6..90acd3a 100644 --- a/CreatureControl/Runtime/Scripts/CreatureAnimator.cs +++ b/CreatureControl/Runtime/Scripts/CreatureAnimator.cs @@ -16,6 +16,7 @@ namespace CreatureControl { }; public RootMotionMode rootMotionMode = RootMotionMode.Normal; + // This part may move to editor time only [System.Serializable] public class RootMotion { public string clipName; @@ -27,11 +28,12 @@ namespace CreatureControl { angularVelocity = Vector3.zero }; } - //public Dictionary rootVelocities = new(); + public List rootVelocities = new(); public RootMotion GetRootMotion(string name) { return this.rootVelocities.Find(rm => rm.clipName == name); } + // end of future editor-time public Dictionary animationDirections = new(); public float rootMotionScaleForward = 1; @@ -109,38 +111,6 @@ namespace CreatureControl { lastOrientation = this.transform.rotation; } - void RetrieveBlendTreeAnimations(Animator animator, string parameterName, float targetValue) { - AnimatorController ac = animator.runtimeAnimatorController as AnimatorController; - // Check if the Animator Controller is valid - if (ac == null) { - Debug.LogError("Animator Controller is not set correctly."); - return; - } - - // Iterate through each layer in the Animator Controller - foreach (AnimatorControllerLayer layer in ac.layers) { - // Access the state machine - foreach (ChildAnimatorState state in layer.stateMachine.states) { - // Check if the state contains a Blend Tree - if (state.state.motion is BlendTree blendTree) { - // Iterate through blend tree children - foreach (ChildMotion child in blendTree.children) { - if (child.directBlendParameter == parameterName) { - // Simulate parameter setting - //animator.SetFloat(parameterName, targetValue); - - // Get the animation clip information - if (child.motion is AnimationClip clip) { - Debug.Log($"Animation Clip: {clip.name}, Speed: {child.timeScale}"); - } - } - } - } - } - } - } - - } } \ No newline at end of file diff --git a/CreatureControl/Runtime/Scripts/Insect/InsectRig.cs b/CreatureControl/Runtime/Scripts/Insect/InsectRig.cs index 64a2800..378ced4 100644 --- a/CreatureControl/Runtime/Scripts/Insect/InsectRig.cs +++ b/CreatureControl/Runtime/Scripts/Insect/InsectRig.cs @@ -62,8 +62,8 @@ namespace CreatureControl { this.rightFrontLeg.PoseLimb(); } - public override void MatchTo(Creature creature, ref bool anythingChanged) { - base.MatchTo(creature, ref anythingChanged); + public override void MatchTo(Creature creature, ref bool somethingChanged) { + base.MatchTo(creature, ref somethingChanged); if (creature is not Insect insect) return; diff --git a/CreatureControl/Runtime/Scripts/Leg.cs b/CreatureControl/Runtime/Scripts/Leg.cs index cad5e56..03043b2 100644 --- a/CreatureControl/Runtime/Scripts/Leg.cs +++ b/CreatureControl/Runtime/Scripts/Leg.cs @@ -24,13 +24,21 @@ namespace CreatureControl { private float _femurLength; public float femurLength { get { - if (_femurLength <= 0) + if (_femurLength <= 0 && this.femur != null && this.tibia != null) _femurLength = Vector3.Distance(this.femur.position, this.tibia.position); return _femurLength; } } // A bit inefficient is this is used a lot... - public float tibiaLength => Vector3.Distance(this.tibia.position, this.tarsus.position); + //public float tibiaLength => Vector3.Distance(this.tibia.position, this.tarsus.position); + private float _tibiaLength; + public float tibiaLength { + get { + if (_tibiaLength <= 0 && this.tibia != null && this.tarsus != null) + _tibiaLength = Vector3.Distance(this.tibia.position, this.tarsus.position); + return _tibiaLength; + } + } public float length => femurLength + tibiaLength; diff --git a/CreatureControl/Runtime/Scripts/TargetLeg.cs b/CreatureControl/Runtime/Scripts/TargetLeg.cs index 69dff5a..ba2ba25 100644 --- a/CreatureControl/Runtime/Scripts/TargetLeg.cs +++ b/CreatureControl/Runtime/Scripts/TargetLeg.cs @@ -27,10 +27,6 @@ namespace CreatureControl { targetToBoneFemur = TargetRig.TargetToBoneRotation(leg.femur, leg.tibia); targetToBoneTibia = TargetRig.TargetToBoneRotation(leg.tibia, leg.tarsus); - float modelLegLength = leg.length; - float targetLegLength = this.bones.length; - Debug.Log($"model: {modelLegLength} rig: {targetLegLength}"); - // Put the end-effector target for IK in a sensible place Vector3 legDirection = (this.bones.tarsus.position - this.bones.femur.position).normalized; Vector3 targetPosition = this.bones.femur.position + 0.7f * this.bones.length * legDirection.normalized; diff --git a/Runtime/Scripts/Ant.cs b/Runtime/Scripts/Ant.cs index 5e4008d..0b435f6 100644 --- a/Runtime/Scripts/Ant.cs +++ b/Runtime/Scripts/Ant.cs @@ -58,7 +58,7 @@ namespace CreatureControl { protected override void Awake() { base.Awake(); - + this.nanoBrain = GetComponentInChildren(); } @@ -147,7 +147,7 @@ namespace CreatureControl { float rotateParam = Mathf.Clamp(angleRad * 3, -1f, 1f); this.animator.SetFloat("Forward", forwardParam); - this.animator.SetFloat("Rotate", rotateParam); + this.animator.SetFloat("Rotation", rotateParam); } private static readonly WaitForSeconds _waitForSeconds3 = new(3); @@ -253,6 +253,7 @@ namespace CreatureControl { } #endregion Update + } } \ No newline at end of file diff --git a/Samples/Foraging.unity b/Samples/Foraging.unity index 22ce533..3ef9acb 100644 --- a/Samples/Foraging.unity +++ b/Samples/Foraging.unity @@ -122,6 +122,11 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} +--- !u!4 &45864745 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} --- !u!1 &94386191 GameObject: m_ObjectHideFlags: 0 @@ -216,6 +221,11 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!4 &125388149 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} --- !u!1 &232829777 GameObject: m_ObjectHideFlags: 0 @@ -405,6 +415,16 @@ MonoBehaviour: antPrefab: {fileID: 0} numberOfAnts: 1 spawnAnt: 0 +--- !u!4 &273765720 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} +--- !u!4 &282023640 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} --- !u!1 &327634872 GameObject: m_ObjectHideFlags: 0 @@ -650,6 +670,16 @@ Transform: - {fileID: 232829778} m_Father: {fileID: 1075240960} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &539705206 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} +--- !u!4 &546513205 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} --- !u!1001 &566787347 PrefabInstance: m_ObjectHideFlags: 0 @@ -720,6 +750,16 @@ Transform: m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} m_PrefabInstance: {fileID: 566787347} m_PrefabAsset: {fileID: 0} +--- !u!4 &673430214 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} +--- !u!4 &685257250 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} --- !u!1001 &691526234 PrefabInstance: m_ObjectHideFlags: 0 @@ -1340,6 +1380,11 @@ Transform: - {fileID: 1973137220} m_Father: {fileID: 1075240960} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &1245228106 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} --- !u!1001 &1282320487 PrefabInstance: m_ObjectHideFlags: 0 @@ -1438,19 +1483,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.33182314 + value: 0.33182305 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.49444538 + value: -0.4944453 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.5847298 + value: -0.5847299 objectReference: {fileID: 0} - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.5509158 + value: 0.5509159 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1466,24 +1511,32 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6889717 + value: 0.68897164 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.7247883 + value: 0.7247884 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000016391276 + value: -0.00000017881392 objectReference: {fileID: 0} - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.00000006332993 + value: 0.00000007078051 objectReference: {fileID: 0} - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: length value: 0.0072452417 objectReference: {fileID: 0} + - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.femur + value: + objectReference: {fileID: 1908370719} + - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.tibia + value: + objectReference: {fileID: 673430214} - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: femurLength value: 0.0030040143 @@ -1492,6 +1545,14 @@ PrefabInstance: propertyPath: tibiaLength value: 0.004241227 objectReference: {fileID: 0} + - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.tarsus + value: + objectReference: {fileID: 1868770260} + - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones._femurLength + value: 0.0030040161 + objectReference: {fileID: 0} - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: targetToBoneFemur.w value: 0.6862775 @@ -1524,10 +1585,26 @@ PrefabInstance: propertyPath: length value: 0.006537831 objectReference: {fileID: 0} + - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.femur + value: + objectReference: {fileID: 539705206} + - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.tibia + value: + objectReference: {fileID: 546513205} - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: femurLength value: 0.0024082726 objectReference: {fileID: 0} + - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.tarsus + value: + objectReference: {fileID: 2093857555} + - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones._femurLength + value: 0.002408272 + objectReference: {fileID: 0} - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: targetToBoneFemur.w value: 0.07596097 @@ -1602,35 +1679,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.45984197 + value: 0.6763229 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.6877811 + value: 0.00000017881385 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.5008271 + value: -0.7366054 objectReference: {fileID: 0} - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.2543124 + value: 0.00000011548394 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.76921755 + value: 0.7692175 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.48360723 + value: -0.4836073 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.17796776 + value: 0.17796774 objectReference: {fileID: 0} - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.37783065 + value: -0.3778307 objectReference: {fileID: 0} - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1668,6 +1745,14 @@ PrefabInstance: propertyPath: length value: 0.007110139 objectReference: {fileID: 0} + - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.femur + value: + objectReference: {fileID: 282023640} + - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.tibia + value: + objectReference: {fileID: 2045717234} - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: femurLength value: 0.0030040178 @@ -1676,6 +1761,14 @@ PrefabInstance: propertyPath: tibiaLength value: 0.004106121 objectReference: {fileID: 0} + - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.tarsus + value: + objectReference: {fileID: 45864745} + - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones._femurLength + value: 0.0030040166 + objectReference: {fileID: 0} - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: targetToBoneFemur.w value: -0.42978364 @@ -1726,51 +1819,51 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.33122328 + value: -0.33122316 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.90636134 + value: 0.9063614 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.26013014 + value: 0.26013026 objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.03365269 + value: 0.03365275 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.06440171 + value: 0.06440168 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.059745185 + value: 0.059745274 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.85543114 + value: 0.8554311 objectReference: {fileID: 0} - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.51041204 + value: -0.51041216 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.83521044 + value: 0.8352103 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.17726359 + value: -0.17726377 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.19850598 + value: 0.19850573 objectReference: {fileID: 0} - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.48124483 + value: 0.48124492 objectReference: {fileID: 0} - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -1974,11 +2067,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000016342258 + value: 0.00000016003976 objectReference: {fileID: 0} - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.00000016900565 + value: -0.00000017439957 objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -2066,19 +2159,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.40812153 + value: 0.40812147 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.2714713 + value: 0.27147117 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.85242325 + value: 0.8524233 objectReference: {fileID: 0} - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.18197484 + value: -0.18197472 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -2090,19 +2183,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.9623592 + value: 0.9194447 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.17736581 + value: 0.3349856 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.20251691 + value: 0.19348608 objectReference: {fileID: 0} - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.03732453 + value: -0.07049368 objectReference: {fileID: 0} - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -2132,26 +2225,50 @@ PrefabInstance: propertyPath: m_LocalRotation.z value: 0.14929758 objectReference: {fileID: 0} + - target: {fileID: 5641584351447400800, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.femur + value: + objectReference: {fileID: 125388149} + - target: {fileID: 5641584351447400800, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.tibia + value: + objectReference: {fileID: 1899152691} + - target: {fileID: 5641584351447400800, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.tarsus + value: + objectReference: {fileID: 273765720} + - target: {fileID: 5641584351447400800, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones._femurLength + value: 0.0024082738 + objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.34205884 + value: 0.46055895 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.9227909 + value: 0.6473188 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.17563702 + value: 0.58904934 objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.02458617 + value: -0.1479351 objectReference: {fileID: 0} - target: {fileID: 6049855982455691338, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_Name value: LowPolyAnt (1) objectReference: {fileID: 0} + - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.femur + value: + objectReference: {fileID: 1327786334} + - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.tibia + value: + objectReference: {fileID: 685257250} - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: femurLength value: 0.0019033402 @@ -2160,6 +2277,14 @@ PrefabInstance: propertyPath: tibiaLength value: 0.0030214665 objectReference: {fileID: 0} + - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.tarsus + value: + objectReference: {fileID: 685257250} + - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones._femurLength + value: 0.0019033396 + objectReference: {fileID: 0} - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: targetToBoneFemur.w value: 0.39405352 @@ -2214,7 +2339,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6889254 + value: 0.68892527 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x @@ -2222,11 +2347,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.007984172 + value: -0.00798374 objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.3463581 + value: -0.346358 objectReference: {fileID: 0} - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -2258,19 +2383,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.5119409 + value: 0.5119411 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.3287885 + value: 0.3287884 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.4640702 + value: 0.4640699 objectReference: {fileID: 0} - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.64378065 + value: -0.6437808 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -2286,52 +2411,60 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6799135 + value: 1 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.7332924 + value: -0.00000008940696 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.000000074505806 + value: -0.0000000745058 objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000007450581 + value: 0.00000004470348 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.65108824 + value: 0.6510881 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.41958734 + value: 0.41958737 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: -0.16263431 + value: -0.16263412 objectReference: {fileID: 0} - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: -0.61121243 + value: -0.6112128 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: -0.027075963 + value: -0.027076056 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: 0.71348995 + value: 0.71348983 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y - value: 0.6805388 + value: 0.6805389 objectReference: {fileID: 0} - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.1645173 + value: 0.16451746 objectReference: {fileID: 0} + - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.femur + value: + objectReference: {fileID: 1646234598} + - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.tibia + value: + objectReference: {fileID: 1530698552} - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: femurLength value: 0.0019033402 @@ -2340,6 +2473,14 @@ PrefabInstance: propertyPath: tibiaLength value: 0.0029819128 objectReference: {fileID: 0} + - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones.tarsus + value: + objectReference: {fileID: 1245228106} + - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones._femurLength + value: 0.001903339 + objectReference: {fileID: 0} - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: targetToBoneFemur.w value: 0.54446536 @@ -2370,11 +2511,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w - value: 0.26493794 + value: 0.2649379 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.x - value: -0.06449161 + value: -0.06449163 objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.y @@ -2382,7 +2523,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.z - value: 0.22755273 + value: 0.22755285 objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x @@ -2418,6 +2559,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} +--- !u!4 &1327786334 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} --- !u!1001 &1413549757 PrefabInstance: m_ObjectHideFlags: 0 @@ -2593,6 +2739,16 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1485508511} m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1530698552 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1646234598 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} --- !u!1 &1670418292 GameObject: m_ObjectHideFlags: 0 @@ -3957,6 +4113,11 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1854230099} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1868770260 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} --- !u!1001 &1880435925 PrefabInstance: m_ObjectHideFlags: 0 @@ -4027,6 +4188,16 @@ Transform: m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} m_PrefabInstance: {fileID: 1880435925} m_PrefabAsset: {fileID: 0} +--- !u!4 &1899152691 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1908370719 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} --- !u!1 &1953862409 GameObject: m_ObjectHideFlags: 0 @@ -4237,6 +4408,11 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1973137219} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &2045717234 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} --- !u!1001 &2063840326 PrefabInstance: m_ObjectHideFlags: 0 @@ -4307,6 +4483,11 @@ Transform: m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} m_PrefabInstance: {fileID: 2063840326} m_PrefabAsset: {fileID: 0} +--- !u!4 &2093857555 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + m_PrefabInstance: {fileID: 1282320487} + m_PrefabAsset: {fileID: 0} --- !u!1001 &5139621985762388695 PrefabInstance: m_ObjectHideFlags: 0 From 983b1e1c40e7680ee69e6578f794c8078b1d702c Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 14 Apr 2026 10:16:50 +0200 Subject: [PATCH 22/38] Fix match targets to legs --- .../Editor/Scripts/Insect/InsectRig_Editor.cs | 2 +- .../Editor/Scripts/TargetLeg_Editor.cs | 4 +-- .../Runtime/Scripts/Insect/InsectRig.cs | 12 +++---- CreatureControl/Runtime/Scripts/Leg.cs | 4 +++ CreatureControl/Runtime/Scripts/TargetLeg.cs | 35 ++++++++++++------- 5 files changed, 36 insertions(+), 21 deletions(-) diff --git a/CreatureControl/Editor/Scripts/Insect/InsectRig_Editor.cs b/CreatureControl/Editor/Scripts/Insect/InsectRig_Editor.cs index 2c77f04..09b3b02 100644 --- a/CreatureControl/Editor/Scripts/Insect/InsectRig_Editor.cs +++ b/CreatureControl/Editor/Scripts/Insect/InsectRig_Editor.cs @@ -13,7 +13,7 @@ namespace CreatureControl { insectRig.legLength = float.PositiveInfinity; foreach (TargetLeg leg in insectRig.legs) { - float legLength = leg.bones.length; + float legLength = leg.length; if (legLength > 0 && legLength < insectRig.legLength) insectRig.legLength = legLength; } diff --git a/CreatureControl/Editor/Scripts/TargetLeg_Editor.cs b/CreatureControl/Editor/Scripts/TargetLeg_Editor.cs index 9886259..7309e9c 100644 --- a/CreatureControl/Editor/Scripts/TargetLeg_Editor.cs +++ b/CreatureControl/Editor/Scripts/TargetLeg_Editor.cs @@ -25,7 +25,7 @@ namespace CreatureControl { base.OnInspectorGUI(); EditorGUI.BeginDisabledGroup(true); - EditorGUILayout.FloatField("Femur Length", targetLeg.bones.femurLength); + EditorGUILayout.FloatField("Femur Length", targetLeg.femurLength); EditorGUI.EndDisabledGroup(); } @@ -35,7 +35,7 @@ namespace CreatureControl { return 0; SerializedObject targetLegPrefabObj = new(prefabSource); - SerializedProperty targetBonesPrefabProp = targetLegPrefabObj.FindProperty(nameof(TargetLeg.bones)); + //SerializedProperty targetBonesPrefabProp = targetLegPrefabObj.FindProperty(nameof(TargetLeg.bones)); return 0; } diff --git a/CreatureControl/Runtime/Scripts/Insect/InsectRig.cs b/CreatureControl/Runtime/Scripts/Insect/InsectRig.cs index 378ced4..f258421 100644 --- a/CreatureControl/Runtime/Scripts/Insect/InsectRig.cs +++ b/CreatureControl/Runtime/Scripts/Insect/InsectRig.cs @@ -54,12 +54,12 @@ namespace CreatureControl { public float legLength; // smalled leg length public override void Pose() { - this.leftBackLeg.PoseLimb(); - this.leftMiddleLeg.PoseLimb(); - this.leftFrontLeg.PoseLimb(); - this.rightBackLeg.PoseLimb(); - this.rightMiddleLeg.PoseLimb(); - this.rightFrontLeg.PoseLimb(); + this.leftBackLeg.PoseTargetLimb(); + this.leftMiddleLeg.PoseTargetLimb(); + this.leftFrontLeg.PoseTargetLimb(); + this.rightBackLeg.PoseTargetLimb(); + this.rightMiddleLeg.PoseTargetLimb(); + this.rightFrontLeg.PoseTargetLimb(); } public override void MatchTo(Creature creature, ref bool somethingChanged) { diff --git a/CreatureControl/Runtime/Scripts/Leg.cs b/CreatureControl/Runtime/Scripts/Leg.cs index 03043b2..484d3f0 100644 --- a/CreatureControl/Runtime/Scripts/Leg.cs +++ b/CreatureControl/Runtime/Scripts/Leg.cs @@ -41,6 +41,10 @@ namespace CreatureControl { } public float length => femurLength + tibiaLength; + public void ResetLengths() { + _femurLength = 0; + _tibiaLength = 0; + } /// /// Check if all bones of the legs have been configured diff --git a/CreatureControl/Runtime/Scripts/TargetLeg.cs b/CreatureControl/Runtime/Scripts/TargetLeg.cs index ba2ba25..fccfaf4 100644 --- a/CreatureControl/Runtime/Scripts/TargetLeg.cs +++ b/CreatureControl/Runtime/Scripts/TargetLeg.cs @@ -9,6 +9,10 @@ namespace CreatureControl { public class TargetLeg : MonoBehaviour { public Leg bones; + public float length => bones.length; + public float femurLength => bones.femurLength; + public float tibiaLength => bones.tibiaLength; + public Transform target; // for the tarsus public Quaternion targetToBoneFemur; @@ -21,36 +25,45 @@ namespace CreatureControl { return; this.bones.femur.position = leg.femur.position; + this.bones.femur.LookAt(leg.tibia); + this.bones.tibia.position = leg.tibia.position; + this.bones.tibia.LookAt(leg.tarsus); + this.bones.tarsus.position = leg.tarsus.position; + bones.ResetLengths(); targetToBoneFemur = TargetRig.TargetToBoneRotation(leg.femur, leg.tibia); targetToBoneTibia = TargetRig.TargetToBoneRotation(leg.tibia, leg.tarsus); // Put the end-effector target for IK in a sensible place + // Vector3 targetPosition = this.bones.femur.position + 0.7f * this.bones.length * legDirection.normalized; + Vector3 targetPosition = leg.tarsus.position; Vector3 legDirection = (this.bones.tarsus.position - this.bones.femur.position).normalized; - Vector3 targetPosition = this.bones.femur.position + 0.7f * this.bones.length * legDirection.normalized; Quaternion targetRotation = Quaternion.LookRotation(legDirection); + this.target.SetPositionAndRotation(targetPosition, targetRotation); this.target.localPosition = new(this.target.localPosition.x, 0, this.target.localPosition.z); + + PoseTargetLimb(); + UpdateBones(leg); } /// /// Pose the target limb /// - public void PoseLimb() { + public void PoseTargetLimb() { if (target == null) return; if (bones.femur == null || bones.tibia == null || bones.tarsus == null) return; Quaternion femurOrientation = FemurRotation(target.position); + this.bones.femur.rotation = femurOrientation; Quaternion tibiaOrientation = TibiaRotation(target.position); + this.bones.tibia.rotation = tibiaOrientation; Quaternion tarsusOrientation = TarsusRotation(target.rotation); - - bones.femur.rotation = femurOrientation; - bones.tibia.rotation = tibiaOrientation; - bones.tarsus.rotation = tarsusOrientation; + this.bones.tarsus.rotation = tarsusOrientation; } public void UpdateBones(Leg leg) { @@ -63,10 +76,8 @@ namespace CreatureControl { return Quaternion.identity; Vector3 toTarget = targetPosition - this.bones.femur.position; - // Debug.DrawRay(femur.position, toTarget, Color.magenta); + // Debug.DrawRay(bones.femur.position, toTarget, Color.magenta); float targetDistance = toTarget.magnitude; - float femurLength = Vector3.Distance(this.bones.femur.position, this.bones.tibia.position); - float tibiaLength = Vector3.Distance(this.bones.tibia.position, this.bones.tarsus.position); float hipAngle = CosineRule(targetDistance, femurLength, tibiaLength); // NaN happens when the distance to the footTarget is longer than the length of the leg @@ -76,8 +87,8 @@ namespace CreatureControl { Quaternion femurOrientation = Quaternion.LookRotation(toTarget, Vector3.up); femurOrientation = Quaternion.AngleAxis(hipAngle, femurOrientation * Vector3.left) * femurOrientation; - // Debug.DrawRay(femur.position, femurOrientation * Vector3.forward, Color.blue); - // Debug.DrawRay(femur.position, femurOrientation * Vector3.up, Color.green); + // Debug.DrawRay(bones.femur.position, femurOrientation * Vector3.forward, Color.blue); + // Debug.DrawRay(bones.femur.position, femurOrientation * Vector3.up, Color.green); return femurOrientation; } @@ -137,7 +148,7 @@ namespace CreatureControl { if (bones.tibia != null && this.bones.tarsus != null) Gizmos.DrawLine(this.bones.tibia.position, this.bones.tarsus.position); - PoseLimb(); + PoseTargetLimb(); } #endregion Scene From 4ae9a15fc61f386b96ce0f7b440780f562d7dc68 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Thu, 23 Apr 2026 15:22:02 +0200 Subject: [PATCH 23/38] Squashed 'NanoBrain/' changes from 832d849..cc9a845 cc9a845 Fix sleeping for product combinator e4ba7f8 Better cross-cluster monitoring 4f8a6ab Improved (but not fixed) cross-cluster monitoring b12616b Fix neuron output visualisation 96439cc Visualize all outputs d583e67 WIP cluster references/instance 04bab92 Fix links to multiple cluster neurons & cleanup e17a249 Cross-cluster editor links 0ab2d21 Migrating and cleaning up b6630ad First steps to using instanceCount for clusters 8801fa2 Cluster reimport fixes befb69d full graph with collapsed clusters 1a1919f Fix expansion of clsuter arrays c708f4d Improved clusterarray support c2e4e1b Fix Cluster array extension 02047a4 Adde full graph scrollbar 471ed36 Completed full graph integration 830e3e7 Added full graph view mode 249e888 Improve full graph view 308a6a1 The Entities are battling 75d9d1c Cleanup c8f0f0c Fix aging of neurons e2e169c small fixes 619ced6 Removed the use of Receptors 19f9296 Simplifications bc0a796 Integrated clusterarray in cluster e40dd23 Fixed clusterViewer for clusterarrays b0f4b41 Status quo adding clusterArrays 1fc75a8 Added ClusterArray 0023920 Cover seeking(-ish) behaviour 1c7b8e7 Added Tanh Activation a99d40c BrainViewer added db43655 Pew pew! 18ef4cd Merge commit '89017475984bbbf1899fb38846c5bb0e7775dedd' into NanoBrain git-subtree-dir: NanoBrain git-subtree-split: cc9a845b643ffb4a9abe4f7da787ac5c5b14dae8 --- Editor/BrainEditorWindow.cs | 369 ----- Editor/BrainEditorWindow.cs.meta | 2 - Editor/Brain_Editor.cs | 73 + ...in_Editor.cs.meta => Brain_Editor.cs.meta} | 0 Editor/ClusterEditor.cs | 632 +++++++++ ...nspector.cs.meta => ClusterEditor.cs.meta} | 0 Editor/ClusterInspector.cs | 1076 -------------- Editor/ClusterViewer.cs | 950 +++++++++++++ Editor/ClusterViewer.cs.meta | 2 + Editor/DAGWindow.cs | 356 ----- Editor/DAGWindow.cs.meta | 2 - Editor/NanoBrain_Editor.cs | 53 - LinearAlgebra.meta | 8 + LinearAlgebra/src.meta | 8 + LinearAlgebra/test.meta | 8 + Runtime/Scripts/Brain.cs | 17 +- Runtime/Scripts/Core/Cluster.cs | 1247 ++++++++++------- Runtime/Scripts/Core/ClusterReceptor.cs | 277 ---- Runtime/Scripts/Core/ClusterReceptor.cs.meta | 2 - Runtime/Scripts/Core/IReceptor.cs | 123 -- Runtime/Scripts/Core/IReceptor.cs.meta | 2 - Runtime/Scripts/Core/Neuron.cs | 143 +- Runtime/Scripts/Core/Nucleus.cs | 13 +- Runtime/Scripts/Core/NucleusArray.cs | 197 --- Runtime/Scripts/Core/NucleusArray.cs.meta | 2 - Runtime/Scripts/Core/Receptor.cs | 113 -- Runtime/Scripts/Core/Receptor.cs.meta | 2 - Runtime/Scripts/Core/Synapse.cs | 6 + .../ScriptableObjects/ClusterPrefab.cs | 1 + 29 files changed, 2562 insertions(+), 3122 deletions(-) delete mode 100644 Editor/BrainEditorWindow.cs delete mode 100644 Editor/BrainEditorWindow.cs.meta create mode 100644 Editor/Brain_Editor.cs rename Editor/{NanoBrain_Editor.cs.meta => Brain_Editor.cs.meta} (100%) create mode 100644 Editor/ClusterEditor.cs rename Editor/{ClusterInspector.cs.meta => ClusterEditor.cs.meta} (100%) delete mode 100644 Editor/ClusterInspector.cs create mode 100644 Editor/ClusterViewer.cs create mode 100644 Editor/ClusterViewer.cs.meta delete mode 100644 Editor/DAGWindow.cs delete mode 100644 Editor/DAGWindow.cs.meta delete mode 100644 Editor/NanoBrain_Editor.cs create mode 100644 LinearAlgebra.meta create mode 100644 LinearAlgebra/src.meta create mode 100644 LinearAlgebra/test.meta delete mode 100644 Runtime/Scripts/Core/ClusterReceptor.cs delete mode 100644 Runtime/Scripts/Core/ClusterReceptor.cs.meta delete mode 100644 Runtime/Scripts/Core/IReceptor.cs delete mode 100644 Runtime/Scripts/Core/IReceptor.cs.meta delete mode 100644 Runtime/Scripts/Core/NucleusArray.cs delete mode 100644 Runtime/Scripts/Core/NucleusArray.cs.meta delete mode 100644 Runtime/Scripts/Core/Receptor.cs delete mode 100644 Runtime/Scripts/Core/Receptor.cs.meta diff --git a/Editor/BrainEditorWindow.cs b/Editor/BrainEditorWindow.cs deleted file mode 100644 index 195ac6a..0000000 --- a/Editor/BrainEditorWindow.cs +++ /dev/null @@ -1,369 +0,0 @@ -using UnityEngine; -using UnityEditor; -using System.Collections.Generic; -using System.Linq; - -namespace NanoBrain { - - // Simple DAG data model - [System.Serializable] - public class DagNode { - public int id; - public string title; - public Vector2 position; - public float radius = 20f; // circle radius - } - - [System.Serializable] - public class DagEdge { - public int fromId; - public int toId; - } - - public class BrainEditorWindow : EditorWindow { - readonly List nodes = new(); - readonly List edges = new(); - - Vector2 pan = Vector2.zero; - float zoom = 1.0f; - const float minZoom = 0.5f; - const float maxZoom = 2.0f; - - // Vector2 dragStart; - // bool draggingNode = false; - // int draggingNodeId = -1; - - private readonly System.Type acceptedType = typeof(ClusterPrefab); - - [MenuItem("Window/Brain Viewer")] - public static void ShowWindow() { - var w = GetWindow("Brain Viewer"); - w.minSize = new Vector2(500, 300); - } - - void OnEnable() { - // if (nodes.Count == 0) - // CreateSampleGraph(); - - - // Register callback so window updates when selection changes - Selection.selectionChanged += OnSelectionChanged; - RefreshSelection(); - ComputeLeftToRightLayout(); - } - - private void OnDisable() { - Selection.selectionChanged -= OnSelectionChanged; - } - - private void OnSelectionChanged() { - RefreshSelection(); - ComputeLeftToRightLayout(); - Repaint(); - } - - private void RefreshSelection() { - ClusterPrefab prefab = Selection.activeObject as ClusterPrefab; - if (prefab != null && acceptedType.IsAssignableFrom(prefab.GetType())) { - GenerateGraph(prefab); - } - } - - private void GenerateGraph(ClusterPrefab prefab) { - nodes.Clear(); - edges.Clear(); - - int ix = 0; - foreach (Nucleus nucleus in prefab.nuclei) { - nodes.Add(new DagNode() { id = ix, title = nucleus.name }); - if (nucleus is Neuron neuron) { - foreach (Nucleus receiver in neuron.receivers) { - int receiverIx = prefab.GetNucleusIndex(receiver); - edges.Add(new DagEdge() { fromId = ix, toId = receiverIx }); - } - } - ix++; - } - } - - - // void CreateSampleGraph() { - // nodes.Clear(); - // edges.Clear(); - - // nodes.Add(new DagNode() { id = 0, title = "In1" }); - // nodes.Add(new DagNode() { id = 1, title = "In2" }); - // nodes.Add(new DagNode() { id = 2, title = "A" }); - // nodes.Add(new DagNode() { id = 3, title = "B" }); - // nodes.Add(new DagNode() { id = 4, title = "C" }); - // nodes.Add(new DagNode() { id = 5, title = "Out1" }); - // nodes.Add(new DagNode() { id = 6, title = "Out2" }); - - // edges.Add(new DagEdge() { fromId = 0, toId = 2 }); - // edges.Add(new DagEdge() { fromId = 1, toId = 2 }); - // edges.Add(new DagEdge() { fromId = 2, toId = 3 }); - // edges.Add(new DagEdge() { fromId = 2, toId = 4 }); - // edges.Add(new DagEdge() { fromId = 3, toId = 5 }); - // edges.Add(new DagEdge() { fromId = 4, toId = 6 }); - // } - - void OnGUI() { - HandleInput(); - - Rect rect = new(0, 0, position.width, position.height); - EditorGUI.DrawRect(rect, new Color(0.11f, 0.11f, 0.11f)); - - // compute window center - Vector2 windowCenter = new(position.width / 2f, position.height / 2f); - - // compute graph bounds center (in graph space) - Rect bounds = GetGraphBounds(); - Vector2 graphCenter = bounds.center; - - // compute autoPan that recenters the graph (does not modify node positions) - Vector2 autoPan = -graphCenter; // moves graph center to origin - // total translation = windowCenter + autoPan + user pan - Matrix4x4 oldMatrix = GUI.matrix; - GUI.matrix = Matrix4x4.TRS(windowCenter + autoPan + pan, Quaternion.identity, Vector3.one * zoom) * - Matrix4x4.TRS(-windowCenter, Quaternion.identity, Vector3.one); - - - // Draw edges first - foreach (DagEdge e in edges) { - DagNode from = GetNodeById(e.fromId); - DagNode to = GetNodeById(e.toId); - if (from == null || to == null) continue; - DrawEdgeCircleNodes(from, to); - } - - // Draw nodes (circles) - foreach (DagNode n in nodes) - DrawNucleus(n); - - GUI.matrix = oldMatrix; - - // Footer toolbar - GUILayout.FlexibleSpace(); - EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); - if (GUILayout.Button("Fit", EditorStyles.toolbarButton)) FitToView(); - if (GUILayout.Button("Layout LR", EditorStyles.toolbarButton)) ComputeLeftToRightLayout(); - EditorGUILayout.EndHorizontal(); - } - - void HandleInput() { - Event e = Event.current; - - // Zoom with scroll - if (e.type == EventType.ScrollWheel) { - float oldZoom = zoom; - float delta = -e.delta.y * 0.01f; - zoom = Mathf.Clamp(zoom + delta, minZoom, maxZoom); - Vector2 mouse = e.mousePosition; - pan += (mouse - new Vector2(position.width / 2, position.height / 2)) * (1 - zoom / oldZoom); - e.Use(); - } - - // Pan with middle or right+ctrl drag - if (e.type == EventType.MouseDrag && (e.button == 2 || (e.button == 1 && e.control))) { - pan += e.delta; - e.Use(); - } - } - - DagNode GetNodeById(int id) => nodes.FirstOrDefault(x => x.id == id); - List GetIncomingEdges(DagNode node) { - List incoming = new(); - foreach (DagEdge e in edges) { - if (e.toId == node.id) - incoming.Add(e); - } - return incoming; - } - List GetOutgoingEdges(DagNode node) { - List outgoing = new(); - foreach (DagEdge e in edges) { - if (e.fromId == node.id) - outgoing.Add(e); - } - return outgoing; - } - - void DrawNucleus(DagNode n) { - Vector3 position = n.position; - - Handles.color = Color.white * 0.9f; - Handles.DrawSolidDisc(n.position, Vector3.forward, n.radius); - - if (GetIncomingEdges(n).Count == 0) - DrawArrowHead(n.position - new Vector2(n.radius + 10, 0), n.position - new Vector2(n.radius + 5, 0), 10f / zoom, 12f / zoom, Color.white); - if (GetOutgoingEdges(n).Count == 0) - DrawArrowHead(n.position + new Vector2(n.radius + 10, 0), n.position + new Vector2(n.radius + 15, 0), 10f / zoom, 12f / zoom, Color.white); - - Handles.color = Color.white; - GUIStyle style = new(EditorStyles.label) { - alignment = TextAnchor.UpperCenter, - normal = { textColor = Color.white }, - fontStyle = FontStyle.Bold, - }; - Vector3 labelPos = position - Vector3.down * (n.radius + 10f); // below disc along up axis - Handles.Label(labelPos, n.title, style); - } - - void DrawEdgeCircleNodes(DagNode from, DagNode to) { - Vector2 a = from.position; - Vector2 b = to.position; - if (a == b) return; - - Handles.color = Color.white * 0.9f; - Handles.DrawLine(from.position, to.position); - - // Vector2 dir = (b - a).normalized; - // Vector2 start = a + dir * from.radius; - // Vector2 end = b - dir * to.radius; - - //DrawArrowHead(end - dir * 2f, end, 10f / zoom, 12f / zoom, Color.white); - - } - - void DrawArrowHead(Vector2 from, Vector2 to, float headWidth, float headLength, Color color) { - Vector2 dir = (to - from).normalized; - if (dir == Vector2.zero) return; - Vector2 right = new Vector2(-dir.y, dir.x); - - Vector3 p1 = to; - Vector3 p2 = to - dir * headLength + right * headWidth * 0.5f; - Vector3 p3 = to - dir * headLength - right * headWidth * 0.5f; - - Handles.color = color; - Handles.DrawAAConvexPolygon(p1, p2, p3); - } - - // Left-to-right layered layout (sources on the left, sinks on the right) - void ComputeLeftToRightLayout() { - // build adjacency and indegree - var adj = nodes.ToDictionary(n => n.id, n => new List()); - var indeg = nodes.ToDictionary(n => n.id, n => 0); - foreach (var e in edges) { - if (!adj.ContainsKey(e.fromId) || !adj.ContainsKey(e.toId)) continue; - adj[e.fromId].Add(e.toId); - indeg[e.toId]++; - } - - // Kahn's algorithm to compute topological layers (horizontal layers) - Dictionary layer = new(); - Queue q = new(indeg.Where(kv => kv.Value == 0).Select(kv => kv.Key)); - foreach (var id in q) layer[id] = 0; - - while (q.Count > 0) { - int u = q.Dequeue(); - int l = layer[u]; - foreach (var v in adj[u]) { - // prefer placing v at least one layer after u - if (!layer.ContainsKey(v) || layer[v] < l + 1) layer[v] = l + 1; - indeg[v]--; - if (indeg[v] == 0) q.Enqueue(v); - } - } - - // Any unreachable nodes -> assign next layers - int maxLayer = layer.Count > 0 ? layer.Values.Max() : 0; - foreach (var n in nodes) { - if (!layer.ContainsKey(n.id)) { - maxLayer++; - layer[n.id] = maxLayer; - } - } - - // Group nodes by layer (left to right) - var layers = layer.GroupBy(kv => kv.Value).OrderBy(g => g.Key).Select(g => g.Select(x => x.Key).ToList()).ToList(); - - // Layout parameters (horizontal spacing drives left->right) - float hSpacing = 150f; - float vSpacing = 100f; - - // Place nodes: x increases with layer index, y spaced within layer - for (int li = 0; li < layers.Count; li++) { - var lst = layers[li]; - float totalHeight = (lst.Count - 1) * vSpacing; - for (int i = 0; i < lst.Count; i++) { - int id = lst[i]; - var n = GetNodeById(id); - if (n == null) continue; - float x = hSpacing + li * hSpacing; - float y = 400 - totalHeight / 2f + i * vSpacing; - // Debug.Log($"({li}, {i}) -> {x}, {y}"); - n.position = new Vector2(x, y); - } - } - - Repaint(); - } - - void FitToView() { - if (nodes.Count == 0) return; - // compute bounds including radii - Rect bounds = new Rect(nodes[0].position - Vector2.one * nodes[0].radius, Vector2.one * nodes[0].radius * 2f); - foreach (var n in nodes) - bounds = RectUnion(bounds, new Rect(n.position - Vector2.one * n.radius, Vector2.one * n.radius * 2f)); - - // center graph at origin (0,0) then set pan so it appears centered in window - Vector2 graphCenter = bounds.center; - // move nodes so center is at origin - for (int i = 0; i < nodes.Count; i++) - nodes[i].position -= graphCenter; - - // reset pan/zoom so centered - pan = Vector2.zero; - zoom = 1.0f; - Repaint(); - } - - - static Rect RectUnion(Rect a, Rect b) { - float xMin = Mathf.Min(a.xMin, b.xMin); - float xMax = Mathf.Max(a.xMax, b.xMax); - float yMin = Mathf.Min(a.yMin, b.yMin); - float yMax = Mathf.Max(a.yMax, b.yMax); - return Rect.MinMaxRect(xMin, yMin, xMax, yMax); - } - - Vector2 ScreenToGraph_old(Vector2 screenPos) { - Vector2 origin = new Vector2(position.width / 2, position.height / 2); - // invert the GUI.matrix transform (approx for current simple transforms) - return (screenPos - (origin + pan)) / zoom + origin * (1 - 1 / zoom); - } - Vector2 ScreenToGraph(Vector2 screenPos) { - Vector2 windowCenter = new Vector2(position.width / 2f, position.height / 2f); - Rect bounds = GetGraphBounds(); - Vector2 graphCenter = bounds.center; - Vector2 autoPan = -graphCenter; - // inverse of: screen -> translate by -(windowCenter+autoPan+pan), scale by 1/zoom, translate by windowCenter - return (screenPos - (windowCenter + autoPan + pan)) / zoom + windowCenter; - } - - - Rect GetGraphBounds() { - if (nodes == null || nodes.Count == 0) return new Rect(Vector2.zero, Vector2.one); - Rect bounds = new( - nodes[0].position - Vector2.one * nodes[0].radius, - 2f * nodes[0].radius * Vector2.one); - foreach (var n in nodes) - bounds = RectUnion(bounds, - new Rect(n.position - Vector2.one * n.radius, 2f * n.radius * Vector2.one)); - return bounds; - } - - - - int HitTestNode(Vector2 graphPos) { - // returns node id under point or -1 - for (int i = nodes.Count - 1; i >= 0; i--) { - var n = nodes[i]; - if ((graphPos - n.position).sqrMagnitude <= n.radius * n.radius) return n.id; - } - return -1; - } - - } - -} \ No newline at end of file diff --git a/Editor/BrainEditorWindow.cs.meta b/Editor/BrainEditorWindow.cs.meta deleted file mode 100644 index 5d8b61f..0000000 --- a/Editor/BrainEditorWindow.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: f041740900808273ab006e7d276a78e9 diff --git a/Editor/Brain_Editor.cs b/Editor/Brain_Editor.cs new file mode 100644 index 0000000..6a9e654 --- /dev/null +++ b/Editor/Brain_Editor.cs @@ -0,0 +1,73 @@ +using UnityEditor; +using UnityEditor.UIElements; + +using UnityEngine; +using UnityEngine.UIElements; + +namespace NanoBrain { + + [CustomEditor(typeof(Brain))] + public class Brain_Editor : Editor { + protected static VisualElement mainContainer; + protected static VisualElement inspectorContainer; + + public Brain component; + private SerializedProperty brainProp; + + public void OnEnable() { + component = target as Brain; + + if (Application.isPlaying == false && serializedObject != null) { + string propertyName = nameof(Brain.brainPrefab); + brainProp = serializedObject.FindProperty(propertyName); + } + } + + public override VisualElement CreateInspectorGUI() { + + if (Application.isPlaying == false) + serializedObject.Update(); + + + VisualElement root = new() { + style = { + paddingLeft = 0, + paddingRight = 0, + paddingTop = 0, + paddingBottom = 0 + } + }; + root.styleSheets.Add(Resources.Load("GraphStyles")); + + PropertyField brainField = new(brainProp) { + label = "Cluster Prefab" + }; + root.Add(brainField); + + CreateViewer(root, component.brain, component.gameObject); + + if (Application.isPlaying == false) + serializedObject.ApplyModifiedProperties(); + return root; + } + + public ClusterViewer.GraphView CreateViewer(VisualElement root, Cluster cluster, GameObject gameObject) { + VisualElement mainContainer = new() { + style = { + flexDirection = FlexDirection.Row, + minHeight = 450 + } + }; + ClusterViewer.GraphView graph = new(cluster); + graph.style.flexGrow = 1; + + mainContainer.Add(graph); + root.Add(mainContainer); + + graph.SetGraph(gameObject); + + return graph; + } + } + +} \ No newline at end of file diff --git a/Editor/NanoBrain_Editor.cs.meta b/Editor/Brain_Editor.cs.meta similarity index 100% rename from Editor/NanoBrain_Editor.cs.meta rename to Editor/Brain_Editor.cs.meta diff --git a/Editor/ClusterEditor.cs b/Editor/ClusterEditor.cs new file mode 100644 index 0000000..1498a79 --- /dev/null +++ b/Editor/ClusterEditor.cs @@ -0,0 +1,632 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEditor; + +using UnityEngine; +using UnityEngine.UIElements; + +namespace NanoBrain { + + [CustomEditor(typeof(ClusterPrefab))] + public class ClusterEditor : ClusterViewer { + + public override VisualElement CreateInspectorGUI() { + ClusterPrefab prefab = target as ClusterPrefab; + if (prefab != null) + prefab.EnsureInitialization(); + + serializedObject.Update(); + + VisualElement root = new(); + CreateEditor(root, prefab, null); + + serializedObject.ApplyModifiedProperties(); + return root; + } + + public GraphView CreateEditor(VisualElement root, ClusterPrefab cluster, GameObject gameObject) { + root.style.paddingLeft = 0; + root.style.paddingRight = 0; + root.style.paddingTop = 0; + root.style.paddingBottom = 0; + + root.styleSheets.Add(Resources.Load("GraphStyles")); + + VisualElement mainContainer = new() { + style = { + flexDirection = FlexDirection.Row, + } + }; + GraphEditor graphContainer = new(cluster); + graphContainer.style.flexShrink = 0; + graphContainer.style.width = 300; + graphContainer.style.overflow = Overflow.Hidden; + + VisualElement inspectorContainer = new() { + name = "inspector", + style = { + minHeight = 450, + width = 300, + flexGrow = 0, + flexDirection = FlexDirection.Row, + } + }; + + mainContainer.Add(graphContainer); + mainContainer.Add(inspectorContainer); + root.Add(mainContainer); + + graphContainer.SetGraph(gameObject, inspectorContainer); + + return graphContainer; + } + + public class GraphEditor : GraphView { + + protected ClusterPrefab prefab; + + public GraphEditor(ClusterPrefab prefab) : base(prefab.output.parent) { + this.prefab = prefab; + + // In a Prefab editor, no instance exists but we need it for the ClusterViewer. + // So we create a temporary instance + Cluster cluster = new(prefab); + this.currentCluster = cluster; + + Button addButton = new(() => OnAddClusterOutput()) { + text = "Add" + }; + topMenuContainer?.Add(addButton); + + Add(topMenuContainer); + } + + void OnAddClusterOutput() { + Nucleus newOutput = new Neuron(this.prefab, "New Output"); + this.prefab.RefreshOutputs(); + outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList(); + outputsPopup.value = newOutput.name; + + this.currentNucleus = newOutput; + } + + public void SetGraph(GameObject gameObject, VisualElement inspectorContainer) { + this.gameObject = gameObject; + + if (Application.isPlaying == false) + this.serializedBrain = new SerializedObject(this.prefab); + this.selectedOutput = this.currentCluster.outputs[0]; + this.currentNucleus = this.selectedOutput; + //this.currentCluster = this.currentNucleus.parent; + Rebuild(inspectorContainer); + // if (outputsPopup != null) + // OnOutputChanged(outputsPopup.choices[0]); + } + + private void Rebuild(VisualElement inspectorContainer) { + + if (this.currentNucleus == null) { + inspectorContainer.Clear(); + return; + } + + string path = AssetDatabase.GetAssetPath(this.prefab); // or known path + this.prefabAsset = AssetDatabase.LoadAssetAtPath(path); + if (this.prefabAsset == null) { + // create in memory save if it doesn't exist + this.prefabAsset = CreateInstance(); + //Debug.LogError("Cluster Prefab is not found on disk"); + } + // DrawInspector(inspectorContainer); + if (inspectorContainer == null) + return; + + inspectorContainer.Clear(); + if (this.currentNucleus == null) + return; + + // create a SerializedObject wrapper so Unity inspector controls work (and Undo) + SerializedObject so = new(prefabAsset); + + foreach (Nucleus nucleus in this.prefab.nuclei) { + nucleus.Initialize(); + } + + this.inspectorIMGUIContainer = new IMGUIContainer(() => InspectorHandler(so)); + + inspectorContainer.Add(inspectorIMGUIContainer); + } + + #region Inspector + + private VisualElement inspectorIMGUIContainer; + private bool showSynapses = true; + private bool showActivation = true; + protected bool breakOnWake = false; + protected bool trace = false; + + void InspectorHandler(SerializedObject serializedObject) { + bool anythingChanged = false; + + if (serializedObject == null || serializedObject.targetObject == null) + return; + + if (this.currentNucleus == null) + return; + + serializedObject.Update(); + + GUIStyle headerStyle = new(EditorStyles.boldLabel) { + alignment = TextAnchor.MiddleLeft, + margin = new RectOffset(10, 0, 4, 4) + }; + GUIStyle boldTextFieldStyle = new(EditorStyles.textField) { + fontStyle = FontStyle.Bold + }; + + // Nucleus type + string nucleusType = this.currentNucleus.GetType().Name; + GUILayout.Label(nucleusType, headerStyle); + + // Nucleus name + if (this.currentNucleus.parent is Cluster parentCluster) { + EditorGUILayout.BeginHorizontal(); + if (GUILayout.Button(this.currentNucleus.parent.name)) + OnClusterClick(parentCluster); + EditorGUI.BeginDisabledGroup(true); + EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); + EditorGUI.EndDisabledGroup(); + if (GUILayout.Button("Reimport")) + ReimportCluster(parentCluster); + EditorGUILayout.EndHorizontal(); + } + else { + string newName = EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); + if (newName != this.currentNucleus.name) { + this.currentNucleus.name = newName; + this.prefab.RefreshOutputs(); + outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList(); + anythingChanged = true; + } + } + + // Current output value + if (Application.isPlaying) { + if (currentNucleus is Neuron currentNeuron1) { + GUIContent nameLabel = new("Output", currentNeuron1.outputValue.ToString()); + EditorGUILayout.FloatField(nameLabel, currentNeuron1.outputMagnitude); + } + else + EditorGUILayout.LabelField(" "); + } + else + EditorGUILayout.LabelField(" "); + + // Memory cell + if (this.currentNucleus is MemoryCell memory) + MemoryCellInspector(memory, ref anythingChanged); + // Cluster + else if (this.currentNucleus is Cluster cluster) + ClusterInspector(cluster, ref anythingChanged); + // Other + else + NucleusInspector(this.currentNucleus, ref anythingChanged); + + if (GUILayout.Button("Delete")) + DeleteNucleus(this.currentNucleus); + + serializedObject.ApplyModifiedProperties(); + if (anythingChanged) { + EditorUtility.SetDirty(prefabAsset); + AssetDatabase.SaveAssets(); + } + } + + protected void MemoryCellInspector(MemoryCell memoryCell, ref bool anythingChanged) { + memoryCell.staticMemory = EditorGUILayout.Toggle("Static Memory", memoryCell.staticMemory); + NucleusInspector(memoryCell, ref anythingChanged); + } + + protected void ClusterInspector(Cluster cluster, ref bool anythingChanged) { + EditorGUILayout.BeginHorizontal(); + + int instanceCount = cluster.instanceCount; + if (instanceCount <= 1) { + if (cluster.siblingClusters != null && cluster.siblingClusters.Length > 1) + instanceCount = cluster.siblingClusters.Count(); + else + instanceCount = 1; + } + EditorGUILayout.IntField("Instances", instanceCount, GUILayout.MinWidth(150)); + + if (GUILayout.Button("Add")) { + Undo.RecordObject(prefabAsset, "Array add " + prefabAsset.name); + //cluster.AddInstance(this.prefab); + cluster.AddInstance(); + anythingChanged = true; + } + if (GUILayout.Button("Del")) { + Undo.RecordObject(prefabAsset, "Array delete " + prefabAsset.name); + cluster.RemoveInstance(); + anythingChanged = true; + } + EditorGUILayout.EndHorizontal(); + + if (GUILayout.Button("Reimport Cluster")) + ReimportCluster(cluster); + } + + protected void NucleusInspector(Nucleus nucleus, ref bool anythingChanged) { + SynapsesInspector(ref anythingChanged); + ActivationInspector(ref anythingChanged); + + EditorGUILayout.Space(); + breakOnWake = EditorGUILayout.Toggle("Break on wake", breakOnWake); + if (breakOnWake && this.currentNucleus is Neuron currentNeuron) { + if (currentNeuron.isSleeping == false) + Debug.Break(); + } + trace = EditorGUILayout.Toggle("Trace", trace); + this.currentNucleus.trace = trace; + } + + protected void SynapsesInspector(ref bool anythingChanged) { + showSynapses = EditorGUILayout.BeginFoldoutHeaderGroup(showSynapses, "Synapses"); + if (showSynapses) { + if (this.currentNucleus is Neuron neuron2) { + Neuron.CombinatorType newCombinator = (Neuron.CombinatorType)EditorGUILayout.EnumPopup("Combinator", neuron2.combinator); + anythingChanged |= newCombinator != neuron2.combinator; + neuron2.combinator = newCombinator; + } + + EditorGUIUtility.wideMode = true; + float previousLabelWidth = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 100; + + Vector3 newBias = EditorGUILayout.Vector3Field("Bias", this.currentNucleus.bias); + anythingChanged |= newBias != this.currentNucleus.bias; + this.currentNucleus.bias = newBias; + EditorGUIUtility.labelWidth = previousLabelWidth; + + Nucleus[] array = null; + int elementIx = -1; + if (this.currentNucleus.synapses.Count > 0) { + Synapse[] synapses = this.currentNucleus.synapses.ToArray(); + foreach (Synapse synapse in synapses) { + if (synapse.neuron == null) + continue; + + if (array != null) { + if (synapse.neuron.parent is Cluster iCluster && elementIx > 0) { + int thisElementIx = Cluster.GetNucleusIndex(iCluster.clusterNuclei, synapse.neuron); + if (thisElementIx == elementIx) + continue; + else + elementIx = thisElementIx; + } + if (array.Contains(synapse.neuron)) + continue; + else if (array.Contains(synapse.neuron.parent)) + continue; + } + else { + if (synapse.neuron.parent is Cluster iReceptor) { + array = iReceptor.siblingClusters; + if (iReceptor is Cluster iCluster) + elementIx = Cluster.GetNucleusIndex(iCluster.clusterNuclei, synapse.neuron); + } + } + + EditorGUILayout.Space(); + + if (Application.isPlaying) { + if (synapse.neuron is Neuron synapseNeuron) { + Vector3 value = synapseNeuron.outputValue * synapse.weight; + GUIContent synapseValueLabel = new(synapse.neuron.name, synapseNeuron.outputValue.ToString()); + EditorGUILayout.FloatField(synapseValueLabel, synapseNeuron.outputMagnitude); + } + } + else { + EditorGUILayout.BeginHorizontal(); + + if (synapse.neuron.clusterPrefab != this.currentNucleus.clusterPrefab) { + // If it is a cluster + GUIStyle labelStyle = new(GUI.skin.label); + float labelWidth = 200; + if (synapse.neuron.clusterPrefab != null) { + labelWidth = labelStyle.CalcSize(new GUIContent($"{synapse.neuron.clusterPrefab.name}.")).x; + GUILayout.Label($"{synapse.neuron.clusterPrefab.name}", GUILayout.Width(labelWidth)); + } + //string[] options = synapse.neuron.parent.clusterNuclei.Select(n => n.name).ToArray(); + string[] options = synapse.neuron.clusterPrefab.nuclei.Select(n => n.name).ToArray(); + int selectedIndex = System.Array.IndexOf(options, synapse.neuron.name); + int newIndex = EditorGUILayout.Popup(selectedIndex, options); + // if (newIndex != selectedIndex && synapse.neuron.clusterPrefab.nuclei[newIndex] is Neuron newNeuron) + // ChangeSynapse(synapse, newNeuron); + if (newIndex != selectedIndex) { + // It shall be ensured that the parent.clusterNuclei and + // clusterPrefab.nuclei contain the same neurons in the same order.... + Nucleus selectedNucleus = synapse.neuron.parent.clusterNuclei[newIndex]; + Neuron newNeuron = selectedNucleus as Neuron; + ChangeSynapse(synapse, newNeuron); + } + } + else + GUILayout.Label(synapse.neuron.name); + + bool disconnecting = GUILayout.Button("Disconnect", GUILayout.Width(80)); + if (disconnecting && synapse.neuron is Neuron synapseNeuron) { + synapseNeuron.RemoveReceiver(this.currentNucleus); + this.prefab.GarbageCollection(); + anythingChanged = true; + } + EditorGUILayout.EndHorizontal(); + + } + + EditorGUI.indentLevel++; + float newWeight = EditorGUILayout.FloatField("Weight", synapse.weight); + if (newWeight != synapse.weight) { + // if (synapse.neuron.parent is IReceptor receptor) { + // Nucleus[] receptorArray = receptor.nucleiArray; + // foreach (Synapse s in this.currentNucleus.synapses) { + // if (s.neuron.parent is IReceptor r && r.nucleiArray == receptorArray) + // s.weight = newWeight; + // } + // } + // else + synapse.weight = newWeight; + anythingChanged = true; + } + EditorGUI.indentLevel--; + } + } + + EditorGUILayout.Space(); + anythingChanged |= ConnectNucleus(this.prefab, this.currentNucleus); + anythingChanged |= AddSynapse(this.prefab, this.currentNucleus); + } + EditorGUILayout.EndFoldoutHeaderGroup(); + } + + protected void ActivationInspector(ref bool anythingChanged) { + EditorGUILayout.Space(); + showActivation = EditorGUILayout.BeginFoldoutHeaderGroup(showActivation, "Activation"); + if (showActivation) { + if (this.currentNucleus is Neuron neuron) { + if (this.currentNucleus is not MemoryCell) { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Activation Curve", GUILayout.MinWidth(60)); + if (neuron.curveMax > 0) + EditorGUILayout.CurveField(neuron.curve, Color.cyan, new Rect(0, 0, 1, neuron.curveMax), GUILayout.Width(40)); + else + EditorGUILayout.CurveField(neuron.curve, Color.cyan, new Rect(0, neuron.curveMax, 1, -neuron.curveMax), GUILayout.Width(40)); + Neuron.ActivationType newPreset = (Neuron.ActivationType)EditorGUILayout.EnumPopup(neuron.curvePreset, GUILayout.MinWidth(50)); + anythingChanged |= newPreset != neuron.curvePreset; + neuron.curvePreset = newPreset; + EditorGUILayout.EndHorizontal(); + } + // if (neuron is Receptor receptor2) { + // if (receptor2.nucleiArray == null || receptor2.nucleiArray.Count() == 0) + // receptor2.array = new NucleusArray(neuron); + // } + } + + EditorGUILayout.Space(); + } + EditorGUILayout.EndFoldoutHeaderGroup(); + } + + #region Synapses + + protected virtual void AddInput(Nucleus.Type selectedType, Nucleus nucleus) { + switch (selectedType) { + case Nucleus.Type.Neuron: + AddNeuronInput(nucleus); + break; + case Nucleus.Type.MemoryCell: + AddMemoryCellInput(nucleus); + break; + case Nucleus.Type.Cluster: + AddClusterInput(nucleus); + break; + // case Nucleus.Type.Receptor: + // AddReceptorInput(nucleus); + // break; + // case Nucleus.Type.ClusterReceptor: + // AddClusterReceptorInput(nucleus); + // break; + // case Nucleus.Type.ClusterArray: + // AddClusterArrayInput(nucleus); + // break; + default: + break; + } + } + + protected virtual void AddNeuronInput(Nucleus nucleus) { + Neuron newNeuroid = new(this.prefab, "New neuron"); + newNeuroid.AddReceiver(nucleus); + this.currentNucleus = newNeuroid; + } + + protected virtual void AddMemoryCellInput(Nucleus nucleus) { + MemoryCell newMemory = new(this.prefab, "New memory cell"); + newMemory.AddReceiver(nucleus); + this.currentNucleus = newMemory; + } + + protected virtual void AddClusterInput(Nucleus nucleus) { + ClusterPickerWindow.ShowPicker(brain => OnClusterPicked(nucleus, brain), "Select Cluster"); + } + private void OnClusterPicked(Nucleus nucleus, ClusterPrefab selectedPrefab) { + Cluster subclusterInstance = new(selectedPrefab, this.prefab); + subclusterInstance.defaultOutput.AddReceiver(nucleus); + } + + private void ReimportCluster(Cluster subCluster) { + if (subCluster.siblingClusters == null || subCluster.siblingClusters.Length <= 0) { + Cluster reimportedCluster = new(subCluster.prefab, this.prefab); + subCluster.MoveReceivers(reimportedCluster); + // subcluster should be garbage now... + this.currentNucleus = reimportedCluster; + } + else { + this.currentNucleus = null; + List newSiblingsList = new(); + foreach (Cluster sibling in subCluster.siblingClusters) { + Cluster reimportedCluster = new(sibling.prefab, this.prefab) { + name = sibling.name + }; + sibling.MoveReceivers(reimportedCluster); + newSiblingsList.Add(reimportedCluster); + // make the first reimportedCluster the new current nucleus + this.currentNucleus ??= reimportedCluster; + } + Cluster[] newSiblings = newSiblingsList.ToArray(); + foreach (Cluster sibling in newSiblings) + sibling.siblingClusters = newSiblings; + } + } + + int selectedConnectNucleus = -1; + // Connect to another nucleus + protected virtual bool ConnectNucleus(ClusterPrefab cluster, Nucleus nucleusToConnect) { + if (cluster == null) + return false; + + IEnumerable synapseNuclei = this.currentNucleus.synapses + .Where(synapse => synapse.neuron != null) + .Select(synapse => synapse.neuron); + + IEnumerable nuclei = cluster.nuclei + .Except(synapseNuclei); + IEnumerable nucleiNames = nuclei + .Select(n => { + int idx = n.name.IndexOf(':'); + return idx < 0 ? n.name : n.name[..idx]; + }) + .Distinct(); + + string[] names = nucleiNames.ToArray(); + EditorGUILayout.BeginHorizontal(); + selectedConnectNucleus = EditorGUILayout.Popup(selectedConnectNucleus, names); + bool connecting = GUILayout.Button("Connect", GUILayout.Width(80)); + EditorGUILayout.EndHorizontal(); + if (connecting) { + Nucleus nucleus = nuclei.ElementAt(selectedConnectNucleus); + if (nucleus is Cluster subCluster) + subCluster.AddArrayReceiver(this.currentNucleus); + else if (nucleus is Neuron neuron) + neuron.AddReceiver(this.currentNucleus); + } + return connecting; + } + + protected virtual void DeleteNucleus(Nucleus nucleus) { + if (nucleus == null) + return; + + if (nucleus is Neuron neuron) { + foreach (Nucleus receiver in neuron.receivers) { + if (receiver != null) { + this.currentNucleus = receiver; + break; + } + } + } + this.prefab.nuclei.Remove(nucleus); + + if (outputsPopup.value == nucleus.name) { + this.prefab.RefreshOutputs(); + outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList(); + outputsPopup.index = 0; + } + + Neuron.Delete(nucleus); + + this.currentNucleus = this.prefab.output; + } + + Nucleus.Type selectedType = Nucleus.Type.None; + protected virtual bool AddSynapse(ClusterPrefab cluster, Nucleus nucleus) { + if (cluster == null) + return false; + + EditorGUILayout.BeginHorizontal(); + selectedType = (Nucleus.Type)EditorGUILayout.EnumPopup(selectedType); + bool connecting = GUILayout.Button("Add", GUILayout.Width(80)); + EditorGUILayout.EndHorizontal(); + + if (connecting) { + AddInput(selectedType, this.currentNucleus); + } + return connecting; + // if (selectedType == Nucleus.Type.None) + // return false; + + // AddInput(selectedType, this.currentNucleus); + // return true; + } + + protected virtual void ChangeSynapse(Synapse synapse, Neuron newNucleus) { + Neuron synapseNeuron = synapse.neuron as Neuron; + if (synapse.neuron.parent is Cluster subCluster && subCluster.prefab != this.prefab) { + // if (synapse.neuron.parent is ClusterReceptor receptor) { + // // the new nucleus is part of a (cluster) receptor, + // // so we have to change all synapses to this nucleus array elements + // int oldNucleusIx = Cluster.GetNucleusIndex(subCluster.clusterNuclei, synapse.neuron); + // int newNucleusIx = Cluster.GetNucleusIndex(subCluster.clusterNuclei, newNucleus); + // foreach (Nucleus element in receptor.nucleiArray) { + // if (element is not ClusterReceptor clusterReceptor) + // continue; + // // Get the same neuron as the synapse.nucleus in a different element + // // of the ClusterReceptor array + // Nucleus oldElementNucleus = clusterReceptor.clusterNuclei[oldNucleusIx]; + // if (oldElementNucleus is not Neuron oldElementNeuron) + // continue; + // // Get the same neuron as newNucleus in a different element + // // of the ClusterReceptor array + // Nucleus newElementNucleus = clusterReceptor.clusterNuclei[newNucleusIx]; + // if (newElementNucleus is not Neuron newElementNeuron) + // continue; + + // oldElementNeuron.RemoveReceiver(this.currentNucleus); + // newElementNeuron.AddReceiver(this.currentNucleus); + // // Now find the synapse which pointed to the old Neuron + // // Synapse synapseForUpdate = this.currentNucleus.GetSynapse(oldElementNeuron); + // // synapseForUpdate.nucleus = newElementNeuron; + // } + // } + // else { + // it is a neuron in a subcluster + synapseNeuron.RemoveReceiver(this.currentNucleus); + newNucleus.AddReceiver(this.currentNucleus); + // } + } + else { + synapseNeuron.RemoveReceiver(this.currentNucleus); + newNucleus.AddReceiver(this.currentNucleus); + } + } + + protected virtual void DisconnectNucleus(Neuron nucleus) { + if (this.currentNucleus.clusterPrefab == null) + return; + string[] names = this.currentNucleus.synapses.Select(synapse => synapse.neuron.name).ToArray(); + int selectedIndex = -1; + selectedIndex = EditorGUILayout.Popup("Disconnect from", selectedIndex, names); + if (selectedIndex >= 0 && selectedIndex < this.currentNucleus.clusterPrefab.nuclei.Count) { + Synapse synapse = this.currentNucleus.synapses[selectedIndex]; + Neuron synapseNeuron = synapse.neuron as Neuron; + synapseNeuron.RemoveReceiver(this.currentNucleus); + } + } + + #endregion Synapses + + #endregion Inspector + } + } + +} \ No newline at end of file diff --git a/Editor/ClusterInspector.cs.meta b/Editor/ClusterEditor.cs.meta similarity index 100% rename from Editor/ClusterInspector.cs.meta rename to Editor/ClusterEditor.cs.meta diff --git a/Editor/ClusterInspector.cs b/Editor/ClusterInspector.cs deleted file mode 100644 index b081cb3..0000000 --- a/Editor/ClusterInspector.cs +++ /dev/null @@ -1,1076 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using UnityEditor; - -using UnityEngine; -using UnityEngine.UIElements; - -namespace NanoBrain { - - [CustomEditor(typeof(ClusterPrefab))] - public class ClusterInspector : Editor { - - public override VisualElement CreateInspectorGUI() { - ClusterPrefab prefab = target as ClusterPrefab; - if (prefab != null) - prefab.EnsureInitialization(); - - serializedObject.Update(); - - VisualElement root = new(); - CreateInspector(root, prefab, prefab.output, null); - - serializedObject.ApplyModifiedProperties(); - return root; - } - - public static GraphView CreateInspector(VisualElement root, ClusterPrefab cluster, Nucleus output, GameObject gameObject) { - root.style.paddingLeft = 0; - root.style.paddingRight = 0; - root.style.paddingTop = 0; - root.style.paddingBottom = 0; - - root.styleSheets.Add(Resources.Load("GraphStyles")); - - VisualElement mainContainer = new() { - style = { - flexDirection = FlexDirection.Row - } - }; - GraphView graph = new(cluster); - graph.style.flexGrow = 1; - - VisualElement inspectorContainer = new VisualElement { - name = "inspector", - style = { - alignSelf = Align.Stretch, - minHeight = 450, - width = 300, - flexGrow = 0 - } - }; - - mainContainer.Add(graph); - mainContainer.Add(inspectorContainer); - root.Add(mainContainer); - - graph.SetGraph(gameObject, output, inspectorContainer); - - return graph; - } - - public class GraphView : VisualElement { - readonly ClusterPrefab prefab; - SerializedObject serializedBrain; - Nucleus currentNucleus; - GameObject gameObject; - private List layers = new(); - private readonly Dictionary neuroidPositions = new(); - private bool expandArray = false; - - ClusterPrefab prefabAsset; - readonly PopupField outputsField; - - public GraphView(ClusterPrefab prefab) { - this.prefab = prefab; - - name = "content"; - style.flexGrow = 1; - - IMGUIContainer graphContainer = new(OnIMGUI); - graphContainer.style.position = Position.Absolute; - graphContainer.style.left = 0; graphContainer.style.top = 0; - graphContainer.style.right = 0; graphContainer.style.bottom = 0; - graphContainer.pickingMode = PickingMode.Position; - graphContainer.focusable = true; - Add(graphContainer); - - VisualElement outputContainer = new() { - style = { - flexDirection = FlexDirection.Row, - alignItems = Align.Center, - } - }; - - List names = this.prefab.outputs.Select(output => output.name).ToList(); - if (names.Count > 0 && names.First() != null) { - outputsField = new(names, names.First()) { - style = { flexGrow = 1 } - }; - outputsField.RegisterValueChangedCallback(evt => OnOutputChanged(evt.newValue)); - outputContainer.Add(outputsField); - } - - Button addButton = new(() => OnAddClusterOutput()) { - text = "Add" - }; - outputContainer.Add(addButton); - - Add(outputContainer); - - // Subscribe when added to panel (editor UI ready) - RegisterCallback(evt => Subscribe()); - RegisterCallback(evt => Unsubscribe()); - } - - void OnOutputChanged(string outputName) { - if (this.currentNucleus.parent != null) - // Get nucleus in the parent instance - this.currentNucleus = this.currentNucleus.parent.GetNucleus(outputName); - else - // Get nucleus in the prefab - this.currentNucleus = this.prefab.GetNucleus(outputName); - } - - void OnAddClusterOutput() { - Nucleus newOutput = new Neuron(this.prefab, "New Output"); - this.prefab.RefreshOutputs(); - outputsField.choices = this.prefab.outputs.Select(output => output.name).ToList(); - outputsField.value = newOutput.name; - - this.currentNucleus = newOutput; - } - - bool subscribed = false; - void Subscribe() { - if (subscribed) return; - SceneView.duringSceneGui += OnSceneGUI; - subscribed = true; - SceneView.RepaintAll(); - } - - void Unsubscribe() { - if (!subscribed) return; - SceneView.duringSceneGui -= OnSceneGUI; - subscribed = false; - } - - public void SetGraph(GameObject gameObject, Nucleus nucleus, VisualElement inspectorContainer) { - this.gameObject = gameObject; - //this.cluster = brain; - if (Application.isPlaying == false) - this.serializedBrain = new SerializedObject(this.prefab); - this.currentNucleus = nucleus; - Rebuild(inspectorContainer); - } - - void Rebuild(VisualElement inspectorContainer) { - BuildLayers(); - - if (this.currentNucleus == null) { - inspectorContainer.Clear(); - return; - } - - string path = AssetDatabase.GetAssetPath(this.prefab); // or known path - this.prefabAsset = AssetDatabase.LoadAssetAtPath(path); - if (this.prefabAsset == null) { - // create in memory save if it doesn't exist - this.prefabAsset = CreateInstance(); - //Debug.LogError("Cluster Prefab is not found on disk"); - } - DrawInspector(inspectorContainer); - } - - private void BuildLayers() { - // A temporary list to track what's been added to layers - this.layers = new(); - int layerIx = 0; - - Nucleus selectedNucleus = this.currentNucleus; - if (selectedNucleus == null) - return; - NeuroidLayer currentLayer = new() { ix = layerIx }; - - if (selectedNucleus is Neuron selectedNeuron && selectedNeuron.receivers != null) { - foreach (Nucleus receiver in selectedNeuron.receivers) { - Nucleus outputNeuroid = receiver; - if (outputNeuroid != null) { - AddToLayer(currentLayer, outputNeuroid); - // Debug.Log($"layer {layerIx} nucleus {outputNeuroid.name}"); - } - } - } - if (currentLayer.neuroids.Count > 0) { - this.layers.Add(currentLayer); - layerIx++; - currentLayer = new() { ix = layerIx }; - } - - AddToLayer(currentLayer, selectedNucleus); - this.layers.Add(currentLayer); - // Debug.Log($"layer {layerIx} nucleus {selectedNucleus.name}"); - - layerIx++; - currentLayer = new() { ix = layerIx }; - - if (selectedNucleus.synapses != null) { - foreach (Synapse synapse in selectedNucleus.synapses) { - Nucleus input = synapse.neuron; - AddToLayer(currentLayer, input); - // Debug.Log($"layer {layerIx} nucleus {input.name}"); - } - } - if (currentLayer.neuroids.Count > 0) { - this.layers.Add(currentLayer); - } - } - - private void AddToLayer(NeuroidLayer layer, Nucleus nucleus) { - if (nucleus == null) - return; - layer.neuroids.Add(nucleus); - //nucleus.layerIx = layer.ix; - // Store its position - Vector2Int neuroidPosition = new(layer.ix, layer.neuroids.Count - 1); - neuroidPositions[nucleus] = neuroidPosition; - - } - - public void OnIMGUI() { - if (currentNucleus == null) - return; - - if (Application.isPlaying == false) - serializedBrain.Update(); - - Handles.BeginGUI(); - DrawGraph(); - Handles.EndGUI(); - - } - - private void DrawGraph() { - float size = 20; - Vector3 position = new(150, 210, 0); - - DrawReceivers(this.currentNucleus, position, size); - DrawSynapses(this.currentNucleus, position, size); - - // Draw selected Nucleus - if (expandArray) { - if (this.currentNucleus is IReceptor receptor1) { - float maxValue = 0; - foreach (Nucleus nucleus in receptor1.nucleiArray) { - if (nucleus is Neuron neuron) { - float value = neuron.outputMagnitude; - if (value > maxValue) - maxValue = value; - } - } - - float spacing = 400f / receptor1.nucleiArray.Count(); - float margin = 10 + spacing / 2; - float xMin = 150 - size; - float xMax = 150 + size; - float yMin = 10 + margin - size / 2; - float yMax = 400 - margin + size; - Vector3[] verts = new Vector3[4] { - new(xMin, yMin, 0), - new(xMax, yMin, 0), - new(xMax, yMax, 0), - new(xMin, yMax, 0) - }; - Handles.color = Color.black; - Handles.DrawAAConvexPolygon(verts); - int row = 0; - foreach (Nucleus nucleus in receptor1.nucleiArray) { - Vector3 pos = new(150, margin + row * spacing, 0.0f); - Handles.color = Color.white; - // The selected nucleus highlight ring - Handles.DrawSolidDisc(pos, Vector3.forward, size + 2); - DrawNucleus(nucleus, pos, maxValue, size); - row++; - } - GUIStyle style = new(EditorStyles.label) { - alignment = TextAnchor.UpperCenter, - normal = { textColor = Color.white }, - fontStyle = FontStyle.Bold, - }; - Vector3 labelPos = new(150, yMax + size + 5, 0); - string receptorName = receptor1.GetName(); - int colonPos = receptorName.IndexOf(":"); - if (colonPos > 0) { - string baseName = receptorName[..colonPos]; - Handles.Label(labelPos, baseName, style); - } - else - Handles.Label(labelPos, receptorName, style); - } - else { - Handles.color = Color.white; - // The selected nucleus highlight ring - Handles.DrawSolidDisc(position, Vector3.forward, size + 2); - float maxValue = 1; - if (this.currentNucleus is Neuron neuron) - maxValue = neuron.outputMagnitude; - else if (this.currentNucleus is Cluster cluster) - maxValue = cluster.defaultOutput.outputMagnitude; - - DrawNucleus(this.currentNucleus, position, maxValue, 20); - - } - } - else { - Handles.color = Color.white; - // The selected nucleus highlight ring - Handles.DrawSolidDisc(position, Vector3.forward, size + 2); - float maxValue = 1; - if (this.currentNucleus is Neuron neuron) - maxValue = neuron.outputMagnitude; - else if (this.currentNucleus is Cluster cluster) - maxValue = cluster.defaultOutput.outputMagnitude; - DrawNucleus(this.currentNucleus, position, maxValue, 20); - } - } - - private void DrawReceivers(Nucleus nucleus, Vector3 parentPos, float size) { - List receivers; - if (nucleus is Neuron neuron) - receivers = neuron.receivers; - else if (nucleus is Cluster cluster) - receivers = cluster.CollectReceivers(); - else - return; - - int nodeCount = receivers.Count(); //neuron != null ? neuron.receivers.Count() : 1; - - // Determine the maximum value in this layer - // This is used to 'scale' the output value colors of the nuclei - float maxValue = 0; - foreach (Nucleus receiver in receivers) { - if (receiver is Neuron neuroid) { - float value = neuroid.outputMagnitude; - if (value > maxValue) - maxValue = value; - } - } - - // Determine the spacing of the nuclei in the layer - float spacing = 400f / nodeCount; - float margin = 10 + spacing / 2; - - int row = 0; - List drawnArrays = new(); - foreach (Nucleus receiver in receivers) { - if (receiver is Receptor receptor) { - if (drawnArrays.Contains(receptor.nucleiArray)) - continue; - drawnArrays.Add(receptor.nucleiArray); - } - - Nucleus receiverNucleus = receiver; - if (receiverNucleus == null) - continue; - - Vector3 pos = new(50, margin + row * spacing, 0.0f); - Handles.color = Color.white; - Handles.DrawLine(parentPos, pos); - - DrawNucleus(receiverNucleus, pos, maxValue, size); - row++; - } - } - - private void DrawSynapses(Nucleus nucleus, Vector3 parentPos, float size) { - int nodeCount = nucleus.synapses.Count; - - // Determine the maximum value in this layer - // This is used to 'scale' the output value colors of the nuclei - float maxValue = 0; - int neuronCount = 0; - List drawnArrays = new(); - foreach (Synapse synapse in nucleus.synapses) { - if (synapse.neuron == null) - continue; - - if (synapse.neuron is Receptor receptor) { - if (drawnArrays.Contains(receptor.nucleiArray)) - continue; - drawnArrays.Add(receptor.nucleiArray); - } - else if (synapse.neuron.parent is ClusterReceptor clusterReceptor) { - if (drawnArrays.Contains(clusterReceptor.nucleiArray)) - continue; - drawnArrays.Add(clusterReceptor.nucleiArray); - } - if (synapse.neuron is Neuron synapseNeuron) { - float value = synapseNeuron.outputMagnitude * synapse.weight; - // Debug.Log($"{synapse.nucleus.name}: {value} {length(synapse.nucleus.outputValue)} {synapse.weight}"); - if (value > maxValue) - maxValue = value; - } - neuronCount++; - } - - // Determine the spacing of the nuclei in the layer - float spacing = 400f / neuronCount; - float margin = 10 + spacing / 2; - - int row = 0; - drawnArrays = new(); - 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); - } - Vector3 pos = new(250, margin + row * spacing, 0.0f); - Handles.color = Color.white; - Handles.DrawLine(parentPos, pos); - Color color = Color.black; - if (Application.isPlaying) { - if (maxValue == 0 || !float.IsFinite(maxValue)) - maxValue = 1; - float brightness = 0; - if (synapse.neuron is Neuron synapseNeuron) - brightness = synapseNeuron.outputMagnitude * synapse.weight / maxValue; - color = new Color(brightness, brightness, brightness, 1f); - } - if (synapse.neuron.parent != null && synapse.neuron.parent != this.currentNucleus.parent) { - // the synapse nucleus is part of a subcluster - DrawNucleus(synapse.neuron.parent, pos, maxValue, size, color); - } - // else if (synapse.nucleus.cluster != null && synapse.nucleus.cluster != this.currentNucleus.cluster) { - // DrawNucleus(synapse.nucleus.parent, pos, maxValue, size, color); - // } - else { - DrawNucleus(synapse.neuron, pos, maxValue, size, color); - } - row++; - } - } - - private void DrawNucleus(Nucleus nucleus, Vector3 position, float maxValue, float size) { - Color color; - if (Application.isPlaying) { - float brightness = 0; - if (nucleus is Neuron neuron) - brightness = neuron.outputMagnitude / maxValue; - color = new Color(brightness, brightness, brightness, 1f); - } - else - color = Color.black; - DrawNucleus(nucleus, position, maxValue, size, color); - } - - private void DrawNucleus(Nucleus nucleus, Vector3 position, float maxValue, float size, Color color) { - if (nucleus is MemoryCell) { - Handles.color = Color.white; - Handles.DrawWireDisc(position + Vector3.right * 10, Vector3.forward, size); - } - - Handles.color = color; - Handles.DrawSolidDisc(position, Vector3.forward, size); - - Handles.color = Color.white; - // Position the label in front of the disc - Vector3 labelPosition = position + (Vector3.forward * 0.1f); - - GUIStyle style = new(EditorStyles.label) { - alignment = TextAnchor.MiddleCenter, - normal = { textColor = Color.white }, - fontStyle = FontStyle.Bold, - }; - - if (nucleus is IReceptor receptor1) { - if (expandArray) { - // Put array indices above elements - style.alignment = TextAnchor.LowerCenter; - Vector3 labelPos1 = position + Vector3.down * (size + 5); // below disc - int colonPos1 = nucleus.name.IndexOf(":"); - if (colonPos1 > 0) { - string extName = nucleus.name[(colonPos1 + 2)..]; - Handles.Label(labelPos1, extName, style); - } - } - else { - // draw the array size label - if (color.grayscale > 0.5f) - style.normal.textColor = Color.black; - else - style.normal.textColor = Color.white; - Handles.Label(labelPosition, receptor1.nucleiArray.Length.ToString(), style); - style.normal.textColor = Color.white; - } - } - - if (expandArray == false || nucleus is not IReceptor) { - // put name below nucleus - Vector3 labelPos = position - Vector3.down * (size + 5); // below neuron - style.alignment = TextAnchor.UpperCenter; - - int colonPos = nucleus.name.IndexOf(":"); - if (colonPos > 0 && colonPos < nucleus.name.Length - 2) { - // if it is an array, we should not show the :0 of the first element - string baseName = nucleus.name[..colonPos]; - Handles.Label(labelPos, baseName, style); - } - else - Handles.Label(labelPos, nucleus.name, style); - - } - - // Draw Cluster ring - if (nucleus is Cluster) { - Handles.color = Color.white; - Handles.DrawWireDisc(position, Vector3.forward, size + 5); - } - - // Tooltip - Rect neuronRect = new(position.x - size, position.y - size, size * 2, size * 2); - int id = GUIUtility.GetControlID(FocusType.Passive); - Event e = Event.current; - EventType et = e.GetTypeForControl(id); - if (e != null && neuronRect.Contains(e.mousePosition)) { - // Process Hover - HandleMouseHover(nucleus, neuronRect); - // Process click - if (e.type == EventType.MouseDown && e.button == 0) { - // Consume the event so the scene doesn't also handle it - e.Use(); - HandleClicked(nucleus); - } - } - } - - private void HandleMouseHover(Nucleus nucleus, Rect rect) { - GUIContent tooltip; - if (nucleus is Neuron neuron) { - tooltip = new( - $"{nucleus.name}" + - $"\nValue: {neuron.outputMagnitude}"); - } - else - tooltip = new($"{nucleus.name}"); - - Vector2 mousePosition = Event.current.mousePosition; - - // Display tooltip with some offset - Vector2 tooltipSize = GUI.skin.box.CalcSize(tooltip); - Rect tooltipRect = new Rect(mousePosition.x + 10, mousePosition.y + 10, tooltipSize.x, tooltipSize.y); - - GUI.Box(tooltipRect, tooltip); - } - - private void HandleClicked(Nucleus nucleus) { - if (nucleus == this.currentNucleus) { - if (nucleus is Receptor || nucleus is ClusterReceptor) - expandArray = !expandArray; - else - expandArray = false; - } - // else if (nucleus is ReceptorInstance receptor) { - // this.currentNucleus = receptor.receptor; - // expandArray = false; - // BuildLayers(); - // } - else { - this.currentNucleus = nucleus; - expandArray = false; - BuildLayers(); - } - } - - private VisualElement inspectorIMGUIContainer; - private bool showSynapses = true; - private bool showActivation = true; - protected bool breakOnWake = false; - protected bool trace = false; - void DrawInspector(VisualElement inspectorContainer) { - if (inspectorContainer == null) - return; - - inspectorContainer.Clear(); - if (this.currentNucleus == null) - return; - - // create a SerializedObject wrapper so Unity inspector controls work (and Undo) - SerializedObject so = new(prefabAsset); - this.inspectorIMGUIContainer = new IMGUIContainer(() => InspectorHandler(so)); - - inspectorContainer.Add(inspectorIMGUIContainer); - } - - void InspectorHandler(SerializedObject serializedObject) { - bool anythingChanged = false; - - if (serializedObject == null || serializedObject.targetObject == null) - return; - - if (this.currentNucleus == null) - return; - - serializedObject.Update(); - - GUIStyle headerStyle = new(EditorStyles.boldLabel) { - alignment = TextAnchor.MiddleLeft, - margin = new RectOffset(10, 0, 4, 4) - }; - GUIStyle boldTextFieldStyle = new(EditorStyles.textField) { - fontStyle = FontStyle.Bold - }; - - GUILayout.Label(this.currentNucleus.GetType().ToString(), headerStyle); - string newName = EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); - if (newName != this.currentNucleus.name) { - this.currentNucleus.name = newName; - this.prefab.RefreshOutputs(); - outputsField.choices = this.prefab.outputs.Select(output => output.name).ToList(); - anythingChanged = true; - } - - if (Application.isPlaying) { - if (currentNucleus is Neuron currentNeuron1) { - GUIContent nameLabel = new("Output", currentNeuron1.outputValue.ToString()); - EditorGUILayout.FloatField(nameLabel, currentNeuron1.outputMagnitude); - } - else - EditorGUILayout.LabelField(" "); - } - else - EditorGUILayout.LabelField(" "); - - if (this.currentNucleus is MemoryCell memory) { - memory.staticMemory = EditorGUILayout.Toggle("Static Memory", memory.staticMemory); - } - - if (this.currentNucleus is IReceptor receptor1) { - EditorGUILayout.BeginHorizontal(); - EditorGUILayout.IntField("Array size", receptor1.nucleiArray.Count()); - if (GUILayout.Button("Add")) { - Undo.RecordObject(prefabAsset, "Array add " + prefabAsset.name); - receptor1.AddReceptorElement(this.prefab); - anythingChanged = true; - } - if (GUILayout.Button("Del")) { - Undo.RecordObject(prefabAsset, "Array delete " + prefabAsset.name); - receptor1.RemoveReceptorElement(); - anythingChanged = true; - } - EditorGUILayout.EndHorizontal(); - } - - // Synapses - - if (this.currentNucleus is not Receptor && this.currentNucleus is not ClusterReceptor) { - showSynapses = EditorGUILayout.BeginFoldoutHeaderGroup(showSynapses, "Synapses"); - if (showSynapses) { - if (this.currentNucleus is Neuron neuron2) { - Neuron.CombinatorType newCombinator = (Neuron.CombinatorType)EditorGUILayout.EnumPopup("Combinator", neuron2.combinator); - anythingChanged |= newCombinator != neuron2.combinator; - neuron2.combinator = newCombinator; - } - - EditorGUIUtility.wideMode = true; - EditorGUIUtility.labelWidth = 100; - Vector3 newBias = EditorGUILayout.Vector3Field("Bias", this.currentNucleus.bias); - anythingChanged |= newBias != this.currentNucleus.bias; - this.currentNucleus.bias = newBias; - - Nucleus[] array = null; - int elementIx = -1; - if (this.currentNucleus.synapses.Count > 0) { - Synapse[] synapses = this.currentNucleus.synapses.ToArray(); - foreach (Synapse synapse in synapses) { - if (synapse.neuron == null) - continue; - - if (array != null) { - if (synapse.neuron.parent is Cluster iCluster && elementIx > 0) { - int thisElementIx = Cluster.GetNucleusIndex(iCluster.clusterNuclei, synapse.neuron); - if (thisElementIx == elementIx) - continue; - else - elementIx = thisElementIx; - } - // if (array.Contains(synapse.nucleus)) - // continue; - else if (array.Contains(synapse.neuron.parent)) - continue; - } - else { - if (synapse.neuron.parent is IReceptor iReceptor) { - array = iReceptor.nucleiArray; - if (iReceptor is Cluster iCluster) - elementIx = Cluster.GetNucleusIndex(iCluster.clusterNuclei, synapse.neuron); - } - // else if (synapse.nucleus is Receptor receptor2) // && receptor2.array != null && receptor2.array.nuclei.Length > 1) - // array = receptor2.nucleiArray; - } - - EditorGUILayout.Space(); - - if (Application.isPlaying) { - if (synapse.neuron is Neuron synapseNeuron) { - Vector3 value = synapseNeuron.outputValue * synapse.weight; - GUIContent synapseValueLabel = new(synapse.neuron.name, synapseNeuron.outputValue.ToString()); - EditorGUILayout.FloatField(synapseValueLabel, synapseNeuron.outputMagnitude); - } - } - else { - EditorGUILayout.BeginHorizontal(); - - if (synapse.neuron.parent != null && synapse.neuron.parent != this.currentNucleus) { - // If it is a cluster - GUIStyle labelStyle = new(GUI.skin.label); - float labelWidth = 200; - if (synapse.neuron.clusterPrefab != null) { - labelWidth = labelStyle.CalcSize(new GUIContent($"{synapse.neuron.parent.baseName}.")).x; - GUILayout.Label($"{synapse.neuron.parent.baseName}", GUILayout.Width(labelWidth)); - } - string[] options = synapse.neuron.parent.clusterNuclei.Select(n => n.name).ToArray(); - int selectedIndex = System.Array.IndexOf(options, synapse.neuron.name); - int newIndex = EditorGUILayout.Popup(selectedIndex, options); - if (newIndex != selectedIndex && synapse.neuron.parent.clusterNuclei[newIndex] is Neuron newNeuron) - ChangeSynapse(synapse, newNeuron); - } - else - GUILayout.Label(synapse.neuron.name); - - bool disconnecting = GUILayout.Button("Disconnect", GUILayout.Width(80)); - if (disconnecting && synapse.neuron is Neuron synapseNeuron) { - synapseNeuron.RemoveReceiver(this.currentNucleus); - this.prefab.GarbageCollection(); - anythingChanged = true; - } - EditorGUILayout.EndHorizontal(); - - } - - EditorGUI.indentLevel++; - float newWeight = EditorGUILayout.FloatField("Weight", synapse.weight); - if (newWeight != synapse.weight) { - if (synapse.neuron.parent is IReceptor receptor) { - Nucleus[] receptorArray = receptor.nucleiArray; - foreach (Synapse s in this.currentNucleus.synapses) { - if (s.neuron.parent is IReceptor r && r.nucleiArray == receptorArray) - s.weight = newWeight; - } - } - else - synapse.weight = newWeight; - anythingChanged = true; - } - EditorGUI.indentLevel--; - } - } - - EditorGUILayout.Space(); - anythingChanged |= ConnectNucleus(this.prefab, this.currentNucleus); - anythingChanged |= AddSynapse(this.prefab, this.currentNucleus); - } - EditorGUILayout.EndFoldoutHeaderGroup(); - } - - // Activation - - if (this.currentNucleus is not Cluster) { - EditorGUILayout.Space(); - showActivation = EditorGUILayout.BeginFoldoutHeaderGroup(showActivation, "Activation"); - if (showActivation) { - if (this.currentNucleus is Neuron neuron) { - if (this.currentNucleus is not MemoryCell) { - EditorGUILayout.BeginHorizontal(); - EditorGUILayout.LabelField("Activation Curve", GUILayout.Width(150)); - if (neuron.curveMax > 0) - EditorGUILayout.CurveField(neuron.curve, Color.cyan, new Rect(0, 0, 1, neuron.curveMax)); - else - EditorGUILayout.CurveField(neuron.curve, Color.cyan, new Rect(0, neuron.curveMax, 1, -neuron.curveMax)); - Neuron.CurvePresets newPreset = (Neuron.CurvePresets)EditorGUILayout.EnumPopup(neuron.curvePreset, GUILayout.Width(100)); - anythingChanged |= newPreset != neuron.curvePreset; - neuron.curvePreset = newPreset; - EditorGUILayout.EndHorizontal(); - } - if (neuron is Receptor receptor2) { - if (receptor2.nucleiArray == null || receptor2.nucleiArray.Count() == 0) - receptor2.array = new NucleusArray(neuron); - } - } - - EditorGUILayout.Space(); - } - EditorGUILayout.EndFoldoutHeaderGroup(); - } - - if (GUILayout.Button("Delete this neuron")) - DeleteNucleus(this.currentNucleus); - - if (this.currentNucleus is Cluster subCluster) { - if (GUILayout.Button("Edit Cluster")) - EditCluster(subCluster); - } - - EditorGUILayout.Space(); - breakOnWake = EditorGUILayout.Toggle("Break on wake", breakOnWake); - if (breakOnWake && this.currentNucleus is Neuron currentNeuron) { - if (currentNeuron.isSleeping == false) - Debug.Break(); - } - trace = EditorGUILayout.Toggle("Trace", trace); - this.currentNucleus.trace = trace; - - serializedObject.ApplyModifiedProperties(); - if (anythingChanged) { - EditorUtility.SetDirty(prefabAsset); - AssetDatabase.SaveAssets(); - } - } - - void OnSceneGUI(SceneView sceneView) { - if (this.gameObject != null) { - if (this.currentNucleus is IReceptor receptor) { - foreach (Nucleus nucleus in receptor.nucleiArray) { - if (nucleus is Neuron neuron) { - Vector3 worldVector = this.gameObject.transform.TransformVector(neuron.outputValue); - Handles.color = Color.yellow; - Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); - } - } - } - else { - if (this.currentNucleus is Neuron currentNeuron) { - Vector3 worldVector = this.gameObject.transform.TransformVector(currentNeuron.outputValue); - Handles.color = Color.yellow; - Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); - } - } - } - } - - #region Synapses - - protected virtual void AddInput(Nucleus.Type selectedType, Nucleus nucleus) { - switch (selectedType) { - case Nucleus.Type.Neuron: - AddNeuronInput(nucleus); - break; - case Nucleus.Type.MemoryCell: - AddMemoryCellInput(nucleus); - break; - // case Nucleus.Type.Selector: - // AddSelectorInput(nucleus); - // break; - case Nucleus.Type.Cluster: - AddClusterInput(nucleus); - break; - // case Nucleus.Type.Pulsar: - // AddPulsarInput(nucleus); - // break; - case Nucleus.Type.Receptor: - AddReceptorInput(nucleus); - break; - // case Nucleus.Type.ReceptorArray: - // AddReceptorArrayInput(nucleus); - // break; - case Nucleus.Type.ClusterReceptor: - AddClusterReceptorInput(nucleus); - break; - default: - break; - } - } - - protected virtual void AddNeuronInput(Nucleus nucleus) { - Neuron newNeuroid = new(this.prefab, "New neuron"); - newNeuroid.AddReceiver(nucleus); - this.currentNucleus = newNeuroid; - BuildLayers(); - } - - protected virtual void AddMemoryCellInput(Nucleus nucleus) { - MemoryCell newMemory = new(this.prefab, "New memory cell"); - newMemory.AddReceiver(nucleus); - this.currentNucleus = newMemory; - BuildLayers(); - } - - protected virtual void AddClusterInput(Nucleus nucleus) { - ClusterPickerWindow.ShowPicker(brain => OnClusterPicked(nucleus, brain), "Select Cluster"); - } - private void OnClusterPicked(Nucleus nucleus, ClusterPrefab prefab) { - Cluster subclusterInstance = new(prefab, this.prefab); - subclusterInstance.defaultOutput.AddReceiver(nucleus); - } - - protected virtual void AddReceptorInput(Nucleus nucleus) { - Receptor newReceptor = new(this.prefab, "New Receptor"); - newReceptor.AddReceiver(nucleus); - this.currentNucleus = newReceptor; - BuildLayers(); - } - - protected virtual void AddClusterReceptorInput(Nucleus nucleus) { - ClusterPickerWindow.ShowPicker(prefab => OnClusterReceptorPicked(nucleus, prefab), "Select Cluster"); - } - private void OnClusterReceptorPicked(Nucleus nucleus, ClusterPrefab selectedPrefab) { - ClusterReceptor clusterInstance = new(selectedPrefab, this.prefab, "New " + selectedPrefab.name); - clusterInstance.defaultOutput.AddReceiver(nucleus); - this.currentNucleus = clusterInstance; - BuildLayers(); - } - - private void EditCluster(Cluster subCluster) { - // May be used with storedPrefab... - Selection.activeObject = subCluster.prefab; - EditorGUIUtility.PingObject(subCluster.prefab); - var editor = Editor.CreateEditor(subCluster.prefab); - } - - int selectedConnectNucleus = -1; - // Connect to another nucleus in the same cluster - protected virtual bool ConnectNucleus(ClusterPrefab cluster, Nucleus nucleusToConnect) { - if (cluster == null) - return false; - - IEnumerable synapseNuclei = this.currentNucleus.synapses - .Where(synapse => synapse.neuron != null) - .Select(synapse => synapse.neuron); - - IEnumerable nuclei = cluster.nuclei - .Except(synapseNuclei); - IEnumerable nucleiNames = nuclei - .Select(n => { - int idx = n.name.IndexOf(':'); - return idx < 0 ? n.name : n.name[..idx]; - }) - .Distinct(); - - string[] names = nucleiNames.ToArray(); - EditorGUILayout.BeginHorizontal(); - selectedConnectNucleus = EditorGUILayout.Popup(selectedConnectNucleus, names); - bool connecting = GUILayout.Button("Connect", GUILayout.Width(80)); - EditorGUILayout.EndHorizontal(); - if (connecting) { - Nucleus nucleus = nuclei.ElementAt(selectedConnectNucleus); - if (nucleus is IReceptor receptor) - receptor.AddArrayReceiver(this.currentNucleus); - else if (nucleus is Neuron neuron) - neuron.AddReceiver(this.currentNucleus); - else if (nucleus is Cluster subCluster) - subCluster.defaultOutput.AddReceiver(this.currentNucleus); - - } - return connecting; - } - - protected virtual void DeleteNucleus(Nucleus nucleus) { - if (nucleus == null) - return; - - if (nucleus is Neuron neuron) { - foreach (Nucleus receiver in neuron.receivers) { - if (receiver != null) { - this.currentNucleus = receiver; - break; - } - } - } - this.prefab.nuclei.Remove(nucleus); - - if (outputsField.value == nucleus.name) { - this.prefab.RefreshOutputs(); - outputsField.choices = this.prefab.outputs.Select(output => output.name).ToList(); - outputsField.index = 0; - } - - Neuron.Delete(nucleus); - - this.currentNucleus = this.prefab.output; - BuildLayers(); - } - - Nucleus.Type selectedType = Nucleus.Type.None; - protected virtual bool AddSynapse(ClusterPrefab cluster, Nucleus nucleus) { - if (cluster == null) - return false; - - EditorGUILayout.BeginHorizontal(); - selectedType = (Nucleus.Type)EditorGUILayout.EnumPopup(selectedType); - bool connecting = GUILayout.Button("Add", GUILayout.Width(80)); - EditorGUILayout.EndHorizontal(); - - if (connecting) { - AddInput(selectedType, this.currentNucleus); - } - return connecting; - // if (selectedType == Nucleus.Type.None) - // return false; - - // AddInput(selectedType, this.currentNucleus); - // return true; - } - - protected virtual void ChangeSynapse(Synapse synapse, Neuron newNucleus) { - Neuron synapseNeuron = synapse.neuron as Neuron; - if (synapse.neuron.parent is Cluster subCluster && subCluster.prefab != this.prefab) { - if (synapse.neuron.parent is ClusterReceptor receptor) { - // the new nucleus is part of a (cluster) receptor, - // so we have to change all synapses to this nucleus array elements - int oldNucleusIx = Cluster.GetNucleusIndex(subCluster.clusterNuclei, synapse.neuron); - int newNucleusIx = Cluster.GetNucleusIndex(subCluster.clusterNuclei, newNucleus); - foreach (Nucleus element in receptor.nucleiArray) { - if (element is not ClusterReceptor clusterReceptor) - continue; - // Get the same neuron as the synapse.nucleus in a different element - // of the ClusterReceptor array - Nucleus oldElementNucleus = clusterReceptor.clusterNuclei[oldNucleusIx]; - if (oldElementNucleus is not Neuron oldElementNeuron) - continue; - // Get the same neuron as newNucleus in a different element - // of the ClusterReceptor array - Nucleus newElementNucleus = clusterReceptor.clusterNuclei[newNucleusIx]; - if (newElementNucleus is not Neuron newElementNeuron) - continue; - - oldElementNeuron.RemoveReceiver(this.currentNucleus); - newElementNeuron.AddReceiver(this.currentNucleus); - // Now find the synapse which pointed to the old Neuron - // Synapse synapseForUpdate = this.currentNucleus.GetSynapse(oldElementNeuron); - // synapseForUpdate.nucleus = newElementNeuron; - } - } - else { - // it is a neuron in a subcluster - synapseNeuron.RemoveReceiver(this.currentNucleus); - newNucleus.AddReceiver(this.currentNucleus); - } - } - else { - synapseNeuron.RemoveReceiver(this.currentNucleus); - newNucleus.AddReceiver(this.currentNucleus); - } - } - - protected virtual void DisconnectNucleus(Neuron nucleus) { - if (this.currentNucleus.clusterPrefab == null) - return; - string[] names = this.currentNucleus.synapses.Select(synapse => synapse.neuron.name).ToArray(); - int selectedIndex = -1; - selectedIndex = EditorGUILayout.Popup("Disconnect from", selectedIndex, names); - if (selectedIndex >= 0 && selectedIndex < this.currentNucleus.clusterPrefab.nuclei.Count) { - Synapse synapse = this.currentNucleus.synapses[selectedIndex]; - Neuron synapseNeuron = synapse.neuron as Neuron; - synapseNeuron.RemoveReceiver(this.currentNucleus); - } - } - - #endregion Synapses - } - - } - - public class NeuroidLayer { - public int ix = 0; - public List neuroids = new(); - } - -} \ No newline at end of file diff --git a/Editor/ClusterViewer.cs b/Editor/ClusterViewer.cs new file mode 100644 index 0000000..af0eb48 --- /dev/null +++ b/Editor/ClusterViewer.cs @@ -0,0 +1,950 @@ +using System.Collections.Generic; +using System.Linq; + +using UnityEditor; +using UnityEngine; +using UnityEngine.UIElements; + +namespace NanoBrain { + + public class ClusterViewer : Editor { + + public static ClusterPrefab previousPrefab; + + public class GraphView : VisualElement { + //protected readonly ClusterPrefab prefab; + protected Cluster currentCluster; + protected SerializedObject serializedBrain; + protected Nucleus currentNucleus; + protected Nucleus selectedOutput; + + protected GameObject gameObject; + private bool expandArray = false; + + protected ClusterPrefab prefabAsset; + protected VisualElement topMenuContainer; + protected ScrollView scrollView; + protected IMGUIContainer graphContainer; + protected readonly PopupField outputsPopup; + + public enum Mode { + Focus, + Full + } + public Mode mode = Mode.Focus; + + public GraphView(Cluster cluster) { + this.currentCluster = cluster; + + name = "content"; + style.flexGrow = 1; + + topMenuContainer = new() { + style = { + flexDirection = FlexDirection.Row, + alignItems = Align.Center, + } + }; + + EnumField modePopup = new(mode); + modePopup.style.width = 80; + modePopup.RegisterValueChangedCallback(OnModeChange); + topMenuContainer.Add(modePopup); + + scrollView = new(ScrollViewMode.Horizontal); + scrollView.style.position = Position.Absolute; + scrollView.style.left = 0; scrollView.style.top = 0; + scrollView.style.right = 0; scrollView.style.bottom = 0; + //scrollView.style.flexGrow = 1; + scrollView.horizontalScrollerVisibility = ScrollerVisibility.Auto; // Auto shows when needed + scrollView.verticalScrollerVisibility = ScrollerVisibility.Hidden; + + graphContainer = new(OnIMGUI); + //graphContainer.style.position = Position.Relative; // or omit this line + //graphContainer.style.position = Position.Absolute; + // graphContainer.style.left = 0; graphContainer.style.top = 0; + // graphContainer.style.right = 0; graphContainer.style.bottom = 0; + graphContainer.pickingMode = PickingMode.Position; + graphContainer.focusable = true; + //graphContainer.style.width = 1200; + //graphContainer.style.width = new StyleLength(StyleKeyword.Null); // allow content to determine width + + scrollView.contentContainer.Add(graphContainer); + Add(scrollView); + Add(topMenuContainer); + + + // Subscribe when added to panel (editor UI ready) + RegisterCallback(evt => Subscribe()); + RegisterCallback(evt => Unsubscribe()); + } + + protected virtual void OnModeChange(ChangeEvent changeEvent) { + this.mode = (Mode)changeEvent.newValue; + } + + bool subscribed = false; + void Subscribe() { + if (subscribed) return; + SceneView.duringSceneGui += OnSceneGUI; + subscribed = true; + SceneView.RepaintAll(); + } + + void Unsubscribe() { + if (!subscribed) return; + SceneView.duringSceneGui -= OnSceneGUI; + subscribed = false; + } + + public void SetGraph(GameObject gameObject) { + this.gameObject = gameObject; + + if (Application.isPlaying == false) + this.serializedBrain = new SerializedObject(this.currentCluster.prefab); + this.selectedOutput = this.currentCluster.outputs[0]; + this.currentNucleus = this.selectedOutput; + Rebuild(); + } + + void Rebuild() { + if (this.currentNucleus == null) + return; + + string path = AssetDatabase.GetAssetPath(this.currentCluster.prefab); // or known path + this.prefabAsset = AssetDatabase.LoadAssetAtPath(path); + if (this.prefabAsset == null) { + // create in memory save if it doesn't exist + this.prefabAsset = CreateInstance(); + //Debug.LogError("Cluster Prefab is not found on disk"); + } + } + + public void OnIMGUI() { + if (Application.isPlaying == false) + serializedBrain.Update(); + + Handles.BeginGUI(); + DrawGraph(); + Handles.EndGUI(); + } + + #region Graph + + protected virtual void DrawGraph() { + if (mode == Mode.Focus) + DrawFocusGraph(); + else + DrawFullGraph(); + } + + #region Full Graph + + protected void DrawFullGraph() { + //Dag dag = GenerateGraph(this.prefab); + Dag dag = GenerateGraph(this.selectedOutput); + Dag.ComputeLayout(dag); + // Draw edges + foreach (Dag.Edge e in dag.edges) { + Dag.Node from = dag.nodes.FirstOrDefault(x => x.id == e.fromId); + Dag.Node to = dag.nodes.FirstOrDefault(x => x.id == e.toId); + if (from == null || to == null) + continue; + + Vector2 fromPosition = from.position; + Vector2 toPosition = to.position; + DrawEdge(fromPosition, toPosition); + } + + // Draw nodes + foreach (Dag.Node n in dag.nodes) + DrawNucleus(n.nucleus, n.position, 1, n.radius); + + // Determine graph width + float width = 0; + float currentNucleusPosition = 0; + foreach (Dag.Node node in dag.nodes) { + if (node.position.x > width) + width = node.position.x; + if (node.nucleus == currentNucleus) + currentNucleusPosition = node.position.x; + } + + // Resize the graph container to the full graph width + float margin = 50f; + graphContainer.style.width = width + 2 * margin; + + // Scroll to the current nucleus + float viewportWidth = scrollView.layout.width; + // center currentNucleus in viewport + float desiredScrollX = currentNucleusPosition - viewportWidth * 0.5f; + // clamp between 0 and maximum scrollable range + float maxScrollX = Mathf.Max(0f, graphContainer.resolvedStyle.width - viewportWidth); + desiredScrollX = Mathf.Clamp(desiredScrollX, 0f, maxScrollX); + + Vector2 current = scrollView.scrollOffset; + scrollView.scrollOffset = new Vector2(desiredScrollX, current.y); + } + + public Dag GenerateGraph(Nucleus rootNucleus) { + Dag dag = new(); + if (rootNucleus == null) + return dag; + + int ix = 0; + Dag.Node receiver = new() { + id = ix, + //title = nucleus.name, + nucleus = rootNucleus + }; + dag.nodes.Add(receiver); + ix++; + DescendGraph(receiver, ref ix, dag); + return dag; + } + + private void DescendGraph(Dag.Node receiver, ref int ix, Dag dag) { + foreach (Synapse synapse in receiver.nucleus.synapses) { + Nucleus nucleus = synapse.neuron; + if (nucleus.parent != null && nucleus.parent != currentNucleus.parent) { + nucleus = nucleus.parent; + } + string nucleusName = nucleus.name; + Dag.Node synapseNode = dag.FindNode(nucleusName); + if (synapseNode == null) { + synapseNode = new() { + id = ix, + nucleus = nucleus + }; + dag.nodes.Add(synapseNode); + } + Dag.Edge edge = new() { + fromId = synapseNode.id, + toId = receiver.id + }; + dag.edges.Add(edge); + ix++; + DescendGraph(synapseNode, ref ix, dag); + } + } + + #endregion Full Graph + + #region Focus Graph + + protected void DrawFocusGraph() { + float size = 20; + Vector3 position = new(150, 210, 0); + + if (this.currentNucleus != null) { + DrawReceivers(this.currentNucleus, position, size); + DrawSynapses(this.currentNucleus, position, size); + + // Draw selected Nucleus + if (expandArray) { + float maxValue = 1; + + if (this.currentNucleus is Cluster cluster) { + float spacing = 400f / cluster.instanceCount; + float margin = 10 + spacing / 2; + float xMin = 150 - size; + float xMax = 150 + size; + float yMin = 10 + margin - size / 2; + float yMax = 400 - margin + size; + Vector3[] verts = new Vector3[4] { + new(xMin, yMin, 0), + new(xMax, yMin, 0), + new(xMax, yMax, 0), + new(xMin, yMax, 0) + }; + Handles.color = Color.black; + Handles.DrawAAConvexPolygon(verts); + int row = 0; + if (cluster.siblingClusters == null) { + Vector3 pos = new(150, margin + row * spacing, 0.0f); + Handles.color = Color.white; + // The selected sibling highlight ring + Handles.DrawSolidDisc(pos, Vector3.forward, size + 2); + DrawNucleus(cluster, pos, maxValue, size); + row++; + } + else { + foreach (Cluster sibling in cluster.siblingClusters) { + Vector3 pos = new(150, margin + row * spacing, 0.0f); + Handles.color = Color.white; + // The selected sibling highlight ring + Handles.DrawSolidDisc(pos, Vector3.forward, size + 2); + DrawNucleus(sibling, pos, maxValue, size); + row++; + } + } + GUIStyle style = new(EditorStyles.label) { + alignment = TextAnchor.UpperCenter, + normal = { textColor = Color.white }, + fontStyle = FontStyle.Bold, + }; + Vector3 labelPos = new(150, yMax + size + 5, 0); + string clusterName = cluster.name; + int colonPos = clusterName.IndexOf(":"); + if (colonPos > 0) { + string baseName = clusterName[..colonPos]; + Handles.Label(labelPos, baseName, style); + } + else + Handles.Label(labelPos, clusterName, style); + } + else { + if (this.currentNucleus is Neuron neuron) + maxValue = neuron.outputMagnitude; + + DrawNucleus(this.currentNucleus, position, maxValue, 20); + + } + } + else { + float maxValue = 1; + if (this.currentNucleus is Neuron neuron) + maxValue = neuron.outputMagnitude; + else if (this.currentNucleus is Cluster cluster) + maxValue = cluster.defaultOutput.outputMagnitude; + DrawNucleus(this.currentNucleus, position, maxValue, 20); + } + } + else { + DrawAllOutputs(position, size); + DrawOutputs(position, size); + } + graphContainer.style.width = 300; + } + + protected void DrawReceivers(Nucleus nucleus, Vector3 parentPos, float size) { + List receivers; + if (nucleus is Neuron neuron) + receivers = neuron.receivers; + else if (nucleus is Cluster cluster) + receivers = cluster.CollectReceivers(); + else + return; + + // For top-level nodes, add link to previous editor and/or 'Outputs' + int nodeCount = receivers.Count(); + if (nucleus == this.selectedOutput) { + // Add link to 'Outpus' + nodeCount++; + if (ClusterViewer.previousPrefab != null) + // Add link to previous editor + nodeCount++; + } + + // Determine the maximum value in this layer + // This is used to 'scale' the output value colors of the nuclei + float maxValue = 0; + foreach (Nucleus receiver in receivers) { + if (receiver is Neuron neuroid) { + float value = neuroid.outputMagnitude; + if (value > maxValue) + maxValue = value; + } + } + + // Determine the spacing of the nuclei in the layer + float spacing = 400f / nodeCount; + float margin = 10 + spacing / 2; + + int row = 0; + List drawnArrays = new(); + foreach (Nucleus receiver in receivers) { + Nucleus receiverNucleus = receiver; + if (receiverNucleus == null) + continue; + + Vector3 pos = new(50, margin + row * spacing, 0.0f); + DrawEdge(parentPos, pos); + + DrawNucleus(receiverNucleus, pos, maxValue, size); + row++; + } + if (nucleus == this.selectedOutput) { + Vector3 pos = new(50, margin + row * spacing, 0); + if (ClusterViewer.previousPrefab != null) { + DrawEdge(parentPos, pos); + DrawClusterPrefab(ClusterViewer.previousPrefab, pos, size); + row++; + } + pos = new(50, margin + row * spacing, 0); + DrawEdge(parentPos, pos); + DrawAllOutputs(pos, size); + } + } + + protected void DrawSynapses(Nucleus nucleus, Vector3 parentPos, float size) { + if (nucleus == null) + return; + + // Determine the maximum value in this layer + // This is used to 'scale' the output value colors of the nuclei + float maxValue = 0; + int neuronCount = 0; + List drawnNeurons = new(); + foreach (Synapse synapse in nucleus.synapses) { + if (synapse.neuron == null) + continue; + + // Count multiple synapses to the same neuron only once + if (drawnNeurons.Contains(synapse.neuron)) + continue; + drawnNeurons.Add(synapse.neuron); + + float value = synapse.neuron.outputMagnitude * synapse.weight; + if (value > maxValue) + maxValue = value; + + neuronCount++; + } + + // Determine the spacing of the nuclei in the layer + float spacing = 400f / neuronCount; + float margin = 10 + spacing / 2; + + int row = 0; + drawnNeurons = new(); + foreach (Synapse synapse in nucleus.synapses) { + if (synapse.neuron is null) + continue; + + // Draw multiple synapses to the same neuron only once + if (drawnNeurons.Contains(synapse.neuron)) + continue; + drawnNeurons.Add(synapse.neuron); + + Vector3 pos = new(250, margin + row * spacing, 0.0f); + DrawEdge(parentPos, pos); + // Handles.color = Color.white; + // Handles.DrawLine(parentPos, pos); + Color color = Color.black; + if (Application.isPlaying) { + if (maxValue == 0 || !float.IsFinite(maxValue)) + maxValue = 1; + float brightness = synapse.neuron.outputMagnitude * synapse.weight / maxValue; + color = new Color(brightness, brightness, brightness, 1f); + } + DrawNucleus(synapse.neuron, pos, size, color); + row++; + } + } + + protected void DrawOutputs(Vector2 parentPos, float size) { + // Determine the maximum value in this layer + // This is used to 'scale' the output value colors of the nuclei + float maxValue = 0; + int neuronCount = 0; + List drawnNuclei = new(); + foreach (Nucleus nucleus in this.currentCluster.outputs) { + if (nucleus is not Neuron neuron) + continue; + + // Draw multiple synapses to the same neuron only once + if (drawnNuclei.Contains(nucleus)) + continue; + drawnNuclei.Add(nucleus); + + float value = neuron.outputMagnitude; + if (value > maxValue) + maxValue = value; + + neuronCount++; + } + + // Determine the spacing of the nuclei in the layer + float spacing = 400f / neuronCount; + float margin = 10 + spacing / 2; + + int row = 0; + drawnNuclei = new(); + foreach (Nucleus nucleus in this.currentCluster.outputs) { + if (nucleus is not Neuron neuron) + continue; + + // Draw multiple synapses to the same neuron only once + if (drawnNuclei.Contains(nucleus)) + continue; + drawnNuclei.Add(nucleus); + + Vector3 pos = new(250, margin + row * spacing, 0.0f); + DrawEdge(parentPos, pos); + Color color = Color.black; + if (Application.isPlaying) { + if (maxValue == 0 || !float.IsFinite(maxValue)) + maxValue = 1; + float brightness = neuron.outputMagnitude / maxValue; + color = new Color(brightness, brightness, brightness, 1f); + } + DrawNucleus(nucleus, pos, size, color); + row++; + } + } + + #endregion Focus Graph + + protected void DrawNucleus(Nucleus nucleus, Vector3 position, float maxValue, float size) { + Color color; + if (Application.isPlaying) { + float brightness = 0; + if (nucleus is Neuron neuron) + brightness = neuron.outputMagnitude / maxValue; + color = new Color(brightness, brightness, brightness, 1f); + } + else + color = Color.black; + DrawNucleus(nucleus, position, size, color); + } + + protected void DrawNucleus(Nucleus nucleus, Vector3 position, float size, Color color) { + if (nucleus == null) + return; + + if (nucleus == this.currentNucleus) { + // The selected nucleus highlight ring + Handles.color = Color.white; + Handles.DrawSolidDisc(position, Vector3.forward, size + 2); + } + + if (nucleus is MemoryCell) { + Handles.color = Color.white; + Handles.DrawWireDisc(position + Vector3.right * 10, Vector3.forward, size); + } + + Handles.color = color; + Handles.DrawSolidDisc(position, Vector3.forward, size); + + Handles.color = Color.white; + // Position the label in front of the disc + Vector3 labelPosition = position + (Vector3.forward * 0.1f); + + GUIStyle style = new(EditorStyles.label) { + alignment = TextAnchor.MiddleCenter, + normal = { textColor = Color.white }, + fontStyle = FontStyle.Bold, + }; + + if (nucleus.parent is Cluster parentCluster && currentNucleus != null && parentCluster != currentNucleus.parent) + DrawCluster(parentCluster, position, color, size); + else if (nucleus is Cluster cluster) + DrawCluster(cluster, position, color, size); + + if (expandArray == false || nucleus != currentNucleus) { + // put name below nucleus + Vector3 labelPos = position - Vector3.down * (size + 5); // below neuron + style.alignment = TextAnchor.UpperCenter; + + if (nucleus.parent != null && currentNucleus != null && nucleus.parent != currentNucleus.parent && nucleus.parent is Cluster parentCluster1) { + // This neuron is part of another cluster + parentCluster1.name ??= ""; + string baseName = ""; + int colonPos = parentCluster1.name.IndexOf(":"); + if (colonPos > 0 && colonPos < parentCluster1.name.Length - 2) + baseName = parentCluster1.name[..colonPos] + "."; + else + baseName = parentCluster1.name + "."; + // if (colonPos > 0 && colonPos < parentCluster1.name.Length - 2) { + // // if it is an array, we should not show the :0 of the first element + // //baseName = baseName[..colonPos]; + // Handles.Label(labelPos, baseName + nucleus.name, style); + // } + // else + Handles.Label(labelPos, baseName + nucleus.name, style); + } + else { + nucleus.name ??= ""; + int colonPos = nucleus.name.IndexOf(":"); + if (colonPos > 0 && colonPos < nucleus.name.Length - 2) { + // if it is an array, we should not show the :0 of the first element + string baseName = nucleus.name[..colonPos]; + Handles.Label(labelPos, baseName, style); + } + else + Handles.Label(labelPos, nucleus.name, style); + } + } + + // Tooltip + Rect neuronRect = new(position.x - size, position.y - size, size * 2, size * 2); + + int id = GUIUtility.GetControlID(FocusType.Passive); + Event e = Event.current; + EventType et = e.GetTypeForControl(id); + if (e != null && neuronRect.Contains(e.mousePosition)) { + // Process Hover + HandleMouseHover(nucleus, neuronRect); + // Process click + if (e.type == EventType.MouseDown && e.button == 0) { + // Consume the event so the scene doesn't also handle it + e.Use(); + if (nucleus is Cluster parentCluster2) + OnNeuronClick(parentCluster2); + else + OnNeuronClick(nucleus); + } + } + } + + protected void DrawCluster(Cluster cluster, Vector3 position, Color color, float size) { + GUIStyle labelTextStyle = new(EditorStyles.label) { + normal = { textColor = Color.white }, + fontStyle = FontStyle.Bold, + }; + + if (expandArray) { + // Put array indices above the discs + labelTextStyle.alignment = TextAnchor.LowerCenter; + Vector3 labelPosition = position + Vector3.down * (size + 5); // below disc + + // Strip the instance number in the name + int colonPos1 = cluster.name.IndexOf(":"); + if (colonPos1 > 0) { + string extName = cluster.name[(colonPos1 + 2)..]; + Handles.Label(labelPosition, extName, labelTextStyle); + } + else + Handles.Label(labelPosition, "0", labelTextStyle); + } + else { + // Put instance count inside the disc + labelTextStyle.alignment = TextAnchor.MiddleCenter; + Vector3 labelPosition = position + (Vector3.forward * 0.1f); + + // Adjust text color based on disc color + if (color.grayscale > 0.5f) + labelTextStyle.normal.textColor = Color.black; + else + labelTextStyle.normal.textColor = Color.white; + + if (cluster.instanceCount > 1) { + Handles.Label(labelPosition, cluster.instanceCount.ToString(), labelTextStyle); + labelTextStyle.normal.textColor = Color.white; + } + else if (cluster.siblingClusters != null && cluster.siblingClusters.Length > 1) { + Handles.Label(labelPosition, cluster.siblingClusters.Length.ToString(), labelTextStyle); + labelTextStyle.normal.textColor = Color.white; + } + } + + // Draw a circle around the disc to indicate this is a Cluster + Handles.color = Color.white; + Handles.DrawWireDisc(position, Vector3.forward, size + 5); + } + + protected void DrawClusterPrefab(ClusterPrefab prefab, Vector2 position, float size) { + Handles.color = Color.black; + Handles.DrawSolidDisc(position, Vector3.forward, size); + // Draw a circle around the disc to indicate this is a Cluster + Handles.color = Color.white; + Handles.DrawWireDisc(position, Vector3.forward, size + 5); + + // put name below nucleus + GUIStyle style = new(EditorStyles.label) { + alignment = TextAnchor.MiddleCenter, + normal = { textColor = Color.white }, + fontStyle = FontStyle.Bold, + }; + Vector2 labelPos = position - Vector2.down * (size + 5); // below neuron + style.alignment = TextAnchor.UpperCenter; + Handles.Label(labelPos, prefab.name, style); + + Rect neuronRect = new(position.x - size, position.y - size, size * 2, size * 2); + int id = GUIUtility.GetControlID(FocusType.Passive); + Event e = Event.current; + EventType et = e.GetTypeForControl(id); + if (e != null && neuronRect.Contains(e.mousePosition)) { + // Process click + if (e.type == EventType.MouseDown && e.button == 0) { + // Consume the event so the scene doesn't also handle it + e.Use(); + Selection.activeObject = prefab; + EditorGUIUtility.PingObject(prefab); + ClusterViewer.previousPrefab = null; + CreateEditor(prefab); + } + } + } + + protected void DrawAllOutputs(Vector2 position, float size) { + GUIStyle labelTextStyle = new(EditorStyles.label) { + normal = { textColor = Color.white }, + fontStyle = FontStyle.Bold, + alignment = TextAnchor.MiddleCenter, + }; + Handles.Label(position, "Outputs", labelTextStyle); + + Rect neuronRect = new(position.x - size, position.y - size, size * 2, size * 2); + Event e = Event.current; + if (e != null && neuronRect.Contains(e.mousePosition)) { + // Process click + if (e.type == EventType.MouseDown && e.button == 0) { + // Consume the event so the scene doesn't also handle it + e.Use(); + OnAllOutputsClick(); + } + } + + } + + protected void DrawEdge(Vector2 from, Vector2 to, float radius = 20) { + Handles.color = Color.white; + // Handles.DrawLine(from, to); + + Vector2 dir = to - from; + float len = dir.magnitude; + if (len <= 2f * radius || len <= Mathf.Epsilon) + // line too short + return; + + Vector2 n = dir / len; // normalized + Vector2 a = from + n * radius; + Vector2 b = to - n * radius; + Handles.DrawLine(a, b); + } + + protected void HandleMouseHover(Nucleus nucleus, Rect rect) { + GUIContent tooltip; + if (nucleus is Neuron neuron) { + tooltip = new( + $"{nucleus.name}" + + $"\nValue: {neuron.outputMagnitude}"); + } + else + tooltip = new($"{nucleus.name}"); + + Vector2 mousePosition = Event.current.mousePosition; + + // Display tooltip with some offset + Vector2 tooltipSize = GUI.skin.box.CalcSize(tooltip); + Rect tooltipRect = new Rect(mousePosition.x + 10, mousePosition.y + 10, tooltipSize.x, tooltipSize.y); + + GUI.Box(tooltipRect, tooltip); + } + + protected void OnNeuronClick(Nucleus nucleus) { + if (nucleus == this.currentNucleus) { + if (Application.isPlaying) { + if (nucleus is Cluster) + expandArray = !expandArray; + else + expandArray = false; + } + else { + if (nucleus is Cluster cluster) + OnClusterClick(cluster); + } + } + else if (nucleus.parent != null && this.currentNucleus != null && nucleus.parent != this.currentNucleus.parent) { + // We go to a different cluster + if (Application.isPlaying) { + this.currentNucleus = nucleus; + if (this.currentNucleus is Neuron neuron && neuron.receivers.Count == 0) + this.selectedOutput = this.currentNucleus; + expandArray = false; + } + else { + // select the cluster, not the neuron in the cluster + this.currentNucleus = nucleus.parent; + expandArray = false; + } + } + else { + this.currentNucleus = nucleus; + if (this.currentNucleus is Neuron neuron && neuron.receivers.Count == 0) + this.selectedOutput = this.currentNucleus; + expandArray = false; + } + } + + protected void OnClusterClick(Cluster subCluster) { + // May be used with storedPrefab... + Selection.activeObject = subCluster.prefab; + EditorGUIUtility.PingObject(subCluster.prefab); + ClusterViewer.previousPrefab = this.currentCluster.prefab; + ClusterEditor newEditor = CreateEditor(subCluster.prefab) as ClusterEditor; + } + + protected void OnAllOutputsClick() { + this.currentNucleus = null; + this.selectedOutput = null; + expandArray = false; + } + + #endregion Graph + + void OnSceneGUI(SceneView sceneView) { + if (this.gameObject != null) { + // if (this.currentNucleus is IReceptor receptor) { + // foreach (Nucleus nucleus in receptor.nucleiArray) { + // if (nucleus is Neuron neuron) { + // Vector3 worldVector = this.gameObject.transform.TransformVector(neuron.outputValue); + // Handles.color = Color.yellow; + // Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); + // } + // } + // } + // else { + if (this.currentNucleus is Neuron currentNeuron) { + Vector3 worldVector = this.gameObject.transform.TransformVector(currentNeuron.outputValue); + Handles.color = Color.yellow; + Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); + } + // } + } + } + + } + } + + public class NeuroidLayer { + public int ix = 0; + public List neuroids = new(); + } + + public class Dag { + + public class Node { + public int id; + public Vector2 position; + public float radius = 20f; // circle radius + public Nucleus nucleus; + } + + public class Edge { + public int fromId; + public int toId; + } + + public List nodes = new(); + public List edges = new(); + + public Node FindNode(string name, bool justBaseName = true) { + if (justBaseName) { + int colonPos = name.IndexOf(":"); + if (colonPos > 0) + name = name[..colonPos]; + } + foreach (Node node in this.nodes) { + string nodeName = node.nucleus.name; + if (justBaseName) { + int colonPos = nodeName.IndexOf(":"); + if (colonPos > 0) + nodeName = nodeName[..colonPos]; + } + if (nodeName == name) + return node; + } + return null; + } + + public static Node GetNodeById(Dag dag, int id) => dag.nodes.FirstOrDefault(x => x.id == id); + + public static void ComputeLayout(Dag dag) { + Dictionary> adjacency = dag.nodes.ToDictionary(n => n.id, n => new List()); + Dictionary outdegree = dag.nodes.ToDictionary(node => node.id, n => 0); + foreach (Edge edge in dag.edges) { + if (!adjacency.ContainsKey(edge.fromId) || !adjacency.ContainsKey(edge.toId)) + continue; + adjacency[edge.fromId].Add(edge.toId); + outdegree[edge.fromId]++; + } + + // Kahn's algorithm to compute topological layers (horizontal layers) + // build parent list (reverse adjacency) and parentIndegree = number of children each parent has + Dictionary> parents = dag.nodes.ToDictionary(n => n.id, _ => new List()); + Dictionary childCount = dag.nodes.ToDictionary(n => n.id, _ => 0); + + foreach (Edge edge in dag.edges) { + if (!adjacency.ContainsKey(edge.fromId) || !adjacency.ContainsKey(edge.toId)) continue; + adjacency[edge.fromId].Add(edge.toId); + parents[edge.toId].Add(edge.fromId); // parent of 'to' is 'from' + childCount[edge.fromId]++; // outdegree + } + + Dictionary layer = new(); + Queue queue = new(outdegree.Where(kv => kv.Value == 0).Select(kv => kv.Key)); + foreach (int id in queue) + layer[id] = 0; + + // process parents (reverse traversal) + while (queue.Count > 0) { + int u = queue.Dequeue(); + int l = layer[u]; + foreach (int p in parents[u]) { + if (!layer.ContainsKey(p) || layer[p] < l + 1) + layer[p] = l + 1; + childCount[p]--; // decrement remaining unprocessed children + if (childCount[p] == 0) + queue.Enqueue(p); + } + } + + // Any unreachable nodes -> assign next layers + int maxLayer = layer.Count > 0 ? layer.Values.Max() : 0; + foreach (Node node in dag.nodes) { + if (!layer.ContainsKey(node.id)) { + maxLayer++; + layer[node.id] = maxLayer; + } + } + + // Group nodes by layer (left to right) + List> layers = + layer. + GroupBy(kv => kv.Value). + OrderBy(g => g.Key). + Select(g => g.Select(x => x.Key).ToList()). + ToList(); + + // Same code without using Linq + // Build layers dictionary: layerIndex -> List nodeIds + // Dictionary> layersDict = new(); + // foreach (KeyValuePair kv in layer) { + // int nodeId = kv.Key; + // int layerIndex = kv.Value; + // if (!layersDict.TryGetValue(layerIndex, out List list)) { + // list = new List(); + // layersDict[layerIndex] = list; + // } + // list.Add(nodeId); + // } + + // // Determine sorted layer indices + // List layerIndices = new(layersDict.Keys); + // layerIndices.Sort(); // ascending order + + // // Build final List> in sorted order + // List> layers = new(); + // foreach (int idx in layerIndices) { + // layers.Add(layersDict[idx]); + // } + + float hSpacing = 100f; + float totalHeight = 400f; + + // Place nodes: x increases with layer index, y spaced within layer + for (int layerIx = 0; layerIx < layers.Count; layerIx++) { + List nodeList = layers[layerIx]; + float spacing = totalHeight / nodeList.Count; + float margin = 10 + spacing / 2; + for (int i = 0; i < nodeList.Count; i++) { + int index = nodeList[i]; + Node node = GetNodeById(dag, index); + if (node == null) + continue; + float x = hSpacing + layerIx * hSpacing; + //float y = 400 - totalHeight / 2f + i * vSpacing; + float y = margin + i * spacing; + // Debug.Log($"({li}, {i}) -> {x}, {y}"); + node.position = new Vector2(x, y); + } + } + + //Repaint(); + } + } + +} \ No newline at end of file diff --git a/Editor/ClusterViewer.cs.meta b/Editor/ClusterViewer.cs.meta new file mode 100644 index 0000000..ac68b91 --- /dev/null +++ b/Editor/ClusterViewer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4fe58945c76d153edacc220597474ad2 \ No newline at end of file diff --git a/Editor/DAGWindow.cs b/Editor/DAGWindow.cs deleted file mode 100644 index 1cb590e..0000000 --- a/Editor/DAGWindow.cs +++ /dev/null @@ -1,356 +0,0 @@ - -using UnityEngine; -using UnityEditor; -using System.Collections.Generic; -using System.Linq; - -namespace NanoBrain { - - // Simple DAG data model - // [System.Serializable] - // public class DagNode - // { - // public int id; - // public string title; - // public Vector2 position; - // public float radius = 36f; // circle radius - // } - - // [System.Serializable] - // public class DagEdge - // { - // public int fromId; - // public int toId; - // } - - public class DAGEditorWindow : EditorWindow { - List nodes = new List(); - List edges = new List(); - - Vector2 pan = Vector2.zero; - float zoom = 1.0f; - const float minZoom = 0.5f; - const float maxZoom = 2.0f; - - GUIStyle labelStyle; - int selectedNodeId = -1; - - Vector2 dragStart; - bool draggingNode = false; - int draggingNodeId = -1; - - [MenuItem("Window/DAG Viewer (LR, Circles)")] - public static void ShowWindow() { - var w = GetWindow("DAG Viewer (LR)"); - w.minSize = new Vector2(500, 300); - } - - void OnEnable() { - labelStyle = new GUIStyle(EditorStyles.label); - labelStyle.alignment = TextAnchor.MiddleCenter; - labelStyle.normal.textColor = Color.white; - labelStyle.fontStyle = FontStyle.Bold; - - if (nodes.Count == 0) - CreateSampleGraph(); - - ComputeLeftToRightLayout(); - } - - void CreateSampleGraph() { - nodes.Clear(); - edges.Clear(); - - nodes.Add(new DagNode() { id = 0, title = "In1" }); - nodes.Add(new DagNode() { id = 1, title = "In2" }); - nodes.Add(new DagNode() { id = 2, title = "A" }); - nodes.Add(new DagNode() { id = 3, title = "B" }); - nodes.Add(new DagNode() { id = 4, title = "C" }); - nodes.Add(new DagNode() { id = 5, title = "Out1" }); - nodes.Add(new DagNode() { id = 6, title = "Out2" }); - - edges.Add(new DagEdge() { fromId = 0, toId = 2 }); - edges.Add(new DagEdge() { fromId = 1, toId = 2 }); - edges.Add(new DagEdge() { fromId = 2, toId = 3 }); - edges.Add(new DagEdge() { fromId = 2, toId = 4 }); - edges.Add(new DagEdge() { fromId = 3, toId = 5 }); - edges.Add(new DagEdge() { fromId = 4, toId = 6 }); - } - - void OnGUI() { - HandleInput(); - - Rect rect = new Rect(0, 0, position.width, position.height); - EditorGUI.DrawRect(rect, new Color(0.11f, 0.11f, 0.11f)); - - Matrix4x4 oldMatrix = GUI.matrix; - Vector2 origin = new Vector2(position.width / 2, position.height / 2); - GUI.matrix = Matrix4x4.TRS(origin + pan, Quaternion.identity, Vector3.one * zoom) * - Matrix4x4.TRS(-origin, Quaternion.identity, Vector3.one); - - // Draw edges first - foreach (var e in edges) { - var from = GetNodeById(e.fromId); - var to = GetNodeById(e.toId); - if (from == null || to == null) continue; - DrawEdgeCircleNodes(from, to); - } - - // Draw nodes (circles) - foreach (var n in nodes) { - DrawNodeCircle(n); - } - - GUI.matrix = oldMatrix; - - // Footer toolbar - GUILayout.FlexibleSpace(); - EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); - if (GUILayout.Button("Fit", EditorStyles.toolbarButton)) FitToView(); - if (GUILayout.Button("Layout LR", EditorStyles.toolbarButton)) ComputeLeftToRightLayout(); - if (GUILayout.Button("Add Node", EditorStyles.toolbarButton)) { - AddNode("N" + nodes.Count); - ComputeLeftToRightLayout(); - } - if (GUILayout.Button("Add Edge (selected->new)", EditorStyles.toolbarButton)) { - if (selectedNodeId != -1) { - var newNode = AddNode("N" + nodes.Count); - edges.Add(new DagEdge() { fromId = selectedNodeId, toId = newNode.id }); - ComputeLeftToRightLayout(); - } - } - EditorGUILayout.EndHorizontal(); - } - - void HandleInput() { - Event e = Event.current; - - // Zoom with scroll - if (e.type == EventType.ScrollWheel) { - float oldZoom = zoom; - float delta = -e.delta.y * 0.01f; - zoom = Mathf.Clamp(zoom + delta, minZoom, maxZoom); - Vector2 mouse = e.mousePosition; - pan += (mouse - new Vector2(position.width / 2, position.height / 2)) * (1 - zoom / oldZoom); - e.Use(); - } - - // Pan with middle or right+ctrl drag - if (e.type == EventType.MouseDrag && (e.button == 2 || (e.button == 1 && e.control))) { - pan += e.delta; - e.Use(); - } - - // Node dragging & selection (convert mouse to graph space) - Vector2 graphMouse = ScreenToGraph(e.mousePosition); - if (e.type == EventType.MouseDown && e.button == 0) { - int hit = HitTestNode(graphMouse); - if (hit != -1) { - selectedNodeId = hit; - draggingNode = true; - draggingNodeId = hit; - dragStart = graphMouse; - e.Use(); - } - else { - selectedNodeId = -1; - } - } - - if (draggingNode && draggingNodeId != -1) { - if (e.type == EventType.MouseDrag && e.button == 0) { - Vector2 graphDelta = e.delta / zoom; - var n = GetNodeById(draggingNodeId); - if (n != null) { - n.position += graphDelta; - Repaint(); - e.Use(); - } - } - if (e.type == EventType.MouseUp && e.button == 0) { - draggingNode = false; - draggingNodeId = -1; - e.Use(); - } - } - } - - DagNode AddNode(string title) { - int nextId = nodes.Count > 0 ? nodes.Max(n => n.id) + 1 : 0; - var n = new DagNode() { id = nextId, title = title, position = Vector2.zero }; - nodes.Add(n); - return n; - } - - DagNode GetNodeById(int id) => nodes.FirstOrDefault(x => x.id == id); - - void DrawNodeCircle(DagNode n) { - Vector2 center = n.position; - float r = n.radius; - Rect nodeRect = new Rect(center.x - r, center.y - r, r * 2, r * 2); - - // circle background - Color bg = (n.id == selectedNodeId) ? new Color(0.15f, 0.5f, 0.9f) : new Color(0.2f, 0.2f, 0.2f); - EditorGUI.DrawRect(nodeRect, bg); - - // anti-aliased circle outline - Handles.color = Color.white * 0.9f; - Handles.DrawAAPolyLine(3f / zoom, GetCircleOutlinePoints(center, r, 48).ToArray()); - - // label - Vector2 labelPos = center - new Vector2(0, 8); - GUI.Label(new Rect(labelPos.x - r, labelPos.y - 8, r * 2, 18), n.title, labelStyle); - } - - List GetCircleOutlinePoints(Vector2 center, float radius, int segments) { - var pts = new List(segments + 1); - for (int i = 0; i <= segments; i++) { - float a = (float)i / segments * Mathf.PI * 2f; - pts.Add(new Vector3(center.x + Mathf.Cos(a) * radius, center.y + Mathf.Sin(a) * radius, 0)); - } - return pts; - } - - void DrawEdgeCircleNodes(DagNode from, DagNode to) { - Vector2 a = from.position; - Vector2 b = to.position; - if (a == b) return; - - // Compute edge line that starts/ends at circle circumferences - Vector2 dir = (b - a).normalized; - Vector2 start = a + dir * from.radius; - Vector2 end = b - dir * to.radius; - - // Use a simple curved line: start -> control -> end (bezier) - Vector2 control = new Vector2((start.x + end.x) / 2f, (start.y + end.y) / 2f); - // Slight vertical offset to separate overlapping lines based on node ids - float offset = ((from.id * 7 + to.id * 11) % 7 - 3) * 6f / zoom; - control += new Vector2(0, offset); - - Handles.color = Color.white * 0.9f; - Handles.DrawAAPolyLine(3f / zoom, 20, GetBezierPoints(start, control, end, 24).ToArray()); - - // Arrow at end pointing towards 'b' - DrawArrowHead(end - dir * 2f, end, 10f / zoom, 12f / zoom, Color.white); - } - - List GetBezierPoints(Vector2 p0, Vector2 p1, Vector2 p2, int seg) { - var pts = new List(seg + 1); - for (int i = 0; i <= seg; i++) { - float t = (float)i / seg; - Vector2 p = (1 - t) * (1 - t) * p0 + 2 * (1 - t) * t * p1 + t * t * p2; - pts.Add(new Vector3(p.x, p.y, 0)); - } - return pts; - } - - void DrawArrowHead(Vector2 from, Vector2 to, float headWidth, float headLength, Color color) { - Vector2 dir = (to - from).normalized; - if (dir == Vector2.zero) return; - Vector2 right = new Vector2(-dir.y, dir.x); - - Vector3 p1 = to; - Vector3 p2 = to - dir * headLength + right * headWidth * 0.5f; - Vector3 p3 = to - dir * headLength - right * headWidth * 0.5f; - - Handles.color = color; - Handles.DrawAAConvexPolygon(p1, p2, p3); - } - - // Left-to-right layered layout (sources on the left, sinks on the right) - void ComputeLeftToRightLayout() { - // build adjacency and indegree - var adj = nodes.ToDictionary(n => n.id, n => new List()); - var indeg = nodes.ToDictionary(n => n.id, n => 0); - foreach (var e in edges) { - if (!adj.ContainsKey(e.fromId) || !adj.ContainsKey(e.toId)) continue; - adj[e.fromId].Add(e.toId); - indeg[e.toId]++; - } - - // Kahn's algorithm to compute topological layers (horizontal layers) - Dictionary layer = new Dictionary(); - Queue q = new Queue(indeg.Where(kv => kv.Value == 0).Select(kv => kv.Key)); - foreach (var id in q) layer[id] = 0; - - while (q.Count > 0) { - int u = q.Dequeue(); - int l = layer[u]; - foreach (var v in adj[u]) { - // prefer placing v at least one layer after u - if (!layer.ContainsKey(v) || layer[v] < l + 1) layer[v] = l + 1; - indeg[v]--; - if (indeg[v] == 0) q.Enqueue(v); - } - } - - // Any unreachable nodes -> assign next layers - int maxLayer = layer.Count > 0 ? layer.Values.Max() : 0; - foreach (var n in nodes) { - if (!layer.ContainsKey(n.id)) { - maxLayer++; - layer[n.id] = maxLayer; - } - } - - // Group nodes by layer (left to right) - var layers = layer.GroupBy(kv => kv.Value).OrderBy(g => g.Key).Select(g => g.Select(x => x.Key).ToList()).ToList(); - - // Layout parameters (horizontal spacing drives left->right) - float hSpacing = 220f; - float vSpacing = 120f; - - // Place nodes: x increases with layer index, y spaced within layer - for (int li = 0; li < layers.Count; li++) { - var lst = layers[li]; - float totalHeight = (lst.Count - 1) * vSpacing; - for (int i = 0; i < lst.Count; i++) { - int id = lst[i]; - var n = GetNodeById(id); - if (n == null) continue; - float x = li * hSpacing; - float y = -totalHeight / 2f + i * vSpacing; - n.position = new Vector2(x, y); - } - } - - Repaint(); - } - - void FitToView() { - if (nodes.Count == 0) return; - Rect bounds = new Rect(nodes[0].position - Vector2.one * nodes[0].radius, Vector2.one * nodes[0].radius * 2f); - foreach (var n in nodes) - bounds = RectUnion(bounds, new Rect(n.position - Vector2.one * n.radius, Vector2.one * n.radius * 2f)); - - Vector2 center = bounds.center; - pan = -center; - zoom = 1.0f; - Repaint(); - } - - static Rect RectUnion(Rect a, Rect b) { - float xMin = Mathf.Min(a.xMin, b.xMin); - float xMax = Mathf.Max(a.xMax, b.xMax); - float yMin = Mathf.Min(a.yMin, b.yMin); - float yMax = Mathf.Max(a.yMax, b.yMax); - return Rect.MinMaxRect(xMin, yMin, xMax, yMax); - } - - Vector2 ScreenToGraph(Vector2 screenPos) { - Vector2 origin = new Vector2(position.width / 2, position.height / 2); - // invert the GUI.matrix transform (approx for current simple transforms) - return (screenPos - (origin + pan)) / zoom + origin * (1 - 1 / zoom); - } - - int HitTestNode(Vector2 graphPos) { - // returns node id under point or -1 - for (int i = nodes.Count - 1; i >= 0; i--) { - var n = nodes[i]; - if ((graphPos - n.position).sqrMagnitude <= n.radius * n.radius) return n.id; - } - return -1; - } - } - -} \ No newline at end of file diff --git a/Editor/DAGWindow.cs.meta b/Editor/DAGWindow.cs.meta deleted file mode 100644 index ea0ee9e..0000000 --- a/Editor/DAGWindow.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 95393aed582b8b30d965400672aec4d8 \ No newline at end of file diff --git a/Editor/NanoBrain_Editor.cs b/Editor/NanoBrain_Editor.cs deleted file mode 100644 index 7e6b441..0000000 --- a/Editor/NanoBrain_Editor.cs +++ /dev/null @@ -1,53 +0,0 @@ -using UnityEditor; -using UnityEditor.UIElements; - -using UnityEngine; -using UnityEngine.UIElements; - -namespace NanoBrain { - - [CustomEditor(typeof(Brain))] - public class NanoBrainComponent_Editor : Editor { - protected static VisualElement mainContainer; - protected static VisualElement inspectorContainer; - - protected Brain component; - private SerializedProperty brainProp; - - //ClusterInspector.GraphView board; - - public void OnEnable() { - component = target as Brain; - - if (Application.isPlaying == false && serializedObject != null) { - string propertyName = nameof(Brain.defaultBrain); - brainProp = serializedObject.FindProperty(propertyName); - } - } - - public override VisualElement CreateInspectorGUI() { - Cluster brain = component.brain; - - if (Application.isPlaying == false) - serializedObject.Update(); - - - VisualElement root = new(); - if (Application.isPlaying == false) { - PropertyField brainField = new(brainProp) { - label = "Cluster Prefab" - }; - root.Add(brainField); - } - - if (brain != null) - ClusterInspector.CreateInspector(root, brain.prefab, brain.defaultOutput, component.gameObject); - - if (Application.isPlaying == false) - serializedObject.ApplyModifiedProperties(); - return root; - } - - } - -} \ No newline at end of file diff --git a/LinearAlgebra.meta b/LinearAlgebra.meta new file mode 100644 index 0000000..d18b73b --- /dev/null +++ b/LinearAlgebra.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a4c7dfe43bdf504e29c5c97919d7a1c0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/LinearAlgebra/src.meta b/LinearAlgebra/src.meta new file mode 100644 index 0000000..6476da7 --- /dev/null +++ b/LinearAlgebra/src.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6a602cec2c4009925b1d19ed36a98c6a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/LinearAlgebra/test.meta b/LinearAlgebra/test.meta new file mode 100644 index 0000000..7b069c9 --- /dev/null +++ b/LinearAlgebra/test.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9b84f664459d02b90894e460de42c219 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/Brain.cs b/Runtime/Scripts/Brain.cs index cd0c668..acb28f3 100644 --- a/Runtime/Scripts/Brain.cs +++ b/Runtime/Scripts/Brain.cs @@ -11,7 +11,7 @@ namespace NanoBrain { /// /// The Cluster prefab from which the cluster is created /// - public ClusterPrefab defaultBrain; + public ClusterPrefab brainPrefab; [NonSerialized] private Cluster brainInstance; @@ -20,15 +20,24 @@ namespace NanoBrain { /// public Cluster brain { get { - if (brainInstance == null && defaultBrain != null) { - brainInstance = new Cluster(defaultBrain) { - name = defaultBrain.name + " (Instance)" + if (brainInstance == null && brainPrefab != null) { + brainInstance = new Cluster(brainPrefab) { + name = brainPrefab.name }; + } else if (brainInstance != null && brainPrefab == null) { + brainInstance = null; } return brainInstance; } } + // public Cluster InitializeBrain() { + // brainInstance = new Cluster(brainPrefab) { + // name = brainPrefab.name + // }; + // return brainInstance; + // } + /// /// Update the weight for all Synapses coming from the Neuron with the given name /// diff --git a/Runtime/Scripts/Core/Cluster.cs b/Runtime/Scripts/Core/Cluster.cs index f8ef85a..0b89721 100644 --- a/Runtime/Scripts/Core/Cluster.cs +++ b/Runtime/Scripts/Core/Cluster.cs @@ -8,535 +8,782 @@ using static Unity.Mathematics.math; namespace NanoBrain { -/// -/// A Cluster combines a collection of Nuclei to implement reusable behaviour -/// -/// A Cluster is an instantiation of a ClusterPrefab. -/// Clusters can be nested inside other clusters. -[Serializable] -public class Cluster : Nucleus { - /// - /// The base name of the cluster. I don't think this is actively used at this moment + /// A Cluster combines a collection of Nuclei to implement reusable behaviour /// - public string baseName { - get { - int colonPositon = this.name.IndexOf(':'); - if (colonPositon < 0) - return this.name; - return this.name[..colonPositon]; - } - } + /// A Cluster is an instantiation of a ClusterPrefab. + /// Clusters can be nested inside other clusters. + [Serializable] + public class Cluster : Nucleus { + // It may be that clusters will not be nuclei anymore in the future.... - #region Init + public ClusterPrefab prefab; - /// - /// Instantiate a new copy of a ClusterPrefab in the given parent - /// - /// The prefab to use - /// The cluster in which this new cluster will be placed - public Cluster(ClusterPrefab prefab, Cluster parent) { - this.prefab = prefab; - this.name = prefab.name; - - this.parent = parent; - this.parent?.clusterNuclei.Add(this); - - ClonePrefab(); - _ = this.inputs; - this.sortedNuclei = TopologicalSort(this.clusterNuclei); - } - - /// - /// Add a new cluster to a ClusterPrefab - /// - /// The prefab to copy - /// The prefab in which the new copy is placed - public Cluster(ClusterPrefab prefab, ClusterPrefab parent = null) { - this.prefab = prefab; - this.name = prefab.name; - this.clusterPrefab = parent; - - if (this.clusterPrefab != null) - this.clusterPrefab.nuclei.Add(this); - - ClonePrefab(); - _ = this.inputs; - this.sortedNuclei = TopologicalSort(this.clusterNuclei); - } - - /// - /// Clone a prefab. - /// - /// Strange that this does not take any parameters or return values. - /// Where which the clone be found??? - private void ClonePrefab() { - Nucleus[] prefabNuclei = this.prefab.nuclei.ToArray(); - // first clone the nuclei without their connections - foreach (Nucleus nucleus in this.prefab.nuclei) { - nucleus.ShallowCloneTo(this); - } - Nucleus[] clonedNuclei = this.clusterNuclei.ToArray(); - - // Now clone the connections - for (int nucleusIx = 0; nucleusIx < prefabNuclei.Length; nucleusIx++) { - Nucleus prefabNucleus = prefabNuclei[nucleusIx]; - if (prefabNucleus is not Neuron prefabNeuron) - continue; - - Nucleus clonedNucleus = clonedNuclei[nucleusIx]; - if (clonedNucleus == null || clonedNucleus is not Neuron clonedNeuron) - continue; - - // Copy the receivers, which will also create the synapses - // Clusters do not have receivers... - foreach (Nucleus receiver in prefabNeuron.receivers.ToArray()) { - int ix = GetNucleusIndex(prefabNuclei, receiver); - if (ix < 0) - continue; - - if (clonedNuclei[ix] is not Nucleus clonedReceiver) - continue; - - // Find the synapse for the weight - float weight = 1; - foreach (Synapse synapse in receiver.synapses) { - // Find the weight for this synapse - if (synapse.neuron == prefabNucleus) { - weight = synapse.weight; - break; - } - } - - clonedNeuron.AddReceiver(clonedReceiver, weight); + /// + /// The base name of the cluster. I don't think this is actively used at this moment + /// + public string baseName { + get { + int colonPositon = this.name.IndexOf(':'); + if (colonPositon < 0) + return this.name; + return this.name[..colonPositon]; } } - // Copy nucleus arrays for receptors - for (int nucleusIx = 0; nucleusIx < prefabNuclei.Length; nucleusIx++) { - Nucleus prefabNucleus = prefabNuclei[nucleusIx]; - if (prefabNucleus is not IReceptor prefabReceptor) - continue; + // This should not be serialized + [SerializeReference] + public Cluster[] siblingClusters; + // This serialization should be enough + public int instanceCount = 1; + public Dictionary thingClusters = new(); - if (prefabReceptor.nucleiArray == null || prefabReceptor.nucleiArray.Length == 0) - continue; + [SerializeReference] + public List clusterNuclei = new(); + // the nuclei sorted using topological sorting + // to ensure that the cluster is computer in the right order + public List sortedNuclei; - IReceptor clonedNucleus = clonedNuclei[nucleusIx] as IReceptor; - if (prefabReceptor == prefabReceptor.nucleiArray[0]) { - // We clone the array only for the first entry - NucleusArray clonedArray = new(prefabReceptor.nucleiArray.Length); - int arrayIx = 0; - foreach (Nucleus prefabArrayNucleus in prefabReceptor.nucleiArray) { - int arrayNucleusIx = GetNucleusIndex(prefabNuclei, prefabArrayNucleus); - if (arrayNucleusIx >= 0) { - Nucleus clonedArrayNucleus = clonedNuclei[arrayNucleusIx]; - clonedArray.nuclei[arrayIx] = clonedArrayNucleus; + #region Init + + /// + /// Instantiate a new copy of a ClusterPrefab in the given parent + /// + /// The prefab to use + /// The cluster in which this new cluster will be placed + public Cluster(ClusterPrefab prefab, Cluster parent) { + this.prefab = prefab; + this.name = prefab.name; + + this.parent = parent; + this.parent?.clusterNuclei.Add(this); + ClonePrefab(); + _ = this.inputs; + this.sortedNuclei = TopologicalSort(this.clusterNuclei); + } + + /// + /// Add a new cluster to a ClusterPrefab + /// + /// The prefab to copy + /// The prefab in which the new copy is placed + public Cluster(ClusterPrefab prefab, ClusterPrefab parent = null) { + this.prefab = prefab; + this.name = prefab.name; + this.clusterPrefab = parent; + + if (this.clusterPrefab != null) + this.clusterPrefab.nuclei.Add(this); + + ClonePrefab(); + _ = this.inputs; + this.sortedNuclei = TopologicalSort(this.clusterNuclei); + } + + /// + /// Clone a prefab. + /// + /// Strange that this does not take any parameters or return values. + /// Where which the clone be found??? + private void ClonePrefab() { + Nucleus[] prefabNuclei = this.prefab.nuclei.ToArray(); + + // first clone the nuclei without their connections + foreach (Nucleus nucleus in prefabNuclei) { + nucleus.ShallowCloneTo(this); + } + Nucleus[] clonedNuclei = this.clusterNuclei.ToArray(); + + // Now clone the connections + for (int nucleusIx = 0; nucleusIx < prefabNuclei.Length; nucleusIx++) { + Nucleus prefabNucleus = prefabNuclei[nucleusIx]; + if (prefabNucleus is not Neuron prefabNeuron) + continue; + + Nucleus clonedNucleus = clonedNuclei[nucleusIx]; + if (clonedNucleus == null || clonedNucleus is not Neuron clonedNeuron) + continue; + + foreach (Synapse prefabSynapse in prefabNeuron.synapses) { + Neuron synapseNeuron = prefabSynapse.neuron; + if (synapseNeuron.parent is not null && synapseNeuron.clusterPrefab != this.clusterPrefab) { + // Neuron is in another cluster, find the cloned cluster first + Cluster prefabCluster = synapseNeuron.parent; + int clusterIx = GetNucleusIndex(prefabNuclei, prefabCluster); + if (clusterIx < 0) + // Could not find the cluster in the prefab + continue; + if (clonedNuclei[clusterIx] is not Cluster clonedCluster) + // Could not find the cloned cluster + continue; + + // Now find the neuron in that cloned cluster + int neuronIx = GetNucleusIndex(prefabCluster.prefab.nuclei, prefabSynapse.neuron); + if (neuronIx < 0) + // Could not find the neuron in the prefab cluster + continue; + if (clonedCluster.clusterNuclei[neuronIx] is not Neuron clonedSender) + // Could not find the neuron in the cloned cluster + continue; + + clonedSender.AddReceiver(clonedNeuron, prefabSynapse.weight); } else { - Debug.LogError($" Could not find prefab nucleus {prefabNucleus.name} in the clones"); + int ix = GetNucleusIndex(prefabNuclei, prefabSynapse.neuron); + if (ix < 0) + continue; + if (clonedNuclei[ix] is not Neuron clonedSender) + continue; + + // Copy the receivers which will also create the synapse + clonedSender.AddReceiver(clonedNeuron, prefabSynapse.weight); } - arrayIx++; } - //clonedNucleus.array = clonedArray; - clonedNucleus.nucleiArray = clonedArray.nuclei; + + // // Copy the receivers, which will also create the synapses + // foreach (Nucleus receiver in prefabNeuron.receivers.ToArray()) { + // int ix = GetNucleusIndex(prefabNuclei, receiver); + // if (ix < 0) + // continue; + + // if (clonedNuclei[ix] is not Nucleus clonedReceiver) + // continue; + + // // Find the synapse for the weight + // float weight = 1; + // foreach (Synapse synapse in receiver.synapses) { + // // Find the weight for this synapse + // if (synapse.neuron == prefabNucleus) { + // weight = synapse.weight; + // break; + // } + // } + + // clonedNeuron.AddReceiver(clonedReceiver, weight); + // } + } + /* + // 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.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; + } + } + + /* + // Collect the subclusters + List subClusters = new(); + foreach (Nucleus nucleus in prefabNuclei) { + foreach (Synapse synapse in nucleus.synapses) { + Nucleus synapseNucleus = synapse.neuron; + Cluster subCluster = synapseNucleus.parent; + if (subCluster is null || + synapseNucleus.clusterPrefab == this.clusterPrefab) { + + continue; + } + // if (synapseNucleus is not Cluster subCluster) + // continue; + if (subClusters.Contains(subCluster)) + continue; + subClusters.Add(subCluster); + } + } + // Create the subcluster instances + foreach (Cluster subCluster in subClusters) { + for (int ix = 0; ix < subCluster.instanceCount; ix++) { + // create the new instance + Cluster clusterInstance = new(subCluster.prefab); + // connect it + foreach ((Neuron sender, Nucleus receiver) in subCluster.CollectConnections()) { + int receiverIx = GetNucleusIndex(prefabNuclei, receiver); + if (receiverIx < 0) + continue; + + if (clonedNuclei[receiverIx] is not Nucleus clonedReceiver) + continue; + + // Find the synapse for the weight + float weight = 1; + foreach (Synapse synapse in receiver.synapses) { + // Find the weight for this synapse + if (synapse.neuron == sender) { + weight = synapse.weight; + break; + } + } + + if (clusterInstance.GetNucleus(sender.name) is not Neuron clonedSender) + continue; + + clonedSender.AddReceiver(clonedReceiver, weight); + } + } + } + */ + + foreach (Nucleus nucleus in this.clusterNuclei) { + if (nucleus is Cluster clonedSubCluster) + RestoreAllExternalReceivers(clonedSubCluster, this.prefab, this); + } + } + + /// + /// Sort the nuclei in a correct evaluation order + /// + /// + /// + /// + private List TopologicalSort(List nodes) { + Dictionary inDegree = new(); + foreach (Nucleus node in nodes) + inDegree[node] = 0; // Initialize in-degree to zero + + // Calculate in-degrees + foreach (Nucleus node in nodes) { + if (node is Cluster cluster) { + foreach (Nucleus receiver in cluster.CollectReceivers()) + inDegree[receiver]++; + } + else if (node is Neuron neuron) { + foreach (Nucleus receiver in neuron.receivers) + inDegree[receiver]++; + } + } + + Queue queue = new(); + foreach (Nucleus node in nodes) { + if (inDegree[node] == 0) // Nodes with no dependencies + queue.Enqueue(node); + } + // The queue basically stores all input nuclei? + + List sortedOrder = new(); + while (queue.Count > 0) { + Nucleus current = queue.Dequeue(); + sortedOrder.Add(current); // Process the node + + if (current is Neuron neuron) { + foreach (Nucleus receiver in neuron.receivers) { + inDegree[receiver]--; + if (inDegree[receiver] == 0) // If all dependencies resolved + queue.Enqueue(receiver); + } + } + else if (current is Cluster cluster) { + foreach (Nucleus receiver in cluster.CollectReceivers()) { + inDegree[receiver]--; + if (inDegree[receiver] == 0) // If all dependencies resolved + queue.Enqueue(receiver); + } + } + } + + // Check for cycles in the graph + if (sortedOrder.Count != nodes.Count) + throw new InvalidOperationException("Graph is not a DAG; a cycle exists."); + + return sortedOrder; + } + + public override Nucleus Clone(ClusterPrefab parent) { + Cluster clone = new(this.prefab, parent); + + foreach (Synapse synapse in this.synapses) { + Synapse clonedSynapse = clone.AddSynapse(synapse.neuron); + clonedSynapse.weight = synapse.weight; + } + + foreach (Nucleus nucleus in this.clusterNuclei) { + if (nucleus is Neuron output) { + foreach (Nucleus receiver in output.receivers) { + int ix = GetNucleusIndex(this.clusterNuclei, output); + Debug.Log($"{output.name} -> {receiver.name}: {ix}"); + if (ix < 0) + continue; + + if (clone.clusterNuclei[ix] is not Neuron clonedOutput) + continue; + + clonedOutput.AddReceiver(receiver); + } + } + } + + return clone; + } + + public override Nucleus ShallowCloneTo(Cluster parent) { + // Clusters should not be cloned, but instantiated from the prefab.... + Cluster clone = new(this.prefab, parent) { + name = this.name, + clusterPrefab = this.clusterPrefab, + }; + // Somehow siblingClusters should be cloned too. Believe I do this in ClonePrefab right now. + + return clone; + } + + private static void RestoreAllExternalReceivers(Cluster clonedCluster, ClusterPrefab prefabParent, Cluster clonedParent) { + int clonedClusterIx = GetNucleusIndex(clonedParent.clusterNuclei, clonedCluster); + if (prefabParent.nuclei[clonedClusterIx] is not Cluster sourceCluster) + return; + + for (int nucleusIx = 0; nucleusIx < sourceCluster.clusterNuclei.Count; nucleusIx++) { + Nucleus sourceNucleus = sourceCluster.clusterNuclei[nucleusIx]; + if (sourceNucleus is not Neuron sourceNeuron) + continue; + + if (clonedCluster.clusterNuclei[nucleusIx] is not Neuron clonedNeuron) + continue; + + // copy the receivers (and thus synapses) from the source to the clone + foreach (Nucleus receiver in sourceNeuron.receivers) { + int ix = GetNucleusIndex(prefabParent.nuclei, receiver); + if (ix < 0 || ix >= clonedParent.clusterNuclei.Count) + continue; + + Nucleus clonedReceiver = clonedParent.clusterNuclei[ix]; + + // Find the synapse for the weight + float weight = 1; + foreach (Synapse synapse in receiver.synapses) { + // Find the weight for this synapse + if (synapse.neuron == sourceNucleus) { + weight = synapse.weight; + break; + } + } + + clonedNeuron.AddReceiver(clonedReceiver, weight); + // Debug.Log($"external: {clonedReceiver.name} receives from {clonedNeuron.name} {clonedNeuron.GetHashCode()}"); + } + } + } + + protected int GetNucleusIndex(Nucleus[] nuclei, Nucleus nucleus) { + for (int i = 0; i < nuclei.Length; i++) { + if (nucleus == nuclei[i]) + return i; + } + return -1; + } + + public static int GetNucleusIndex(List nuclei, Nucleus nucleus) { + int i = 0; + foreach (Nucleus nucleiElement in nuclei) { + //for (int i = 0; i < nuclei.Length; i++) { + if (nucleus == nucleiElement) + return i; + i++; + } + return -1; + } + + #endregion Init + + #region Cluster Array + + public void AddInstance() { + this.instanceCount++; + } + + public void AddInstance(ClusterPrefab prefab) { + // Ensure siblingClusters exists + if (this.siblingClusters == null || this.siblingClusters.Length == 0) + this.siblingClusters = new Cluster[1] { this }; + + // Prepare the new array + int newLength = this.siblingClusters.Length + 1; + Cluster[] newSiblings = new Cluster[newLength]; + + for (int i = 0; i < newSiblings.Length - 1; i++) + newSiblings[i] = this.siblingClusters[i]; + + Cluster newCluster = this.Clone(prefab) as Cluster; + string baseName = this.name; + int colonPos = baseName.IndexOf(":"); + if (colonPos > 0) + baseName = baseName[..colonPos]; + newCluster.name = $"{baseName}: {newLength - 1}"; + newSiblings[newLength - 1] = newCluster; + + // All siblingClusters need to user this array! + foreach (Cluster sibling in newSiblings) + sibling.siblingClusters = newSiblings; + } + + public void RemoveInstance() { + if (instanceCount > 1) + instanceCount--; + else { + if (this.siblingClusters == null || this.siblingClusters.Length <= 1) + return; + + // Prepare the new array + int newLength = this.siblingClusters.Length - 1; + Cluster[] newClusters = new Cluster[newLength]; + + for (int i = 0; i < newLength; i++) + newClusters[i] = this.siblingClusters[i]; + + Neuron.Delete(this.siblingClusters[^1]); + this.siblingClusters = newClusters; + } + } + + public virtual Cluster GetThingCluster() { + Cluster selectedCluster = SelectCluster(); + return selectedCluster; + } + public virtual Cluster GetThingCluster(int thingId, string thingName = null) { + if (thingClusters.TryGetValue(thingId, out Cluster cluster)) + return cluster; + + Cluster selectedCluster = SelectCluster(); + thingClusters[thingId] = selectedCluster; + return selectedCluster; + } + + private Cluster SelectCluster() { + if (this.siblingClusters == null) + return this; + + // Find a sleeping cluster + foreach (Cluster cluster in this.siblingClusters) { + if (cluster.defaultOutput.isSleeping) { + RemoveThingCluster(cluster); + return cluster; + } + } + + // Otherwise find longest unused cluster + Cluster unusedCluster = this.siblingClusters[0]; + for (int ix = 1; ix < this.siblingClusters.Length; ix++) { + if (this.siblingClusters[ix].defaultOutput.lastUpdate < unusedCluster.defaultOutput.lastUpdate) + unusedCluster = this.siblingClusters[ix]; + } + + RemoveThingCluster(unusedCluster); + return unusedCluster; + } + + private void RemoveThingCluster(Cluster cluster) { + List keysToRemove = new(); + foreach (KeyValuePair kvp in thingClusters) { + if (kvp.Value == cluster) + keysToRemove.Add(kvp.Key); + } + + foreach (int thingId in keysToRemove) + thingClusters.Remove(thingId); + } + + public bool SameSiblingsAs(Cluster[] otherSiblingClusters) { + if (this.siblingClusters == null) + return false; + for (int ix = 0; ix < this.siblingClusters.Length; ix++) { + if (this.siblingClusters[ix] != otherSiblingClusters[ix]) + return false; + } + return true; + } + + public void AddArrayReceiver(Nucleus receiverToAdd, float weight = 1) { + this.defaultOutput.AddReceiver(receiverToAdd, weight); + // foreach (Cluster cluster in this.siblingClusters) { + // cluster.defaultOutput.AddReceiver(receiverToAdd, weight); + // } + + } + + #endregion ClusterArray + + + + //public Dictionary nucleiDict = new(); + + public List _inputs = null; + public virtual List inputs { + get { + if (this._inputs == null) { + this._inputs = new(); + foreach (Nucleus nucleus in this.clusterNuclei) { + // inputs have no synapses + if (nucleus.synapses.Count == 0) + this._inputs.Add(nucleus); + } + ComputeOrders(); + } + return this._inputs; + } + } + + public Dictionary> computeOrders = new(); + private void ComputeOrders() { + foreach (Nucleus input in this._inputs) + computeOrders[input] = TopologicalSort2(input); + } + + private List TopologicalSort2(Nucleus startNode) { + Dictionary inDegree = new(); + HashSet visited = new(); + + // Initialize in-degrees and mark all nodes as unvisited + foreach (Nucleus node in this.clusterNuclei) + inDegree[node] = 0; + + // Calculate in-degrees for all nodes reachable from the start node + Queue queue = new Queue(); + queue.Enqueue(startNode); + visited.Add(startNode); + + while (queue.Count > 0) { + Nucleus current = queue.Dequeue(); + List receivers = null; + if (current is Neuron neuron) + receivers = neuron.receivers; + else if (current is Cluster cluster) + receivers = cluster.CollectReceivers(); + + // if (current is Neuron neuron) { + foreach (Nucleus receiver in receivers) { + if (!visited.Contains(receiver)) { + visited.Add(receiver); + queue.Enqueue(receiver); + } + inDegree[receiver]++; + } + // } + } + + // Perform topological sort on all reachable nodes + queue.Clear(); + foreach (Nucleus node in visited) { + if (inDegree[node] == 0) + queue.Enqueue(node); + } + + List sortedOrder = new List(); + while (queue.Count > 0) { + Nucleus current = queue.Dequeue(); + sortedOrder.Add(current); // Process the node + + List receivers = null; + if (current is Neuron neuron) + receivers = neuron.receivers; + else if (current is Cluster cluster) + receivers = cluster.CollectReceivers(); + + //if (current is Neuron neuron) { + + foreach (Nucleus receiver in receivers) { + if (visited.Contains(receiver)) { + inDegree[receiver]--; + if (inDegree[receiver] == 0) // If all dependencies resolved + queue.Enqueue(receiver); + } + } + //} + } + + // Check for cycles in the graph + if (sortedOrder.Count != visited.Count) + throw new InvalidOperationException("Graph is not a DAG; a cycle exists."); + + return sortedOrder; + } + + public virtual Neuron defaultOutput {//=> this.nuclei[0] as Nucleus; + get { + if (this.clusterNuclei.Count > 0) + return this.clusterNuclei[0] as Neuron; + return null; + } + } + protected List _outputs = null; + public List outputs { + get { + if (this._outputs == null) { + this._outputs = new(); + foreach (Nucleus nucleus in this.clusterNuclei) { + if (nucleus is Neuron neuron && neuron.receivers.Count == 0) + this._outputs.Add(neuron); + } + } + return this._outputs; + } + } + + public bool TryGetNucleus(string nucleusName, out Nucleus foundNucleus) { + foreach (Nucleus receptor in this.clusterNuclei) { + if (receptor is Nucleus nucleus) + if (nucleus.name == nucleusName) { + foundNucleus = nucleus; + return true; + } + } + foundNucleus = null; + return false; + } + + public Nucleus GetNucleus(string nucleusName) { + int dotPosition = nucleusName.IndexOf('.'); + if (dotPosition >= 0) { + string clusterName = nucleusName[..dotPosition]; + string clusterName0 = clusterName + ": 0"; + foreach (Nucleus nucleus in this.clusterNuclei) { + if (nucleus is Cluster cluster) { + if (cluster.name == clusterName || cluster.name == clusterName0) { + string subNucleusName = nucleusName[(dotPosition + 1)..]; + return cluster.GetNucleus(subNucleusName); + } + } + } + return null; } else { - // The others will refer to the array created for the first nucleus in the array - int firstNucleusIx = GetNucleusIndex(prefabNuclei, prefabReceptor.nucleiArray[0]); - IReceptor clonedFirstNucleus = clonedNuclei[firstNucleusIx] as IReceptor; - clonedNucleus.nucleiArray = clonedFirstNucleus.nucleiArray; - } - } - - foreach (Nucleus nucleus in this.clusterNuclei) { - if (nucleus is Cluster clonedSubCluster) - RestoreAllExternalReceivers(clonedSubCluster, this.prefab, this); - } - } - - /// - /// Sort the nuclei in a correct evaluation order - /// - /// - /// - /// - private List TopologicalSort(List nodes) { - Dictionary inDegree = new(); - foreach (Nucleus node in nodes) - inDegree[node] = 0; // Initialize in-degree to zero - - // Calculate in-degrees - foreach (Nucleus node in nodes) { - if (node is Cluster cluster) { - foreach (Nucleus receiver in cluster.CollectReceivers()) - inDegree[receiver]++; - } - else if (node is Neuron neuron) { - foreach (Nucleus receiver in neuron.receivers) - inDegree[receiver]++; - } - } - - Queue queue = new(); - foreach (Nucleus node in nodes) { - if (inDegree[node] == 0) // Nodes with no dependencies - queue.Enqueue(node); - } - // The queue basically stores all input nuclei? - - List sortedOrder = new(); - while (queue.Count > 0) { - Nucleus current = queue.Dequeue(); - sortedOrder.Add(current); // Process the node - - if (current is Neuron neuron) { - foreach (Nucleus receiver in neuron.receivers) { - inDegree[receiver]--; - if (inDegree[receiver] == 0) // If all dependencies resolved - queue.Enqueue(receiver); - } - } - else if (current is Cluster cluster) { - foreach (Nucleus receiver in cluster.CollectReceivers()) { - inDegree[receiver]--; - if (inDegree[receiver] == 0) // If all dependencies resolved - queue.Enqueue(receiver); - } - } - } - - // Check for cycles in the graph - if (sortedOrder.Count != nodes.Count) - throw new InvalidOperationException("Graph is not a DAG; a cycle exists."); - - return sortedOrder; - } - - public override Nucleus Clone(ClusterPrefab parent) { - Cluster clone = new(this.prefab, parent); - - foreach (Synapse synapse in this.synapses) { - Synapse clonedSynapse = clone.AddSynapse(synapse.neuron); - clonedSynapse.weight = synapse.weight; - } - - foreach (Neuron output in this.outputs) { - foreach (Nucleus receiver in output.receivers) { - int ix = GetNucleusIndex(this.clusterNuclei.ToArray(), output); - if (ix < 0) - continue; - - if (clone.clusterNuclei[ix] is not Neuron clonedOutput) - continue; - - clonedOutput.AddReceiver(receiver); - } - } - - return clone; - } - - public override Nucleus ShallowCloneTo(Cluster parent) { - Cluster clone = new(this.prefab, parent) { - name = this.name, - clusterPrefab = this.clusterPrefab, - }; - - return clone; - } - - private static void RestoreAllExternalReceivers(Cluster clonedCluster, ClusterPrefab prefabParent, Cluster clonedParent) { - int clonedClusterIx = GetNucleusIndex(clonedParent.clusterNuclei, clonedCluster); - if (prefabParent.nuclei[clonedClusterIx] is not Cluster sourceCluster) - return; - - for (int nucleusIx = 0; nucleusIx < sourceCluster.clusterNuclei.Count; nucleusIx++) { - Nucleus sourceNucleus = sourceCluster.clusterNuclei[nucleusIx]; - if (sourceNucleus is not Neuron sourceNeuron) - continue; - - if (clonedCluster.clusterNuclei[nucleusIx] is not Neuron clonedNeuron) - continue; - - // copy the receivers (and thus synapses) from the source to the clone - foreach (Nucleus receiver in sourceNeuron.receivers) { - int ix = GetNucleusIndex(prefabParent.nuclei, receiver); - if (ix < 0 || ix >= clonedParent.clusterNuclei.Count) - continue; - - Nucleus clonedReceiver = clonedParent.clusterNuclei[ix]; - - // Find the synapse for the weight - float weight = 1; - foreach (Synapse synapse in receiver.synapses) { - // Find the weight for this synapse - if (synapse.neuron == sourceNucleus) { - weight = synapse.weight; - break; - } - } - - clonedNeuron.AddReceiver(clonedReceiver, weight); - // Debug.Log($"external: {clonedReceiver.name} receives from {clonedNeuron.name} {clonedNeuron.GetHashCode()}"); - } - } - } - - protected int GetNucleusIndex(Nucleus[] nuclei, Nucleus nucleus) { - for (int i = 0; i < nuclei.Length; i++) { - if (nucleus == nuclei[i]) - return i; - } - return -1; - } - - public static int GetNucleusIndex(List nuclei, Nucleus nucleus) { - int i = 0; - foreach (Nucleus nucleiElement in nuclei) { - //for (int i = 0; i < nuclei.Length; i++) { - if (nucleus == nucleiElement) - return i; - i++; - } - return -1; - } - - #endregion Init - - public ClusterPrefab prefab; - - - [SerializeReference] - public List clusterNuclei = new(); - // the nuclei sorted using topological sorting - // to ensure that the cluster is computer in the right order - public List sortedNuclei; - //public Dictionary nucleiDict = new(); - - public List _inputs = null; - public virtual List inputs { - get { - if (this._inputs == null) { - this._inputs = new(); + string nucleusName0 = nucleusName + ": 0"; foreach (Nucleus nucleus in this.clusterNuclei) { - // inputs have no synapses - if (nucleus.synapses.Count == 0) - this._inputs.Add(nucleus); - } - ComputeOrders(); - } - return this._inputs; - } - } - - public Dictionary> computeOrders = new(); - private void ComputeOrders() { - foreach (Nucleus input in this._inputs) - computeOrders[input] = TopologicalSort2(input); - } - - private List TopologicalSort2(Nucleus startNode) { - Dictionary inDegree = new(); - HashSet visited = new(); - - // Initialize in-degrees and mark all nodes as unvisited - foreach (Nucleus node in this.clusterNuclei) - inDegree[node] = 0; - - // Calculate in-degrees for all nodes reachable from the start node - Queue queue = new Queue(); - queue.Enqueue(startNode); - visited.Add(startNode); - - while (queue.Count > 0) { - Nucleus current = queue.Dequeue(); - List receivers = null; - if (current is Neuron neuron) - receivers = neuron.receivers; - else if (current is Cluster cluster) - receivers = cluster.CollectReceivers(); - - // if (current is Neuron neuron) { - foreach (Nucleus receiver in receivers) { - if (!visited.Contains(receiver)) { - visited.Add(receiver); - queue.Enqueue(receiver); - } - inDegree[receiver]++; - } - // } - } - - // Perform topological sort on all reachable nodes - queue.Clear(); - foreach (Nucleus node in visited) { - if (inDegree[node] == 0) - queue.Enqueue(node); - } - - List sortedOrder = new List(); - while (queue.Count > 0) { - Nucleus current = queue.Dequeue(); - sortedOrder.Add(current); // Process the node - - List receivers = null; - if (current is Neuron neuron) - receivers = neuron.receivers; - else if (current is Cluster cluster) - receivers = cluster.CollectReceivers(); - - //if (current is Neuron neuron) { - - foreach (Nucleus receiver in receivers) { - if (visited.Contains(receiver)) { - inDegree[receiver]--; - if (inDegree[receiver] == 0) // If all dependencies resolved - queue.Enqueue(receiver); - } - } - //} - } - - // Check for cycles in the graph - if (sortedOrder.Count != visited.Count) - throw new InvalidOperationException("Graph is not a DAG; a cycle exists."); - - return sortedOrder; - } - - public virtual Neuron defaultOutput {//=> this.nuclei[0] as Nucleus; - get { - if (this.clusterNuclei.Count > 0) - return this.clusterNuclei[0] as Neuron; - return null; - } - } - protected List _outputs = null; - public List outputs { - get { - if (this._outputs == null) { - this._outputs = new(); - foreach (Nucleus nucleus in this.clusterNuclei) { - if (nucleus is Neuron neuron) // && neuron.receivers.Count == 0) - this._outputs.Add(neuron); - } - } - return this._outputs; - } - } - - public bool TryGetNucleus(string nucleusName, out Nucleus foundNucleus) { - foreach (Nucleus receptor in this.clusterNuclei) { - if (receptor is Nucleus nucleus) - if (nucleus.name == nucleusName) { - foundNucleus = nucleus; - return true; - } - } - foundNucleus = null; - return false; - } - - public Nucleus GetNucleus(string nucleusName) { - int dotPosition = nucleusName.IndexOf('.'); - if (dotPosition >= 0) { - string clusterName = nucleusName[..dotPosition]; - string clusterName0 = clusterName + ": 0"; - foreach (Nucleus nucleus in this.clusterNuclei) { - if (nucleus is Cluster cluster) { - if (cluster.name == clusterName || cluster.name == clusterName0) { - string subNucleusName = nucleusName[(dotPosition + 1)..]; - return cluster.GetNucleus(subNucleusName); + if (nucleus is Cluster) { //IReceptor receptor) { + if (nucleus.name == nucleusName | nucleus.name == nucleusName0) + return nucleus; } - } - } - return null; - } - else { - string nucleusName0 = nucleusName + ": 0"; - foreach (Nucleus nucleus in this.clusterNuclei) { - if (nucleus is IReceptor receptor) { - if (nucleus.name == nucleusName | nucleus.name == nucleusName0) + else if (nucleus.name == nucleusName) return nucleus; } - else if (nucleus.name == nucleusName) - return nucleus; - } - return null; - } - } - - // [Obsolete("Use GetNucleus instead")] - // public IReceptor GetReceptor(string receptorName) { - // return GetNucleus(receptorName) as IReceptor; - // } - - #region Receivers - - public virtual List CollectReceivers() { - List receivers = new(); - foreach (Neuron output in this.outputs) { - foreach (Nucleus receiver in output.receivers) { - // Only add receivers outside this cluster - if (receiver.clusterPrefab != this.prefab) - receivers.Add(receiver); - //receivers.AddRange(output.receivers); + return null; } } - return receivers; - } - #endregion Receivers + #region Receivers - #region Update + public virtual List CollectReceivers() { + List receivers = new(); + foreach (Nucleus outputNucleus in this.clusterNuclei) { + if (outputNucleus is not Neuron output) + continue; - public void UpdateFromNucleus(Nucleus startNucleus) { - // no bias+synapse input state calculation for now... - - if (this.computeOrders.ContainsKey(startNucleus) == false) { - //Debug.LogError($"{this.name} compute orders does not contain an order for {startNucleus.name}"); - return; + foreach (Nucleus receiver in output.receivers) { + // Only add receivers outside this cluster + if (receiver.clusterPrefab != this.prefab) + receivers.Add(receiver); + } + } + return receivers; } - List computeOrder = this.computeOrders[startNucleus]; - if (startNucleus.trace) - Debug.Log($"Update from {startNucleus.name}"); - foreach (Nucleus nucleus in computeOrder) { - nucleus.UpdateStateIsolated(); - if (startNucleus.trace && nucleus is Neuron neuron) - Debug.Log($" {nucleus.name}[{nucleus.GetHashCode()}] = {neuron.outputValue}"); + public List<(Neuron, Nucleus)> CollectConnections() { + List<(Neuron, Nucleus)> connections = new(); + + foreach (Nucleus outputNucleus in this.clusterNuclei) { + if (outputNucleus is not Neuron output) + continue; + + foreach (Nucleus receiver in output.receivers) { + // Only add receivers outside this cluster + if (receiver.clusterPrefab != this.prefab) + connections.Add((output, receiver)); + } + } + return connections; } - // continue in parent - this.parent?.UpdateFromNucleus(this); + public void MoveReceivers(Cluster newCluster) { + Debug.Log($"Move receivers for {this.name} to {newCluster.name}"); + foreach (Nucleus outputNucleus in this.clusterNuclei) { + if (outputNucleus is not Neuron output) + continue; + + // Find the existing output in the new cluster + if (newCluster.GetNucleus(output.name) is not Neuron newOutput) { + Debug.LogWarning($"Could not find output {this.name}.{output.name} in {newCluster.name}"); + continue; + } + Debug.Log($"Check {this.name}.{output.name} receivers"); + Nucleus[] receivers = output.receivers.ToArray(); + foreach (Nucleus receiver in receivers) { + if (receiver.clusterPrefab != this.prefab) { + // Replace synapse with new synapse + // to the new cluster + Debug.Log($"move {receiver.name} from {this.name}.{output.name} to {newCluster.name}.{newOutput.name}"); + Synapse synapse = receiver.GetSynapse(output); + newOutput.AddReceiver(receiver, synapse.weight); + output.RemoveReceiver(receiver); + } + } + } + } + + #endregion Receivers + + #region Update + + public void UpdateFromNucleus(Nucleus startNucleus) { + // no bias+synapse input state calculation for now... + + if (this.computeOrders.ContainsKey(startNucleus) == false) { + //Debug.LogError($"{this.name} compute orders does not contain an order for {startNucleus.name}"); + return; + } + + List computeOrder = this.computeOrders[startNucleus]; + if (startNucleus.trace) + Debug.Log($"Update from {startNucleus.name}"); + foreach (Nucleus nucleus in computeOrder) { + if (nucleus is not Cluster) { + nucleus.UpdateStateIsolated(); + if (startNucleus.trace && nucleus is Neuron neuron) + Debug.Log($" {nucleus.name}[{nucleus.GetHashCode()}]"); // = {neuron.outputValue}"); + } + } + + // continue in parent + this.parent?.UpdateFromNucleus(this); + + UpdateNuclei(); + } + + public override void UpdateStateIsolated() { + throw new Exception("Cluster should not be updated!"); + } + + public override void UpdateNuclei() { + foreach (Nucleus nucleus in this.clusterNuclei) + nucleus.UpdateNuclei(); + } + + #endregion Update - UpdateNuclei(); } - public override void UpdateStateIsolated() { - throw new Exception("Cluster should not be updated!"); - // float3 sum = this.bias; - - // //Applying the weight factors - // foreach (Synapse synapse in this.synapses) { - // if (lengthsq(synapse.neuron.outputValue) > 0) { - // sum += synapse.weight * synapse.neuron.outputValue; - // } - // } - - // foreach (Nucleus nucleus in this.sortedNuclei) - // nucleus.UpdateStateIsolated(); - - // UpdateNuclei(); - } - - public override void UpdateNuclei() { - foreach (Nucleus nucleus in this.clusterNuclei) - nucleus.UpdateNuclei(); - } - - #endregion Update - -} - } \ No newline at end of file diff --git a/Runtime/Scripts/Core/ClusterReceptor.cs b/Runtime/Scripts/Core/ClusterReceptor.cs deleted file mode 100644 index 0dcd8ec..0000000 --- a/Runtime/Scripts/Core/ClusterReceptor.cs +++ /dev/null @@ -1,277 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; -#if UNITY_MATHEMATICS -using Unity.Mathematics; -using static Unity.Mathematics.math; -#endif -using System.Linq; - -namespace NanoBrain { - -[Serializable] -public class ClusterReceptor : Cluster, IReceptor { - public ClusterReceptor(ClusterPrefab prefab, Cluster parent, string name) : base(prefab, parent) { - this.name = name; - this.array = new NucleusArray(this); - if (this.name.IndexOf(":") < 0) - this.name += ": 0"; - - } - public ClusterReceptor(ClusterPrefab prefab, ClusterPrefab parent, string name) : base(prefab, parent) { - this.name = name; - this.array = new NucleusArray(this); - } - - public string GetName() { - return this.name; - } - - public override Nucleus ShallowCloneTo(Cluster parent) { - ClusterReceptor clone = new(this.prefab, parent, this.name) { - clusterPrefab = this.clusterPrefab, - }; - - return clone; - } - - public override Nucleus Clone(ClusterPrefab parent) { - ClusterReceptor clone = new(prefab, parent, this.name) { - array = this._array - }; - - foreach (Synapse synapse in this.synapses) { - Synapse clonedSynapse = clone.AddSynapse(synapse.neuron); - clonedSynapse.weight = synapse.weight; - } - - this._outputs = null; // Make sure the output are regenerated - foreach (Neuron output in this.outputs) { - int ix = GetNucleusIndex(this.clusterNuclei, output); - if (ix < 0 || clone.clusterNuclei[ix] is not Neuron clonedOutput) - continue; - - foreach (Nucleus receiver in output.receivers) - clonedOutput.AddReceiver(receiver); - } - return clone; - } - - public override List CollectReceivers() { - List receivers = new(); - foreach (Nucleus element in this.nucleiArray) { - if (element is not Cluster clusterElement) - continue; - - foreach (Nucleus outputNucleus in clusterElement.clusterNuclei) { - if (outputNucleus is not Neuron output) - continue; - - // this should be clusterElement.outputs, - // but outputs is not updated when correctly and may contain old data... - foreach (Nucleus receiver in output.receivers) { - // Only add receivers outside clusterElement cluster - if (receiver.clusterPrefab != clusterElement.prefab && - receivers.Contains(receiver) == false) - receivers.Add(receiver); - } - } - } - return receivers; - } - - [SerializeReference] - private NucleusArray _array; - public NucleusArray array { - set { _array = value; } - } - - public Nucleus[] nucleiArray { - get { return _array.nuclei; } - set { _array.nuclei = value; } - } - - public void AddReceptorElement(ClusterPrefab prefab) { - IReceptorHelpers.AddReceptorElement(this, prefab); - } - - public void RemoveReceptorElement() { - IReceptorHelpers.RemoveReceptorElement(this); - } - - public void AddArrayReceiver(Nucleus receiverToAdd, float weight = 1) { - IReceptorHelpers.AddArrayReceiver(this, receiverToAdd, weight); - } - - public override void UpdateStateIsolated() { - // Clusters don't do anything, - // The nuclei in them do the work - // and should be called directly, not from the cluster - } - - public override void UpdateNuclei() { - foreach (Nucleus nucleus in this.clusterNuclei) - nucleus.UpdateNuclei(); - } - - public override void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = null) { - Debug.LogError("Process Stimulus was called on clusterreceptor without a neuron specified"); - } - - private readonly Dictionary thingReceivers = new(); - - public virtual void ProcessStimulus(Neuron input, Vector3 inputValue, int thingId = 0, string thingName = null) { - CleanupReceivers(); - - if (!thingReceivers.TryGetValue(thingId, out ClusterReceptor selectedReceiver)) - selectedReceiver = FindReceiver2(thingId, inputValue, input); - if (selectedReceiver == null) - return; - - if (thingName != null) { - string baseName = selectedReceiver.name; - int colonPos = selectedReceiver.name.IndexOf(":"); - if (colonPos > 0) - baseName = selectedReceiver.name[..colonPos]; - selectedReceiver.name = baseName + ": " + thingName; - } - - int inputIx = GetNucleusIndex(this.clusterNuclei, input); - if (inputIx < 0) - return; - - if (selectedReceiver.clusterNuclei[inputIx] is Neuron selectedNeuron) - selectedNeuron.ProcessStimulusDirect(inputValue); - } - -#if UNITY_MATHEMATICS - - private ClusterReceptor FindReceiver2(int thingId, float3 inputValue, Neuron input) { - // No existing nucleus for this thing - ClusterReceptor selectedReceiver = null; - float selectedMagnitude = 0; - foreach (ClusterReceptor receiver in this.nucleiArray.Cast()) { - if (thingReceivers.ContainsValue(receiver) == false) { - // We found an unusued receiver - thingReceivers.Add(thingId, receiver); - return receiver; - } - else if (receiver.defaultOutput.isSleeping) { - // A sleeping receiver is not active and can therefore always be used - thingReceivers.Add(thingId, receiver); - receiver.bias = float3(0, 0, 0); - return receiver; - } - else if (selectedReceiver == null) { - // If we haven't found a receiver yet, just start by taking the first - selectedReceiver = receiver; - selectedMagnitude = length(selectedReceiver.defaultOutput.outputValue); - } - // Look for the receiver with the lowest output magnitude - else { - float magnitude = length(receiver.defaultOutput.outputValue); - - if (length(receiver.defaultOutput.outputValue) < selectedMagnitude) { - selectedReceiver = receiver; - selectedMagnitude = length(selectedReceiver.defaultOutput.outputValue); - } - } - } - if (selectedReceiver != null) { - // To re-initialize the cluster (esp. memory cells) - // we update the cluster neuron twice. - // Bit of a hack..... - int inputIx = GetNucleusIndex(this.clusterNuclei, input); - if (inputIx >= 0) { - if (selectedReceiver.clusterNuclei[inputIx] is Neuron selectedNeuron) - selectedNeuron.ProcessStimulusDirect(inputValue); - } - - // Replace the receiver - // Find the thingId current associated with the receiver - int keyToRemove = thingReceivers.FirstOrDefault(r => r.Value.Equals(selectedReceiver)).Key; - if (keyToRemove != 0 || thingReceivers.ContainsKey(keyToRemove)) - thingReceivers.Remove(keyToRemove); - // And add the new association - thingReceivers.Add(thingId, selectedReceiver); - } - return selectedReceiver; - } - -#else - - private ClusterReceptor FindReceiver2(int thingId, Vector3 inputValue, Neuron input) { - // No existing nucleus for this thing - ClusterReceptor selectedReceiver = null; - float selectedMagnitude = 0; - foreach (ClusterReceptor receiver in this.nucleiArray.Cast()) { - if (thingReceivers.ContainsValue(receiver) == false) { - // We found an unusued receiver - thingReceivers.Add(thingId, receiver); - return receiver; - } - else if (receiver.defaultOutput.isSleeping) { - // A sleeping receiver is not active and can therefore always be used - thingReceivers.Add(thingId, receiver); - receiver.bias = new Vector3(0, 0, 0); - return receiver; - } - else if (selectedReceiver == null) { - // If we haven't found a receiver yet, just start by taking the first - selectedReceiver = receiver; - selectedMagnitude = selectedReceiver.defaultOutput.outputValue.magnitude; - } - // Look for the receiver with the lowest output magnitude - else { - float magnitude = receiver.defaultOutput.outputValue.magnitude; - - if (receiver.defaultOutput.outputValue.magnitude < selectedMagnitude) { - selectedReceiver = receiver; - selectedMagnitude = selectedReceiver.defaultOutput.outputValue.magnitude; - } - } - } - if (selectedReceiver != null) { - // To re-initialize the cluster (esp. memory cells) - // we update the cluster neuron twice. - // Bit of a hack..... - int inputIx = GetNucleusIndex(this.clusterNuclei, input); - if (inputIx >= 0) { - if (selectedReceiver.clusterNuclei[inputIx] is Neuron selectedNeuron) - selectedNeuron.ProcessStimulusDirect(inputValue); - } - - // Replace the receiver - // Find the thingId current associated with the receiver - int keyToRemove = thingReceivers.FirstOrDefault(r => r.Value.Equals(selectedReceiver)).Key; - if (keyToRemove != 0 || thingReceivers.ContainsKey(keyToRemove)) - thingReceivers.Remove(keyToRemove); - // And add the new association - thingReceivers.Add(thingId, selectedReceiver); - } - return selectedReceiver; - } - -#endif - - private void CleanupReceivers() { - // Remove a thing-receiver connection when the nucleus is inactive - List receiversToRemove = new(); - foreach (KeyValuePair item in thingReceivers) { - if (item.Value != null && item.Value.defaultOutput.isSleeping) - receiversToRemove.Add(item.Key); - } - foreach (int thingId in receiversToRemove) { - Nucleus selectedReceiver = thingReceivers[thingId]; - - thingReceivers.Remove(thingId); - - int colonPos = selectedReceiver.name.IndexOf(":"); - if (colonPos > 0) - selectedReceiver.name = selectedReceiver.name[..colonPos]; - - } - } -} - -} \ No newline at end of file diff --git a/Runtime/Scripts/Core/ClusterReceptor.cs.meta b/Runtime/Scripts/Core/ClusterReceptor.cs.meta deleted file mode 100644 index 027f164..0000000 --- a/Runtime/Scripts/Core/ClusterReceptor.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 4f64f5d72a422a7c8bb9ace598432aad \ No newline at end of file diff --git a/Runtime/Scripts/Core/IReceptor.cs b/Runtime/Scripts/Core/IReceptor.cs deleted file mode 100644 index 4c4b373..0000000 --- a/Runtime/Scripts/Core/IReceptor.cs +++ /dev/null @@ -1,123 +0,0 @@ -using UnityEngine; - -namespace NanoBrain { - - /// - /// A Receptor is a Nucleus which can receive input (called Stimulus) from outside the the cluster/brain - /// - /// It has the ability to distinguish stimuli from different things using an array of Nuclei - public interface IReceptor { - /// - /// Get the name of the receptor - /// - /// The name of the receptor - public string GetName(); - - /// - /// The array of nuclei used to track multiple things sending stimuli - /// - /// The size of the array determines the maximum number of things which can be distinguished - public Nucleus[] nucleiArray { get; set; } - - /// - /// Extends the nucleiArray with an additional element - /// - /// A prefab of the nucleus to add? - public void AddReceptorElement(ClusterPrefab prefab); - /// - /// Removes the last element from the nucleiArray - /// - public void RemoveReceptorElement(); - - /// - /// Add a receiver for this receptor array - /// - /// The receiving Nucleus - /// The initial weight to use for the synapses - /// This function will add a synapse to the receiver for each element in the nucleiArray. - public void AddArrayReceiver(Nucleus receiverToAdd, float weight = 1); - - /// - /// Process an external stimulus - /// - /// The value of the stimulus - /// The id of the thing causing the stimulus - /// The name of the thing causing the stimulus - public void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = null); - } - - public static class IReceptorHelpers { - - /// - /// Implementation for the NanoBrain::IReceptor::AddReceptorElement which can be used for all implementations of IReceptor - /// - /// The IReceptor which needs to extend its nucleiArray - /// A prefab of the nucleus to add? - public static void AddReceptorElement(IReceptor receptor, ClusterPrefab prefab) { - if (receptor.nucleiArray.Length == 0) { - Debug.LogError("Empty perceptoid array, cannot add"); - } - int newLength = receptor.nucleiArray.Length + 1; - Nucleus[] newArray = new Nucleus[newLength]; - - string baseName = receptor.GetName(); - int colonPos = baseName.IndexOf(":"); - if (colonPos > 0) - baseName = baseName[..colonPos]; - - for (int i = 0; i < receptor.nucleiArray.Length; i++) - newArray[i] = receptor.nucleiArray[i]; - if (receptor.nucleiArray[0] is Nucleus nucleus) { - newArray[newLength - 1] = nucleus.Clone(prefab); - newArray[newLength - 1].name = $"{baseName}: {newLength - 1}"; - } - - foreach (Nucleus element in receptor.nucleiArray) { - if (element is IReceptor receptorElement) { - receptorElement.nucleiArray = newArray; - } - } - } - - /// - /// Implementation for the NanoBrain::IReceptor::RemoteReceptorElement which can be used for all implementations of IReceptor - /// - /// The IReceptor which needs to shorten its nucleiArray - public static void RemoveReceptorElement(IReceptor receptor) { - int newLength = receptor.nucleiArray.Length - 1; - if (newLength == 0) { - Debug.LogWarning("Perceptoid array cannot be empty"); - } - Nucleus[] newArray = new Nucleus[newLength]; - for (int i = 0; i < newLength; i++) - newArray[i] = receptor.nucleiArray[i]; - // Delete the last perception - if (receptor.nucleiArray[newLength] is Nucleus nucleus) - Neuron.Delete(nucleus); - - foreach (Nucleus element in receptor.nucleiArray) { - if (element is IReceptor receptorElement) { - receptorElement.nucleiArray = newArray; - } - } - - } - - /// - /// Implementation for the NanoBreain::IRceptor::AddArrayReceiver which can be used for all implementations of IReceptor - /// - /// The IReceptor for which a receiving nuclues needs to be added - /// The nucleus to receive input from the receptor - /// The initial weight for the synapses - public static void AddArrayReceiver(IReceptor receptor, Nucleus receiverToAdd, float weight = 1) { - foreach (Nucleus element in receptor.nucleiArray) { - if (element is Cluster cluster) - cluster.defaultOutput.AddReceiver(receiverToAdd, weight); - if (element is Neuron neuron) - neuron.AddReceiver(receiverToAdd, weight); - } - - } - } - -} \ No newline at end of file diff --git a/Runtime/Scripts/Core/IReceptor.cs.meta b/Runtime/Scripts/Core/IReceptor.cs.meta deleted file mode 100644 index 0c0ee6f..0000000 --- a/Runtime/Scripts/Core/IReceptor.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 73f052292ad16bb53a3c07aa1694c705 \ No newline at end of file diff --git a/Runtime/Scripts/Core/Neuron.cs b/Runtime/Scripts/Core/Neuron.cs index fcadfea..d0f9473 100644 --- a/Runtime/Scripts/Core/Neuron.cs +++ b/Runtime/Scripts/Core/Neuron.cs @@ -61,16 +61,19 @@ namespace NanoBrain { /// /// The type of /// - public enum CurvePresets { + public enum ActivationType { Linear, Power, Sqrt, Reciprocal, + Tanh, + Binary, + Normalized, Custom } [SerializeField] - public CurvePresets _curvePreset; - public CurvePresets curvePreset { + public ActivationType _curvePreset; + public ActivationType curvePreset { get { return _curvePreset; } set { _curvePreset = value; @@ -82,18 +85,27 @@ namespace NanoBrain { public AnimationCurve GenerateCurve() { switch (this.curvePreset) { - case CurvePresets.Linear: + case ActivationType.Linear: this.curveMax = 1; return Presets.Linear(1); - case CurvePresets.Power: + case ActivationType.Power: this.curveMax = 1; return Presets.Power(2.0f, 1); - case CurvePresets.Sqrt: + case ActivationType.Sqrt: this.curveMax = 1; return Presets.Power(0.5f, 1); - case CurvePresets.Reciprocal: + case ActivationType.Reciprocal: this.curveMax = 1 / 0.01f * 1; return Presets.Reciprocal(1); + case ActivationType.Tanh: + this.curveMax = 1; + return Presets.Tanh(1); + case ActivationType.Binary: + this.curveMax = 1; + return Presets.Binary(); + case ActivationType.Normalized: + this.curveMax = 1; + return Presets.Binary(); default: this.curveMax = 1; return this.curve; @@ -142,6 +154,28 @@ namespace NanoBrain { } return curve; } + public static AnimationCurve Tanh(float weight) { + //int samples = 128; + float xMin = 0.001f; + float xMax = 1; + var keys = new Keyframe[samples]; + for (int i = 0; i < samples; i++) { + float t = i / (float)(samples - 1); + float x = Mathf.Lerp(xMin, xMax, t); + float y = MathF.Tanh(x * weight); + keys[i] = new Keyframe(x, y); + } + var curve = new AnimationCurve(keys); + for (int i = 0; i < curve.length; i++) { + AnimationUtility.SetKeyLeftTangentMode(curve, i, AnimationUtility.TangentMode.Linear); + AnimationUtility.SetKeyRightTangentMode(curve, i, AnimationUtility.TangentMode.Linear); + } + return curve; + + } + public static AnimationCurve Binary() { + return AnimationCurve.Linear(0, 0, 1, 1); + } } #endregion Serialization @@ -175,15 +209,29 @@ namespace NanoBrain { public float outputSqrMagnitude => _outputValue.sqrMagnitude; #endif - public bool isFiring => this.outputMagnitude > 0.5f; + public bool isFiring { + get { + SleepCheck(); + return this.outputMagnitude > 0.5f; + } + } public Action WhenFiring; - public virtual bool isSleeping => this.outputMagnitude == 0; + public virtual bool isSleeping => Time.time - this.lastUpdate > this.timeToSleep; //this.outputMagnitude == 0; + public void SleepCheck() { + if (this.isSleeping) { +#if UNITY_MATHEMATICS + this._outputValue = new float3(0, 0, 0); +#else + this._outputValue = new Vector3(0,0,0); +#endif + } + } [NonSerialized] - public int stale = 1000; - public readonly int staleValueForSleep = 20; + public float lastUpdate = 0; + public readonly float timeToSleep = 1f; /// \copydoc NanoBrain::Nucleus::ShallowCloneTo public override Nucleus ShallowCloneTo(Cluster newParent) { @@ -236,9 +284,11 @@ namespace NanoBrain { } else if (nucleus is Cluster cluster) { // remove all receivers for this cluster - foreach (Neuron output in cluster.outputs) { - foreach (Nucleus receiver in output.receivers) { - receiver.synapses.RemoveAll(s => s.neuron == output); + foreach (Nucleus clusterNucleus in cluster.clusterNuclei) { + if (clusterNucleus is Neuron output) { + foreach (Nucleus receiver in output.receivers) { + receiver.synapses.RemoveAll(s => s.neuron == output); + } } } } @@ -252,8 +302,18 @@ namespace NanoBrain { } public override void UpdateStateIsolated() { + CheckSleepingSynapses(); var result = Combinator(); this.outputValue = Activator(result); + this.lastUpdate = Time.time; + } + + protected void CheckSleepingSynapses() { + foreach (Synapse synapse in this.synapses) { + if (synapse.isSleeping) { + synapse.neuron.outputValue = Vector3.zero; + } + } } #region Combinator @@ -348,10 +408,13 @@ namespace NanoBrain { #if UNITY_MATHEMATICS public Func Activator => this.curvePreset switch { - CurvePresets.Linear => ActivatorLinear, - CurvePresets.Sqrt => ActivatorSqrt, - CurvePresets.Power => ActivatorPower, - CurvePresets.Reciprocal => ActivatorReciprocal, + ActivationType.Linear => ActivatorLinear, + ActivationType.Sqrt => ActivatorSqrt, + ActivationType.Power => ActivatorPower, + ActivationType.Reciprocal => ActivatorReciprocal, + ActivationType.Tanh => ActivatorTanh, + ActivationType.Binary => ActivatorBinary, + ActivationType.Normalized => ActivatorNormalized, _ => ActivatorCustom }; @@ -378,6 +441,24 @@ namespace NanoBrain { return result; } + protected float3 ActivatorTanh(float3 input) { + float magnitude = length(input); + float3 result = normalize(input) * MathF.Tanh(magnitude); + return result; + } + protected float3 ActivatorBinary(float3 input) { + float magnitude = length(input); + float value = Mathf.Clamp01(magnitude); + return float3(value, value, value); + } + + protected float3 ActivatorNormalized(float3 input) { + if (lengthsq(input) == 0) + return input; + float3 result = normalize(input); + return result; + } + protected float3 ActivatorCustom(float3 input) { float activatedValue = this.curve.Evaluate(length(input)); float3 result = normalize(input) * activatedValue; @@ -442,32 +523,16 @@ namespace NanoBrain { } public virtual void RemoveReceiver(Nucleus receiverToRemove) { - if (this is IReceptor receptor) { - foreach (Nucleus element in receptor.nucleiArray) { - if (element is Neuron neuron) { - neuron._receivers.RemoveAll(receiver => receiver == receiverToRemove); - receiverToRemove.synapses.RemoveAll(synapse => synapse.neuron == neuron); - } - } - } - else { - this._receivers.RemoveAll(receiver => receiver == receiverToRemove); - receiverToRemove.synapses.RemoveAll(synapse => synapse.neuron == this); - } + this._receivers.RemoveAll(receiver => receiver == receiverToRemove); + receiverToRemove.synapses.RemoveAll(synapse => synapse.neuron == this); } #endregion Receivers - public override void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = null) { - if (this.parent is ClusterReceptor clusterReceptor) - clusterReceptor.ProcessStimulus(this, inputValue, thingId, thingName); - else - ProcessStimulusDirect(inputValue, thingId, thingName); - } - - public void ProcessStimulusDirect(Vector3 inputValue, int thingId = 0, string thingName = null) { - this.stale = 0; + public override void ProcessStimulus(Vector3 inputValue) { + ; + this.lastUpdate = Time.time; this.bias = inputValue; this.parent.UpdateFromNucleus(this); } diff --git a/Runtime/Scripts/Core/Nucleus.cs b/Runtime/Scripts/Core/Nucleus.cs index d6a0952..314fee3 100644 --- a/Runtime/Scripts/Core/Nucleus.cs +++ b/Runtime/Scripts/Core/Nucleus.cs @@ -54,10 +54,13 @@ public abstract class Nucleus { Neuron, MemoryCell, Cluster, - Receptor, - ClusterReceptor, + //Receptor, + //ClusterReceptor, + //ClusterArray, } + public virtual void Initialize() {} + #region Synapses /// @@ -87,6 +90,10 @@ public abstract class Nucleus { return synapse; } + // public Synapse AddSynapse(ClusterPrefab clusterPrefab, string neuronName, float weight = 1) { + + // } + /// /// Find a synapse /// @@ -137,7 +144,7 @@ public abstract class Nucleus { /// The value of the stimulus /// The id of the thing causing the stimulus /// The name of the thing causing the stimulus - public virtual void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = "") { + public virtual void ProcessStimulus(Vector3 inputValue) { //, int thingId = 0, string thingName = "") { } #endregion Update diff --git a/Runtime/Scripts/Core/NucleusArray.cs b/Runtime/Scripts/Core/NucleusArray.cs deleted file mode 100644 index 60a4a21..0000000 --- a/Runtime/Scripts/Core/NucleusArray.cs +++ /dev/null @@ -1,197 +0,0 @@ -using System.Linq; -using System.Collections.Generic; -using UnityEngine; -#if UNITY_MATHEMATICS -using Unity.Mathematics; -using static Unity.Mathematics.math; -#endif - -namespace NanoBrain { - - /// - /// Class to manage an array of nuclei for an IReceptor - /// - /// Would love to get rid of this class. - [System.Serializable] - public class NucleusArray { - /// - /// The nuclei in this array - /// - [SerializeReference] - private Nucleus[] _nuclei; - public Nucleus[] nuclei { - get { - return _nuclei; - } - set { - _nuclei = value; - } - } - - /// - /// Create a new NucleusArray with the given nucleus - /// - /// The Nucleus to put in the NucleusArray - /// This results in an nucleus array of size 1 - public NucleusArray(Nucleus nucleus) { - this._nuclei = new Nucleus[1]; - this._nuclei[0] = nucleus; - } - /// - /// Create a new NucleusArray of the given size - /// - /// The size of the nucluesArray - public NucleusArray(int size) { - this._nuclei = new Nucleus[size]; - } - - - // public void AddNucleus(ClusterPrefab prefab) { - // if (this._nuclei.Length == 0) { - // Debug.LogError("Empty perceptoid array, cannot add"); - // return; - // } - // int newLength = this._nuclei.Length + 1; - // Nucleus[] newArray = new Nucleus[newLength]; - - // for (int i = 0; i < this._nuclei.Length; i++) - // newArray[i] = this._nuclei[i]; - // if (this._nuclei[0] is Nucleus nucleus) { - // newArray[newLength - 1] = nucleus.Clone(prefab); - // newArray[newLength - 1].name += $": {newLength - 1}"; - // } - - // this._nuclei = newArray; - // } - - // public void RemoveNucleus() { - // int newLength = this._nuclei.Length - 1; - // if (newLength == 0) { - // Debug.LogWarning("Perceptoid array cannot be empty"); - // return; - // } - // Nucleus[] newPerceptei = new Nucleus[newLength]; - // for (int i = 0; i < newLength; i++) - // newPerceptei[i] = this._nuclei[i]; - // // Delete the last perception - // if (this._nuclei[newLength] is Nucleus nucleus) - // Neuron.Delete(nucleus); //this._nuclei[newLength]); - - // this._nuclei = newPerceptei; - // } - - public Dictionary thingReceivers = new(); - -#if UNITY_MATHEMATICS - - private Nucleus FindReceiver(int thingId, float3 inputValue) { - float inputMagnitude = length(inputValue); - return FindReceiverMagnitude(thingId, inputMagnitude); - } - -#else - - private Nucleus FindReceiver(int thingId, Vector3 inputValue) { - float inputMagnitude = inputValue.magnitude; - return FindReceiverMagnitude(thingId, inputMagnitude); - } - -#endif - - private Nucleus FindReceiverMagnitude(int thingId, float inputMagnitude) { - Neuron selectedReceiver = null; - float selectedMagnitude = 0; - foreach (Nucleus nucleusReceiver in this._nuclei) { - if (nucleusReceiver is not Neuron receiver) - continue; - if (thingReceivers.ContainsValue(receiver) == false) { - // We found an unusued receiver - thingReceivers.Add(thingId, receiver); - return receiver; - } - else if (receiver.isSleeping) { - // A sleeping receiver is not active and can therefore always be used - thingReceivers.Add(thingId, receiver); - return receiver; - } - else if (selectedReceiver == null) { - // If we haven't found a receiver yet, just start by taking the first - selectedReceiver = receiver; - selectedMagnitude = selectedReceiver.outputMagnitude; - } - // Look for the receiver with the lowest magnitude - else { - float magnitude = receiver.outputMagnitude; - - if (magnitude < inputMagnitude && receiver.outputMagnitude < selectedMagnitude) { - selectedReceiver = receiver; - selectedMagnitude = selectedReceiver.outputMagnitude; - } - } - } - if (selectedReceiver != null) { - // Replace the receiver - // Find the thingId current associated with the receiver - int keyToRemove = thingReceivers.FirstOrDefault(r => r.Value.Equals(selectedReceiver)).Key; - if (keyToRemove != 0 || thingReceivers.ContainsKey(keyToRemove)) - thingReceivers.Remove(keyToRemove); - // And add the new association - thingReceivers.Add(thingId, selectedReceiver); - } - return selectedReceiver; - } - - /// - /// Process an external stimulus - /// - /// The value of the stimulus - /// The id of the thing causing the stimulus - /// The name of the thing causing the stimulus - public virtual void ProcessStimulus(int thingId, Vector3 inputValue, string thingName = null) { - CleanupReceivers(); - - if (this._nuclei[0] is Neuron neuron) - inputValue = neuron.Activator(inputValue); - - if (!thingReceivers.TryGetValue(thingId, out Nucleus selectedReceiver)) { - // No existing nucleus for this thing - selectedReceiver = FindReceiver(thingId, inputValue); - } - if (selectedReceiver == null) - return; - - if (thingName != null) { - string baseName = selectedReceiver.name; - int colonPos = selectedReceiver.name.IndexOf(":"); - if (colonPos > 0) - baseName = selectedReceiver.name[..colonPos]; - selectedReceiver.name = baseName + ": " + thingName; - } - - if (selectedReceiver is Neuron selectedNucleus) - selectedNucleus.ProcessStimulusDirect(inputValue); - } - - /// - /// Remove a thing-receiver connection when the nucleus is inactive - /// - private void CleanupReceivers() { - List receiversToRemove = new(); - foreach (KeyValuePair item in thingReceivers) { - if (item.Value != null && item.Value is Neuron neuron && neuron.isSleeping) - receiversToRemove.Add(item.Key); - } - foreach (int thingId in receiversToRemove) { - Nucleus selectedReceiver = thingReceivers[thingId]; - - thingReceivers.Remove(thingId); - - int colonPos = selectedReceiver.name.IndexOf(":"); - if (colonPos > 0) - selectedReceiver.name = selectedReceiver.name[..colonPos]; - - } - } - } - -} \ No newline at end of file diff --git a/Runtime/Scripts/Core/NucleusArray.cs.meta b/Runtime/Scripts/Core/NucleusArray.cs.meta deleted file mode 100644 index 61e26b7..0000000 --- a/Runtime/Scripts/Core/NucleusArray.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: f8cac60bd79854595a8571c042f77998 \ No newline at end of file diff --git a/Runtime/Scripts/Core/Receptor.cs b/Runtime/Scripts/Core/Receptor.cs deleted file mode 100644 index 38a9cdf..0000000 --- a/Runtime/Scripts/Core/Receptor.cs +++ /dev/null @@ -1,113 +0,0 @@ -using UnityEngine; -#if UNITY_MATHEMATICS -using Unity.Mathematics; -using static Unity.Mathematics.math; -#endif - -namespace NanoBrain { - - /// - /// Basic IReceptor to receive external input - /// - [System.Serializable] - public class Receptor : Neuron, IReceptor { - /// - /// Create a new Receptor in a Cluster instance - /// - /// The Cluster in which the Receptor is created - /// The name of the new Receptor - public Receptor(Cluster parent, string name) : base(parent, name) { - this.array = new NucleusArray(this); - if (this.name.IndexOf(":") < 0) - this.name += ": 0"; - } - /// - /// Create a new Receptor in a Cluster Prefab - /// - /// The Cluster Prefab in which the Receptor is created - /// The name of the new Receptor - public Receptor(ClusterPrefab prefab, string name) : base(prefab, name) { - this.array = new NucleusArray(this); - } - - public string GetName() { - return this.name; - } - - /// \copydoc NanoBrain::Neuron::ShallowCloneTo - public override Nucleus ShallowCloneTo(Cluster parent) { - Receptor clone = new(parent, name) { - - }; - CloneFields(clone); - return clone; - } - /// \copydoc NanoBrain::Neuron::Clone - public override Nucleus Clone(ClusterPrefab prefab) { - Receptor clone = new(prefab, name) { - array = this._array - }; - CloneFields(clone); - // Adding receivers will also add synapses to the receivers - foreach (Nucleus receiver in this.receivers.ToArray()) - clone.AddReceiver(receiver); - - return clone; - } - - [SerializeReference] - private NucleusArray _array; - public NucleusArray array { - set { _array = value; } - } - - public Nucleus[] nucleiArray { - get { return _array.nuclei; } - set { _array.nuclei = value; } - } - - public void AddReceptorElement(ClusterPrefab prefab) { - IReceptorHelpers.AddReceptorElement(this, prefab); - } - - public void RemoveReceptorElement() { - IReceptorHelpers.RemoveReceptorElement(this); - } - - public virtual void AddArrayReceiver(Nucleus receiverToAdd, float weight = 1) { - IReceptorHelpers.AddArrayReceiver(this, receiverToAdd, weight); - } - - public override void UpdateStateIsolated() { - this.outputValue = this.bias; - } - -#if UNITY_MATHEMATICS - - public override void UpdateNuclei() { - this.stale++; - if (this.stale > staleValueForSleep && lengthsq(this.bias) > 0) { - this.bias = new float3(0, 0, 0); - this.parent.UpdateFromNucleus(this); - } - } - -#else - - public override void UpdateNuclei() { - this.stale++; - if (this.stale > staleValueForSleep && this.bias.sqrMagnitude > 0) { - this.bias = new Vector3(0, 0, 0); - this.parent.UpdateFromNucleus(this); - } - } - - -#endif - public override void ProcessStimulus(Vector3 inputValue, int thingId = 0, string thingName = null) { - this._array ??= new NucleusArray(this.parent); - this._array.ProcessStimulus(thingId, inputValue, thingName); - } - } - -} \ No newline at end of file diff --git a/Runtime/Scripts/Core/Receptor.cs.meta b/Runtime/Scripts/Core/Receptor.cs.meta deleted file mode 100644 index 56793ae..0000000 --- a/Runtime/Scripts/Core/Receptor.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: cfb9734aebc3ab85aacf87d26fb92e55 \ No newline at end of file diff --git a/Runtime/Scripts/Core/Synapse.cs b/Runtime/Scripts/Core/Synapse.cs index 63bacf7..e71130d 100644 --- a/Runtime/Scripts/Core/Synapse.cs +++ b/Runtime/Scripts/Core/Synapse.cs @@ -28,6 +28,12 @@ namespace NanoBrain { this.neuron = nucleus; this.weight = weight; } + + public bool isSleeping { + get { + return this.neuron.isSleeping; + } + } } } \ No newline at end of file diff --git a/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs b/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs index e50093f..2920733 100644 --- a/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs +++ b/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs @@ -10,6 +10,7 @@ namespace NanoBrain { public class ClusterPrefab : ScriptableObject { /// The nuclei in this cluster [SerializeReference] + // This list should not include any clusters... public List nuclei = new(); /// From 9eda1cdf064cd284aa63c8cee2c029df00002fbc Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Thu, 23 Apr 2026 17:39:51 +0200 Subject: [PATCH 24/38] Added insect body parts --- CreatureControl/Editor/Scripts/Leg_Editor.cs | 18 +- CreatureControl/Runtime/Scripts/Bone.cs | 9 + CreatureControl/Runtime/Scripts/Bone.cs.meta | 11 + .../Runtime/Scripts/Insect/Antenna.cs | 53 + .../Runtime/Scripts/Insect/Antenna.cs.meta | 11 + .../Runtime/Scripts/Insect/Insect.cs | 6 + .../Runtime/Scripts/Insect/InsectHead.cs | 9 + .../Runtime/Scripts/Insect/InsectHead.cs.meta | 11 + .../Runtime/Scripts/Insect/Mandible.cs | 12 + .../Runtime/Scripts/Insect/Mandible.cs.meta | 11 + CreatureControl/Runtime/Scripts/Leg.cs | 210 ++- NanoBrain/Editor/ClusterEditor.cs | 16 +- NanoBrain/Editor/ClusterViewer.cs | 2 +- NanoBrain/Editor/ClusterViewer.cs.meta | 11 +- Runtime/Scripts/Ant.cs | 16 +- Samples/Brain/Foraging.asset | 1412 +++-------------- Samples/Brain/Foraging.asset.meta | 4 +- Samples/Brain/Foraging_old.asset | 1179 ++++++++++++++ Samples/Brain/Foraging_old.asset.meta | 8 + 19 files changed, 1789 insertions(+), 1220 deletions(-) create mode 100644 CreatureControl/Runtime/Scripts/Bone.cs create mode 100644 CreatureControl/Runtime/Scripts/Bone.cs.meta create mode 100644 CreatureControl/Runtime/Scripts/Insect/Antenna.cs create mode 100644 CreatureControl/Runtime/Scripts/Insect/Antenna.cs.meta create mode 100644 CreatureControl/Runtime/Scripts/Insect/InsectHead.cs create mode 100644 CreatureControl/Runtime/Scripts/Insect/InsectHead.cs.meta create mode 100644 CreatureControl/Runtime/Scripts/Insect/Mandible.cs create mode 100644 CreatureControl/Runtime/Scripts/Insect/Mandible.cs.meta create mode 100644 Samples/Brain/Foraging_old.asset create mode 100644 Samples/Brain/Foraging_old.asset.meta diff --git a/CreatureControl/Editor/Scripts/Leg_Editor.cs b/CreatureControl/Editor/Scripts/Leg_Editor.cs index e325521..e178960 100644 --- a/CreatureControl/Editor/Scripts/Leg_Editor.cs +++ b/CreatureControl/Editor/Scripts/Leg_Editor.cs @@ -17,23 +17,13 @@ namespace CreatureControl { EditorGUILayout.BeginHorizontal(); string legName = ConvertCamelCase(legProp.name); showfield = EditorGUILayout.Foldout(showfield, legName, true, foldoutStyle); - SerializedProperty femurProp = legProp.FindPropertyRelative(nameof(Leg.femur)); - SerializedProperty tibiaProp = legProp.FindPropertyRelative(nameof(Leg.tibia)); - SerializedProperty tarsusProp = legProp.FindPropertyRelative(nameof(Leg.tarsus)); + SerializedProperty femurProp = legProp.FindPropertyRelative("_femur");//nameof(Leg._femur)); + SerializedProperty tibiaProp = legProp.FindPropertyRelative("_tibia"); //nameof(Leg._tibia)); + SerializedProperty tarsusProp = legProp.FindPropertyRelative("_tarsus"); //nameof(Leg._tarsus)); Transform newFemur = (Transform)EditorGUILayout.ObjectField(femurProp.objectReferenceValue, typeof(Transform), true); if (newFemur != femurProp.objectReferenceValue) { - // Try to determine further bones when the femur has been updated - femurProp.objectReferenceValue = newFemur; - if (newFemur != null) { - if (tibiaProp.objectReferenceValue == null && newFemur.childCount == 1) - tibiaProp.objectReferenceValue = newFemur.GetChild(0); - Transform tibia = (Transform)tibiaProp.objectReferenceValue; - if (tibia != null) { - if (tarsusProp.objectReferenceValue == null && tibia.childCount == 1) - tarsusProp.objectReferenceValue = tibia.GetChild(0); - } - } + leg.DetectBones(newFemur); anythingChanged = true; } EditorGUILayout.EndHorizontal(); diff --git a/CreatureControl/Runtime/Scripts/Bone.cs b/CreatureControl/Runtime/Scripts/Bone.cs new file mode 100644 index 0000000..9c24ff0 --- /dev/null +++ b/CreatureControl/Runtime/Scripts/Bone.cs @@ -0,0 +1,9 @@ +namespace CreatureControl { + + public enum Side { + Unknown, + Left, + Right + }; + +} \ No newline at end of file diff --git a/CreatureControl/Runtime/Scripts/Bone.cs.meta b/CreatureControl/Runtime/Scripts/Bone.cs.meta new file mode 100644 index 0000000..5404f4c --- /dev/null +++ b/CreatureControl/Runtime/Scripts/Bone.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f0c445c1f36ba4b819cc479fe343eaa5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/CreatureControl/Runtime/Scripts/Insect/Antenna.cs b/CreatureControl/Runtime/Scripts/Insect/Antenna.cs new file mode 100644 index 0000000..a6c2d48 --- /dev/null +++ b/CreatureControl/Runtime/Scripts/Insect/Antenna.cs @@ -0,0 +1,53 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace CreatureControl { + + [System.Serializable] + public class Antenna { + private Transform _scape; + public Transform scape { + get => this._scape; + set { + this._scape = value; + this._scapeLength = 0; + } + } + private Transform _funiculus; + public Transform funiculus { + get => this._funiculus; + set { + this._funiculus = value; + this._scapeLength = 0; + this._funiculusLength = 0; + } + } + + private Transform _end; + + private float _scapeLength = 0; + public float scapeLength { + get { + if (_scapeLength <= 0 && this.scape != null && this._funiculus != null) + _scapeLength = Vector3.Distance(this._scape.position, this._funiculus.position); + return _scapeLength; + } + } + private float _funiculusLength = 0; + public float funuculusLength { + get { + if (_funiculusLength <= 0 && this._funiculus != null && this._end != null) + _funiculusLength = Vector3.Distance(this._funiculus.position, this._end.position); + return _funiculusLength; + } + } + + public Side side; + public bool isLeft => side == Side.Left; + public bool isRight => side == Side.Right; + + // Movement it seems: + // head-scape joint: mainly 2 degrees of freedom: pitch and yaw. Limited roll is possible + // scape-funiculus joint: mainly 1 degree of freedom: pitch. Limited yaw is possible + } +} \ No newline at end of file diff --git a/CreatureControl/Runtime/Scripts/Insect/Antenna.cs.meta b/CreatureControl/Runtime/Scripts/Insect/Antenna.cs.meta new file mode 100644 index 0000000..883d8f1 --- /dev/null +++ b/CreatureControl/Runtime/Scripts/Insect/Antenna.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d0a74d6a0259bc3239ce87703b015c8a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/CreatureControl/Runtime/Scripts/Insect/Insect.cs b/CreatureControl/Runtime/Scripts/Insect/Insect.cs index f798ea8..339a9ff 100644 --- a/CreatureControl/Runtime/Scripts/Insect/Insect.cs +++ b/CreatureControl/Runtime/Scripts/Insect/Insect.cs @@ -1,3 +1,5 @@ +using UnityEngine; + namespace CreatureControl { /// @@ -10,6 +12,10 @@ namespace CreatureControl { public float forwardSpeed = 1; public float rotationSpeed = 1; + public InsectHead head; + public Transform thorax; + public Transform abdomen; + public Leg leftFrontLeg; public Leg leftMiddleLeg; public Leg leftHindLeg; diff --git a/CreatureControl/Runtime/Scripts/Insect/InsectHead.cs b/CreatureControl/Runtime/Scripts/Insect/InsectHead.cs new file mode 100644 index 0000000..bbee091 --- /dev/null +++ b/CreatureControl/Runtime/Scripts/Insect/InsectHead.cs @@ -0,0 +1,9 @@ +namespace CreatureControl { + public class InsectHead { + public Antenna leftAntenna; + public Antenna rightAntenna; + + public Mandible leftMandible; + public Mandible rightMandible; + } +} \ No newline at end of file diff --git a/CreatureControl/Runtime/Scripts/Insect/InsectHead.cs.meta b/CreatureControl/Runtime/Scripts/Insect/InsectHead.cs.meta new file mode 100644 index 0000000..06d8ca1 --- /dev/null +++ b/CreatureControl/Runtime/Scripts/Insect/InsectHead.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c81d225e1c5078b5aba909ac5c4876e1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/CreatureControl/Runtime/Scripts/Insect/Mandible.cs b/CreatureControl/Runtime/Scripts/Insect/Mandible.cs new file mode 100644 index 0000000..9546eaa --- /dev/null +++ b/CreatureControl/Runtime/Scripts/Insect/Mandible.cs @@ -0,0 +1,12 @@ +using UnityEngine; + +namespace CreatureControl { + + public class Mandible { + public Transform bone; + + public Side side; + public bool isLeft => side == Side.Left; + public bool isRight => side == Side.Right; + } +} \ No newline at end of file diff --git a/CreatureControl/Runtime/Scripts/Insect/Mandible.cs.meta b/CreatureControl/Runtime/Scripts/Insect/Mandible.cs.meta new file mode 100644 index 0000000..a1b3336 --- /dev/null +++ b/CreatureControl/Runtime/Scripts/Insect/Mandible.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ed9a3aa6498a84ac9bfd3a036847635f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/CreatureControl/Runtime/Scripts/Leg.cs b/CreatureControl/Runtime/Scripts/Leg.cs index 484d3f0..9328843 100644 --- a/CreatureControl/Runtime/Scripts/Leg.cs +++ b/CreatureControl/Runtime/Scripts/Leg.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using UnityEngine; namespace CreatureControl { @@ -7,21 +8,94 @@ namespace CreatureControl { /// [System.Serializable] public class Leg { + [SerializeField] + private Transform _coxa; + /// + /// The hip bone + /// + public Transform coxa { + get => this._coxa; + set { + this._coxa = value; + this._femurLength = 0; + } + } + + [SerializeField] + private Transform _femur; /// /// The upper leg or thigh bone /// - public Transform femur; + public Transform femur { + get => this._femur; + set { + this._femur = value; + this._femurLength = 0; + } + } + + [SerializeField] + private Transform _tibia; /// /// The lower leg or shank bone /// - public Transform tibia; + public Transform tibia { + get => this._tibia; + set { + this._tibia = value; + this._femurLength = 0; + this._tibiaLength = 0; + } + } + + [SerializeField] + private Transform _tarsus; /// /// The foot bone /// - public Transform tarsus; + public Transform tarsus { + get => this._tarsus; + set { + this._tarsus = value; + this._tibiaLength = 0; + this._tarsusLength = 0; + } + } + + [SerializeField] + private Transform _phalanges; + /// + /// The toes + /// + public Transform phalanges { + get => this._phalanges; + set { + this._phalanges = value; + this._tarsusLength = 0; + this._phalangesLength = 0; + } + } + + [SerializeField] + private Transform _end; + /// + /// The end of the leg + /// + public Transform end { + get => this._end; + set { + this._end = value; + this._phalangesLength = 0; + } + } + + #region Bones [SerializeField] private float _femurLength; + /// + /// The length of the femur bone + /// public float femurLength { get { if (_femurLength <= 0 && this.femur != null && this.tibia != null) @@ -29,9 +103,12 @@ namespace CreatureControl { return _femurLength; } } - // A bit inefficient is this is used a lot... - //public float tibiaLength => Vector3.Distance(this.tibia.position, this.tarsus.position); + + [SerializeField] private float _tibiaLength; + /// + /// The length of the tibia bone + /// public float tibiaLength { get { if (_tibiaLength <= 0 && this.tibia != null && this.tarsus != null) @@ -39,18 +116,137 @@ namespace CreatureControl { return _tibiaLength; } } + + [SerializeField] + private float _tarsusLength; + /// + /// The length of the tarsus bone + /// + public float tarsusLength { + get { + if (_tarsusLength <= 0 && this.tarsus != null && this.phalanges != null) + _tarsusLength = Vector3.Distance(this.tarsus.position, this.phalanges.position); + return _tarsusLength; + } + } + + [SerializeField] + private float _phalangesLength; + /// + /// The length of the phalanges + /// + public float phalangesLength { + get { + if (_phalangesLength <= 0 && this.phalanges != null && this.end != null) + _phalangesLength = Vector3.Distance(this.phalanges.position, this.end.position); + return _phalangesLength; + } + } + + /// + /// The length of the leg from hip to foot + /// + /// This consists of the femur and tibia public float length => femurLength + tibiaLength; + /// + /// The size of the foot + /// + /// This consists of the tarsus and phalanges + public float footLength => tarsusLength + phalangesLength; + public void ResetLengths() { _femurLength = 0; - _tibiaLength = 0; + _tibiaLength = 0; + _tarsusLength = 0; + _phalangesLength = 0; } + /// + /// Try to determine the leg bones + /// + /// the first bone of the leg (could be coxa or femur depending on chain length) + public void DetectBones(Transform root) { + if (root == null) + return; + coxa = femur = tibia = tarsus = phalanges = end = null; + + // gather a straight chain following single-child links + List chain = new(); + Transform current = root; + chain.Add(current); + while (current.childCount == 1) { + current = current.GetChild(0); + chain.Add(current); + } + + // the detected end bone is the last element in the collected chain + end = chain[^1]; + + // map chain length to bone roles according to rules: + // 1 => femur + // 2 => femur, tibia + // 3 => femur, tibia, tarsus + // 4 => femur, tibia, tarsus, phalanges + // 5+ => coxa, femur, tibia, tarsus, phalanges (first 5) + int count = chain.Count; + if (count == 1) + femur = chain[0]; + else if (count == 2) { + femur = chain[0]; + tibia = chain[1]; + } + else if (count == 3) { + femur = chain[0]; + tibia = chain[1]; + tarsus = chain[2]; + } + else if (count == 4) { + femur = chain[0]; + tibia = chain[1]; + tarsus = chain[2]; + phalanges = chain[3]; + } + else // count >= 5 + { + coxa = chain[0]; + femur = chain[1]; + tibia = chain[2]; + tarsus = chain[3]; + phalanges = chain[4]; + } + } + + #endregion Bones + /// /// Check if all bones of the legs have been configured /// /// True when all bones are configured - public bool isConfigured => femur != null && tibia != null && tarsus != null; + public bool isConfigured => + this.femur != null && + this.tibia != null && + this.tarsus != null && + this.phalanges != null && + this.end != null; + + public Side side; + public bool isLeft => side == Side.Left; + public bool isRight => side == Side.Right; + + private Vector3 _kneeAxis = Vector3.zero; + public Vector3 kneeAxis { + get { + if (this._kneeAxis.sqrMagnitude == 0) { + Vector3 femurWorldDirection = (this.tibia.position - this.femur.position).normalized; + Vector3 tibiaWorldDirection = (this.tarsus.position - this.tibia.position).normalized; + Vector3 kneeWorldAxis = Vector3.Cross(femurWorldDirection, tibiaWorldDirection); + Vector3 kneeLocalAxis = this.femur.InverseTransformDirection(kneeWorldAxis); + this._kneeAxis = kneeLocalAxis; + } + return this._kneeAxis; + } + } } } \ No newline at end of file diff --git a/NanoBrain/Editor/ClusterEditor.cs b/NanoBrain/Editor/ClusterEditor.cs index 1498a79..6e6ef22 100644 --- a/NanoBrain/Editor/ClusterEditor.cs +++ b/NanoBrain/Editor/ClusterEditor.cs @@ -84,8 +84,8 @@ namespace NanoBrain { void OnAddClusterOutput() { Nucleus newOutput = new Neuron(this.prefab, "New Output"); this.prefab.RefreshOutputs(); - outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList(); - outputsPopup.value = newOutput.name; + // outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList(); + // outputsPopup.value = newOutput.name; this.currentNucleus = newOutput; } @@ -185,7 +185,7 @@ namespace NanoBrain { if (newName != this.currentNucleus.name) { this.currentNucleus.name = newName; this.prefab.RefreshOutputs(); - outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList(); + // outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList(); anythingChanged = true; } } @@ -537,11 +537,11 @@ namespace NanoBrain { } this.prefab.nuclei.Remove(nucleus); - if (outputsPopup.value == nucleus.name) { - this.prefab.RefreshOutputs(); - outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList(); - outputsPopup.index = 0; - } + // if (outputsPopup.value == nucleus.name) { + // this.prefab.RefreshOutputs(); + // outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList(); + // outputsPopup.index = 0; + // } Neuron.Delete(nucleus); diff --git a/NanoBrain/Editor/ClusterViewer.cs b/NanoBrain/Editor/ClusterViewer.cs index af0eb48..11013d3 100644 --- a/NanoBrain/Editor/ClusterViewer.cs +++ b/NanoBrain/Editor/ClusterViewer.cs @@ -25,7 +25,7 @@ namespace NanoBrain { protected VisualElement topMenuContainer; protected ScrollView scrollView; protected IMGUIContainer graphContainer; - protected readonly PopupField outputsPopup; + //protected readonly PopupField outputsPopup; public enum Mode { Focus, diff --git a/NanoBrain/Editor/ClusterViewer.cs.meta b/NanoBrain/Editor/ClusterViewer.cs.meta index ac68b91..7859dec 100644 --- a/NanoBrain/Editor/ClusterViewer.cs.meta +++ b/NanoBrain/Editor/ClusterViewer.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 4fe58945c76d153edacc220597474ad2 \ No newline at end of file +guid: 4fe58945c76d153edacc220597474ad2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/Ant.cs b/Runtime/Scripts/Ant.cs index 0b435f6..7eb26cc 100644 --- a/Runtime/Scripts/Ant.cs +++ b/Runtime/Scripts/Ant.cs @@ -48,8 +48,8 @@ namespace CreatureControl { public Nucleus pheromoneSteering; public Nucleus hitLeft; public Nucleus hitRight; - public Receptor foodReceptor; - public Receptor homeReceptor; + public Neuron foodReceptor; + public Neuron homeReceptor; public Vector3 linearVelocity = Vector3.forward; public Vector3 angularVelocity; @@ -76,8 +76,8 @@ namespace CreatureControl { this.beat = brain.GetNucleus("Beat"); this.hitLeft = brain.GetNucleus("Hit Left"); this.hitRight = brain.GetNucleus("Hit Right"); - this.foodReceptor = brain.GetNucleus("Food Receptor") as Receptor; - this.homeReceptor = brain.GetNucleus("Home Receptor") as Receptor; + this.foodReceptor = brain.GetNucleus("Food Receptor") as Neuron; + this.homeReceptor = brain.GetNucleus("Home Receptor") as Neuron; this.pheromoneSteering = brain.GetNucleus("Pheromone Steering"); //--- brain outputs @@ -190,10 +190,10 @@ namespace CreatureControl { Vector3 smell = smellDirection.normalized * intensity; switch (pheromone.type) { case Pheromone.Type.Food: - foodReceptor?.ProcessStimulus(smellDirection.normalized * intensity, pheromone.GetInstanceID(), "food pheromone"); + foodReceptor?.ProcessStimulus(smellDirection.normalized * intensity); //, pheromone.GetInstanceID(), "food pheromone"); break; case Pheromone.Type.Home: - homeReceptor?.ProcessStimulus(smellDirection.normalized * intensity, pheromone.GetInstanceID(), "home pheromone"); + homeReceptor?.ProcessStimulus(smellDirection.normalized * intensity); //, pheromone.GetInstanceID(), "home pheromone"); break; } //Debug.DrawLine(this.transform.position, pheromone.transform.position, Color.magenta); @@ -214,7 +214,7 @@ namespace CreatureControl { float angle = Vector3.Angle(Vector3.forward, smellDirection); if (angle < smellAngle && distance > 0.01) { float intensity = food.StrengthAt(distance); - foodReceptor?.ProcessStimulus(smellDirection.normalized * intensity, food.GetInstanceID(), "food"); + foodReceptor?.ProcessStimulus(smellDirection.normalized * intensity); //, food.GetInstanceID(), "food"); Debug.DrawLine(this.transform.position, food.transform.position, Color.red); } } @@ -234,7 +234,7 @@ namespace CreatureControl { if (angle < smellAngle && distance > 0.01) { float intensity = nest.StrengthAt(distance); Vector3 value = smellDirection.normalized * intensity; - homeReceptor?.ProcessStimulus(value, nest.GetInstanceID(), "nest"); + homeReceptor?.ProcessStimulus(value); //, nest.GetInstanceID(), "nest"); Debug.DrawLine(this.transform.position, nest.transform.position, Color.red); } } diff --git a/Samples/Brain/Foraging.asset b/Samples/Brain/Foraging.asset index 25529d8..1a95a08 100644 --- a/Samples/Brain/Foraging.asset +++ b/Samples/Brain/Foraging.asset @@ -1,1179 +1,233 @@ -%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: Foraging - m_EditorClassIdentifier: Assembly-CSharp::ClusterPrefab - nuclei: - - rid: 5479437209301418101 - - rid: 5479437233826299911 - - rid: 5479437233826299913 - - rid: 5479437301218279525 - - rid: 5479437301218279531 - - rid: 5479437301218279533 - - rid: 5479437301218279535 - - rid: 5479437321628549179 - - rid: 5479437321628549183 - - rid: 5479437321628549189 - - rid: 5479437344462864575 - - rid: 5479437344462864598 - - rid: 5479437349790417078 - - rid: 5479437349790417080 - - rid: 5479437349790417084 - - rid: 5479437349790417088 - - rid: 2262690603760877647 - - rid: 2262690603760877698 - - rid: 2262690603760877722 - - rid: 2262690603760877723 - - rid: 2262690603760877724 - - rid: 2262690603760877753 - - rid: 2262690603760877783 - - rid: 2262690603760877784 - - rid: 2262690603760877785 - - rid: 2262690603760877786 - references: - version: 2 - RefIds: - - rid: -2 - type: {class: , ns: NanoBrain, asm: } - - rid: 2262690603760877647 - type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Food Receptor - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877783 - _array: - rid: 2262690603760877648 - - rid: 2262690603760877648 - type: {class: NucleusArray, ns: NanoBrain, asm: Assembly-CSharp} - data: - _nuclei: - - rid: 2262690603760877647 - - rid: 2262690603760877784 - - rid: 2262690603760877785 - - rid: 2262690603760877786 - - rid: 2262690603760877698 - type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Home Receptor - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877753 - _array: - rid: 2262690603760877699 - - rid: 2262690603760877699 - type: {class: NucleusArray, ns: NanoBrain, asm: Assembly-CSharp} - data: - _nuclei: - - rid: 2262690603760877698 - - rid: 2262690603760877722 - - rid: 2262690603760877723 - - rid: 2262690603760877724 - - rid: 2262690603760877722 - type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: 'Home Receptor: 1' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877753 - _array: - rid: 2262690603760877699 - - rid: 2262690603760877723 - type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: 'Home Receptor: 2' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877753 - _array: - rid: 2262690603760877699 - - rid: 2262690603760877724 - type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: 'Home Receptor: 3' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877753 - _array: - rid: 2262690603760877699 - - rid: 2262690603760877753 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Home Smell - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 2262690603760877698 - weight: 1 - - neuron: - rid: 2262690603760877722 - weight: 1 - - neuron: - rid: 2262690603760877723 - weight: 1 - - neuron: - rid: 2262690603760877724 - weight: 1 - combinator: 0 - _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 - _receivers: - - rid: 5479437349790417084 - - rid: 2262690603760877783 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Food Smell - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 2262690603760877647 - weight: 1 - - neuron: - rid: 2262690603760877784 - weight: 1 - - neuron: - rid: 2262690603760877785 - weight: 1 - - neuron: - rid: 2262690603760877786 - weight: 1 - combinator: 0 - _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 - _receivers: - - rid: 5479437349790417078 - - rid: 2262690603760877784 - type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: 'Food Receptor: 1' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877783 - _array: - rid: 2262690603760877648 - - rid: 2262690603760877785 - type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: 'Food Receptor: 2' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877783 - _array: - rid: 2262690603760877648 - - rid: 2262690603760877786 - type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: 'Food Receptor: 3' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877783 - _array: - rid: 2262690603760877648 - - rid: 5479437209301418101 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Output - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 5479437344462864575 - weight: 4 - - neuron: - rid: 5479437344462864598 - weight: 1 - - neuron: - rid: 5479437349790417078 - weight: 1 - - neuron: - rid: 5479437349790417084 - weight: 1 - combinator: 0 - _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 - _receivers: [] - - rid: 5479437233826299911 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Hit Left - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 5479437344462864575 - - rid: 5479437301218279533 - - rid: 5479437233826299913 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Hit Right - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 5479437344462864575 - - rid: 5479437301218279533 - - rid: 5479437301218279525 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Home Pheromones - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0.5, y: 0.5, z: 0.5} - _synapses: - - neuron: - rid: 5479437301218279531 - weight: 1 - - neuron: - rid: 5479437321628549179 - weight: 1 - combinator: 1 - _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 - _receivers: [] - - rid: 5479437301218279531 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Beat - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 5479437301218279525 - - rid: 5479437301218279535 - - rid: 5479437301218279533 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Mouth - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 5479437233826299911 - weight: 1 - - neuron: - rid: 5479437233826299913 - weight: 1 - combinator: 0 - _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 - _receivers: [] - - rid: 5479437301218279535 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Food Pheromones - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 1, y: 1, z: 1} - _synapses: - - neuron: - rid: 5479437301218279531 - weight: 1 - - neuron: - rid: 5479437321628549183 - weight: 1 - combinator: 1 - _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 - _receivers: [] - - rid: 5479437321628549179 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Looking for food - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0.5, y: 0.5, z: 0.5} - _synapses: - - neuron: - rid: 5479437321628549189 - weight: -0.5 - combinator: 0 - _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 - _receivers: - - rid: 5479437301218279525 - - rid: 5479437321628549183 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Going home - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0.5, y: 0.5, z: 0.5} - _synapses: - - neuron: - rid: 5479437321628549189 - weight: 0.5 - combinator: 0 - _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 - _receivers: - - rid: 5479437301218279535 - - rid: 5479437321628549189 - type: {class: MemoryCell, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Having Food - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 5479437321628549179 - - rid: 5479437321628549183 - - rid: 5479437349790417088 - - rid: 5479437349790417080 - staticMemory: 1 - - rid: 5479437344462864575 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Collision Steering - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 5479437233826299911 - weight: -1 - - neuron: - rid: 5479437233826299913 - weight: -1 - combinator: 0 - _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 - _receivers: - - rid: 5479437209301418101 - - rid: 5479437344462864598 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Pheromone Steering - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 5479437209301418101 - - rid: 5479437349790417078 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Food steering - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 1, y: 1, z: 1} - _synapses: - - neuron: - rid: 5479437349790417080 - weight: 1 - - neuron: - rid: 2262690603760877783 - weight: 1 - combinator: 1 - _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 - _receivers: - - rid: 5479437209301418101 - - rid: 5479437349790417080 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Have no food - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0.5, y: 0.5, z: 0.5} - _synapses: - - neuron: - rid: 5479437321628549189 - weight: -0.5 - combinator: 0 - _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 - _receivers: - - rid: 5479437349790417078 - - rid: 5479437349790417084 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Home steering - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 1, y: 1, z: 1} - _synapses: - - neuron: - rid: 5479437349790417088 - weight: 1 - - neuron: - rid: 2262690603760877753 - weight: 1 - combinator: 1 - _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 - _receivers: - - rid: 5479437209301418101 - - rid: 5479437349790417088 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Have Food - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0.5, y: 0.5, z: 0.5} - _synapses: - - neuron: - rid: 5479437321628549189 - weight: 0.5 - combinator: 0 - _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 - _receivers: - - rid: 5479437349790417084 +%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: Foraging + m_EditorClassIdentifier: + nuclei: + - rid: 2642584373999960064 + - rid: 2642584373999960065 + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } + - rid: 2642584373999960064 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Output + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 1 + _receivers: [] + - rid: 2642584373999960065 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Collision Steering + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2642584373999960066 + - rid: 2642584373999960068 + - rid: 2642584373999960066 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Output + clusterPrefab: {fileID: 11400000} + parent: + rid: 2642584373999960067 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 2642584373999960065 + weight: 1 + combinator: 0 + _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 + _receivers: [] + - rid: 2642584373999960067 + type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Foraging + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + prefab: {fileID: 11400000} + siblingClusters: [] + instanceCount: 1 + clusterNuclei: + - rid: 2642584373999960066 + - rid: 2642584373999960068 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Output + clusterPrefab: {fileID: 11400000} + parent: + rid: 2642584373999960069 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 2642584373999960065 + weight: 1 + combinator: 0 + _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 + _receivers: [] + - rid: 2642584373999960069 + type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Foraging + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + prefab: {fileID: 11400000} + siblingClusters: [] + instanceCount: 1 + clusterNuclei: + - rid: 2642584373999960068 + - rid: 2642584373999960070 + - rid: 2642584373999960070 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Collision Steering + clusterPrefab: {fileID: 11400000} + parent: + rid: 2642584373999960069 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: [] diff --git a/Samples/Brain/Foraging.asset.meta b/Samples/Brain/Foraging.asset.meta index 34f9027..cc22036 100644 --- a/Samples/Brain/Foraging.asset.meta +++ b/Samples/Brain/Foraging.asset.meta @@ -1,8 +1,8 @@ fileFormatVersion: 2 -guid: 0f7345a3a2017e01383b1d8392b40304 +guid: 81292defec7ff5278a48a5d154659d00 NativeFormatImporter: externalObjects: {} - mainObjectFileID: 0 + mainObjectFileID: 11400000 userData: assetBundleName: assetBundleVariant: diff --git a/Samples/Brain/Foraging_old.asset b/Samples/Brain/Foraging_old.asset new file mode 100644 index 0000000..cc32b51 --- /dev/null +++ b/Samples/Brain/Foraging_old.asset @@ -0,0 +1,1179 @@ +%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: Foraging_old + m_EditorClassIdentifier: Assembly-CSharp::ClusterPrefab + nuclei: + - rid: 5479437209301418101 + - rid: 5479437233826299911 + - rid: 5479437233826299913 + - rid: 5479437301218279525 + - rid: 5479437301218279531 + - rid: 5479437301218279533 + - rid: 5479437301218279535 + - rid: 5479437321628549179 + - rid: 5479437321628549183 + - rid: 5479437321628549189 + - rid: 5479437344462864575 + - rid: 5479437344462864598 + - rid: 5479437349790417078 + - rid: 5479437349790417080 + - rid: 5479437349790417084 + - rid: 5479437349790417088 + - rid: 2262690603760877647 + - rid: 2262690603760877698 + - rid: 2262690603760877722 + - rid: 2262690603760877723 + - rid: 2262690603760877724 + - rid: 2262690603760877753 + - rid: 2262690603760877783 + - rid: 2262690603760877784 + - rid: 2262690603760877785 + - rid: 2262690603760877786 + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: NanoBrain, asm: } + - rid: 2262690603760877647 + type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Food Receptor + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690603760877783 + _array: + rid: 2262690603760877648 + - rid: 2262690603760877648 + type: {class: NucleusArray, ns: NanoBrain, asm: Assembly-CSharp} + data: + _nuclei: + - rid: 2262690603760877647 + - rid: 2262690603760877784 + - rid: 2262690603760877785 + - rid: 2262690603760877786 + - rid: 2262690603760877698 + type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Home Receptor + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690603760877753 + _array: + rid: 2262690603760877699 + - rid: 2262690603760877699 + type: {class: NucleusArray, ns: NanoBrain, asm: Assembly-CSharp} + data: + _nuclei: + - rid: 2262690603760877698 + - rid: 2262690603760877722 + - rid: 2262690603760877723 + - rid: 2262690603760877724 + - rid: 2262690603760877722 + type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: 'Home Receptor: 1' + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690603760877753 + _array: + rid: 2262690603760877699 + - rid: 2262690603760877723 + type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: 'Home Receptor: 2' + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690603760877753 + _array: + rid: 2262690603760877699 + - rid: 2262690603760877724 + type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: 'Home Receptor: 3' + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690603760877753 + _array: + rid: 2262690603760877699 + - rid: 2262690603760877753 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Home Smell + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 2262690603760877698 + weight: 1 + - neuron: + rid: 2262690603760877722 + weight: 1 + - neuron: + rid: 2262690603760877723 + weight: 1 + - neuron: + rid: 2262690603760877724 + weight: 1 + combinator: 0 + _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 + _receivers: + - rid: 5479437349790417084 + - rid: 2262690603760877783 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Food Smell + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 2262690603760877647 + weight: 1 + - neuron: + rid: 2262690603760877784 + weight: 1 + - neuron: + rid: 2262690603760877785 + weight: 1 + - neuron: + rid: 2262690603760877786 + weight: 1 + combinator: 0 + _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 + _receivers: + - rid: 5479437349790417078 + - rid: 2262690603760877784 + type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: 'Food Receptor: 1' + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690603760877783 + _array: + rid: 2262690603760877648 + - rid: 2262690603760877785 + type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: 'Food Receptor: 2' + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690603760877783 + _array: + rid: 2262690603760877648 + - rid: 2262690603760877786 + type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: 'Food Receptor: 3' + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 2262690603760877783 + _array: + rid: 2262690603760877648 + - rid: 5479437209301418101 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Output + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 5479437344462864575 + weight: 4 + - neuron: + rid: 5479437344462864598 + weight: 1 + - neuron: + rid: 5479437349790417078 + weight: 1 + - neuron: + rid: 5479437349790417084 + weight: 1 + combinator: 0 + _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 + _receivers: [] + - rid: 5479437233826299911 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Hit Left + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 5479437344462864575 + - rid: 5479437301218279533 + - rid: 5479437233826299913 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Hit Right + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 5479437344462864575 + - rid: 5479437301218279533 + - rid: 5479437301218279525 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Home Pheromones + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0.5, y: 0.5, z: 0.5} + _synapses: + - neuron: + rid: 5479437301218279531 + weight: 1 + - neuron: + rid: 5479437321628549179 + weight: 1 + combinator: 1 + _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 + _receivers: [] + - rid: 5479437301218279531 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Beat + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 5479437301218279525 + - rid: 5479437301218279535 + - rid: 5479437301218279533 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Mouth + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 5479437233826299911 + weight: 1 + - neuron: + rid: 5479437233826299913 + weight: 1 + combinator: 0 + _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 + _receivers: [] + - rid: 5479437301218279535 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Food Pheromones + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 1, y: 1, z: 1} + _synapses: + - neuron: + rid: 5479437301218279531 + weight: 1 + - neuron: + rid: 5479437321628549183 + weight: 1 + combinator: 1 + _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 + _receivers: [] + - rid: 5479437321628549179 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Looking for food + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0.5, y: 0.5, z: 0.5} + _synapses: + - neuron: + rid: 5479437321628549189 + weight: -0.5 + combinator: 0 + _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 + _receivers: + - rid: 5479437301218279525 + - rid: 5479437321628549183 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Going home + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0.5, y: 0.5, z: 0.5} + _synapses: + - neuron: + rid: 5479437321628549189 + weight: 0.5 + combinator: 0 + _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 + _receivers: + - rid: 5479437301218279535 + - rid: 5479437321628549189 + type: {class: MemoryCell, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Having Food + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 5479437321628549179 + - rid: 5479437321628549183 + - rid: 5479437349790417088 + - rid: 5479437349790417080 + staticMemory: 1 + - rid: 5479437344462864575 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Collision Steering + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 5479437233826299911 + weight: -1 + - neuron: + rid: 5479437233826299913 + weight: -1 + combinator: 0 + _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 + _receivers: + - rid: 5479437209301418101 + - rid: 5479437344462864598 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Pheromone Steering + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + _receivers: + - rid: 5479437209301418101 + - rid: 5479437349790417078 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Food steering + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 1, y: 1, z: 1} + _synapses: + - neuron: + rid: 5479437349790417080 + weight: 1 + - neuron: + rid: 2262690603760877783 + weight: 1 + combinator: 1 + _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 + _receivers: + - rid: 5479437209301418101 + - rid: 5479437349790417080 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Have no food + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0.5, y: 0.5, z: 0.5} + _synapses: + - neuron: + rid: 5479437321628549189 + weight: -0.5 + combinator: 0 + _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 + _receivers: + - rid: 5479437349790417078 + - rid: 5479437349790417084 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Home steering + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 1, y: 1, z: 1} + _synapses: + - neuron: + rid: 5479437349790417088 + weight: 1 + - neuron: + rid: 2262690603760877753 + weight: 1 + combinator: 1 + _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 + _receivers: + - rid: 5479437209301418101 + - rid: 5479437349790417088 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Have Food + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0.5, y: 0.5, z: 0.5} + _synapses: + - neuron: + rid: 5479437321628549189 + weight: 0.5 + combinator: 0 + _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 + _receivers: + - rid: 5479437349790417084 diff --git a/Samples/Brain/Foraging_old.asset.meta b/Samples/Brain/Foraging_old.asset.meta new file mode 100644 index 0000000..34f9027 --- /dev/null +++ b/Samples/Brain/Foraging_old.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0f7345a3a2017e01383b1d8392b40304 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: From 36c414ae021025018889eb03307bed0def0469e0 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 5 May 2026 08:48:41 +0200 Subject: [PATCH 25/38] Insect rig improvements --- .../Editor/Scripts/Insect/Insect_Editor.cs | 25 +- CreatureControl/Editor/Scripts/Leg_Editor.cs | 49 +- CreatureControl/Runtime/Scripts/Creature.cs | 3 + .../Runtime/Scripts/Insect/Insect.cs | 5 +- CreatureControl/Runtime/Scripts/Leg.cs | 58 +- CreatureControl/Runtime/Scripts/TargetRig.cs | 3 + NanoBrain/Editor/ClusterViewer.cs | 6 +- Runtime/Resources/InsectTargetRig.prefab | 86 +- Samples/Foraging.unity | 3565 +++++++++++------ .../Prefabs/LowPolyAntRigged Variant.prefab | 2586 ++++++++++++ .../LowPolyAntRigged Variant.prefab.meta | 7 + Samples/Prefabs/LowPolyAntRigged.prefab | 59 + Samples/Prefabs/LowPolyAntRigged.prefab.meta | 7 + ...owPolyAnt.prefab => LowPolyAnt_old.prefab} | 2805 ++++++++----- ...prefab.meta => LowPolyAnt_old.prefab.meta} | 0 15 files changed, 6946 insertions(+), 2318 deletions(-) create mode 100644 Samples/Prefabs/LowPolyAntRigged Variant.prefab create mode 100644 Samples/Prefabs/LowPolyAntRigged Variant.prefab.meta create mode 100644 Samples/Prefabs/LowPolyAntRigged.prefab create mode 100644 Samples/Prefabs/LowPolyAntRigged.prefab.meta rename Samples/Prefabs/{LowPolyAnt.prefab => LowPolyAnt_old.prefab} (56%) rename Samples/Prefabs/{LowPolyAnt.prefab.meta => LowPolyAnt_old.prefab.meta} (100%) diff --git a/CreatureControl/Editor/Scripts/Insect/Insect_Editor.cs b/CreatureControl/Editor/Scripts/Insect/Insect_Editor.cs index 714e789..76214e1 100644 --- a/CreatureControl/Editor/Scripts/Insect/Insect_Editor.cs +++ b/CreatureControl/Editor/Scripts/Insect/Insect_Editor.cs @@ -10,13 +10,15 @@ namespace CreatureControl { protected Insect insect; public override void OnEnable() { - base.OnEnable(); insect = target as Insect; - //bool anythingChanged = false; + bool anythingChanged = false; + + anythingChanged |= insect.CheckTargetRig(); + + base.OnEnable(); - //anythingChanged |= insect.CheckTargetRig("InsectRig"); // We already do this in Creature_Editor... //this.creature.targetRig.MatchTo(this.creature, ref anythingChanged); //insect.insectRig.MatchTo(insect, ref anythingChanged); @@ -64,10 +66,10 @@ namespace CreatureControl { // } */ - // if (anythingChanged) { - // EditorUtility.SetDirty(creature); - // AssetDatabase.SaveAssets(); - // } + if (anythingChanged) { + EditorUtility.SetDirty(creature); + AssetDatabase.SaveAssets(); + } } static void CollectFromStateMachine(AnimatorStateMachine sm, List outList) { @@ -111,6 +113,9 @@ namespace CreatureControl { static bool showTargets; private void TargetsInspector() { + if (insect.insectRig == null) + return; + bool configurationIncomplete = false; if (!insect.leftFrontLeg.isConfigured || !insect.leftMiddleLeg.isConfigured || @@ -153,9 +158,11 @@ namespace CreatureControl { if (somethingChanged) { Debug.Log("seomthin has changed"); // don't know if this apply/update is really needed.... - serializedObject.ApplyModifiedProperties(); - insect.insectRig.MatchTo(insect, ref somethingChanged); serializedObject.Update(); + // serializedObject.ApplyModifiedProperties(); + insect.insectRig.MatchTo(insect, ref somethingChanged); + EditorUtility.SetDirty(this.insect); + AssetDatabase.SaveAssets(); } } } diff --git a/CreatureControl/Editor/Scripts/Leg_Editor.cs b/CreatureControl/Editor/Scripts/Leg_Editor.cs index e178960..082a9e4 100644 --- a/CreatureControl/Editor/Scripts/Leg_Editor.cs +++ b/CreatureControl/Editor/Scripts/Leg_Editor.cs @@ -8,7 +8,7 @@ namespace CreatureControl { private static bool showfield = false; public static bool Inspector(SerializedProperty legProp, TargetLeg targetLeg, Leg leg) { - bool anythingChanged = false; + bool somethingChanged = false; GUIStyle foldoutStyle = new(EditorStyles.foldout) { margin = EditorStyles.objectField.margin @@ -17,28 +17,49 @@ namespace CreatureControl { EditorGUILayout.BeginHorizontal(); string legName = ConvertCamelCase(legProp.name); showfield = EditorGUILayout.Foldout(showfield, legName, true, foldoutStyle); - SerializedProperty femurProp = legProp.FindPropertyRelative("_femur");//nameof(Leg._femur)); - SerializedProperty tibiaProp = legProp.FindPropertyRelative("_tibia"); //nameof(Leg._tibia)); - SerializedProperty tarsusProp = legProp.FindPropertyRelative("_tarsus"); //nameof(Leg._tarsus)); - - Transform newFemur = (Transform)EditorGUILayout.ObjectField(femurProp.objectReferenceValue, typeof(Transform), true); - if (newFemur != femurProp.objectReferenceValue) { - leg.DetectBones(newFemur); - anythingChanged = true; + bool femurChanged = FemurInspector(leg); + if (femurChanged) { + Debug.Log("Check"); + leg.DetectBones(leg.femur); } + somethingChanged |= femurChanged; EditorGUILayout.EndHorizontal(); - if (femurProp.objectReferenceValue != null && tibiaProp.objectReferenceValue == null) + if (leg.femur != null && leg.tibia == null) showfield = true; if (showfield) { EditorGUI.indentLevel++; - tibiaProp.objectReferenceValue = (Transform)EditorGUILayout.ObjectField("Lower Leg", tibiaProp.objectReferenceValue, typeof(Transform), true); - tarsusProp.objectReferenceValue = (Transform)EditorGUILayout.ObjectField("Foot", tarsusProp.objectReferenceValue, typeof(Transform), true); - // Need to check if anythingChanged and update the projection if it did + somethingChanged |= TibiaInspector(leg); + somethingChanged |= TarsusInspector(leg); + somethingChanged |= PhalangesInspector(leg); EditorGUI.indentLevel--; } - return anythingChanged; + return somethingChanged; + } + + protected static bool FemurInspector(Leg leg) { + Transform oldFemur = leg.femur; + leg.femur = (Transform)EditorGUILayout.ObjectField(leg.femur, typeof(Transform), true); + return leg.femur != oldFemur; + } + + protected static bool TibiaInspector(Leg leg) { + Transform oldTibia = leg.tibia; + leg.tibia = (Transform)EditorGUILayout.ObjectField("Lower leg", leg.tibia, typeof(Transform), true); + return leg.tibia != oldTibia; + } + + protected static bool TarsusInspector(Leg leg) { + Transform oldTarsus = leg.tarsus; + leg.tarsus = (Transform)EditorGUILayout.ObjectField("Foot", leg.tarsus, typeof(Transform), true); + return leg.tarsus != oldTarsus; + } + + protected static bool PhalangesInspector(Leg leg) { + Transform oldPhalanges = leg.phalanges; + leg.phalanges = (Transform)EditorGUILayout.ObjectField("Toes", leg.phalanges, typeof(Transform), true); + return leg.phalanges != oldPhalanges; } private static string ConvertCamelCase(string text) { diff --git a/CreatureControl/Runtime/Scripts/Creature.cs b/CreatureControl/Runtime/Scripts/Creature.cs index 52287e3..2d67f04 100644 --- a/CreatureControl/Runtime/Scripts/Creature.cs +++ b/CreatureControl/Runtime/Scripts/Creature.cs @@ -159,6 +159,9 @@ namespace CreatureControl { /// Update the bones of the creature's rig from the target rig pose /// public virtual void UpdateModel() { + if (this.model == null) + return; + Vector3 newPosition = this.targetRig.transform.position + this.targetToModelTranslation; Quaternion newOrientation = this.targetRig.transform.rotation * this.targetToModelRotation; this.model.SetPositionAndRotation(newPosition, newOrientation); diff --git a/CreatureControl/Runtime/Scripts/Insect/Insect.cs b/CreatureControl/Runtime/Scripts/Insect/Insect.cs index 339a9ff..524e592 100644 --- a/CreatureControl/Runtime/Scripts/Insect/Insect.cs +++ b/CreatureControl/Runtime/Scripts/Insect/Insect.cs @@ -22,7 +22,7 @@ namespace CreatureControl { public Leg rightFrontLeg; public Leg rightMiddleLeg; - public Leg rightHindLeg; + public Leg rightHindLeg; public bool updateAnimations = false; @@ -45,6 +45,9 @@ namespace CreatureControl { public override void UpdateModel() { base.UpdateModel(); + if (this.insectRig == null) + return; + if (this.insectRig.leftFrontLeg != null) this.insectRig.leftFrontLeg.UpdateBones(this.leftFrontLeg); if (this.insectRig.leftMiddleLeg != null) diff --git a/CreatureControl/Runtime/Scripts/Leg.cs b/CreatureControl/Runtime/Scripts/Leg.cs index 9328843..2f0d051 100644 --- a/CreatureControl/Runtime/Scripts/Leg.cs +++ b/CreatureControl/Runtime/Scripts/Leg.cs @@ -21,6 +21,7 @@ namespace CreatureControl { } } + public readonly static string nameOfFemur = nameof(_femur); [SerializeField] private Transform _femur; /// @@ -34,6 +35,7 @@ namespace CreatureControl { } } + public readonly static string nameOfTibia = nameof(_tibia); [SerializeField] private Transform _tibia; /// @@ -48,6 +50,7 @@ namespace CreatureControl { } } + public readonly static string nameOfTarsus = nameof(_tarsus); [SerializeField] private Transform _tarsus; /// @@ -62,6 +65,7 @@ namespace CreatureControl { } } + public readonly static string nameOfPhalanges = nameof(_phalanges); [SerializeField] private Transform _phalanges; /// @@ -169,7 +173,6 @@ namespace CreatureControl { public void DetectBones(Transform root) { if (root == null) return; - coxa = femur = tibia = tarsus = phalanges = end = null; // gather a straight chain following single-child links List chain = new(); @@ -180,40 +183,39 @@ namespace CreatureControl { chain.Add(current); } - // the detected end bone is the last element in the collected chain - end = chain[^1]; - - // map chain length to bone roles according to rules: - // 1 => femur - // 2 => femur, tibia - // 3 => femur, tibia, tarsus - // 4 => femur, tibia, tarsus, phalanges - // 5+ => coxa, femur, tibia, tarsus, phalanges (first 5) int count = chain.Count; + if (count <= 1) + // With one bone (and no end bone) it is not possible to compute the IK + return; + + // the detected end bone is the last element in the collected chain + // this.end = chain[^1]; + // count--; + if (count == 1) - femur = chain[0]; + this.femur = chain[0]; else if (count == 2) { - femur = chain[0]; - tibia = chain[1]; + this.femur = chain[0]; + this.tibia = chain[1]; } else if (count == 3) { - femur = chain[0]; - tibia = chain[1]; - tarsus = chain[2]; + this.femur = chain[0]; + this.tibia = chain[1]; + this.tarsus = chain[2]; } else if (count == 4) { - femur = chain[0]; - tibia = chain[1]; - tarsus = chain[2]; - phalanges = chain[3]; + this.femur = chain[0]; + this.tibia = chain[1]; + this.tarsus = chain[2]; + this.phalanges = chain[3]; } else // count >= 5 { - coxa = chain[0]; - femur = chain[1]; - tibia = chain[2]; - tarsus = chain[3]; - phalanges = chain[4]; + this.coxa = chain[0]; + this.femur = chain[1]; + this.tibia = chain[2]; + this.tarsus = chain[3]; + this.phalanges = chain[4]; } } @@ -226,9 +228,9 @@ namespace CreatureControl { public bool isConfigured => this.femur != null && this.tibia != null && - this.tarsus != null && - this.phalanges != null && - this.end != null; + this.tarsus != null; + // && this.phalanges != null + // && this.end != null; public Side side; public bool isLeft => side == Side.Left; diff --git a/CreatureControl/Runtime/Scripts/TargetRig.cs b/CreatureControl/Runtime/Scripts/TargetRig.cs index 23452e7..88a558d 100644 --- a/CreatureControl/Runtime/Scripts/TargetRig.cs +++ b/CreatureControl/Runtime/Scripts/TargetRig.cs @@ -27,6 +27,9 @@ namespace CreatureControl { /// The creature to align to /// True when any property of the creature has changed public virtual void MatchTo(Creature creature, ref bool anythingChanged) { + if (creature == null || creature.model == null) + return; + Vector3 targetToModelTranslation = creature.model.position - this.transform.position; bool changed = targetToModelTranslation != creature.targetToModelTranslation; if (changed) { diff --git a/NanoBrain/Editor/ClusterViewer.cs b/NanoBrain/Editor/ClusterViewer.cs index 11013d3..54df2e8 100644 --- a/NanoBrain/Editor/ClusterViewer.cs +++ b/NanoBrain/Editor/ClusterViewer.cs @@ -99,7 +99,9 @@ namespace NanoBrain { public void SetGraph(GameObject gameObject) { this.gameObject = gameObject; - + if (this.currentCluster == null) + return; + if (Application.isPlaying == false) this.serializedBrain = new SerializedObject(this.currentCluster.prefab); this.selectedOutput = this.currentCluster.outputs[0]; @@ -121,7 +123,7 @@ namespace NanoBrain { } public void OnIMGUI() { - if (Application.isPlaying == false) + if (Application.isPlaying == false && serializedBrain != null) serializedBrain.Update(); Handles.BeginGUI(); diff --git a/Runtime/Resources/InsectTargetRig.prefab b/Runtime/Resources/InsectTargetRig.prefab index b6cbe68..65ab417 100644 --- a/Runtime/Resources/InsectTargetRig.prefab +++ b/Runtime/Resources/InsectTargetRig.prefab @@ -78,10 +78,17 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: bones: - femur: {fileID: 2087731612450819825} - tibia: {fileID: 7566832081299524197} - tarsus: {fileID: 7011186323915432702} + _coxa: {fileID: 0} + _femur: {fileID: 2087731612450819825} + _tibia: {fileID: 7566832081299524197} + _tarsus: {fileID: 7011186323915432702} + _phalanges: {fileID: 0} + _end: {fileID: 0} _femurLength: 0.004816547 + _tibiaLength: 0.008353032 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 target: {fileID: 8947192729555298471} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} @@ -144,7 +151,7 @@ MonoBehaviour: rightMiddleLeg: {fileID: 4196034226083389076} rightBackLeg: {fileID: 8323677930838830493} render: 1 - legLength: 0.009770508 + legLength: 0.0031432603 --- !u!95 &5843436816833865534 Animator: serializedVersion: 5 @@ -190,7 +197,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 816003872898039836} serializedVersion: 2 - m_LocalRotation: {x: -0.47292894, y: 0.17234407, z: 0.038568486, w: -0.86321974} + m_LocalRotation: {x: -0.47292906, y: 0.17234407, z: 0.038568486, w: -0.8632196} m_LocalPosition: {x: 0, y: 0, z: 0.008212241} m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 0.9999999} m_ConstrainProportionsScale: 0 @@ -243,10 +250,17 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: bones: - femur: {fileID: 976560727556484423} - tibia: {fileID: 3873135409852464941} - tarsus: {fileID: 3355004770557811387} + _coxa: {fileID: 0} + _femur: {fileID: 976560727556484423} + _tibia: {fileID: 3873135409852464941} + _tarsus: {fileID: 3355004770557811387} + _phalanges: {fileID: 0} + _end: {fileID: 0} _femurLength: 0.003806679 + _tibiaLength: 0.0060429377 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 target: {fileID: 2041764967651498327} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} @@ -511,10 +525,17 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: bones: - femur: {fileID: 7879963364189984297} - tibia: {fileID: 8557148899078362646} - tarsus: {fileID: 2520372565419969361} + _coxa: {fileID: 0} + _femur: {fileID: 7879963364189984297} + _tibia: {fileID: 8557148899078362646} + _tarsus: {fileID: 2520372565419969361} + _phalanges: {fileID: 0} + _end: {fileID: 0} _femurLength: 0.006008031 + _tibiaLength: 0.008482452 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 target: {fileID: 5692380185316106944} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} @@ -1175,7 +1196,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5930454242050132924} serializedVersion: 2 - m_LocalRotation: {x: 0.07720134, y: 0.9225222, z: 0.25537333, w: -0.27888584} + m_LocalRotation: {x: 0.07720129, y: 0.92252225, z: 0.25537315, w: -0.27888587} m_LocalPosition: {x: -0.002, y: 0.004, z: -0.006} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1196,10 +1217,17 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: bones: - femur: {fileID: 1138231466888029713} - tibia: {fileID: 6229249450306020558} - tarsus: {fileID: 3473835942814004862} + _coxa: {fileID: 0} + _femur: {fileID: 1138231466888029713} + _tibia: {fileID: 6229249450306020558} + _tarsus: {fileID: 3473835942814004862} + _phalanges: {fileID: 0} + _end: {fileID: 0} _femurLength: 0.0031432603 + _tibiaLength: 0.008212241 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 target: {fileID: 2714894253296331867} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} @@ -1313,10 +1341,17 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: bones: - femur: {fileID: 5158943779127512027} - tibia: {fileID: 5102382635668602733} - tarsus: {fileID: 5832494694235077857} + _coxa: {fileID: 0} + _femur: {fileID: 5158943779127512027} + _tibia: {fileID: 5102382635668602733} + _tarsus: {fileID: 5832494694235077857} + _phalanges: {fileID: 0} + _end: {fileID: 0} _femurLength: 0.004816545 + _tibiaLength: 0.008259119 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 target: {fileID: 8660658904332009209} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} @@ -1722,7 +1757,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8534431202702769095} serializedVersion: 2 - m_LocalRotation: {x: 0.6024823, y: 0.00000008940697, z: 0.000000052154064, w: 0.79813224} + m_LocalRotation: {x: 0.6024822, y: 0.000000074505806, z: 0.000000044703484, w: 0.7981324} m_LocalPosition: {x: 0, y: 0, z: 0.00314326} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1881,10 +1916,17 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: bones: - femur: {fileID: 7827425323228862897} - tibia: {fileID: 8607306932134183899} - tarsus: {fileID: 5350519918537018444} + _coxa: {fileID: 0} + _femur: {fileID: 7827425323228862897} + _tibia: {fileID: 8607306932134183899} + _tarsus: {fileID: 5350519918537018444} + _phalanges: {fileID: 0} + _end: {fileID: 0} _femurLength: 0.00380668 + _tibiaLength: 0.005963828 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 target: {fileID: 5063380583403966759} targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} diff --git a/Samples/Foraging.unity b/Samples/Foraging.unity index 3ef9acb..02e9183 100644 --- a/Samples/Foraging.unity +++ b/Samples/Foraging.unity @@ -122,11 +122,69 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} ---- !u!4 &45864745 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} +--- !u!1 &23532513 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 23532514} + m_Layer: 0 + m_Name: LeftMiddle_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &23532514 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 23532513} + serializedVersion: 2 + m_LocalRotation: {x: 0.80737054, y: 0.00000008940697, z: 0.000000044703484, w: 0.59004486} + m_LocalPosition: {x: 0, y: 0, z: 0.004816545} + m_LocalScale: {x: 0.9999998, y: 1, z: 1.0000001} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1046556278} + m_Father: {fileID: 1541404099} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &90659803 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 90659804} + m_Layer: 0 + m_Name: LeftHind_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &90659804 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 90659803} + serializedVersion: 2 + m_LocalRotation: {x: -0.47292906, y: 0.17234407, z: 0.038568486, w: -0.8632196} + m_LocalPosition: {x: 0, y: 0, z: 0.008212241} + m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 0.9999999} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1757828249} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &94386191 GameObject: m_ObjectHideFlags: 0 @@ -221,11 +279,204 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!4 &125388149 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} +--- !u!1 &128928878 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 128928880} + - component: {fileID: 128928879} + m_Layer: 0 + m_Name: LeftFront_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &128928879 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 128928878} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 128928880} + _tibia: {fileID: 1055832138} + _tarsus: {fileID: 164314500} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.00380668 + _tibiaLength: 0.005963828 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 604205123} + targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} + targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} +--- !u!4 &128928880 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 128928878} + serializedVersion: 2 + m_LocalRotation: {x: -0.16464044, y: -0.20846698, z: -0.035625506, w: 0.9634137} + m_LocalPosition: {x: -0.002, y: 0.004, z: -0.002} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1055832138} + m_Father: {fileID: 658804661} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &140096619 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 140096620} + - component: {fileID: 140096622} + - component: {fileID: 140096621} + m_Layer: 0 + m_Name: LeftHind_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &140096620 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 140096619} + serializedVersion: 2 + m_LocalRotation: {x: 0.31411165, y: -0.6442087, z: 0.69609904, w: 0.042132646} + m_LocalPosition: {x: -0.006812622, y: 0, z: -0.01323235} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 969006086} + m_Father: {fileID: 1972141019} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!54 &140096621 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 140096619} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &140096622 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 140096619} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 770696509} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!1 &164314499 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 164314500} + m_Layer: 0 + m_Name: LeftFront_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &164314500 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 164314499} + serializedVersion: 2 + m_LocalRotation: {x: -0.0855568, y: 0.6380306, z: 0.42223957, w: 0.63820904} + m_LocalPosition: {x: 0, y: 0, z: 0.005963828} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1055832138} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &219111718 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 219111719} + m_Layer: 0 + m_Name: RightHind_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &219111719 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 219111718} + serializedVersion: 2 + m_LocalRotation: {x: 0.48380893, y: -0.2750721, z: 0.20774265, w: 0.8044299} + m_LocalPosition: {x: 0, y: 0, z: 0.008482451} + m_LocalScale: {x: 1, y: 0.9999999, z: 0.9999999} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 931091334} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &232829777 GameObject: m_ObjectHideFlags: 0 @@ -366,6 +617,66 @@ Transform: - {fileID: 1880435926} m_Father: {fileID: 1075240960} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &249293163 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 249293165} + - component: {fileID: 249293164} + m_Layer: 0 + m_Name: RightHind_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &249293164 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249293163} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 249293165} + _tibia: {fileID: 931091334} + _tarsus: {fileID: 219111719} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.006008031 + _tibiaLength: 0.008482452 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 649117740} + targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} + targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} +--- !u!4 &249293165 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249293163} + serializedVersion: 2 + m_LocalRotation: {x: -0.08576872, y: 0.912694, z: 0.30887008, w: 0.25344196} + m_LocalPosition: {x: 0.002, y: 0.004, z: -0.006} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 931091334} + m_Father: {fileID: 658804661} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &266176282 GameObject: m_ObjectHideFlags: 0 @@ -415,16 +726,6 @@ MonoBehaviour: antPrefab: {fileID: 0} numberOfAnts: 1 spawnAnt: 0 ---- !u!4 &273765720 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} - m_PrefabAsset: {fileID: 0} ---- !u!4 &282023640 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} - m_PrefabAsset: {fileID: 0} --- !u!1 &327634872 GameObject: m_ObjectHideFlags: 0 @@ -635,6 +936,100 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 330205048} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &362020948 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 362020950} + - component: {fileID: 362020949} + m_Layer: 0 + m_Name: RightMiddle_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &362020949 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 362020948} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 362020950} + _tibia: {fileID: 1488622526} + _tarsus: {fileID: 776655108} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.004816547 + _tibiaLength: 0.008353032 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 1445635527} + targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} + targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} +--- !u!4 &362020950 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 362020948} + serializedVersion: 2 + m_LocalRotation: {x: -0.30156556, y: 0.57948405, z: 0.24379048, w: 0.71681434} + m_LocalPosition: {x: 0.002, y: 0.004, z: -0.0045} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1488622526} + m_Father: {fileID: 658804661} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &390443499 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 390443500} + m_Layer: 0 + m_Name: LeftFeetTarget + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &390443500 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390443499} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1947988475} + - {fileID: 1272710240} + - {fileID: 649117740} + m_Father: {fileID: 1980490809} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &467453031 GameObject: m_ObjectHideFlags: 0 @@ -670,16 +1065,6 @@ Transform: - {fileID: 232829778} m_Father: {fileID: 1075240960} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!4 &539705206 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} - m_PrefabAsset: {fileID: 0} ---- !u!4 &546513205 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} - m_PrefabAsset: {fileID: 0} --- !u!1001 &566787347 PrefabInstance: m_ObjectHideFlags: 0 @@ -750,16 +1135,239 @@ Transform: m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} m_PrefabInstance: {fileID: 566787347} m_PrefabAsset: {fileID: 0} ---- !u!4 &673430214 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} +--- !u!1 &604205122 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} ---- !u!4 &685257250 stripped + serializedVersion: 6 + m_Component: + - component: {fileID: 604205123} + - component: {fileID: 604205125} + - component: {fileID: 604205124} + m_Layer: 0 + m_Name: LeftFront_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &604205123 Transform: - m_CorrespondingSourceObject: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 604205122} + serializedVersion: 2 + m_LocalRotation: {x: 0.10340257, y: 0.19714029, z: 0.72879976, w: 0.6475296} + m_LocalPosition: {x: -0.00464314, y: 0, z: 0.003821565} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1639738099} + m_Father: {fileID: 1972141019} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!54 &604205124 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 604205122} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &604205125 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 604205122} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 128928879} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!1 &649117739 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 649117740} + - component: {fileID: 649117742} + - component: {fileID: 649117741} + m_Layer: 0 + m_Name: RighHind_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &649117740 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 649117739} + serializedVersion: 2 + m_LocalRotation: {x: 0.25241286, y: 0.31570747, z: -0.7996064, w: 0.44412404} + m_LocalPosition: {x: 0.006352237, y: 0, z: -0.01323235} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1007722913} + m_Father: {fileID: 390443500} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!54 &649117741 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 649117739} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &649117742 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 649117739} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 249293164} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!1 &658804658 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 658804661} + - component: {fileID: 658804660} + - component: {fileID: 658804659} + m_Layer: 0 + m_Name: Target Rig + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!95 &658804659 +Animator: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 658804658} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: ba169e741a830f910bdde9e04f7c88f4, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 1 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!114 &658804660 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 658804658} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a25e8575da1d1cba48dc2b8da7a2b0ab, type: 3} + m_Name: + m_EditorClassIdentifier: + leftFrontLeg: {fileID: 128928879} + leftMiddleLeg: {fileID: 1541404098} + leftBackLeg: {fileID: 770696509} + rightFrontLeg: {fileID: 818182968} + rightMiddleLeg: {fileID: 362020949} + rightBackLeg: {fileID: 249293164} + render: 1 + legLength: 0.0031432603 +--- !u!4 &658804661 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 658804658} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 128928880} + - {fileID: 1541404099} + - {fileID: 770696510} + - {fileID: 818182969} + - {fileID: 362020950} + - {fileID: 249293165} + - {fileID: 1980490809} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &691526234 PrefabInstance: m_ObjectHideFlags: 0 @@ -830,6 +1438,66 @@ Transform: m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} m_PrefabInstance: {fileID: 691526234} m_PrefabAsset: {fileID: 0} +--- !u!1 &770696508 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 770696510} + - component: {fileID: 770696509} + m_Layer: 0 + m_Name: LeftHind_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &770696509 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 770696508} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 770696510} + _tibia: {fileID: 1757828249} + _tarsus: {fileID: 90659804} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0031432603 + _tibiaLength: 0.008212241 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 140096620} + targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} + targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} +--- !u!4 &770696510 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 770696508} + serializedVersion: 2 + m_LocalRotation: {x: 0.07720129, y: 0.92252225, z: 0.25537315, w: -0.27888587} + m_LocalPosition: {x: -0.002, y: 0.004, z: -0.006} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1757828249} + m_Father: {fileID: 658804661} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &775612060 GameObject: m_ObjectHideFlags: 0 @@ -922,6 +1590,97 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!1 &776655107 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 776655108} + m_Layer: 0 + m_Name: RightMiddle_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &776655108 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 776655107} + serializedVersion: 2 + m_LocalRotation: {x: 0.38045225, y: -0.47525752, z: -0.47922108, w: 0.6322449} + m_LocalPosition: {x: 0, y: 0, z: 0.00835303} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1488622526} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &818182967 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 818182969} + - component: {fileID: 818182968} + m_Layer: 0 + m_Name: RightFront_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &818182968 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 818182967} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 818182969} + _tibia: {fileID: 1013915773} + _tarsus: {fileID: 1146434365} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.003806679 + _tibiaLength: 0.0060429377 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 1947988475} + targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} + targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} +--- !u!4 &818182969 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 818182967} + serializedVersion: 2 + m_LocalRotation: {x: -0.17474006, y: 0.20808172, z: 0.037810877, w: 0.96163315} + m_LocalPosition: {x: 0.002, y: 0.004, z: -0.002} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1013915773} + m_Father: {fileID: 658804661} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &834383114 PrefabInstance: m_ObjectHideFlags: 0 @@ -1097,6 +1856,311 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 906427684} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &931091333 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 931091334} + m_Layer: 0 + m_Name: RightHind_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &931091334 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 931091333} + serializedVersion: 2 + m_LocalRotation: {x: 0.77590793, y: -0.000000074505806, z: -0.000000029802322, w: 0.63084626} + m_LocalPosition: {x: 0, y: 0, z: 0.006008029} + m_LocalScale: {x: 1, y: 1.0000001, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 219111719} + m_Father: {fileID: 249293165} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &969006085 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 969006086} + - component: {fileID: 969006089} + - component: {fileID: 969006088} + - component: {fileID: 969006087} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &969006086 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 969006085} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 140096620} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &969006087 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 969006085} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &969006088 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 969006085} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &969006089 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 969006085} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1007722912 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1007722913} + - component: {fileID: 1007722916} + - component: {fileID: 1007722915} + - component: {fileID: 1007722914} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1007722913 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1007722912} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 649117740} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &1007722914 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1007722912} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1007722915 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1007722912} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1007722916 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1007722912} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1013915772 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1013915773} + m_Layer: 0 + m_Name: RightFront_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1013915773 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1013915772} + serializedVersion: 2 + m_LocalRotation: {x: 0.6604676, y: -0.000000014901161, z: 0.000000026077032, w: 0.7508546} + m_LocalPosition: {x: 0, y: 0, z: 0.003806679} + m_LocalScale: {x: 0.99999994, y: 1, z: 0.99999994} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1146434365} + m_Father: {fileID: 818182969} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1046556277 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1046556278} + m_Layer: 0 + m_Name: LeftMiddle_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1046556278 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1046556277} + serializedVersion: 2 + m_LocalRotation: {x: -0.44156945, y: -0.45806098, z: -0.5668178, w: -0.5233681} + m_LocalPosition: {x: 0, y: 0, z: 0.008259117} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 23532514} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1052160350 GameObject: m_ObjectHideFlags: 0 @@ -1203,6 +2267,38 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1052160350} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1055832137 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1055832138} + m_Layer: 0 + m_Name: LeftFront_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1055832138 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1055832137} + serializedVersion: 2 + m_LocalRotation: {x: 0.65185237, y: 0.000000074505806, z: -0.000000020489097, w: 0.7583459} + m_LocalPosition: {x: 0, y: 0, z: 0.00380668} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 164314500} + m_Father: {fileID: 128928880} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1075240959 GameObject: m_ObjectHideFlags: 0 @@ -1345,6 +2441,37 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: -17.01, y: 0, z: 0} +--- !u!1 &1146434364 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1146434365} + m_Layer: 0 + m_Name: RightFront_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1146434365 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146434364} + serializedVersion: 2 + m_LocalRotation: {x: 0.018655328, y: -0.9132966, z: -0.1308956, w: -0.3852372} + m_LocalPosition: {x: 0, y: 0, z: 0.006042937} + m_LocalScale: {x: 1.0000001, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1013915773} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1187775863 GameObject: m_ObjectHideFlags: 0 @@ -1380,1190 +2507,82 @@ Transform: - {fileID: 1973137220} m_Father: {fileID: 1075240960} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!4 &1245228106 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &1282320487 -PrefabInstance: +--- !u!1 &1272710239 +GameObject: m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: -8003107013834283777, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_Constraints - value: 112 - objectReference: {fileID: 0} - - target: {fileID: -8003107013834283777, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_IsKinematic - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: -0.01037 - objectReference: {fileID: 0} - - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: 0.0000000037252903 - objectReference: {fileID: 0} - - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: -0.0015127966 - objectReference: {fileID: 0} - - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 142933671008865873, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: -0.000581027 - objectReference: {fileID: 0} - - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.95134753 - objectReference: {fileID: 0} - - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.16772145 - objectReference: {fileID: 0} - - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: -0.2545459 - objectReference: {fileID: 0} - - target: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.044876143 - objectReference: {fileID: 0} - - target: {fileID: 234321254904069504, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_Enabled - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 234321254904069504, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: stepOffset - value: 0.005 - objectReference: {fileID: 0} - - target: {fileID: 234321254904069504, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: forwardSpeed - value: 2 - objectReference: {fileID: 0} - - target: {fileID: 234321254904069504, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: rotationSpeed - value: 2 - objectReference: {fileID: 0} - - target: {fileID: 234321254904069504, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: slopeAlignment - value: 0.3 - objectReference: {fileID: 0} - - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.33182305 - objectReference: {fileID: 0} - - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.4944453 - objectReference: {fileID: 0} - - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: -0.5847299 - objectReference: {fileID: 0} - - target: {fileID: 534893054875158022, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 0.5509159 - objectReference: {fileID: 0} - - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: 0.0000000010477379 - objectReference: {fileID: 0} - - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: -3.4924597e-10 - objectReference: {fileID: 0} - - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: 0.0030040161 - objectReference: {fileID: 0} - - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.68897164 - objectReference: {fileID: 0} - - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.7247884 - objectReference: {fileID: 0} - - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: -0.00000017881392 - objectReference: {fileID: 0} - - target: {fileID: 1095306108603189499, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 0.00000007078051 - objectReference: {fileID: 0} - - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: length - value: 0.0072452417 - objectReference: {fileID: 0} - - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.femur - value: - objectReference: {fileID: 1908370719} - - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.tibia - value: - objectReference: {fileID: 673430214} - - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: femurLength - value: 0.0030040143 - objectReference: {fileID: 0} - - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: tibiaLength - value: 0.004241227 - objectReference: {fileID: 0} - - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.tarsus - value: - objectReference: {fileID: 1868770260} - - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones._femurLength - value: 0.0030040161 - objectReference: {fileID: 0} - - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.w - value: 0.6862775 - objectReference: {fileID: 0} - - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.x - value: 0.68627745 - objectReference: {fileID: 0} - - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.y - value: -0.17036225 - objectReference: {fileID: 0} - - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.z - value: -0.1703624 - objectReference: {fileID: 0} - - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneTibia.w - value: 0.68425715 - objectReference: {fileID: 0} - - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneTibia.x - value: 0.68425727 - objectReference: {fileID: 0} - - target: {fileID: 1203350180057270885, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneTibia.z - value: -0.17830373 - objectReference: {fileID: 0} - - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: length - value: 0.006537831 - objectReference: {fileID: 0} - - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.femur - value: - objectReference: {fileID: 539705206} - - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.tibia - value: - objectReference: {fileID: 546513205} - - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: femurLength - value: 0.0024082726 - objectReference: {fileID: 0} - - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.tarsus - value: - objectReference: {fileID: 2093857555} - - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones._femurLength - value: 0.002408272 - objectReference: {fileID: 0} - - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.w - value: 0.07596097 - objectReference: {fileID: 0} - - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.x - value: 0.07596083 - objectReference: {fileID: 0} - - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.y - value: -0.7030148 - objectReference: {fileID: 0} - - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.z - value: -0.7030151 - objectReference: {fileID: 0} - - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneTibia.x - value: -0.5739346 - objectReference: {fileID: 0} - - target: {fileID: 1224259364153304487, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneTibia.z - value: -0.4130365 - objectReference: {fileID: 0} - - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: -0.0003301995 - objectReference: {fileID: 0} - - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: -0.27289417 - objectReference: {fileID: 0} - - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.07145223 - objectReference: {fileID: 0} - - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.92810106 - objectReference: {fileID: 0} - - target: {fileID: 1327310794183198169, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 0.24300592 - objectReference: {fileID: 0} - - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: 4.2024412e-10 - objectReference: {fileID: 0} - - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: -9.313226e-10 - objectReference: {fileID: 0} - - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: 0.004129558 - objectReference: {fileID: 0} - - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.9622479 - objectReference: {fileID: 0} - - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.2721745 - objectReference: {fileID: 0} - - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.000000067463276 - objectReference: {fileID: 0} - - target: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.000000050987605 - objectReference: {fileID: 0} - - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.6763229 - objectReference: {fileID: 0} - - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.00000017881385 - objectReference: {fileID: 0} - - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: -0.7366054 - objectReference: {fileID: 0} - - target: {fileID: 1958841765505811662, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 0.00000011548394 - objectReference: {fileID: 0} - - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.7692175 - objectReference: {fileID: 0} - - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.4836073 - objectReference: {fileID: 0} - - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.17796774 - objectReference: {fileID: 0} - - target: {fileID: 2005934180743361291, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.3778307 - objectReference: {fileID: 0} - - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: -5.0543536e-10 - objectReference: {fileID: 0} - - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: 9.313226e-10 - objectReference: {fileID: 0} - - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: 0.0041061174 - objectReference: {fileID: 0} - - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.948097 - objectReference: {fileID: 0} - - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.3179813 - objectReference: {fileID: 0} - - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: -0.00000007940766 - objectReference: {fileID: 0} - - target: {fileID: 2681310150771510278, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 0.00000006468157 - objectReference: {fileID: 0} - - target: {fileID: 2692911006928419026, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ba169e741a830f910bdde9e04f7c88f4, type: 2} - - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: length - value: 0.007110139 - objectReference: {fileID: 0} - - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.femur - value: - objectReference: {fileID: 282023640} - - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.tibia - value: - objectReference: {fileID: 2045717234} - - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: femurLength - value: 0.0030040178 - objectReference: {fileID: 0} - - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: tibiaLength - value: 0.004106121 - objectReference: {fileID: 0} - - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.tarsus - value: - objectReference: {fileID: 45864745} - - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones._femurLength - value: 0.0030040166 - objectReference: {fileID: 0} - - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.w - value: -0.42978364 - objectReference: {fileID: 0} - - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.x - value: -0.4297838 - objectReference: {fileID: 0} - - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.y - value: 0.5615034 - objectReference: {fileID: 0} - - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.z - value: 0.5615032 - objectReference: {fileID: 0} - - target: {fileID: 2828406421342858178, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneTibia.z - value: 0.12736641 - objectReference: {fileID: 0} - - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: 0.0048809913 - objectReference: {fileID: 0} - - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: -0.0005492205 - objectReference: {fileID: 0} - - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.7481474 - objectReference: {fileID: 0} - - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.17950971 - objectReference: {fileID: 0} - - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.6211592 - objectReference: {fileID: 0} - - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.1490403 - objectReference: {fileID: 0} - - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: -0.33122316 - objectReference: {fileID: 0} - - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.9063614 - objectReference: {fileID: 0} - - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.26013026 - objectReference: {fileID: 0} - - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 0.03365275 - objectReference: {fileID: 0} - - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.06440168 - objectReference: {fileID: 0} - - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.059745274 - objectReference: {fileID: 0} - - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.8554311 - objectReference: {fileID: 0} - - target: {fileID: 3205175265109727877, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.51041216 - objectReference: {fileID: 0} - - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.8352103 - objectReference: {fileID: 0} - - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.17726377 - objectReference: {fileID: 0} - - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.19850573 - objectReference: {fileID: 0} - - target: {fileID: 3285577884221125498, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 0.48124492 - objectReference: {fileID: 0} - - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: -0.0018809745 - objectReference: {fileID: 0} - - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: 0.0012553621 - objectReference: {fileID: 0} - - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.9065212 - objectReference: {fileID: 0} - - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.33378425 - objectReference: {fileID: 0} - - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: -0.242552 - objectReference: {fileID: 0} - - target: {fileID: 3356290378512291932, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 0.089308485 - objectReference: {fileID: 0} - - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: 0.0008435268 - objectReference: {fileID: 0} - - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.7287942 - objectReference: {fileID: 0} - - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.24659143 - objectReference: {fileID: 0} - - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.6050909 - objectReference: {fileID: 0} - - target: {fileID: 3372983822486805436, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 0.20473577 - objectReference: {fileID: 0} - - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: 0.0022482695 - objectReference: {fileID: 0} - - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: 0.0015912955 - objectReference: {fileID: 0} - - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.9194447 - objectReference: {fileID: 0} - - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.33498552 - objectReference: {fileID: 0} - - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.193486 - objectReference: {fileID: 0} - - target: {fileID: 3569754655958120677, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.070493646 - objectReference: {fileID: 0} - - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: -1.4643946e-10 - objectReference: {fileID: 0} - - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: -4.6566123e-10 - objectReference: {fileID: 0} - - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: 0.004176514 - objectReference: {fileID: 0} - - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.9628682 - objectReference: {fileID: 0} - - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.26997188 - objectReference: {fileID: 0} - - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: -0.000000062902416 - objectReference: {fileID: 0} - - target: {fileID: 3666013087391118676, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 0.000000075457855 - objectReference: {fileID: 0} - - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: -0.00024004001 - objectReference: {fileID: 0} - - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.73313934 - objectReference: {fileID: 0} - - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.24335097 - objectReference: {fileID: 0} - - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: -0.6027135 - objectReference: {fileID: 0} - - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.20005873 - objectReference: {fileID: 0} - - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: 4.656613e-10 - objectReference: {fileID: 0} - - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: 4.0745363e-10 - objectReference: {fileID: 0} - - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: 0.0024082721 - objectReference: {fileID: 0} - - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.67232096 - objectReference: {fileID: 0} - - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.7402598 - objectReference: {fileID: 0} - - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: -0.000000059604645 - objectReference: {fileID: 0} - - target: {fileID: 4257347763753830756, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.000000014901161 - objectReference: {fileID: 0} - - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: 0.003254889 - objectReference: {fileID: 0} - - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: -0.0060925996 - objectReference: {fileID: 0} - - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.26382536 - objectReference: {fileID: 0} - - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.068901524 - objectReference: {fileID: 0} - - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.930884 - objectReference: {fileID: 0} - - target: {fileID: 4460867367699750457, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.2431128 - objectReference: {fileID: 0} - - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: -0.0000000012189263 - objectReference: {fileID: 0} - - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: 0.0000000013969836 - objectReference: {fileID: 0} - - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: 0.0042412244 - objectReference: {fileID: 0} - - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.9503331 - objectReference: {fileID: 0} - - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.31123465 - objectReference: {fileID: 0} - - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.00000016003976 - objectReference: {fileID: 0} - - target: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.00000017439957 - objectReference: {fileID: 0} - - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: -0.002748238 - objectReference: {fileID: 0} - - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: -0.005979646 - objectReference: {fileID: 0} - - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: -0.27477506 - objectReference: {fileID: 0} - - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.06383813 - objectReference: {fileID: 0} - - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.9344979 - objectReference: {fileID: 0} - - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.2171107 - objectReference: {fileID: 0} - - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: 0.000000001378122 - objectReference: {fileID: 0} - - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: 0.0000000011641532 - objectReference: {fileID: 0} - - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: 0.0030214668 - objectReference: {fileID: 0} - - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.9578121 - objectReference: {fileID: 0} - - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.28739524 - objectReference: {fileID: 0} - - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: -0.0000000011394262 - objectReference: {fileID: 0} - - target: {fileID: 4697254007644123733, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 3.0993516e-10 - objectReference: {fileID: 0} - - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: 5.820766e-10 - objectReference: {fileID: 0} - - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: -6.4028427e-10 - objectReference: {fileID: 0} - - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: 0.0019033392 - objectReference: {fileID: 0} - - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.6810773 - objectReference: {fileID: 0} - - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.7322116 - objectReference: {fileID: 0} - - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: -0.00000023841855 - objectReference: {fileID: 0} - - target: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 0.00000014156102 - objectReference: {fileID: 0} - - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.40812147 - objectReference: {fileID: 0} - - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.27147117 - objectReference: {fileID: 0} - - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.8524233 - objectReference: {fileID: 0} - - target: {fileID: 5281922441378744651, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.18197472 - objectReference: {fileID: 0} - - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: 0.0011845138 - objectReference: {fileID: 0} - - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: -0.00082425796 - objectReference: {fileID: 0} - - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.9194447 - objectReference: {fileID: 0} - - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.3349856 - objectReference: {fileID: 0} - - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.19348608 - objectReference: {fileID: 0} - - target: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.07049368 - objectReference: {fileID: 0} - - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: -0.0042337617 - objectReference: {fileID: 0} - - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: -0.00069292285 - objectReference: {fileID: 0} - - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.75082123 - objectReference: {fileID: 0} - - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.18160525 - objectReference: {fileID: 0} - - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: -0.6172498 - objectReference: {fileID: 0} - - target: {fileID: 5485567755949912416, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 0.14929758 - objectReference: {fileID: 0} - - target: {fileID: 5641584351447400800, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.femur - value: - objectReference: {fileID: 125388149} - - target: {fileID: 5641584351447400800, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.tibia - value: - objectReference: {fileID: 1899152691} - - target: {fileID: 5641584351447400800, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.tarsus - value: - objectReference: {fileID: 273765720} - - target: {fileID: 5641584351447400800, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones._femurLength - value: 0.0024082738 - objectReference: {fileID: 0} - - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.46055895 - objectReference: {fileID: 0} - - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.6473188 - objectReference: {fileID: 0} - - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.58904934 - objectReference: {fileID: 0} - - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.1479351 - objectReference: {fileID: 0} - - target: {fileID: 6049855982455691338, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_Name - value: LowPolyAnt (1) - objectReference: {fileID: 0} - - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.femur - value: - objectReference: {fileID: 1327786334} - - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.tibia - value: - objectReference: {fileID: 685257250} - - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: femurLength - value: 0.0019033402 - objectReference: {fileID: 0} - - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: tibiaLength - value: 0.0030214665 - objectReference: {fileID: 0} - - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.tarsus - value: - objectReference: {fileID: 685257250} - - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones._femurLength - value: 0.0019033396 - objectReference: {fileID: 0} - - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.w - value: 0.39405352 - objectReference: {fileID: 0} - - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.x - value: 0.39405334 - objectReference: {fileID: 0} - - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.y - value: -0.5871304 - objectReference: {fileID: 0} - - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneTibia.w - value: -0.16597605 - objectReference: {fileID: 0} - - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneTibia.x - value: -0.16597635 - objectReference: {fileID: 0} - - target: {fileID: 6090589349420666311, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneTibia.z - value: -0.68735147 - objectReference: {fileID: 0} - - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: -1.1641532e-10 - objectReference: {fileID: 0} - - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: 0.0000000010477379 - objectReference: {fileID: 0} - - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: 0.0030040157 - objectReference: {fileID: 0} - - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.69097376 - objectReference: {fileID: 0} - - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.7228799 - objectReference: {fileID: 0} - - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.0000000745058 - objectReference: {fileID: 0} - - target: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.0000000037252899 - objectReference: {fileID: 0} - - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.68892527 - objectReference: {fileID: 0} - - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.6366744 - objectReference: {fileID: 0} - - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: -0.00798374 - objectReference: {fileID: 0} - - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.346358 - objectReference: {fileID: 0} - - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: -7.858034e-10 - objectReference: {fileID: 0} - - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: -4.656613e-10 - objectReference: {fileID: 0} - - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: 0.0024082735 - objectReference: {fileID: 0} - - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.6710927 - objectReference: {fileID: 0} - - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.7413735 - objectReference: {fileID: 0} - - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.00000008940696 - objectReference: {fileID: 0} - - target: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.00000004470348 - objectReference: {fileID: 0} - - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.5119411 - objectReference: {fileID: 0} - - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.3287884 - objectReference: {fileID: 0} - - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.4640699 - objectReference: {fileID: 0} - - target: {fileID: 7045014934404856493, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.6437808 - objectReference: {fileID: 0} - - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: 1.7462298e-10 - objectReference: {fileID: 0} - - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: -2.910383e-10 - objectReference: {fileID: 0} - - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: 0.0019033398 - objectReference: {fileID: 0} - - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.00000008940696 - objectReference: {fileID: 0} - - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: -0.0000000745058 - objectReference: {fileID: 0} - - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 0.00000004470348 - objectReference: {fileID: 0} - - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.6510881 - objectReference: {fileID: 0} - - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.41958737 - objectReference: {fileID: 0} - - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: -0.16263412 - objectReference: {fileID: 0} - - target: {fileID: 8032286693086551754, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.6112128 - objectReference: {fileID: 0} - - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: -0.027076056 - objectReference: {fileID: 0} - - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: 0.71348983 - objectReference: {fileID: 0} - - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.6805389 - objectReference: {fileID: 0} - - target: {fileID: 8123136597867026454, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 0.16451746 - objectReference: {fileID: 0} - - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.femur - value: - objectReference: {fileID: 1646234598} - - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.tibia - value: - objectReference: {fileID: 1530698552} - - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: femurLength - value: 0.0019033402 - objectReference: {fileID: 0} - - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: tibiaLength - value: 0.0029819128 - objectReference: {fileID: 0} - - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones.tarsus - value: - objectReference: {fileID: 1245228106} - - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: bones._femurLength - value: 0.001903339 - objectReference: {fileID: 0} - - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.w - value: 0.54446536 - objectReference: {fileID: 0} - - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.x - value: 0.5444652 - objectReference: {fileID: 0} - - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.y - value: -0.4511736 - objectReference: {fileID: 0} - - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneFemur.z - value: -0.45117366 - objectReference: {fileID: 0} - - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneTibia.x - value: 0.42917204 - objectReference: {fileID: 0} - - target: {fileID: 8412519912061285269, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: targetToBoneTibia.z - value: 0.56197107 - objectReference: {fileID: 0} - - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: 0.00093368813 - objectReference: {fileID: 0} - - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.2649379 - objectReference: {fileID: 0} - - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.06449163 - objectReference: {fileID: 0} - - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.9348094 - objectReference: {fileID: 0} - - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: 0.22755285 - objectReference: {fileID: 0} - - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.x - value: -0.0000000010156647 - objectReference: {fileID: 0} - - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.y - value: 2.3283064e-10 - objectReference: {fileID: 0} - - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalPosition.z - value: 0.002981913 - objectReference: {fileID: 0} - - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.w - value: 0.9570173 - objectReference: {fileID: 0} - - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.x - value: -0.29003084 - objectReference: {fileID: 0} - - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.y - value: 0.00000013207135 - objectReference: {fileID: 0} - - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - propertyPath: m_LocalRotation.z - value: -0.0000002448431 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: - - {fileID: 8367929451558061141, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} ---- !u!4 &1327786334 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 5388736343723676868, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1272710240} + - component: {fileID: 1272710242} + - component: {fileID: 1272710241} + m_Layer: 0 + m_Name: LeftMiddle_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1272710240 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1272710239} + serializedVersion: 2 + m_LocalRotation: {x: -0.05136092, y: 0.062381554, z: -0.97098094, w: -0.22509275} + m_LocalPosition: {x: -0.009, y: 0, z: -0.003} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1952639986} + m_Father: {fileID: 390443500} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!54 &1272710241 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1272710239} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1272710242 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1272710239} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 1541404098} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} --- !u!1001 &1413549757 PrefabInstance: m_ObjectHideFlags: 0 @@ -2634,6 +2653,187 @@ Transform: m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} m_PrefabInstance: {fileID: 1413549757} m_PrefabAsset: {fileID: 0} +--- !u!1 &1427151305 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1427151306} + - component: {fileID: 1427151309} + - component: {fileID: 1427151308} + - component: {fileID: 1427151307} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1427151306 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1427151305} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1445635527} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &1427151307 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1427151305} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1427151308 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1427151305} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1427151309 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1427151305} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1445635526 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1445635527} + - component: {fileID: 1445635529} + - component: {fileID: 1445635528} + m_Layer: 0 + m_Name: RightMiddle_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1445635527 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1445635526} + serializedVersion: 2 + m_LocalRotation: {x: 0.096186325, y: 0.093534976, z: -0.9225138, w: 0.36189467} + m_LocalPosition: {x: 0.009, y: 0, z: -0.003} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1427151306} + m_Father: {fileID: 1972141019} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!54 &1445635528 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1445635526} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1445635529 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1445635526} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 362020949} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} --- !u!1 &1485508511 GameObject: m_ObjectHideFlags: 0 @@ -2739,16 +2939,308 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1485508511} m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1530698552 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 4825372182573643071, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} +--- !u!1 &1488622525 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} ---- !u!4 &1646234598 stripped + serializedVersion: 6 + m_Component: + - component: {fileID: 1488622526} + m_Layer: 0 + m_Name: RightMiddle_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1488622526 Transform: - m_CorrespondingSourceObject: {fileID: 150961482459879826, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1488622525} + serializedVersion: 2 + m_LocalRotation: {x: 0.8123018, y: -0.00000008940697, z: -0.00000008940697, w: 0.5832374} + m_LocalPosition: {x: 0, y: 0, z: 0.004816546} + m_LocalScale: {x: 1, y: 1.0000001, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 776655108} + m_Father: {fileID: 362020950} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1541404097 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1541404099} + - component: {fileID: 1541404098} + m_Layer: 0 + m_Name: LeftMiddle_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1541404098 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1541404097} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 1541404099} + _tibia: {fileID: 23532514} + _tarsus: {fileID: 1046556278} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.004816545 + _tibiaLength: 0.008259119 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 1272710240} + targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} + targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} +--- !u!4 &1541404099 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1541404097} + serializedVersion: 2 + m_LocalRotation: {x: -0.2941951, y: -0.58195484, z: -0.23783205, w: 0.7198707} + m_LocalPosition: {x: -0.002, y: 0.004, z: -0.0045} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 23532514} + m_Father: {fileID: 658804661} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1570305109 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1570305110} + - component: {fileID: 1570305113} + - component: {fileID: 1570305112} + - component: {fileID: 1570305111} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1570305110 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1570305109} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1947988475} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &1570305111 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1570305109} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1570305112 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1570305109} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1570305113 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1570305109} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1639738098 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1639738099} + - component: {fileID: 1639738102} + - component: {fileID: 1639738101} + - component: {fileID: 1639738100} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1639738099 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1639738098} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 604205123} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &1639738100 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1639738098} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1639738101 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1639738098} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1639738102 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1639738098} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &1670418292 GameObject: m_ObjectHideFlags: 0 @@ -3938,6 +4430,38 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} +--- !u!1 &1757828248 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1757828249} + m_Layer: 0 + m_Name: LeftHind_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1757828249 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1757828248} + serializedVersion: 2 + m_LocalRotation: {x: 0.6024822, y: 0.000000074505806, z: 0.000000044703484, w: 0.7981324} + m_LocalPosition: {x: 0, y: 0, z: 0.00314326} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 90659804} + m_Father: {fileID: 770696510} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1769394186 PrefabInstance: m_ObjectHideFlags: 0 @@ -4113,11 +4637,6 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1854230099} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1868770260 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 4465520568132267032, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} - m_PrefabAsset: {fileID: 0} --- !u!1001 &1880435925 PrefabInstance: m_ObjectHideFlags: 0 @@ -4188,16 +4707,187 @@ Transform: m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} m_PrefabInstance: {fileID: 1880435925} m_PrefabAsset: {fileID: 0} ---- !u!4 &1899152691 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 6689676706817588414, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} +--- !u!1 &1947988474 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} ---- !u!4 &1908370719 stripped + serializedVersion: 6 + m_Component: + - component: {fileID: 1947988475} + - component: {fileID: 1947988477} + - component: {fileID: 1947988476} + m_Layer: 0 + m_Name: RightFront_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1947988475 Transform: - m_CorrespondingSourceObject: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1947988474} + serializedVersion: 2 + m_LocalRotation: {x: -0.30181327, y: -0.7707289, z: -0.53122467, w: -0.18079302} + m_LocalPosition: {x: 0.00464314, y: 0, z: 0.003821564} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1570305110} + m_Father: {fileID: 390443500} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!54 &1947988476 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1947988474} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1947988477 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1947988474} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 818182968} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!1 &1952639985 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1952639986} + - component: {fileID: 1952639989} + - component: {fileID: 1952639988} + - component: {fileID: 1952639987} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1952639986 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1952639985} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1272710240} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &1952639987 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1952639985} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1952639988 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1952639985} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1952639989 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1952639985} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &1953862409 GameObject: m_ObjectHideFlags: 0 @@ -4303,6 +4993,40 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1953862409} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1972141018 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1972141019} + m_Layer: 0 + m_Name: RightFeetTarget + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1972141019 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1972141018} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 604205123} + - {fileID: 1445635527} + - {fileID: 140096620} + m_Father: {fileID: 1980490809} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1973137219 GameObject: m_ObjectHideFlags: 0 @@ -4408,11 +5132,39 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1973137219} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &2045717234 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 6508993773649296106, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} +--- !u!1 &1980490808 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1980490809} + m_Layer: 0 + m_Name: Body + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1980490809 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1980490808} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 390443500} + - {fileID: 1972141019} + m_Father: {fileID: 658804661} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &2063840326 PrefabInstance: m_ObjectHideFlags: 0 @@ -4483,11 +5235,63 @@ Transform: m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} m_PrefabInstance: {fileID: 2063840326} m_PrefabAsset: {fileID: 0} ---- !u!4 &2093857555 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 1711874384539071963, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} - m_PrefabInstance: {fileID: 1282320487} - m_PrefabAsset: {fileID: 0} +--- !u!1001 &2573365365212359253 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 7021329035324230484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7021329035324230484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7021329035324230484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7021329035324230484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7021329035324230484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7021329035324230484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7021329035324230484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7021329035324230484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7021329035324230484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7021329035324230484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7654735227470959086, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_Name + value: LowPolyAntRigged + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} --- !u!1001 &5139621985762388695 PrefabInstance: m_ObjectHideFlags: 0 @@ -4770,6 +5574,70 @@ PrefabInstance: propertyPath: m_LocalRotation.z value: 0.05409455 objectReference: {fileID: 0} + - target: {fileID: 2686484682440155780, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: 1.3096724e-10 + objectReference: {fileID: 0} + - target: {fileID: 2686484682440155780, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: 5.820766e-11 + objectReference: {fileID: 0} + - target: {fileID: 2686484682440155780, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0009741969 + objectReference: {fileID: 0} + - target: {fileID: 2686484682440155780, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.000000029802322 + objectReference: {fileID: 0} + - target: {fileID: 2686484682440155780, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.000000059604645 + objectReference: {fileID: 0} + - target: {fileID: 2686484682440155780, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000074505806 + objectReference: {fileID: 0} + - target: {fileID: 2931338979595795620, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones._femurLength + value: 0.0009741969 + objectReference: {fileID: 0} + - target: {fileID: 2931338979595795620, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones._tibiaLength + value: 0.0019033399 + objectReference: {fileID: 0} + - target: {fileID: 2931338979595795620, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.w + value: 0.59518033 + objectReference: {fileID: 0} + - target: {fileID: 2931338979595795620, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.x + value: 0.5951802 + objectReference: {fileID: 0} + - target: {fileID: 2931338979595795620, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.y + value: -0.38178587 + objectReference: {fileID: 0} + - target: {fileID: 2931338979595795620, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.z + value: -0.38178596 + objectReference: {fileID: 0} + - target: {fileID: 2931338979595795620, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.w + value: 0.5444651 + objectReference: {fileID: 0} + - target: {fileID: 2931338979595795620, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.x + value: 0.5444651 + objectReference: {fileID: 0} + - target: {fileID: 2931338979595795620, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.y + value: -0.45117384 + objectReference: {fileID: 0} + - target: {fileID: 2931338979595795620, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.z + value: -0.45117384 + objectReference: {fileID: 0} - target: {fileID: 2977042892368063048, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x value: 0.0055046873 @@ -4798,6 +5666,22 @@ PrefabInstance: propertyPath: m_LocalRotation.z value: -0.9225137 objectReference: {fileID: 0} + - target: {fileID: 3094414937761591974, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.74126977 + objectReference: {fileID: 0} + - target: {fileID: 3094414937761591974, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.44152743 + objectReference: {fileID: 0} + - target: {fileID: 3094414937761591974, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.4343325 + objectReference: {fileID: 0} + - target: {fileID: 3094414937761591974, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.25870436 + objectReference: {fileID: 0} - target: {fileID: 3129944562958416866, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w value: -0.2877543 @@ -4946,6 +5830,22 @@ PrefabInstance: propertyPath: m_LocalRotation.z value: -0.55117863 objectReference: {fileID: 0} + - target: {fileID: 4035490749013894202, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: -0.21595848 + objectReference: {fileID: 0} + - target: {fileID: 4035490749013894202, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.4985907 + objectReference: {fileID: 0} + - target: {fileID: 4035490749013894202, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.81307715 + objectReference: {fileID: 0} + - target: {fileID: 4035490749013894202, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.20898552 + objectReference: {fileID: 0} - target: {fileID: 4121123608317626207, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w value: 0.70263857 @@ -5046,6 +5946,46 @@ PrefabInstance: propertyPath: m_LocalRotation.z value: 0.08832248 objectReference: {fileID: 0} + - target: {fileID: 4466240571091799157, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.2944264 + objectReference: {fileID: 0} + - target: {fileID: 4466240571091799157, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.63144505 + objectReference: {fileID: 0} + - target: {fileID: 4466240571091799157, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.303147 + objectReference: {fileID: 0} + - target: {fileID: 4466240571091799157, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.6501478 + objectReference: {fileID: 0} + - target: {fileID: 4557280867763525384, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -0.0017314093 + objectReference: {fileID: 0} + - target: {fileID: 4557280867763525384, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0003849562 + objectReference: {fileID: 0} + - target: {fileID: 4557280867763525384, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.76046896 + objectReference: {fileID: 0} + - target: {fileID: 4557280867763525384, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.40757126 + objectReference: {fileID: 0} + - target: {fileID: 4557280867763525384, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.44558194 + objectReference: {fileID: 0} + - target: {fileID: 4557280867763525384, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.23880842 + objectReference: {fileID: 0} - target: {fileID: 4619691744559750327, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x value: -0.003255364 @@ -5190,6 +6130,34 @@ PrefabInstance: propertyPath: m_LocalRotation.z value: -0.970981 objectReference: {fileID: 0} + - target: {fileID: 5636711249314604671, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: -2.910383e-11 + objectReference: {fileID: 0} + - target: {fileID: 5636711249314604671, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: -1.1641532e-10 + objectReference: {fileID: 0} + - target: {fileID: 5636711249314604671, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0024082724 + objectReference: {fileID: 0} + - target: {fileID: 5636711249314604671, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.22179879 + objectReference: {fileID: 0} + - target: {fileID: 5636711249314604671, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.9750925 + objectReference: {fileID: 0} + - target: {fileID: 5636711249314604671, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5636711249314604671, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000029802322 + objectReference: {fileID: 0} - target: {fileID: 5809107228299138557, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w value: 0.3000418 @@ -5242,6 +6210,46 @@ PrefabInstance: propertyPath: m_LocalRotation.z value: 0.00000002235174 objectReference: {fileID: 0} + - target: {fileID: 6556223786326307639, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones._femurLength + value: 0.0024082726 + objectReference: {fileID: 0} + - target: {fileID: 6556223786326307639, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: bones._tibiaLength + value: 0.00954048 + objectReference: {fileID: 0} + - target: {fileID: 6556223786326307639, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.w + value: 0.075960584 + objectReference: {fileID: 0} + - target: {fileID: 6556223786326307639, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.x + value: 0.075960524 + objectReference: {fileID: 0} + - target: {fileID: 6556223786326307639, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.y + value: -0.7030149 + objectReference: {fileID: 0} + - target: {fileID: 6556223786326307639, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneFemur.z + value: -0.7030149 + objectReference: {fileID: 0} + - target: {fileID: 6556223786326307639, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.w + value: -0.10819775 + objectReference: {fileID: 0} + - target: {fileID: 6556223786326307639, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.x + value: 0.53075707 + objectReference: {fileID: 0} + - target: {fileID: 6556223786326307639, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.y + value: 0.08887558 + objectReference: {fileID: 0} + - target: {fileID: 6556223786326307639, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: targetToBoneTibia.z + value: -0.83587766 + objectReference: {fileID: 0} - target: {fileID: 6651475039257777810, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w value: 0.76123184 @@ -5302,6 +6310,34 @@ PrefabInstance: propertyPath: m_LocalRotation.z value: -0.5836946 objectReference: {fileID: 0} + - target: {fileID: 7143708260603782485, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: 7.9497403e-10 + objectReference: {fileID: 0} + - target: {fileID: 7143708260603782485, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: -9.313226e-10 + objectReference: {fileID: 0} + - target: {fileID: 7143708260603782485, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.009540478 + objectReference: {fileID: 0} + - target: {fileID: 7143708260603782485, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.99753606 + objectReference: {fileID: 0} + - target: {fileID: 7143708260603782485, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.070156485 + objectReference: {fileID: 0} + - target: {fileID: 7143708260603782485, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.000000036205485 + objectReference: {fileID: 0} + - target: {fileID: 7143708260603782485, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000024472364 + objectReference: {fileID: 0} - target: {fileID: 7208198274800747088, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x value: 0 @@ -5362,6 +6398,34 @@ PrefabInstance: propertyPath: m_LocalRotation.z value: 0.14253792 objectReference: {fileID: 0} + - target: {fileID: 8247032405819563791, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.x + value: 3.7720896e-11 + objectReference: {fileID: 0} + - target: {fileID: 8247032405819563791, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.y + value: -4.930531e-11 + objectReference: {fileID: 0} + - target: {fileID: 8247032405819563791, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0019033398 + objectReference: {fileID: 0} + - target: {fileID: 8247032405819563791, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.998978 + objectReference: {fileID: 0} + - target: {fileID: 8247032405819563791, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.045199424 + objectReference: {fileID: 0} + - target: {fileID: 8247032405819563791, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.0000000033067025 + objectReference: {fileID: 0} + - target: {fileID: 8247032405819563791, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000041933248 + objectReference: {fileID: 0} - target: {fileID: 8736634913202717324, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalRotation.w value: 0.23704566 @@ -5378,6 +6442,14 @@ PrefabInstance: propertyPath: m_LocalRotation.z value: 0.4755186 objectReference: {fileID: 0} + - target: {fileID: 8915532165699174383, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.09889889 + objectReference: {fileID: 0} + - target: {fileID: 8915532165699174383, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.10182816 + objectReference: {fileID: 0} - target: {fileID: 8974688457054953145, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} propertyPath: m_LocalPosition.x value: -6.3268757e-10 @@ -5421,4 +6493,5 @@ SceneRoots: - {fileID: 6563506007167416910} - {fileID: 1733975501} - {fileID: 1131923926} - - {fileID: 1282320487} + - {fileID: 2573365365212359253} + - {fileID: 658804661} diff --git a/Samples/Prefabs/LowPolyAntRigged Variant.prefab b/Samples/Prefabs/LowPolyAntRigged Variant.prefab new file mode 100644 index 0000000..09d643b --- /dev/null +++ b/Samples/Prefabs/LowPolyAntRigged Variant.prefab @@ -0,0 +1,2586 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &48814082094993782 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6620083584134435749} + - component: {fileID: 332666212402510700} + m_Layer: 0 + m_Name: RightHind_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6620083584134435749 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 48814082094993782} + serializedVersion: 2 + m_LocalRotation: {x: -0.18358338, y: -0.3308578, z: -0.06578502, w: 0.9233107} + m_LocalPosition: {x: -0.0009336879, y: 0.0024799206, z: 0.0023264561} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3274992126458333413} + m_Father: {fileID: 5455741408827371642} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &332666212402510700 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 48814082094993782} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 6620083584134435749} + _tibia: {fileID: 3274992126458333413} + _tarsus: {fileID: 1815117023348536243} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.003004015 + _tibiaLength: 0.004241225 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 695389755773980816} + targetToBoneFemur: {x: 0.68627733, y: -0.17036346, z: -0.17036389, w: 0.68627715} + targetToBoneTibia: {x: 0.6842575, y: -0.17830275, z: -0.17830281, w: 0.68425745} +--- !u!1 &416341717470637372 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1147253866681693926} + - component: {fileID: 765056943644537310} + - component: {fileID: 5706269701432903497} + - component: {fileID: 623407551900395286} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1147253866681693926 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 416341717470637372} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2994943864588667712} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &765056943644537310 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 416341717470637372} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &5706269701432903497 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 416341717470637372} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &623407551900395286 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 416341717470637372} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &760677620665191546 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6524871249661584575} + - component: {fileID: 2921123688466122419} + - component: {fileID: 2976802081314220338} + m_Layer: 0 + m_Name: LeftMiddle_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6524871249661584575 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 760677620665191546} + serializedVersion: 2 + m_LocalRotation: {x: 0.21358053, y: 0.5783707, z: -0.16025272, w: 0.77083707} + m_LocalPosition: {x: 0.0035855595, y: 0, z: 0.0024545942} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4335119159191562342} + m_Father: {fileID: 1973083541448087081} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2921123688466122419 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 760677620665191546} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 8104549368886974640} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &2976802081314220338 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 760677620665191546} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &768774003839910012 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5685316299564663885} + m_Layer: 0 + m_Name: RightFront_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5685316299564663885 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 768774003839910012} + serializedVersion: 2 + m_LocalRotation: {x: 0.5003333, y: -0, z: 0.000000009778887, w: 0.8658329} + m_LocalPosition: {x: 5.820766e-11, y: 1.4551915e-11, z: 0.0019033396} + m_LocalScale: {x: 0.99999994, y: 1, z: 0.99999994} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2100924547480595579} + m_Father: {fileID: 5108746397492641501} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1172085276506359845 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2569903554710171135} + m_Layer: 0 + m_Name: LeftHind_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2569903554710171135 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1172085276506359845} + serializedVersion: 2 + m_LocalRotation: {x: 0.5662565, y: 0.000000074505806, z: -0.000000029802322, w: 0.82422906} + m_LocalPosition: {x: -2.3283064e-10, y: -1.1641532e-10, z: 0.0030040164} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6572398933426288654} + m_Father: {fileID: 3025673039819971543} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1707527511329441970 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5455741408827371642} + - component: {fileID: 6225543280879680199} + - component: {fileID: 5769218204124627899} + m_Layer: 0 + m_Name: Target Rig + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5455741408827371642 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1707527511329441970} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7400717801484663767} + - {fileID: 6513804325188258242} + - {fileID: 3025673039819971543} + - {fileID: 5108746397492641501} + - {fileID: 2149330539247012361} + - {fileID: 6620083584134435749} + - {fileID: 3032351043825914991} + m_Father: {fileID: 7021329035324230484} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &6225543280879680199 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1707527511329441970} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a25e8575da1d1cba48dc2b8da7a2b0ab, type: 3} + m_Name: + m_EditorClassIdentifier: + leftFrontLeg: {fileID: 5737181765023906041} + leftMiddleLeg: {fileID: 8104549368886974640} + leftBackLeg: {fileID: 247438257786629943} + rightFrontLeg: {fileID: 9079939580604013961} + rightMiddleLeg: {fileID: 1490908466784209397} + rightBackLeg: {fileID: 332666212402510700} + render: 1 + legLength: 0.0031432603 +--- !u!95 &5769218204124627899 +Animator: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1707527511329441970} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: ba169e741a830f910bdde9e04f7c88f4, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 1 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &1905952260995010657 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5108746397492641501} + - component: {fileID: 9079939580604013961} + m_Layer: 0 + m_Name: RightFront_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5108746397492641501 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1905952260995010657} + serializedVersion: 2 + m_LocalRotation: {x: 0.008035312, y: 0.98819375, z: 0.055726767, w: -0.1424891} + m_LocalPosition: {x: -0.0011845141, y: 0.0022176225, z: 0.0008242579} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5685316299564663885} + m_Father: {fileID: 5455741408827371642} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &9079939580604013961 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1905952260995010657} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 5108746397492641501} + _tibia: {fileID: 5685316299564663885} + _tarsus: {fileID: 2100924547480595579} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0019033399 + _tibiaLength: 0.0030214663 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 7535818317971162736} + targetToBoneFemur: {x: -0.39405388, y: 0.58712995, z: 0.58713025, w: -0.39405403} + targetToBoneTibia: {x: 0.16597556, y: 0.68735176, z: 0.6873516, w: 0.16597566} +--- !u!1 &2002995186414150031 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7535818317971162736} + - component: {fileID: 1564660168666174722} + - component: {fileID: 7458700492093133842} + m_Layer: 0 + m_Name: RightFront_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7535818317971162736 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2002995186414150031} + serializedVersion: 2 + m_LocalRotation: {x: -0.038188487, y: 0.95367134, z: -0.26484576, w: -0.13751125} + m_LocalPosition: {x: -0.0022254877, y: 0, z: -0.0027103845} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8784072832208096793} + m_Father: {fileID: 1973083541448087081} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1564660168666174722 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2002995186414150031} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 9079939580604013961} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &7458700492093133842 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2002995186414150031} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &2179671286471868525 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5257551609953188724} + m_Layer: 0 + m_Name: RightMiddle_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5257551609953188724 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2179671286471868525} + serializedVersion: 2 + m_LocalRotation: {x: -0.25057116, y: -0.000000065022775, z: 0.00000006945299, w: 0.96809816} + m_LocalPosition: {x: -3.238299e-10, y: -0.0000000013969836, z: 0.0041765124} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4543089944971148809} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2380841201002348501 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4875846235429722894} + - component: {fileID: 2908643555560092782} + - component: {fileID: 2574878829964795765} + - component: {fileID: 810647718779632323} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4875846235429722894 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2380841201002348501} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8598108513644155435} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &2908643555560092782 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2380841201002348501} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2574878829964795765 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2380841201002348501} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &810647718779632323 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2380841201002348501} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &2457472889863853332 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7400717801484663767} + - component: {fileID: 5737181765023906041} + m_Layer: 0 + m_Name: LeftFront_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7400717801484663767 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2457472889863853332} + serializedVersion: 2 + m_LocalRotation: {x: -0.07811355, y: 0.8607989, z: 0.13913086, w: 0.48328695} + m_LocalPosition: {x: 0.00058102724, y: 0.0022176215, z: 0.0009999603} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7313217641663358484} + m_Father: {fileID: 5455741408827371642} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &5737181765023906041 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2457472889863853332} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 7400717801484663767} + _tibia: {fileID: 7313217641663358484} + _tarsus: {fileID: 8921816082228033372} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0019033394 + _tibiaLength: 0.0029819128 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 8598108513644155435} + targetToBoneFemur: {x: -0.54446507, y: 0.4511738, z: 0.4511738, w: -0.5444651} + targetToBoneTibia: {x: -0.4291711, y: -0.5619718, z: -0.5619717, w: -0.4291711} +--- !u!1 &3777701420985572540 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2100924547480595579} + m_Layer: 0 + m_Name: RightFront_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2100924547480595579 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3777701420985572540} + serializedVersion: 2 + m_LocalRotation: {x: -0.19549796, y: -0.000000005094616, z: 0.000000017145215, w: 0.98070407} + m_LocalPosition: {x: -2.302496e-10, y: 4.656613e-10, z: 0.0030214668} + m_LocalScale: {x: 1.0000001, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5685316299564663885} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &3920577155972359935 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7166545474223194656} + m_Layer: 0 + m_Name: RightFeetTarget + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7166545474223194656 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3920577155972359935} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8598108513644155435} + - {fileID: 2994943864588667712} + - {fileID: 5432151846474450495} + m_Father: {fileID: 3032351043825914991} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &4065735907697761591 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3025673039819971543} + - component: {fileID: 247438257786629943} + m_Layer: 0 + m_Name: LeftHind_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3025673039819971543 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4065735907697761591} + serializedVersion: 2 + m_LocalRotation: {x: -0.15892647, y: 0.20721243, z: 0.03413669, w: 0.9646968} + m_LocalPosition: {x: 0.00033019992, y: 0.002194208, z: 0.0022233187} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2569903554710171135} + m_Father: {fileID: 5455741408827371642} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &247438257786629943 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4065735907697761591} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 3025673039819971543} + _tibia: {fileID: 2569903554710171135} + _tarsus: {fileID: 6572398933426288654} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0030040161 + _tibiaLength: 0.004106119 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 5432151846474450495} + targetToBoneFemur: {x: -0.42978364, y: 0.56150335, z: 0.56150335, w: -0.42978373} + targetToBoneTibia: {x: -0.69554174, y: 0.12736525, z: 0.12736537, w: -0.69554156} +--- !u!1 &4182190929931663781 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1973083541448087081} + m_Layer: 0 + m_Name: LeftFeetTarget + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1973083541448087081 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4182190929931663781} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7535818317971162736} + - {fileID: 6524871249661584575} + - {fileID: 695389755773980816} + m_Father: {fileID: 3032351043825914991} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &4952099904377439682 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1815117023348536243} + m_Layer: 0 + m_Name: RightHind_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1815117023348536243 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4952099904377439682} + serializedVersion: 2 + m_LocalRotation: {x: -0.27829966, y: -0.000000042638188, z: 0.000000038007318, w: 0.9604943} + m_LocalPosition: {x: 4.529893e-10, y: 4.6566123e-10, z: 0.0042412244} + m_LocalScale: {x: 1, y: 0.9999999, z: 0.9999999} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3274992126458333413} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &5078412544789699653 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8784072832208096793} + - component: {fileID: 8911320210562044992} + - component: {fileID: 3257845160480096208} + - component: {fileID: 205488134360900369} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8784072832208096793 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5078412544789699653} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7535818317971162736} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8911320210562044992 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5078412544789699653} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3257845160480096208 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5078412544789699653} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &205488134360900369 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5078412544789699653} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &5281421315871977577 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3841319966920808315} + - component: {fileID: 8264832174447155669} + - component: {fileID: 1425301757130586281} + - component: {fileID: 7313344205372792901} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3841319966920808315 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5281421315871977577} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5432151846474450495} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8264832174447155669 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5281421315871977577} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1425301757130586281 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5281421315871977577} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &7313344205372792901 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5281421315871977577} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &5310401428433936744 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6513804325188258242} + - component: {fileID: 8104549368886974640} + m_Layer: 0 + m_Name: LeftMiddle_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6513804325188258242 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5310401428433936744} + serializedVersion: 2 + m_LocalRotation: {x: -0.2959484, y: 0.557571, z: 0.22205457, w: 0.7431157} + m_LocalPosition: {x: 0.00024003958, y: 0.0020915146, z: 0.0014802816} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1060641200493147314} + m_Father: {fileID: 5455741408827371642} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8104549368886974640 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5310401428433936744} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 6513804325188258242} + _tibia: {fileID: 1060641200493147314} + _tarsus: {fileID: 6535965612457355736} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0024082724 + _tibiaLength: 0.004129558 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 6524871249661584575} + targetToBoneFemur: {x: -0.07596299, y: 0.7030147, z: 0.70301473, w: -0.07596313} + targetToBoneTibia: {x: 0.5739338, y: 0.4130375, z: 0.41303754, w: 0.57393384} +--- !u!1 &5562197182297121653 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6535965612457355736} + m_Layer: 0 + m_Name: LeftMiddle_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6535965612457355736 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5562197182297121653} + serializedVersion: 2 + m_LocalRotation: {x: -0.2938226, y: -0.00000006842171, z: 0.000000027993332, w: 0.95586} + m_LocalPosition: {x: -3.2661936e-11, y: -4.656613e-10, z: 0.0041295574} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1060641200493147314} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &6190145159146150034 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3032351043825914991} + m_Layer: 0 + m_Name: Body + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3032351043825914991 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6190145159146150034} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1973083541448087081} + - {fileID: 7166545474223194656} + m_Father: {fileID: 5455741408827371642} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &6583053149302699544 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5432151846474450495} + - component: {fileID: 5860664376499223543} + - component: {fileID: 6463125562356195587} + m_Layer: 0 + m_Name: LeftHind_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5432151846474450495 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6583053149302699544} + serializedVersion: 2 + m_LocalRotation: {x: 0.18536524, y: 0.20619658, z: -0.039815597, w: 0.95996743} + m_LocalPosition: {x: 0.0025763547, y: 0, z: 0.007210679} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3841319966920808315} + m_Father: {fileID: 7166545474223194656} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &5860664376499223543 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6583053149302699544} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 247438257786629943} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &6463125562356195587 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6583053149302699544} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &6801568934457079910 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2994943864588667712} + - component: {fileID: 5559140201310600965} + - component: {fileID: 1432832243362445666} + m_Layer: 0 + m_Name: RightMiddle_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2994943864588667712 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6801568934457079910} + serializedVersion: 2 + m_LocalRotation: {x: 0.16905624, y: -0.60871303, z: 0.13480797, w: 0.7633579} + m_LocalPosition: {x: -0.005221297, y: 0, z: 0.0023041049} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1147253866681693926} + m_Father: {fileID: 7166545474223194656} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &5559140201310600965 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6801568934457079910} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 1490908466784209397} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &1432832243362445666 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6801568934457079910} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &6873385228662672074 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7313217641663358484} + m_Layer: 0 + m_Name: LeftFront_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7313217641663358484 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6873385228662672074} + serializedVersion: 2 + m_LocalRotation: {x: 0.7023507, y: -0.000000119209275, z: -0.000000052154057, w: 0.71183115} + m_LocalPosition: {x: -5.820766e-11, y: -1.4551915e-11, z: 0.0019033395} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8921816082228033372} + m_Father: {fileID: 7400717801484663767} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &6914182830566095201 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7627482398291295121} + - component: {fileID: 4565609942158302390} + - component: {fileID: 4188737614634612876} + - component: {fileID: 3813967880658986579} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7627482398291295121 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6914182830566095201} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 695389755773980816} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &4565609942158302390 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6914182830566095201} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &4188737614634612876 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6914182830566095201} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &3813967880658986579 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6914182830566095201} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &7131816219117484372 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1060641200493147314} + m_Layer: 0 + m_Name: LeftMiddle_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1060641200493147314 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7131816219117484372} + serializedVersion: 2 + m_LocalRotation: {x: 0.81196964, y: 0.000000029802322, z: -0.000000014901161, w: 0.5836997} + m_LocalPosition: {x: -2.910383e-10, y: -1.1641532e-10, z: 0.0024082724} + m_LocalScale: {x: 0.9999998, y: 1, z: 1.0000001} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6535965612457355736} + m_Father: {fileID: 6513804325188258242} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &7286684200615477946 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 695389755773980816} + - component: {fileID: 8419874740830707076} + - component: {fileID: 6435354293840719115} + m_Layer: 0 + m_Name: RighHind_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &695389755773980816 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7286684200615477946} + serializedVersion: 2 + m_LocalRotation: {x: 0.21589375, y: -0.32834357, z: 0.07736305, w: 0.9162944} + m_LocalPosition: {x: -0.004090551, y: 0, z: 0.006165704} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7627482398291295121} + m_Father: {fileID: 1973083541448087081} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8419874740830707076 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7286684200615477946} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 332666212402510700} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &6435354293840719115 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7286684200615477946} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &8160510656416894680 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4543089944971148809} + m_Layer: 0 + m_Name: RightMiddle_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4543089944971148809 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8160510656416894680} + serializedVersion: 2 + m_LocalRotation: {x: 0.68396217, y: 0.00000011920929, z: -0.000000037252903, w: 0.7295175} + m_LocalPosition: {x: 8.731149e-11, y: -5.820766e-11, z: 0.0024082728} + m_LocalScale: {x: 1, y: 1.0000001, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5257551609953188724} + m_Father: {fileID: 2149330539247012361} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &8426252934148981496 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2149330539247012361} + - component: {fileID: 1490908466784209397} + m_Layer: 0 + m_Name: RightMiddle_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2149330539247012361 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8426252934148981496} + serializedVersion: 2 + m_LocalRotation: {x: -0.21754476, y: -0.59884197, z: -0.17347345, w: 0.750979} + m_LocalPosition: {x: -0.0008435269, y: 0.0020915149, z: 0.0013045785} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4543089944971148809} + m_Father: {fileID: 5455741408827371642} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1490908466784209397 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8426252934148981496} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 2149330539247012361} + _tibia: {fileID: 4543089944971148809} + _tarsus: {fileID: 5257551609953188724} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0024082728 + _tibiaLength: 0.0041765124 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 2994943864588667712} + targetToBoneFemur: {x: 0.6612267, y: -0.25055832, z: -0.25055864, w: 0.6612266} + targetToBoneTibia: {x: 0.580795, y: -0.40333298, z: -0.4033331, w: 0.5807951} +--- !u!1 &8493022310677088757 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6572398933426288654} + m_Layer: 0 + m_Name: LeftHind_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6572398933426288654 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8493022310677088757} + serializedVersion: 2 + m_LocalRotation: {x: -0.24540102, y: -0.00000008238297, z: 0.000000046868834, w: 0.9694216} + m_LocalPosition: {x: 1.2869883e-10, y: -6.9849193e-10, z: 0.004106119} + m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 0.9999999} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2569903554710171135} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &8541204045262727826 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8921816082228033372} + m_Layer: 0 + m_Name: LeftFront_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8921816082228033372 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8541204045262727826} + serializedVersion: 2 + m_LocalRotation: {x: -0.27837536, y: 0.00000012499017, z: -0.00000010053604, w: 0.96047235} + m_LocalPosition: {x: 3.2853265e-10, y: 0, z: 0.0029819128} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7313217641663358484} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &8708463665214363942 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4335119159191562342} + - component: {fileID: 793186625795647975} + - component: {fileID: 7530726407399149546} + - component: {fileID: 1806808629223865588} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4335119159191562342 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8708463665214363942} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6524871249661584575} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &793186625795647975 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8708463665214363942} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &7530726407399149546 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8708463665214363942} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &1806808629223865588 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8708463665214363942} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &8852874818565513860 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8598108513644155435} + - component: {fileID: 6317662830386040236} + - component: {fileID: 5483534907731950224} + m_Layer: 0 + m_Name: LeftFront_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8598108513644155435 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852874818565513860} + serializedVersion: 2 + m_LocalRotation: {x: 0.16157505, y: 0.82311046, z: -0.28778687, w: 0.46212706} + m_LocalPosition: {x: 0.0029576225, y: 0, z: -0.0004493994} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4875846235429722894} + m_Father: {fileID: 7166545474223194656} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &6317662830386040236 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852874818565513860} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 5737181765023906041} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &5483534907731950224 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852874818565513860} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &8858494942561296820 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3274992126458333413} + m_Layer: 0 + m_Name: RightHind_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3274992126458333413 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8858494942561296820} + serializedVersion: 2 + m_LocalRotation: {x: 0.65159947, y: 0.00000008940697, z: -0.0000000037252903, w: 0.7585633} + m_LocalPosition: {x: 1.1641532e-10, y: -5.820766e-11, z: 0.003004015} + m_LocalScale: {x: 1, y: 1.0000001, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1815117023348536243} + m_Father: {fileID: 6620083584134435749} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &268813082562621446 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.w + value: -0.028299924 + objectReference: {fileID: 0} + - target: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.68439233 + objectReference: {fileID: 0} + - target: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.7112685 + objectReference: {fileID: 0} + - target: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.15780877 + objectReference: {fileID: 0} + - target: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.70777136 + objectReference: {fileID: 0} + - target: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.38709292 + objectReference: {fileID: 0} + - target: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.17679313 + objectReference: {fileID: 0} + - target: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.56388205 + objectReference: {fileID: 0} + - target: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.6106688 + objectReference: {fileID: 0} + - target: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.25755203 + objectReference: {fileID: 0} + - target: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.5535677 + objectReference: {fileID: 0} + - target: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.50429505 + objectReference: {fileID: 0} + - target: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7585124 + objectReference: {fileID: 0} + - target: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.57238305 + objectReference: {fileID: 0} + - target: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.008787777 + objectReference: {fileID: 0} + - target: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.31138325 + objectReference: {fileID: 0} + - target: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.3284602 + objectReference: {fileID: 0} + - target: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.8921965 + objectReference: {fileID: 0} + - target: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.29728144 + objectReference: {fileID: 0} + - target: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.087881796 + objectReference: {fileID: 0} + - target: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.47020036 + objectReference: {fileID: 0} + - target: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.13349845 + objectReference: {fileID: 0} + - target: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.7921709 + objectReference: {fileID: 0} + - target: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.3654518 + objectReference: {fileID: 0} + - target: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.032779932 + objectReference: {fileID: 0} + - target: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.044935822 + objectReference: {fileID: 0} + - target: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.83270496 + objectReference: {fileID: 0} + - target: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.55091625 + objectReference: {fileID: 0} + - target: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.8540222 + objectReference: {fileID: 0} + - target: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.32501346 + objectReference: {fileID: 0} + - target: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.2263683 + objectReference: {fileID: 0} + - target: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.33729792 + objectReference: {fileID: 0} + - target: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.w + value: -0.5112793 + objectReference: {fileID: 0} + - target: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.x + value: 0.8116233 + objectReference: {fileID: 0} + - target: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.25970224 + objectReference: {fileID: 0} + - target: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.111426905 + objectReference: {fileID: 0} + - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.8169425 + objectReference: {fileID: 0} + - target: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.43574855 + objectReference: {fileID: 0} + - target: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.y + value: 0.14708081 + objectReference: {fileID: 0} + - target: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.34798777 + objectReference: {fileID: 0} + - target: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.58558255 + objectReference: {fileID: 0} + - target: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.46928045 + objectReference: {fileID: 0} + - target: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.63777727 + objectReference: {fileID: 0} + - target: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.z + value: -0.17351994 + objectReference: {fileID: 0} + - target: {fileID: 7602095073321034216, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_Name + value: LowPolyAntRigged Variant + objectReference: {fileID: 0} + - target: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.w + value: 0.2880835 + objectReference: {fileID: 0} + - target: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.x + value: -0.54234576 + objectReference: {fileID: 0} + - target: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.y + value: -0.50765467 + objectReference: {fileID: 0} + - target: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + propertyPath: m_LocalRotation.z + value: 0.60428125 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + insertIndex: -1 + addedObject: {fileID: 5455741408827371642} + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 7602095073321034216, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + insertIndex: -1 + addedObject: {fileID: 3735440054552339591} + - targetCorrespondingSourceObject: {fileID: 7602095073321034216, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + insertIndex: -1 + addedObject: {fileID: 1035200439474759374} + m_SourcePrefab: {fileID: 100100000, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} +--- !u!4 &658830270699185039 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 765513740636640137, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &759246230369452321 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 662704793158332711, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1004982706826917178 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1310879476154348518 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1753625742497676530 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 2012305571009694964, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &2057489726524823425 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &2380027669956049854 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &3303214404428789969 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &3437674504221910605 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 3174499717288498763, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &3748243631002723431 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &4297746994971185241 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4044142357247811679, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &4514560718350377827 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4403945523445994341, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &5823700145767964246 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &5850833608922183593 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &5946952163060695275 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5853788262327791853, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &6207803342309021390 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7021329035324230484 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7378712539761125858 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7394846002605678119 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!1 &7654735227470959086 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 7602095073321034216, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!114 &3735440054552339591 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7654735227470959086} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92f34a5e4027a1dc39efd8ce63cf6aba, type: 3} + m_Name: + m_EditorClassIdentifier: + brainPrefab: {fileID: 0} +--- !u!114 &1035200439474759374 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7654735227470959086} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 456c8036e1196d245a3894315f92807d, type: 3} + m_Name: + m_EditorClassIdentifier: + model: {fileID: 0} + targetRig: {fileID: 6225543280879680199} + targetToModelTranslation: {x: 0, y: 0, z: 0} + targetToModelRotation: {x: 0, y: 0, z: 0, w: 0} + animator: {fileID: 5769218204124627899} + animationsPath: Assets + stepOffset: 0.3 + useGravity: 1 + slopeAlignment: 0.3 + creatureRigidbody: {fileID: 0} + bodyCollider: {fileID: 0} + colliderToGround: 0 + ground: {fileID: 0} + insectRig: {fileID: 6225543280879680199} + forwardSpeed: 1 + rotationSpeed: 1 + thorax: {fileID: 0} + abdomen: {fileID: 0} + leftFrontLeg: + _coxa: {fileID: 0} + _femur: {fileID: 6207803342309021390} + _tibia: {fileID: 1004982706826917178} + _tarsus: {fileID: 5946952163060695275} + _phalanges: {fileID: 3437674504221910605} + _end: {fileID: 0} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + leftMiddleLeg: + _coxa: {fileID: 0} + _femur: {fileID: 3748243631002723431} + _tibia: {fileID: 8801464852371122986} + _tarsus: {fileID: 8761181449924935905} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + leftHindLeg: + _coxa: {fileID: 0} + _femur: {fileID: 5850833608922183593} + _tibia: {fileID: 2057489726524823425} + _tarsus: {fileID: 4514560718350377827} + _phalanges: {fileID: 8516272057858494884} + _end: {fileID: 0} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + rightFrontLeg: + _coxa: {fileID: 0} + _femur: {fileID: 3303214404428789969} + _tibia: {fileID: 7378712539761125858} + _tarsus: {fileID: 4297746994971185241} + _phalanges: {fileID: 1753625742497676530} + _end: {fileID: 0} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + rightMiddleLeg: + _coxa: {fileID: 0} + _femur: {fileID: 5823700145767964246} + _tibia: {fileID: 1310879476154348518} + _tarsus: {fileID: 658830270699185039} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + rightHindLeg: + _coxa: {fileID: 0} + _femur: {fileID: 7394846002605678119} + _tibia: {fileID: 2380027669956049854} + _tarsus: {fileID: 9071269745514191105} + _phalanges: {fileID: 759246230369452321} + _end: {fileID: 0} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + updateAnimations: 0 + homePheromonePrefab: {fileID: 0} + foodPheromonePrefab: {fileID: 0} + touchLeft: {fileID: 0} + touchRight: {fileID: 0} + nanoBrain: {fileID: 0} + targetDirection: + name: + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + _receivers: [] + hasFood: + name: + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + _receivers: [] + foodReceptor: + name: + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + _receivers: [] + homeReceptor: + name: + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + _receivers: [] + linearVelocity: {x: 0, y: 0, z: 1} + angularVelocity: {x: 0, y: 0, z: 0} + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } +--- !u!4 &8516272057858494884 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8472647778795970978, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &8761181449924935905 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8804251463692579047, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &8801464852371122986 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!4 &9071269745514191105 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 9104197992604264711, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} diff --git a/Samples/Prefabs/LowPolyAntRigged Variant.prefab.meta b/Samples/Prefabs/LowPolyAntRigged Variant.prefab.meta new file mode 100644 index 0000000..8a90156 --- /dev/null +++ b/Samples/Prefabs/LowPolyAntRigged Variant.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 49b4f3c47b71346f2be821320af94de8 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Prefabs/LowPolyAntRigged.prefab b/Samples/Prefabs/LowPolyAntRigged.prefab new file mode 100644 index 0000000..4f2eecd --- /dev/null +++ b/Samples/Prefabs/LowPolyAntRigged.prefab @@ -0,0 +1,59 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &7296245778777971897 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_Name + value: LowPolyAntRigged + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} diff --git a/Samples/Prefabs/LowPolyAntRigged.prefab.meta b/Samples/Prefabs/LowPolyAntRigged.prefab.meta new file mode 100644 index 0000000..f519a47 --- /dev/null +++ b/Samples/Prefabs/LowPolyAntRigged.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c5354e27a3702dfa6838172d55d2ea6f +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Prefabs/LowPolyAnt.prefab b/Samples/Prefabs/LowPolyAnt_old.prefab similarity index 56% rename from Samples/Prefabs/LowPolyAnt.prefab rename to Samples/Prefabs/LowPolyAnt_old.prefab index 746af43..3ec3c82 100644 --- a/Samples/Prefabs/LowPolyAnt.prefab +++ b/Samples/Prefabs/LowPolyAnt_old.prefab @@ -1,6 +1,6 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!1 &195030705904155389 +--- !u!1 &230087542543594166 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8,391 +8,8 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 8736634913202717324} - - component: {fileID: 1203350180057270885} - m_Layer: 0 - m_Name: RightHind_Femur - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &8736634913202717324 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 195030705904155389} - serializedVersion: 2 - m_LocalRotation: {x: -0.13477108, y: 0.8363776, z: 0.47551966, w: 0.23704495} - m_LocalPosition: {x: 0.0009336879, y: 0.0024799206, z: -0.0023264561} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1095306108603189499} - m_Father: {fileID: 1132083621233143022} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1203350180057270885 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 195030705904155389} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} - m_Name: - m_EditorClassIdentifier: - femurTarget: {fileID: 8736634913202717324} - tibiaTarget: {fileID: 1095306108603189499} - tarsusTarget: {fileID: 4465520568132267032} - target: {fileID: 4460867367699750457} - targetToBoneFemur: {x: 0.6862775, y: -0.17036214, z: -0.17036238, w: 0.68627757} - targetToBoneTibia: {x: 0.6842572, y: -0.17830358, z: -0.17830375, w: 0.6842572} ---- !u!1 &215599392191349277 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4460867367699750457} - - component: {fileID: 1460475222319043845} - m_Layer: 0 - m_Name: RighHind_Target - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4460867367699750457 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 215599392191349277} - serializedVersion: 2 - m_LocalRotation: {x: 0.25241342, y: 0.31570777, z: -0.79960614, w: 0.4441241} - m_LocalPosition: {x: 0.0038087943, y: 0.0034997058, z: -0.006991218} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 2865190682323673334} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1460475222319043845 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 215599392191349277} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} - m_Name: - m_EditorClassIdentifier: - leg: {fileID: 1203350180057270885} ---- !u!1 &425510772414546922 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1711874384539071963} - m_Layer: 0 - m_Name: LeftMiddle_Tarsus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1711874384539071963 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 425510772414546922} - serializedVersion: 2 - m_LocalRotation: {x: -0.50375277, y: -0.39015326, z: -0.60948807, w: -0.47173932} - m_LocalPosition: {x: 5.2251403e-10, y: 9.313226e-10, z: 0.004129558} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 4257347763753830756} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &833168781736909522 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2865190682323673334} - m_Layer: 0 - m_Name: LeftFeetTarget - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2865190682323673334 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 833168781736909522} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 3569754655958120677} - - {fileID: 5485567755949912416} - - {fileID: 4460867367699750457} - m_Father: {fileID: 1270547791031276539} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &948888685367613515 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 150961482459879826} - - component: {fileID: 8412519912061285269} - m_Layer: 0 - m_Name: LeftFront_Femur - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &150961482459879826 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 948888685367613515} - serializedVersion: 2 - m_LocalRotation: {x: -0.39661294, y: -0.23568115, z: -0.10611857, w: 0.88084704} - m_LocalPosition: {x: -0.00058102724, y: 0.0022176215, z: -0.0009999603} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 4825372182573643071} - m_Father: {fileID: 1132083621233143022} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &8412519912061285269 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 948888685367613515} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} - m_Name: - m_EditorClassIdentifier: - femurTarget: {fileID: 150961482459879826} - tibiaTarget: {fileID: 4825372182573643071} - tarsusTarget: {fileID: 8974688457054953145} - target: {fileID: 3356290378512291932} - targetToBoneFemur: {x: 0.54446524, y: -0.45117372, z: -0.45117372, w: 0.5444652} - targetToBoneTibia: {x: 0.42917213, y: 0.56197107, z: 0.561971, w: 0.4291721} ---- !u!1 &1225980930997210190 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6689676706817588414} - m_Layer: 0 - m_Name: RightMiddle_Tibia - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &6689676706817588414 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1225980930997210190} - serializedVersion: 2 - m_LocalRotation: {x: 0.7048249, y: -0.000000059604645, z: -0.000000044703484, w: 0.7093814} - m_LocalPosition: {x: -2.0372681e-10, y: -6.4028427e-10, z: 0.0024082724} - m_LocalScale: {x: 1, y: 1.0000001, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 3666013087391118676} - m_Father: {fileID: 3372983822486805436} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1804281948388399161 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4697254007644123733} - m_Layer: 0 - m_Name: RightFront_Tarsus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4697254007644123733 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1804281948388399161} - serializedVersion: 2 - m_LocalRotation: {x: -0.07757982, y: -0.85775256, z: -0.34210277, w: -0.3757762} - m_LocalPosition: {x: -0.0000000013468346, y: 6.9849193e-10, z: 0.0030214668} - m_LocalScale: {x: 1.0000001, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 7208198274800747088} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2350219568237293750 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4825372182573643071} - m_Layer: 0 - m_Name: LeftFront_Tibia - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4825372182573643071 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2350219568237293750} - serializedVersion: 2 - m_LocalRotation: {x: 0.6343887, y: 0.000000044703484, z: 0.000000037252903, w: 0.7730143} - m_LocalPosition: {x: -5.820766e-11, y: 4.656613e-10, z: 0.0019033399} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 8974688457054953145} - m_Father: {fileID: 150961482459879826} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &3410443368924151137 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3356290378512291932} - - component: {fileID: 1419085291533453807} - m_Layer: 0 - m_Name: LeftFront_Target - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3356290378512291932 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3410443368924151137} - serializedVersion: 2 - m_LocalRotation: {x: 0.10340227, y: 0.1971393, z: 0.72880065, w: 0.647529} - m_LocalPosition: {x: -0.0024971578, y: 0.0021396582, z: 0.0023244207} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 4131352864139675544} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1419085291533453807 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3410443368924151137} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} - m_Name: - m_EditorClassIdentifier: - leg: {fileID: 8412519912061285269} ---- !u!1 &3483421239704639250 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2681310150771510278} - m_Layer: 0 - m_Name: LeftHind_Tarsus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2681310150771510278 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3483421239704639250} - serializedVersion: 2 - m_LocalRotation: {x: -0.51428276, y: 0.16752261, z: 0.054094367, w: -0.8393588} - m_LocalPosition: {x: 1.026485e-10, y: 9.313226e-10, z: 0.0041061193} - m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 0.9999999} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 6508993773649296106} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &3562563164939487401 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5388736343723676868} - - component: {fileID: 6090589349420666311} + - component: {fileID: 6467049112098783428} + - component: {fileID: 5180648142402506305} m_Layer: 0 m_Name: RightFront_Femur m_TagString: Untagged @@ -400,41 +17,50 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &5388736343723676868 +--- !u!4 &6467049112098783428 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3562563164939487401} + m_GameObject: {fileID: 230087542543594166} serializedVersion: 2 - m_LocalRotation: {x: -0.29237995, y: 0.19651854, z: 0.061527006, w: 0.9338677} - m_LocalPosition: {x: 0.0011845141, y: 0.0022176225, z: -0.0008242579} + m_LocalRotation: {x: -0.17474006, y: 0.20808172, z: 0.037810877, w: 0.96163315} + m_LocalPosition: {x: 0.002, y: 0.004, z: -0.002} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 7208198274800747088} - m_Father: {fileID: 1132083621233143022} + - {fileID: 3963452760192123310} + m_Father: {fileID: 251994500893480182} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &6090589349420666311 +--- !u!114 &5180648142402506305 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3562563164939487401} + m_GameObject: {fileID: 230087542543594166} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} m_Name: m_EditorClassIdentifier: - femurTarget: {fileID: 5388736343723676868} - tibiaTarget: {fileID: 7208198274800747088} - tarsusTarget: {fileID: 4697254007644123733} - target: {fileID: 3569754655958120677} - targetToBoneFemur: {x: 0.3940533, y: -0.58713037, z: -0.58713055, w: 0.3940536} - targetToBoneTibia: {x: -0.16597638, y: -0.68735164, z: -0.6873514, w: -0.16597603} ---- !u!1 &4457464667729487864 + bones: + _coxa: {fileID: 0} + _femur: {fileID: 6467049112098783428} + _tibia: {fileID: 3963452760192123310} + _tarsus: {fileID: 6001888852664112042} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.003806679 + _tibiaLength: 0.0060429377 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 4868282165521932244} + targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} + targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &444950149452848068 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -442,49 +68,1163 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 4121123608317626207} - - component: {fileID: 1224259364153304487} + - component: {fileID: 8739639113273851831} + - component: {fileID: 7727758787478708212} + - component: {fileID: 5733871298883973715} m_Layer: 0 - m_Name: LeftMiddle_Femur + m_Name: RightMiddle_Target m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &4121123608317626207 +--- !u!4 &8739639113273851831 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4457464667729487864} + m_GameObject: {fileID: 444950149452848068} serializedVersion: 2 - m_LocalRotation: {x: -0.32094878, y: -0.5776432, z: -0.2638538, w: 0.7026389} - m_LocalPosition: {x: -0.00024003958, y: 0.0020915146, z: -0.0014802816} + m_LocalRotation: {x: 0.096186325, y: 0.093534976, z: -0.9225138, w: 0.36189467} + m_LocalPosition: {x: 0.009, y: 0, z: -0.003} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 4257347763753830756} - m_Father: {fileID: 1132083621233143022} + - {fileID: 887352657459884729} + m_Father: {fileID: 5015002525134534127} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1224259364153304487 +--- !u!114 &7727758787478708212 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4457464667729487864} + m_GameObject: {fileID: 444950149452848068} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 7421825557250077988} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &5733871298883973715 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 444950149452848068} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &476706297749042700 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6134385803024903022} + m_Layer: 0 + m_Name: RightHind_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6134385803024903022 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 476706297749042700} + serializedVersion: 2 + m_LocalRotation: {x: 0.48380893, y: -0.2750721, z: 0.20774265, w: 0.8044299} + m_LocalPosition: {x: 0, y: 0, z: 0.008482451} + m_LocalScale: {x: 1, y: 0.9999999, z: 0.9999999} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2642028626011608533} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &590550628866556317 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3094414937761591974} + - component: {fileID: 2931338979595795620} + m_Layer: 0 + m_Name: LeftFront_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3094414937761591974 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 590550628866556317} + serializedVersion: 2 + m_LocalRotation: {x: 0.47970197, y: -0.42020383, z: 0.28107202, w: 0.7171564} + m_LocalPosition: {x: -0.00034144553, y: 0.002941784, z: -0.0003939495} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2686484682440155780} + m_Father: {fileID: 251994500893480182} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2931338979595795620 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 590550628866556317} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} m_Name: m_EditorClassIdentifier: - femurTarget: {fileID: 4121123608317626207} - tibiaTarget: {fileID: 4257347763753830756} - tarsusTarget: {fileID: 1711874384539071963} - target: {fileID: 5485567755949912416} - targetToBoneFemur: {x: 0.07596084, y: -0.7030149, z: -0.70301497, w: 0.075961} - targetToBoneTibia: {x: -0.57393456, y: -0.4130365, z: -0.41303644, w: -0.5739346} + bones: + _coxa: {fileID: 0} + _femur: {fileID: 3094414937761591974} + _tibia: {fileID: 2686484682440155780} + _tarsus: {fileID: 8247032405819563791} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0009741967 + _tibiaLength: 0.0019033399 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 4557280867763525384} + targetToBoneFemur: {x: 0.5951803, y: -0.38178593, z: -0.3817859, w: 0.59518033} + targetToBoneTibia: {x: 0.54446507, y: -0.45117378, z: -0.45117372, w: 0.5444651} +--- !u!1 &801023433461010370 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 183953155526515413} + - component: {fileID: 9184078024487677310} + - component: {fileID: 2427205062466560566} + - component: {fileID: 2685048481014454357} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &183953155526515413 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 801023433461010370} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3832790435500645726} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &9184078024487677310 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 801023433461010370} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2427205062466560566 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 801023433461010370} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &2685048481014454357 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 801023433461010370} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &1013648781333075626 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3223876340092525417} + - component: {fileID: 6104424371449848165} + - component: {fileID: 5399750378116154747} + - component: {fileID: 8435277516018286011} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3223876340092525417 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1013648781333075626} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 531771381638345340} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &6104424371449848165 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1013648781333075626} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &5399750378116154747 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1013648781333075626} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &8435277516018286011 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1013648781333075626} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &1626002099353973476 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5329455728383020995} + m_Layer: 0 + m_Name: LeftHind_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5329455728383020995 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1626002099353973476} + serializedVersion: 2 + m_LocalRotation: {x: -0.47292906, y: 0.17234407, z: 0.038568486, w: -0.8632196} + m_LocalPosition: {x: 0, y: 0, z: 0.008212241} + m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 0.9999999} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2999413795424141020} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1706065461928215417 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 564885585128768249} + m_Layer: 0 + m_Name: RightMiddle_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &564885585128768249 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1706065461928215417} + serializedVersion: 2 + m_LocalRotation: {x: 0.8123018, y: -0.00000008940697, z: -0.00000008940697, w: 0.5832374} + m_LocalPosition: {x: 0, y: 0, z: 0.004816546} + m_LocalScale: {x: 1, y: 1.0000001, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7618999096974203275} + m_Father: {fileID: 4113843561538727143} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1833482632684700050 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 53840535814766497} + - component: {fileID: 869922995006349275} + m_Layer: 0 + m_Name: LeftHind_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &53840535814766497 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1833482632684700050} + serializedVersion: 2 + m_LocalRotation: {x: 0.07720129, y: 0.92252225, z: 0.25537315, w: -0.27888587} + m_LocalPosition: {x: -0.002, y: 0.004, z: -0.006} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2999413795424141020} + m_Father: {fileID: 251994500893480182} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &869922995006349275 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1833482632684700050} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 53840535814766497} + _tibia: {fileID: 2999413795424141020} + _tarsus: {fileID: 5329455728383020995} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0031432603 + _tibiaLength: 0.008212241 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 531771381638345340} + targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} + targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &1893394149797732128 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5637715266609923672} + m_Layer: 0 + m_Name: Body + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5637715266609923672 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1893394149797732128} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2698078800514819247} + - {fileID: 5015002525134534127} + m_Father: {fileID: 251994500893480182} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2183957048647594342 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7618999096974203275} + m_Layer: 0 + m_Name: RightMiddle_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7618999096974203275 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2183957048647594342} + serializedVersion: 2 + m_LocalRotation: {x: 0.38045225, y: -0.47525752, z: -0.47922108, w: 0.6322449} + m_LocalPosition: {x: 0, y: 0, z: 0.00835303} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 564885585128768249} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2428760898124967627 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2999413795424141020} + m_Layer: 0 + m_Name: LeftHind_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2999413795424141020 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2428760898124967627} + serializedVersion: 2 + m_LocalRotation: {x: 0.6024822, y: 0.000000074505806, z: 0.000000044703484, w: 0.7981324} + m_LocalPosition: {x: 0, y: 0, z: 0.00314326} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5329455728383020995} + m_Father: {fileID: 53840535814766497} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2612686447507533131 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4113843561538727143} + - component: {fileID: 7421825557250077988} + m_Layer: 0 + m_Name: RightMiddle_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4113843561538727143 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2612686447507533131} + serializedVersion: 2 + m_LocalRotation: {x: -0.30156556, y: 0.57948405, z: 0.24379048, w: 0.71681434} + m_LocalPosition: {x: 0.002, y: 0.004, z: -0.0045} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 564885585128768249} + m_Father: {fileID: 251994500893480182} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &7421825557250077988 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2612686447507533131} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 4113843561538727143} + _tibia: {fileID: 564885585128768249} + _tarsus: {fileID: 7618999096974203275} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.004816547 + _tibiaLength: 0.008353032 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 8739639113273851831} + targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} + targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &3090401224450952824 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4557280867763525384} + - component: {fileID: 8112407393094641902} + - component: {fileID: 2335929670467068538} + m_Layer: 0 + m_Name: LeftFront_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4557280867763525384 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3090401224450952824} + serializedVersion: 2 + m_LocalRotation: {x: 0.46372008, y: -0.4263186, z: 0.2717077, w: 0.72759265} + m_LocalPosition: {x: -0.0014014725, y: 0, z: 0.00020006666} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3786811458943709164} + m_Father: {fileID: 5015002525134534127} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8112407393094641902 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3090401224450952824} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 2931338979595795620} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &2335929670467068538 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3090401224450952824} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &3440149001795082521 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3963452760192123310} + m_Layer: 0 + m_Name: RightFront_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3963452760192123310 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3440149001795082521} + serializedVersion: 2 + m_LocalRotation: {x: 0.6604676, y: -0.000000014901161, z: 0.000000026077032, w: 0.7508546} + m_LocalPosition: {x: 0, y: 0, z: 0.003806679} + m_LocalScale: {x: 0.99999994, y: 1, z: 0.99999994} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6001888852664112042} + m_Father: {fileID: 6467049112098783428} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &3905083371666350510 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 251994500893480182} + - component: {fileID: 7832936243256560234} + - component: {fileID: 5660010132641936441} + m_Layer: 0 + m_Name: Target Rig + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &251994500893480182 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3905083371666350510} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3094414937761591974} + - {fileID: 4466240571091799157} + - {fileID: 53840535814766497} + - {fileID: 6467049112098783428} + - {fileID: 4113843561538727143} + - {fileID: 5462790918422484118} + - {fileID: 5637715266609923672} + m_Father: {fileID: 142933671008865873} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &7832936243256560234 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3905083371666350510} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a25e8575da1d1cba48dc2b8da7a2b0ab, type: 3} + m_Name: + m_EditorClassIdentifier: + leftFrontLeg: {fileID: 2931338979595795620} + leftMiddleLeg: {fileID: 6556223786326307639} + leftBackLeg: {fileID: 869922995006349275} + rightFrontLeg: {fileID: 5180648142402506305} + rightMiddleLeg: {fileID: 7421825557250077988} + rightBackLeg: {fileID: 5634589886651889287} + render: 1 + legLength: 0.0031432603 +--- !u!95 &5660010132641936441 +Animator: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3905083371666350510} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: ba169e741a830f910bdde9e04f7c88f4, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 1 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &4219038591740119739 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4868282165521932244} + - component: {fileID: 4961806641430117032} + - component: {fileID: 4452933037503558675} + m_Layer: 0 + m_Name: RightFront_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4868282165521932244 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4219038591740119739} + serializedVersion: 2 + m_LocalRotation: {x: -0.30181327, y: -0.7707289, z: -0.53122467, w: -0.18079302} + m_LocalPosition: {x: 0.00464314, y: 0, z: 0.003821564} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6030524449257995456} + m_Father: {fileID: 2698078800514819247} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &4961806641430117032 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4219038591740119739} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 5180648142402506305} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &4452933037503558675 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4219038591740119739} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &4248502646861145072 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 887352657459884729} + - component: {fileID: 8481088226238805291} + - component: {fileID: 1259512857725351977} + - component: {fileID: 4041865418978157163} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &887352657459884729 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4248502646861145072} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8739639113273851831} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8481088226238805291 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4248502646861145072} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1259512857725351977 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4248502646861145072} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &4041865418978157163 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4248502646861145072} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &4523426493395368647 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2642028626011608533} + m_Layer: 0 + m_Name: RightHind_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2642028626011608533 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4523426493395368647} + serializedVersion: 2 + m_LocalRotation: {x: 0.77590793, y: -0.000000074505806, z: -0.000000029802322, w: 0.63084626} + m_LocalPosition: {x: 0, y: 0, z: 0.006008029} + m_LocalScale: {x: 1, y: 1.0000001, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6134385803024903022} + m_Father: {fileID: 5462790918422484118} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &4542578395883903081 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8915532165699174383} + - component: {fileID: 4908947459743844361} + - component: {fileID: 2211262856813482471} + m_Layer: 0 + m_Name: LeftMiddle_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8915532165699174383 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4542578395883903081} + serializedVersion: 2 + m_LocalRotation: {x: 0.098898955, y: 0.7100854, z: -0.101828225, w: 0.6896585} + m_LocalPosition: {x: 0.006899408, y: 0, z: -0.0016887018} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2012794677097276843} + m_Father: {fileID: 2698078800514819247} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &4908947459743844361 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4542578395883903081} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 6556223786326307639} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &2211262856813482471 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4542578395883903081} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &4875690898188437905 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8247032405819563791} + m_Layer: 0 + m_Name: LeftFront_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8247032405819563791 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4875690898188437905} + serializedVersion: 2 + m_LocalRotation: {x: -0.022121402, y: 0.000000027179832, z: 0.00000001355345, w: 0.9997553} + m_LocalPosition: {x: -1.4848664e-10, y: -7.304474e-11, z: 0.0019033398} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2686484682440155780} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &4906119704203575010 GameObject: m_ObjectHideFlags: 0 @@ -554,7 +1294,7 @@ MonoBehaviour: RefIds: - rid: -2 type: {class: , ns: , asm: } ---- !u!1 &4972799937271457485 +--- !u!1 &4962958793569902001 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -562,81 +1302,59 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 4465520568132267032} + - component: {fileID: 4466240571091799157} + - component: {fileID: 6556223786326307639} m_Layer: 0 - m_Name: RightHind_Tarsus + m_Name: LeftMiddle_Femur m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &4465520568132267032 +--- !u!4 &4466240571091799157 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4972799937271457485} + m_GameObject: {fileID: 4962958793569902001} serializedVersion: 2 - m_LocalRotation: {x: 0.7436548, y: -0.3305105, z: 0.08832311, w: 0.5744036} - m_LocalPosition: {x: 8.552051e-11, y: 0.0000000013969836, z: 0.004241226} - m_LocalScale: {x: 1, y: 0.9999999, z: 0.9999999} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1095306108603189499} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &5218931202498691491 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3372983822486805436} - - component: {fileID: 5641584351447400800} - m_Layer: 0 - m_Name: RightMiddle_Femur - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3372983822486805436 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5218931202498691491} - serializedVersion: 2 - m_LocalRotation: {x: -0.31618157, y: 0.58235323, z: 0.26251173, w: 0.70141405} - m_LocalPosition: {x: 0.0008435269, y: 0.0020915149, z: -0.0013045785} + m_LocalRotation: {x: -0.6314459, y: 0.3031451, z: 0.6501487, w: 0.2944246} + m_LocalPosition: {x: -0.00024003958, y: 0.0020915146, z: -0.0014802816} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 6689676706817588414} - m_Father: {fileID: 1132083621233143022} + - {fileID: 5636711249314604671} + m_Father: {fileID: 251994500893480182} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &5641584351447400800 +--- !u!114 &6556223786326307639 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5218931202498691491} + m_GameObject: {fileID: 4962958793569902001} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} m_Name: m_EditorClassIdentifier: - femurTarget: {fileID: 3372983822486805436} - tibiaTarget: {fileID: 6689676706817588414} - tarsusTarget: {fileID: 3666013087391118676} - target: {fileID: 2977042892368063048} - targetToBoneFemur: {x: 0.6612268, y: -0.2505574, z: -0.25055742, w: 0.66122687} - targetToBoneTibia: {x: 0.58079547, y: -0.40333176, z: -0.40333194, w: 0.58079576} ---- !u!1 &5379064793215454306 + bones: + _coxa: {fileID: 0} + _femur: {fileID: 4466240571091799157} + _tibia: {fileID: 5636711249314604671} + _tarsus: {fileID: 7143708260603782485} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0024082721 + _tibiaLength: 0.009540485 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 8915532165699174383} + targetToBoneFemur: {x: -0.075960286, y: 0.70301497, z: 0.70301497, w: -0.07596032} + targetToBoneTibia: {x: 0.5307571, y: 0.08887554, z: -0.83587766, w: -0.1081977} +--- !u!1 &5000988579550260823 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -644,44 +1362,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 3569754655958120677} - - component: {fileID: 4848010959330428318} + - component: {fileID: 7143708260603782485} m_Layer: 0 - m_Name: RightFront_Target + m_Name: LeftMiddle_Tarsus m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &3569754655958120677 +--- !u!4 &7143708260603782485 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5379064793215454306} + m_GameObject: {fileID: 5000988579550260823} serializedVersion: 2 - m_LocalRotation: {x: -0.30181357, y: -0.7707284, z: -0.531225, w: -0.18079332} - m_LocalPosition: {x: 0.002816435, y: 0.0015853075, z: 0.0028815302} + m_LocalRotation: {x: -0.07015571, y: -0.0000000049110245, z: 0.000000020597344, w: 0.9975361} + m_LocalPosition: {x: -8.4513574e-10, y: 9.313226e-10, z: 0.009540481} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 2865190682323673334} + m_Father: {fileID: 5636711249314604671} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &4848010959330428318 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5379064793215454306} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} - m_Name: - m_EditorClassIdentifier: - leg: {fileID: 6090589349420666311} ---- !u!1 &5654004739311776755 +--- !u!1 &5028329744804170079 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -689,123 +1393,64 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1132083621233143022} - - component: {fileID: 4996875861191481708} - - component: {fileID: 2692911006928419026} + - component: {fileID: 2686484682440155780} m_Layer: 0 - m_Name: Target Rig + m_Name: LeftFront_Tibia m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1132083621233143022 +--- !u!4 &2686484682440155780 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5654004739311776755} + m_GameObject: {fileID: 5028329744804170079} + serializedVersion: 2 + m_LocalRotation: {x: -0.000000029802322, y: 0.000000059604645, z: -0.00000011920929, w: 1} + m_LocalPosition: {x: -8.731149e-11, y: -5.820766e-11, z: 0.0009741969} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8247032405819563791} + m_Father: {fileID: 3094414937761591974} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &5455950462707428763 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5015002525134534127} + m_Layer: 0 + m_Name: RightFeetTarget + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5015002525134534127 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455950462707428763} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 150961482459879826} - - {fileID: 4121123608317626207} - - {fileID: 1327310794183198169} - - {fileID: 5388736343723676868} - - {fileID: 3372983822486805436} - - {fileID: 8736634913202717324} - - {fileID: 1270547791031276539} - m_Father: {fileID: 142933671008865873} + - {fileID: 4557280867763525384} + - {fileID: 8739639113273851831} + - {fileID: 531771381638345340} + m_Father: {fileID: 5637715266609923672} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &4996875861191481708 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5654004739311776755} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a25e8575da1d1cba48dc2b8da7a2b0ab, type: 3} - m_Name: - m_EditorClassIdentifier: - animator: {fileID: 2692911006928419026} - leftFrontLeg: {fileID: 8412519912061285269} - leftMiddleLeg: {fileID: 1224259364153304487} - leftBackLeg: {fileID: 2828406421342858178} - rightFrontLeg: {fileID: 6090589349420666311} - rightMiddleLeg: {fileID: 5641584351447400800} - rightBackLeg: {fileID: 1203350180057270885} ---- !u!95 &2692911006928419026 -Animator: - serializedVersion: 5 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5654004739311776755} - m_Enabled: 1 - m_Avatar: {fileID: 0} - m_Controller: {fileID: 9100000, guid: d4b9f32bef604abd5953647ad53ca0f7, type: 2} - m_CullingMode: 0 - m_UpdateMode: 0 - m_ApplyRootMotion: 1 - m_LinearVelocityBlending: 0 - m_StabilizeFeet: 0 - m_WarningMessage: - m_HasTransformHierarchy: 1 - m_AllowConstantClipSamplingOptimization: 1 - m_KeepAnimatorStateOnDisable: 0 - m_WriteDefaultValuesOnDisable: 0 ---- !u!1 &5829048315119694257 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4619691744559750327} - - component: {fileID: 2980889793696956954} - m_Layer: 0 - m_Name: LeftHind_Target - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4619691744559750327 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5829048315119694257} - serializedVersion: 2 - m_LocalRotation: {x: 0.31411174, y: -0.64420867, z: 0.6960991, w: 0.04213263} - m_LocalPosition: {x: -0.0032553556, y: 0.0018025497, z: -0.0067674937} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 4131352864139675544} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &2980889793696956954 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5829048315119694257} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} - m_Name: - m_EditorClassIdentifier: - leg: {fileID: 2828406421342858178} --- !u!1 &5873613095539591011 GameObject: m_ObjectHideFlags: 0 @@ -886,7 +1531,7 @@ GameObject: - component: {fileID: -8003107013834283777} - component: {fileID: 7735418154774209516} m_Layer: 0 - m_Name: LowPolyAnt + m_Name: LowPolyAnt_old m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -906,7 +1551,7 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 2033799980227094136} - - {fileID: 1132083621233143022} + - {fileID: 251994500893480182} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &234321254904069504 @@ -922,41 +1567,119 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: model: {fileID: 2033799980227094136} - targetRig: {fileID: 4996875861191481708} + targetRig: {fileID: 7832936243256560234} targetToModelTranslation: {x: 0, y: 0, z: 0} targetToModelRotation: {x: 0, y: 1, z: 0, w: 0} - insectRig: {fileID: 4996875861191481708} + animator: {fileID: 5660010132641936441} + animationsPath: Assets + stepOffset: 0.3 + useGravity: 1 + slopeAlignment: 0.3 + creatureRigidbody: {fileID: 0} + bodyCollider: {fileID: 0} + colliderToGround: 0 + ground: {fileID: 0} + insectRig: {fileID: 7832936243256560234} forwardSpeed: 1 rotationSpeed: 0.5 + thorax: {fileID: 0} + abdomen: {fileID: 0} leftFrontLeg: - femur: {fileID: 3129944562958416866} - tibia: {fileID: 8123136597867026454} - tarsus: {fileID: 3444856495080713671} + _coxa: {fileID: 4302206267607079050} + _femur: {fileID: 4035490749013894202} + _tibia: {fileID: 3129944562958416866} + _tarsus: {fileID: 8123136597867026454} + _phalanges: {fileID: 3444856495080713671} + _end: {fileID: 5979748411632683873} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 leftMiddleLeg: - femur: {fileID: 5281922441378744651} - tibia: {fileID: 534893054875158022} - tarsus: {fileID: 350365826056351181} + _coxa: {fileID: 0} + _femur: {fileID: 5281922441378744651} + _tibia: {fileID: 534893054875158022} + _tarsus: {fileID: 8389613894499192483} + _phalanges: {fileID: 0} + _end: {fileID: 350365826056351181} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 leftHindLeg: - femur: {fileID: 3205175265109727877} - tibia: {fileID: 7045014934404856493} - tarsus: {fileID: 4895332312401972815} + _coxa: {fileID: 0} + _femur: {fileID: 0} + _tibia: {fileID: 0} + _tarsus: {fileID: 0} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 rightFrontLeg: - femur: {fileID: 5809107228299138557} - tibia: {fileID: 1958841765505811662} - tarsus: {fileID: 5111002698291903861} + _coxa: {fileID: 0} + _femur: {fileID: 0} + _tibia: {fileID: 0} + _tarsus: {fileID: 0} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 rightMiddleLeg: - femur: {fileID: 3285577884221125498} - tibia: {fileID: 8032286693086551754} - tarsus: {fileID: 8389613894499192483} + _coxa: {fileID: 0} + _femur: {fileID: 0} + _tibia: {fileID: 0} + _tarsus: {fileID: 0} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 rightHindLeg: - femur: {fileID: 2005934180743361291} - tibia: {fileID: 6651475039257777810} - tarsus: {fileID: 48088264025699373} + _coxa: {fileID: 0} + _femur: {fileID: 0} + _tibia: {fileID: 0} + _tarsus: {fileID: 0} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + updateAnimations: 0 homePheromonePrefab: {fileID: 733094908384848434, guid: 04af7f4320cef6537a2d13a3cf2f845f, type: 3} foodPheromonePrefab: {fileID: 733094908384848434, guid: 289d9024551239891a16e5cfc01fe383, type: 3} touchLeft: {fileID: 3447676861061705183} touchRight: {fileID: 4656736088368465949} nanoBrain: {fileID: 0} + targetDirection: + name: + clusterPrefab: {fileID: 0} + parent: + rid: -2 + trace: 0 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + _receivers: [] hasFood: name: clusterPrefab: {fileID: 0} @@ -993,8 +1716,6 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 0 _receivers: [] - _array: - rid: -2 homeReceptor: name: clusterPrefab: {fileID: 0} @@ -1013,12 +1734,8 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 0 _receivers: [] - _array: - rid: -2 - animator: {fileID: 0} linearVelocity: {x: 0, y: 0, z: 0} angularVelocity: {x: 0, y: 0, z: 0} - beatInterval: 3 references: version: 2 RefIds: @@ -1036,7 +1753,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 92f34a5e4027a1dc39efd8ce63cf6aba, type: 3} m_Name: m_EditorClassIdentifier: - defaultBrain: {fileID: 11400000, guid: 0f7345a3a2017e01383b1d8392b40304, type: 2} + brainPrefab: {fileID: 0} --- !u!54 &-8003107013834283777 Rigidbody: m_ObjectHideFlags: 0 @@ -1087,7 +1804,7 @@ CapsuleCollider: m_Height: 0.01 m_Direction: 2 m_Center: {x: 0, y: 0.003, z: -0.001} ---- !u!1 &6253173783848440160 +--- !u!1 &6060860702729136872 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1095,76 +1812,75 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 6508993773649296106} + - component: {fileID: 531771381638345340} + - component: {fileID: 2336446639644379929} + - component: {fileID: 8510990201713493651} m_Layer: 0 - m_Name: LeftHind_Tibia + m_Name: LeftHind_Target m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &6508993773649296106 +--- !u!4 &531771381638345340 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6253173783848440160} + m_GameObject: {fileID: 6060860702729136872} serializedVersion: 2 - m_LocalRotation: {x: 0.6554138, y: -0.00000004470348, z: -0, w: 0.75527} - m_LocalPosition: {x: -2.910383e-10, y: 1.1641532e-10, z: 0.0030040168} + m_LocalRotation: {x: 0.31411165, y: -0.6442087, z: 0.69609904, w: 0.042132646} + m_LocalPosition: {x: -0.006812622, y: 0, z: -0.01323235} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 2681310150771510278} - m_Father: {fileID: 1327310794183198169} + - {fileID: 3223876340092525417} + m_Father: {fileID: 5015002525134534127} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &7094641368037459222 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2977042892368063048} - - component: {fileID: 2006435240473296608} - m_Layer: 0 - m_Name: RightMiddle_Target - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2977042892368063048 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7094641368037459222} - serializedVersion: 2 - m_LocalRotation: {x: 0.09618692, y: 0.09353526, z: -0.92251384, w: 0.36189428} - m_LocalPosition: {x: 0.005504694, y: 0.0011504211, z: -0.00043249247} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 4131352864139675544} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &2006435240473296608 +--- !u!114 &2336446639644379929 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7094641368037459222} + m_GameObject: {fileID: 6060860702729136872} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} m_Name: m_EditorClassIdentifier: - leg: {fileID: 5641584351447400800} ---- !u!1 &7983744359672809821 + leg: {fileID: 869922995006349275} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &8510990201713493651 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6060860702729136872} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &6216897277961732621 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1172,127 +1888,59 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 8974688457054953145} + - component: {fileID: 5462790918422484118} + - component: {fileID: 5634589886651889287} m_Layer: 0 - m_Name: LeftFront_Tarsus + m_Name: RightHind_Femur m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &8974688457054953145 +--- !u!4 &5462790918422484118 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7983744359672809821} + m_GameObject: {fileID: 6216897277961732621} serializedVersion: 2 - m_LocalRotation: {x: 0.12825255, y: 0.5222314, z: 0.56039983, w: 0.629903} - m_LocalPosition: {x: -1.7240753e-10, y: -2.3283064e-10, z: 0.0029819128} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 4825372182573643071} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &8191044987985069073 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4257347763753830756} - m_Layer: 0 - m_Name: LeftMiddle_Tibia - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4257347763753830756 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8191044987985069073} - serializedVersion: 2 - m_LocalRotation: {x: 0.7621095, y: 0.00000014901161, z: 0.000000044703484, w: 0.6474482} - m_LocalPosition: {x: 2.0372681e-10, y: 3.4924597e-10, z: 0.002408273} - m_LocalScale: {x: 0.9999998, y: 1, z: 1.0000001} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1711874384539071963} - m_Father: {fileID: 4121123608317626207} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &8207404405038920476 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3666013087391118676} - m_Layer: 0 - m_Name: RightMiddle_Tarsus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3666013087391118676 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8207404405038920476} - serializedVersion: 2 - m_LocalRotation: {x: 0.5023686, y: -0.3766614, z: -0.5511794, w: 0.5495027} - m_LocalPosition: {x: -8.0971324e-10, y: -9.3132246e-10, z: 0.0041765133} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 6689676706817588414} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &8213240003649835924 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4131352864139675544} - m_Layer: 0 - m_Name: RightFeetTarget - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4131352864139675544 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8213240003649835924} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalRotation: {x: -0.08576872, y: 0.912694, z: 0.30887008, w: 0.25344196} + m_LocalPosition: {x: 0.002, y: 0.004, z: -0.006} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 3356290378512291932} - - {fileID: 2977042892368063048} - - {fileID: 4619691744559750327} - m_Father: {fileID: 1270547791031276539} + - {fileID: 2642028626011608533} + m_Father: {fileID: 251994500893480182} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &8255217149465558227 +--- !u!114 &5634589886651889287 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6216897277961732621} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 5462790918422484118} + _tibia: {fileID: 2642028626011608533} + _tarsus: {fileID: 6134385803024903022} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.006008031 + _tibiaLength: 0.008482452 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 3832790435500645726} + targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} + targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &6793347268954126531 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1300,43 +1948,10 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1270547791031276539} - m_Layer: 0 - m_Name: Body - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1270547791031276539 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8255217149465558227} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 2865190682323673334} - - {fileID: 4131352864139675544} - m_Father: {fileID: 1132083621233143022} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &8367929451558061141 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6600195620735265739} - - component: {fileID: 7786054496805026280} - - component: {fileID: 2032597241917309394} - - component: {fileID: 2241783675997813330} + - component: {fileID: 6030524449257995456} + - component: {fileID: 9182957746531414823} + - component: {fileID: 1430941204318238070} + - component: {fileID: 6740957477993731457} m_Layer: 0 m_Name: Sphere m_TagString: Untagged @@ -1344,36 +1959,36 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &6600195620735265739 +--- !u!4 &6030524449257995456 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8367929451558061141} + m_GameObject: {fileID: 6793347268954126531} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 5485567755949912416} + m_Father: {fileID: 4868282165521932244} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &7786054496805026280 +--- !u!33 &9182957746531414823 MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8367929451558061141} + m_GameObject: {fileID: 6793347268954126531} m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &2032597241917309394 +--- !u!23 &1430941204318238070 MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8367929451558061141} + m_GameObject: {fileID: 6793347268954126531} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 @@ -1409,13 +2024,13 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!135 &2241783675997813330 +--- !u!135 &6740957477993731457 SphereCollider: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8367929451558061141} + m_GameObject: {fileID: 6793347268954126531} m_Material: {fileID: 0} m_IncludeLayers: serializedVersion: 2 @@ -1424,13 +2039,13 @@ SphereCollider: serializedVersion: 2 m_Bits: 0 m_LayerOverridePriority: 0 - m_IsTrigger: 0 + m_IsTrigger: 1 m_ProvidesContacts: 0 m_Enabled: 1 serializedVersion: 3 m_Radius: 0.5 m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &8568971501071931210 +--- !u!1 &7098306259425464805 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1438,128 +2053,75 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1327310794183198169} - - component: {fileID: 2828406421342858178} + - component: {fileID: 3832790435500645726} + - component: {fileID: 7280602224976540635} + - component: {fileID: 707766737853431632} m_Layer: 0 - m_Name: LeftHind_Femur + m_Name: RighHind_Target m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1327310794183198169 +--- !u!4 &3832790435500645726 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8568971501071931210} + m_GameObject: {fileID: 7098306259425464805} serializedVersion: 2 - m_LocalRotation: {x: 0.106737606, y: 0.8880574, z: 0.36301398, w: -0.26111704} - m_LocalPosition: {x: -0.00033019992, y: 0.002194208, z: -0.0022233187} + m_LocalRotation: {x: 0.25241286, y: 0.31570747, z: -0.7996064, w: 0.44412404} + m_LocalPosition: {x: 0.006352237, y: 0, z: -0.01323235} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 6508993773649296106} - m_Father: {fileID: 1132083621233143022} + - {fileID: 183953155526515413} + m_Father: {fileID: 2698078800514819247} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &2828406421342858178 +--- !u!114 &7280602224976540635 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8568971501071931210} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} - m_Name: - m_EditorClassIdentifier: - femurTarget: {fileID: 1327310794183198169} - tibiaTarget: {fileID: 6508993773649296106} - tarsusTarget: {fileID: 2681310150771510278} - target: {fileID: 4619691744559750327} - targetToBoneFemur: {x: -0.42978385, y: 0.5615033, z: 0.56150323, w: -0.42978373} - targetToBoneTibia: {x: -0.69554144, y: 0.12736636, z: 0.12736638, w: -0.6955414} ---- !u!1 &8763969733554696343 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1095306108603189499} - m_Layer: 0 - m_Name: RightHind_Tibia - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1095306108603189499 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8763969733554696343} - serializedVersion: 2 - m_LocalRotation: {x: 0.648421, y: -0.000000014901161, z: -0.000000029802322, w: 0.761282} - m_LocalPosition: {x: 1.7462298e-10, y: 0.0000000011641532, z: 0.0030040145} - m_LocalScale: {x: 1, y: 1.0000001, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 4465520568132267032} - m_Father: {fileID: 8736634913202717324} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &8789210005126180132 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5485567755949912416} - - component: {fileID: 6424492492774642734} - m_Layer: 0 - m_Name: LeftMiddle_Target - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &5485567755949912416 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8789210005126180132} - serializedVersion: 2 - m_LocalRotation: {x: -0.051360033, y: 0.062381737, z: -0.97098106, w: -0.22509213} - m_LocalPosition: {x: -0.0043804464, y: 0.00073906756, z: -0.00066403276} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 6600195620735265739} - m_Father: {fileID: 2865190682323673334} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &6424492492774642734 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8789210005126180132} + m_GameObject: {fileID: 7098306259425464805} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} m_Name: m_EditorClassIdentifier: - leg: {fileID: 1224259364153304487} ---- !u!1 &8872453984500004720 + leg: {fileID: 5634589886651889287} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &707766737853431632 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7098306259425464805} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &7804036806525958303 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1567,29 +2129,273 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 7208198274800747088} + - component: {fileID: 3786811458943709164} + - component: {fileID: 7055800830293489818} + - component: {fileID: 1223104716111544894} + - component: {fileID: 8563584138109900878} m_Layer: 0 - m_Name: RightFront_Tibia + m_Name: Sphere m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &7208198274800747088 +--- !u!4 &3786811458943709164 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8872453984500004720} + m_GameObject: {fileID: 7804036806525958303} serializedVersion: 2 - m_LocalRotation: {x: 0.5693908, y: 0.000000074505806, z: -0.0000000037252903, w: 0.822067} - m_LocalPosition: {x: -5.820766e-11, y: -5.2386895e-10, z: 0.00190334} - m_LocalScale: {x: 0.99999994, y: 1, z: 0.99999994} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4557280867763525384} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &7055800830293489818 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7804036806525958303} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1223104716111544894 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7804036806525958303} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &8563584138109900878 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7804036806525958303} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &7819032868439084120 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2698078800514819247} + m_Layer: 0 + m_Name: LeftFeetTarget + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2698078800514819247 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7819032868439084120} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 4697254007644123733} - m_Father: {fileID: 5388736343723676868} + - {fileID: 4868282165521932244} + - {fileID: 8915532165699174383} + - {fileID: 3832790435500645726} + m_Father: {fileID: 5637715266609923672} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &8767151997032773558 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2012794677097276843} + - component: {fileID: 1645929713477861937} + - component: {fileID: 8469315042696588623} + - component: {fileID: 1770717401732585841} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2012794677097276843 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8767151997032773558} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8915532165699174383} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &1645929713477861937 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8767151997032773558} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &8469315042696588623 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8767151997032773558} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &1770717401732585841 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8767151997032773558} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &8962071163487025447 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5636711249314604671} + m_Layer: 0 + m_Name: LeftMiddle_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5636711249314604671 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8962071163487025447} + serializedVersion: 2 + m_LocalRotation: {x: 0.97509295, y: -0, z: -0.000000089406974, w: 0.22179665} + m_LocalPosition: {x: -3.092282e-10, y: 5.820766e-11, z: 0.0024082721} + m_LocalScale: {x: 0.9999998, y: 1, z: 1.0000001} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7143708260603782485} + m_Father: {fileID: 4466240571091799157} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &9010873934654507837 GameObject: @@ -1657,6 +2463,37 @@ SphereCollider: serializedVersion: 3 m_Radius: 0.0003 m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &9141705264912577427 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6001888852664112042} + m_Layer: 0 + m_Name: RightFront_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6001888852664112042 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9141705264912577427} + serializedVersion: 2 + m_LocalRotation: {x: 0.018655328, y: -0.9132966, z: -0.1308956, w: -0.3852372} + m_LocalPosition: {x: 0, y: 0, z: 0.006042937} + m_LocalScale: {x: 1.0000001, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3963452760192123310} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1996004150271050131 PrefabInstance: m_ObjectHideFlags: 0 @@ -1683,19 +2520,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: -9179445421520403107, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w - value: 0.5559828 + value: 0.63162875 objectReference: {fileID: 0} - target: {fileID: -9179445421520403107, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.x - value: -0.5340521 + value: -0.3353042 objectReference: {fileID: 0} - target: {fileID: -9179445421520403107, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.y - value: -0.6055392 + value: -0.6879281 objectReference: {fileID: 0} - target: {fileID: -9179445421520403107, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.z - value: -0.19746874 + value: -0.123980865 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalPosition.x @@ -1739,35 +2576,51 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: -7142874668923041899, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w - value: 0.3195471 + value: 0.55765265 objectReference: {fileID: 0} - target: {fileID: -7142874668923041899, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.x - value: -0.5090394 + value: 0.6142037 objectReference: {fileID: 0} - target: {fileID: -7142874668923041899, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.y - value: -0.5630976 + value: 0.3162089 objectReference: {fileID: 0} - target: {fileID: -7142874668923041899, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.z - value: 0.56717694 + value: 0.46020567 + objectReference: {fileID: 0} + - target: {fileID: -6650749816151890519, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalRotation.w + value: -0.19484976 + objectReference: {fileID: 0} + - target: {fileID: -6650749816151890519, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalRotation.x + value: -0.54128045 + objectReference: {fileID: 0} + - target: {fileID: -6650749816151890519, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalRotation.y + value: 0.7928144 + objectReference: {fileID: 0} + - target: {fileID: -6650749816151890519, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalRotation.z + value: 0.20123237 objectReference: {fileID: 0} - target: {fileID: -5320003922327391511, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w - value: 0.787415 + value: 0.98340696 objectReference: {fileID: 0} - target: {fileID: -5320003922327391511, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.x - value: -0.2243748 + value: -0.061044253 objectReference: {fileID: 0} - target: {fileID: -5320003922327391511, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.y - value: 0.17398317 + value: 0.000000014901158 objectReference: {fileID: 0} - target: {fileID: -5320003922327391511, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.z - value: 0.5471411 + value: 0.17083435 objectReference: {fileID: 0} - target: {fileID: -4035803069545785599, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w @@ -1787,19 +2640,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: -3243133469712725800, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w - value: 0.38135156 + value: 0.8071078 objectReference: {fileID: 0} - target: {fileID: -3243133469712725800, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.x - value: 0.3324836 + value: -0.31629673 objectReference: {fileID: 0} - target: {fileID: -3243133469712725800, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.y - value: 0.8220475 + value: -0.41213745 objectReference: {fileID: 0} - target: {fileID: -3243133469712725800, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.z - value: -0.26127318 + value: -0.28049242 objectReference: {fileID: 0} - target: {fileID: 919132149155446097, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_Name @@ -1807,19 +2660,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3520953768647703153, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w - value: -0.2877549 + value: 0.9926133 objectReference: {fileID: 0} - target: {fileID: 3520953768647703153, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.x - value: 0.9565252 + value: -0.000000111758716 objectReference: {fileID: 0} - target: {fileID: 3520953768647703153, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.y - value: 0.03149977 + value: -0.12132138 objectReference: {fileID: 0} - target: {fileID: 3520953768647703153, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.z - value: -0.035559755 + value: 0.00000005960465 objectReference: {fileID: 0} - target: {fileID: 4019509778734078742, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w @@ -1839,19 +2692,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5417024461510546542, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w - value: 0.30004126 + value: 0.401849 objectReference: {fileID: 0} - target: {fileID: 5417024461510546542, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.x - value: 0.95133615 + value: 0.84321576 objectReference: {fileID: 0} - target: {fileID: 5417024461510546542, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.y - value: 0.070007786 + value: 0.34903476 objectReference: {fileID: 0} - target: {fileID: 5417024461510546542, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.z - value: 0.005809238 + value: -0.0753606 objectReference: {fileID: 0} - target: {fileID: 7712439107775519109, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w @@ -1871,19 +2724,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8415909405364182873, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w - value: 0.6882352 + value: 0.9727385 objectReference: {fileID: 0} - target: {fileID: 8415909405364182873, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.x - value: 0.39890242 + value: 0.07803434 objectReference: {fileID: 0} - target: {fileID: 8415909405364182873, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.y - value: -0.1719131 + value: -0.000000003967127 objectReference: {fileID: 0} - target: {fileID: 8415909405364182873, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.z - value: -0.58108085 + value: -0.21838136 objectReference: {fileID: 0} - target: {fileID: 8824751735636065086, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w @@ -1915,11 +2768,6 @@ PrefabInstance: addedObject: {fileID: 337496440490020837} m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} ---- !u!4 &48088264025699373 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 1952841736590030270, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} - m_PrefabInstance: {fileID: 1996004150271050131} - m_PrefabAsset: {fileID: 0} --- !u!4 &350365826056351181 stripped Transform: m_CorrespondingSourceObject: {fileID: -6958196734000698274, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} @@ -1930,16 +2778,6 @@ Transform: m_CorrespondingSourceObject: {fileID: -7142874668923041899, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} m_PrefabInstance: {fileID: 1996004150271050131} m_PrefabAsset: {fileID: 0} ---- !u!4 &1958841765505811662 stripped -Transform: - m_CorrespondingSourceObject: {fileID: -9179445421520403107, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} - m_PrefabInstance: {fileID: 1996004150271050131} - m_PrefabAsset: {fileID: 0} ---- !u!4 &2005934180743361291 stripped -Transform: - m_CorrespondingSourceObject: {fileID: -9194738892650499432, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} - m_PrefabInstance: {fileID: 1996004150271050131} - m_PrefabAsset: {fileID: 0} --- !u!4 &2033799980227094136 stripped Transform: m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} @@ -1955,16 +2793,6 @@ Transform: m_CorrespondingSourceObject: {fileID: 3520953768647703153, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} m_PrefabInstance: {fileID: 1996004150271050131} m_PrefabAsset: {fileID: 0} ---- !u!4 &3205175265109727877 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 4019509778734078742, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} - m_PrefabInstance: {fileID: 1996004150271050131} - m_PrefabAsset: {fileID: 0} ---- !u!4 &3285577884221125498 stripped -Transform: - m_CorrespondingSourceObject: {fileID: -5320003922327391511, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} - m_PrefabInstance: {fileID: 1996004150271050131} - m_PrefabAsset: {fileID: 0} --- !u!4 &3444856495080713671 stripped Transform: m_CorrespondingSourceObject: {fileID: -5441001975159772076, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} @@ -1975,14 +2803,14 @@ Transform: m_CorrespondingSourceObject: {fileID: -5826042357504818389, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} m_PrefabInstance: {fileID: 1996004150271050131} m_PrefabAsset: {fileID: 0} ---- !u!4 &4895332312401972815 stripped +--- !u!4 &4035490749013894202 stripped Transform: - m_CorrespondingSourceObject: {fileID: 6367120096215338972, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + m_CorrespondingSourceObject: {fileID: -6650749816151890519, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} m_PrefabInstance: {fileID: 1996004150271050131} m_PrefabAsset: {fileID: 0} ---- !u!4 &5111002698291903861 stripped +--- !u!4 &4302206267607079050 stripped Transform: - m_CorrespondingSourceObject: {fileID: -2495320830140154650, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + m_CorrespondingSourceObject: {fileID: -6915353105400768231, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} m_PrefabInstance: {fileID: 1996004150271050131} m_PrefabAsset: {fileID: 0} --- !u!4 &5281922441378744651 stripped @@ -1990,14 +2818,9 @@ Transform: m_CorrespondingSourceObject: {fileID: -3243133469712725800, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} m_PrefabInstance: {fileID: 1996004150271050131} m_PrefabAsset: {fileID: 0} ---- !u!4 &5809107228299138557 stripped +--- !u!4 &5979748411632683873 stripped Transform: - m_CorrespondingSourceObject: {fileID: 5417024461510546542, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} - m_PrefabInstance: {fileID: 1996004150271050131} - m_PrefabAsset: {fileID: 0} ---- !u!4 &6651475039257777810 stripped -Transform: - m_CorrespondingSourceObject: {fileID: -4035803069545785599, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + m_CorrespondingSourceObject: {fileID: 5282562163218451186, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} m_PrefabInstance: {fileID: 1996004150271050131} m_PrefabAsset: {fileID: 0} --- !u!4 &6956186879419627238 stripped @@ -2005,16 +2828,6 @@ Transform: m_CorrespondingSourceObject: {fileID: 8879528566716807029, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} m_PrefabInstance: {fileID: 1996004150271050131} m_PrefabAsset: {fileID: 0} ---- !u!4 &7045014934404856493 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 8824751735636065086, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} - m_PrefabInstance: {fileID: 1996004150271050131} - m_PrefabAsset: {fileID: 0} ---- !u!4 &8032286693086551754 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 8415909405364182873, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} - m_PrefabInstance: {fileID: 1996004150271050131} - m_PrefabAsset: {fileID: 0} --- !u!4 &8123136597867026454 stripped Transform: m_CorrespondingSourceObject: {fileID: 7712439107775519109, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} diff --git a/Samples/Prefabs/LowPolyAnt.prefab.meta b/Samples/Prefabs/LowPolyAnt_old.prefab.meta similarity index 100% rename from Samples/Prefabs/LowPolyAnt.prefab.meta rename to Samples/Prefabs/LowPolyAnt_old.prefab.meta From dd326823a8256f3ddb808e071d98c4aede72e410 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 5 May 2026 08:48:46 +0200 Subject: [PATCH 26/38] Squashed 'NanoBrain/' changes from cc9a845..7ef8e42 7ef8e42 multi-cluster calculation fix af0ba68 Viewer for multi-clusters 0401090 Created runtime sibling, but not the synapses yet 36f876c draw external receivers only once ffcf420 Fix cloned external connections b2bc92b Multiple players working-ish 335dae7 Fix deleting neuron without synapses fc8caa8 Fix adding/removing cluster outputs 805b0f8 Fix broken outputpop references ecab0b0 Fix neuron name editor git-subtree-dir: NanoBrain git-subtree-split: 7ef8e42e091cd5a46bf77dfbf9b1a3b3a4422752 --- Editor/ClusterEditor.cs | 212 ++++++++-------- Editor/ClusterViewer.cs | 122 ++++++++-- Runtime/Scripts/Core/Cluster.cs | 412 ++++++++++++++++++++------------ Runtime/Scripts/Core/Neuron.cs | 28 ++- Runtime/Scripts/Core/Synapse.cs | 6 +- 5 files changed, 485 insertions(+), 295 deletions(-) diff --git a/Editor/ClusterEditor.cs b/Editor/ClusterEditor.cs index 1498a79..725b27d 100644 --- a/Editor/ClusterEditor.cs +++ b/Editor/ClusterEditor.cs @@ -64,30 +64,22 @@ namespace NanoBrain { public class GraphEditor : GraphView { protected ClusterPrefab prefab; + protected Nucleus currentPrefabNucleus; + + protected override Nucleus currentNucleus { + get => base.currentNucleus; + set { + base.currentNucleus = value; + this.currentPrefabNucleus = value != null ? this.prefab.GetNucleus(value.name) : null; + } + } public GraphEditor(ClusterPrefab prefab) : base(prefab.output.parent) { this.prefab = prefab; // In a Prefab editor, no instance exists but we need it for the ClusterViewer. // So we create a temporary instance - Cluster cluster = new(prefab); - this.currentCluster = cluster; - - Button addButton = new(() => OnAddClusterOutput()) { - text = "Add" - }; - topMenuContainer?.Add(addButton); - - Add(topMenuContainer); - } - - void OnAddClusterOutput() { - Nucleus newOutput = new Neuron(this.prefab, "New Output"); - this.prefab.RefreshOutputs(); - outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList(); - outputsPopup.value = newOutput.name; - - this.currentNucleus = newOutput; + this.currentCluster = new(prefab); } public void SetGraph(GameObject gameObject, VisualElement inspectorContainer) { @@ -151,69 +143,76 @@ namespace NanoBrain { if (serializedObject == null || serializedObject.targetObject == null) return; - if (this.currentNucleus == null) - return; - serializedObject.Update(); - GUIStyle headerStyle = new(EditorStyles.boldLabel) { - alignment = TextAnchor.MiddleLeft, - margin = new RectOffset(10, 0, 4, 4) - }; GUIStyle boldTextFieldStyle = new(EditorStyles.textField) { fontStyle = FontStyle.Bold }; - // Nucleus type - string nucleusType = this.currentNucleus.GetType().Name; - GUILayout.Label(nucleusType, headerStyle); - - // Nucleus name - if (this.currentNucleus.parent is Cluster parentCluster) { - EditorGUILayout.BeginHorizontal(); - if (GUILayout.Button(this.currentNucleus.parent.name)) - OnClusterClick(parentCluster); - EditorGUI.BeginDisabledGroup(true); - EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); - EditorGUI.EndDisabledGroup(); - if (GUILayout.Button("Reimport")) - ReimportCluster(parentCluster); - EditorGUILayout.EndHorizontal(); + if (this.currentNucleus == null) { + OutputsInspector(ref anythingChanged); + return; } else { - string newName = EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); - if (newName != this.currentNucleus.name) { - this.currentNucleus.name = newName; - this.prefab.RefreshOutputs(); - outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList(); - anythingChanged = true; - } - } + GUIStyle headerStyle = new(EditorStyles.boldLabel) { + alignment = TextAnchor.MiddleLeft, + margin = new RectOffset(10, 0, 4, 4) + }; + // Nucleus type + string nucleusType = this.currentNucleus.GetType().Name; + GUILayout.Label(nucleusType, headerStyle); - // Current output value - if (Application.isPlaying) { - if (currentNucleus is Neuron currentNeuron1) { - GUIContent nameLabel = new("Output", currentNeuron1.outputValue.ToString()); - EditorGUILayout.FloatField(nameLabel, currentNeuron1.outputMagnitude); + // Nucleus name + Cluster cluster = this.currentPrefabNucleus as Cluster; + if (cluster != null) { + EditorGUILayout.BeginHorizontal(); + if (GUILayout.Button(this.currentNucleus.parent.name)) + OnClusterClick(cluster); + EditorGUI.BeginDisabledGroup(true); + EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); + EditorGUI.EndDisabledGroup(); + if (GUILayout.Button("Reimport")) + ReimportCluster(cluster); + EditorGUILayout.EndHorizontal(); + } + else { + string newName = EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); + if (newName != this.currentNucleus.name) { + Nucleus prefabNucleus = this.prefab.GetNucleus(this.currentNucleus.name); + prefabNucleus.name = newName; + // This changes it in the temporary cluster instance + this.currentNucleus.name = newName; + this.prefab.RefreshOutputs(); + // outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList(); + anythingChanged = true; + } + } + + // Current output value + if (Application.isPlaying) { + if (currentNucleus is Neuron currentNeuron1) { + GUIContent nameLabel = new("Output", currentNeuron1.outputValue.ToString()); + EditorGUILayout.FloatField(nameLabel, currentNeuron1.outputMagnitude); + } + else + EditorGUILayout.LabelField(" "); } else EditorGUILayout.LabelField(" "); + + // Memory cell + if (this.currentNucleus is MemoryCell memory) + MemoryCellInspector(memory, ref anythingChanged); + // Cluster + else if (cluster != null) + ClusterInspector(cluster, ref anythingChanged); + // Other + else + NucleusInspector(this.currentNucleus, ref anythingChanged); + + if (GUILayout.Button("Delete")) + DeleteNucleus(this.currentNucleus); } - else - EditorGUILayout.LabelField(" "); - - // Memory cell - if (this.currentNucleus is MemoryCell memory) - MemoryCellInspector(memory, ref anythingChanged); - // Cluster - else if (this.currentNucleus is Cluster cluster) - ClusterInspector(cluster, ref anythingChanged); - // Other - else - NucleusInspector(this.currentNucleus, ref anythingChanged); - - if (GUILayout.Button("Delete")) - DeleteNucleus(this.currentNucleus); serializedObject.ApplyModifiedProperties(); if (anythingChanged) { @@ -222,6 +221,24 @@ namespace NanoBrain { } } + protected void OutputsInspector(ref bool anythingChanged) { + GUIStyle headerStyle = new(EditorStyles.boldLabel) { + alignment = TextAnchor.MiddleLeft, + margin = new RectOffset(10, 0, 4, 4) + }; + GUILayout.Label("Outputs", headerStyle); + + bool connecting = GUILayout.Button("Add Output Neuron"); + if (connecting) { + Nucleus newOutput = new Neuron(this.prefab, "New Output"); + // Regenerate the temporary clsuter instance + // See also the constructor + this.currentCluster = new(this.prefab); + this.currentNucleus = newOutput; + this.selectedOutput = this.currentNucleus; + } + } + protected void MemoryCellInspector(MemoryCell memoryCell, ref bool anythingChanged) { memoryCell.staticMemory = EditorGUILayout.Toggle("Static Memory", memoryCell.staticMemory); NucleusInspector(memoryCell, ref anythingChanged); @@ -241,7 +258,6 @@ namespace NanoBrain { if (GUILayout.Button("Add")) { Undo.RecordObject(prefabAsset, "Array add " + prefabAsset.name); - //cluster.AddInstance(this.prefab); cluster.AddInstance(); anythingChanged = true; } @@ -284,14 +300,17 @@ namespace NanoBrain { EditorGUIUtility.labelWidth = 100; Vector3 newBias = EditorGUILayout.Vector3Field("Bias", this.currentNucleus.bias); - anythingChanged |= newBias != this.currentNucleus.bias; - this.currentNucleus.bias = newBias; + if (newBias != this.currentPrefabNucleus.bias) { + anythingChanged |= newBias != this.currentNucleus.bias; + this.currentPrefabNucleus.bias = newBias; + this.currentNucleus.bias = newBias; + } EditorGUIUtility.labelWidth = previousLabelWidth; Nucleus[] array = null; int elementIx = -1; - if (this.currentNucleus.synapses.Count > 0) { - Synapse[] synapses = this.currentNucleus.synapses.ToArray(); + if (this.currentPrefabNucleus.synapses.Count > 0) { + Synapse[] synapses = this.currentPrefabNucleus.synapses.ToArray(); foreach (Synapse synapse in synapses) { if (synapse.neuron == null) continue; @@ -330,24 +349,20 @@ namespace NanoBrain { EditorGUILayout.BeginHorizontal(); if (synapse.neuron.clusterPrefab != this.currentNucleus.clusterPrefab) { - // If it is a cluster + // If it is a different cluster GUIStyle labelStyle = new(GUI.skin.label); float labelWidth = 200; if (synapse.neuron.clusterPrefab != null) { labelWidth = labelStyle.CalcSize(new GUIContent($"{synapse.neuron.clusterPrefab.name}.")).x; GUILayout.Label($"{synapse.neuron.clusterPrefab.name}", GUILayout.Width(labelWidth)); } - //string[] options = synapse.neuron.parent.clusterNuclei.Select(n => n.name).ToArray(); string[] options = synapse.neuron.clusterPrefab.nuclei.Select(n => n.name).ToArray(); int selectedIndex = System.Array.IndexOf(options, synapse.neuron.name); int newIndex = EditorGUILayout.Popup(selectedIndex, options); - // if (newIndex != selectedIndex && synapse.neuron.clusterPrefab.nuclei[newIndex] is Neuron newNeuron) - // ChangeSynapse(synapse, newNeuron); if (newIndex != selectedIndex) { - // It shall be ensured that the parent.clusterNuclei and - // clusterPrefab.nuclei contain the same neurons in the same order.... - Nucleus selectedNucleus = synapse.neuron.parent.clusterNuclei[newIndex]; - Neuron newNeuron = selectedNucleus as Neuron; + // Nucleus selectedNucleus = synapse.neuron.parent.clusterNuclei[newIndex]; + // Neuron newNeuron = selectedNucleus as Neuron; + Neuron newNeuron = synapse.neuron.clusterPrefab.nuclei[newIndex] as Neuron; ChangeSynapse(synapse, newNeuron); } } @@ -367,14 +382,6 @@ namespace NanoBrain { EditorGUI.indentLevel++; float newWeight = EditorGUILayout.FloatField("Weight", synapse.weight); if (newWeight != synapse.weight) { - // if (synapse.neuron.parent is IReceptor receptor) { - // Nucleus[] receptorArray = receptor.nucleiArray; - // foreach (Synapse s in this.currentNucleus.synapses) { - // if (s.neuron.parent is IReceptor r && r.nucleiArray == receptorArray) - // s.weight = newWeight; - // } - // } - // else synapse.weight = newWeight; anythingChanged = true; } @@ -430,15 +437,6 @@ namespace NanoBrain { case Nucleus.Type.Cluster: AddClusterInput(nucleus); break; - // case Nucleus.Type.Receptor: - // AddReceptorInput(nucleus); - // break; - // case Nucleus.Type.ClusterReceptor: - // AddClusterReceptorInput(nucleus); - // break; - // case Nucleus.Type.ClusterArray: - // AddClusterArrayInput(nucleus); - // break; default: break; } @@ -535,17 +533,15 @@ namespace NanoBrain { } } } - this.prefab.nuclei.Remove(nucleus); + this.currentCluster.DeleteNucleus(nucleus);//clusterNuclei.Remove(nucleus); - if (outputsPopup.value == nucleus.name) { - this.prefab.RefreshOutputs(); - outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList(); - outputsPopup.index = 0; - } + // this.prefab.nuclei.Remove(nucleus); + // Neuron.Delete(nucleus); + this.prefab.RefreshOutputs(); - Neuron.Delete(nucleus); this.currentNucleus = this.prefab.output; + this.selectedOutput = this.currentNucleus; } Nucleus.Type selectedType = Nucleus.Type.None; @@ -570,7 +566,7 @@ namespace NanoBrain { } protected virtual void ChangeSynapse(Synapse synapse, Neuron newNucleus) { - Neuron synapseNeuron = synapse.neuron as Neuron; + Neuron synapseNeuron = synapse.neuron; if (synapse.neuron.parent is Cluster subCluster && subCluster.prefab != this.prefab) { // if (synapse.neuron.parent is ClusterReceptor receptor) { // // the new nucleus is part of a (cluster) receptor, @@ -600,8 +596,8 @@ namespace NanoBrain { // } // else { // it is a neuron in a subcluster - synapseNeuron.RemoveReceiver(this.currentNucleus); - newNucleus.AddReceiver(this.currentNucleus); + synapseNeuron.RemoveReceiver(this.currentPrefabNucleus); + newNucleus.AddReceiver(this.currentPrefabNucleus); // } } else { diff --git a/Editor/ClusterViewer.cs b/Editor/ClusterViewer.cs index af0eb48..5f11269 100644 --- a/Editor/ClusterViewer.cs +++ b/Editor/ClusterViewer.cs @@ -15,8 +15,15 @@ namespace NanoBrain { //protected readonly ClusterPrefab prefab; protected Cluster currentCluster; protected SerializedObject serializedBrain; - protected Nucleus currentNucleus; + protected Nucleus _currentNucleus; + protected virtual Nucleus currentNucleus { + get => _currentNucleus; + set => _currentNucleus = value; + } + //protected Nucleus currentNucleus; protected Nucleus selectedOutput; + // Only used when selecting a synapse to a multi-cluster + protected Nucleus selectedSynapseNeuron; protected GameObject gameObject; private bool expandArray = false; @@ -25,7 +32,7 @@ namespace NanoBrain { protected VisualElement topMenuContainer; protected ScrollView scrollView; protected IMGUIContainer graphContainer; - protected readonly PopupField outputsPopup; + //protected readonly PopupField outputsPopup; public enum Mode { Focus, @@ -322,7 +329,7 @@ namespace NanoBrain { if (nucleus is Neuron neuron) receivers = neuron.receivers; else if (nucleus is Cluster cluster) - receivers = cluster.CollectReceivers(); + receivers = cluster.CollectReceivers(true); else return; @@ -352,7 +359,6 @@ namespace NanoBrain { float margin = 10 + spacing / 2; int row = 0; - List drawnArrays = new(); foreach (Nucleus receiver in receivers) { Nucleus receiverNucleus = receiver; if (receiverNucleus == null) @@ -378,6 +384,10 @@ namespace NanoBrain { } protected void DrawSynapses(Nucleus nucleus, Vector3 parentPos, float size) { + if (this.selectedSynapseNeuron != null) { + DrawClusterSynapses(this.selectedSynapseNeuron, parentPos, size); + return; + } if (nucleus == null) return; @@ -385,15 +395,19 @@ namespace NanoBrain { // This is used to 'scale' the output value colors of the nuclei float maxValue = 0; int neuronCount = 0; - List drawnNeurons = new(); + List drawnNeuronNames = new(); foreach (Synapse synapse in nucleus.synapses) { if (synapse.neuron == null) continue; // Count multiple synapses to the same neuron only once - if (drawnNeurons.Contains(synapse.neuron)) + string neuronName = synapse.neuron.name; + if (synapse.neuron.parent != null) + neuronName = synapse.neuron.parent.baseName + "." + neuronName; + + if (drawnNeuronNames.Contains(neuronName)) continue; - drawnNeurons.Add(synapse.neuron); + drawnNeuronNames.Add(neuronName); float value = synapse.neuron.outputMagnitude * synapse.weight; if (value > maxValue) @@ -407,15 +421,20 @@ namespace NanoBrain { float margin = 10 + spacing / 2; int row = 0; - drawnNeurons = new(); + //List drawnNeurons = new(); + drawnNeuronNames = new(); foreach (Synapse synapse in nucleus.synapses) { if (synapse.neuron is null) continue; // Draw multiple synapses to the same neuron only once - if (drawnNeurons.Contains(synapse.neuron)) + string neuronName = synapse.neuron.name; + if (synapse.neuron.parent != null) + neuronName = synapse.neuron.parent.baseName + "." + neuronName; + + if (drawnNeuronNames.Contains(neuronName)) continue; - drawnNeurons.Add(synapse.neuron); + drawnNeuronNames.Add(neuronName); Vector3 pos = new(250, margin + row * spacing, 0.0f); DrawEdge(parentPos, pos); @@ -433,6 +452,50 @@ namespace NanoBrain { } } + protected void DrawClusterSynapses(Nucleus nucleus, Vector3 parentPos, float size) { + if (nucleus == null || nucleus.parent == null || nucleus.parent.siblingClusters == null) + return; + + // Hack to disable showing labels + expandArray = true; + + float maxValue = 0; + foreach (Cluster sibling in nucleus.parent.siblingClusters) { + Neuron siblingNeuron = sibling.GetNucleus(nucleus.name) as Neuron; + float value = siblingNeuron.outputMagnitude; // no need to add weight as they are all the same + if (value > maxValue) + maxValue = value; + } + + // Determine the spacing of the nuclei in the layer + float spacing = 400f / nucleus.parent.instanceCount; + float margin = 10 + spacing / 2; + + int row = 0; + foreach (Cluster sibling in nucleus.parent.siblingClusters) { + Neuron siblingNeuron = sibling.GetNucleus(nucleus.name) as Neuron; + Vector3 position = new(250, margin + row * spacing, 0.0f); + DrawEdge(parentPos, position); + Color color = Color.black; + if (Application.isPlaying) { + if (maxValue == 0 || !float.IsFinite(maxValue)) + maxValue = 1; + float brightness = siblingNeuron.outputMagnitude / maxValue; + color = new Color(brightness, brightness, brightness, 1f); + } DrawNucleus(siblingNeuron, position, size, color); + GUIStyle style = new(EditorStyles.label) { + alignment = TextAnchor.UpperCenter, + normal = { textColor = Color.white }, + fontStyle = FontStyle.Bold, + }; + Vector3 labelPos = position - Vector3.down * (size + 5); // below neuron + string name = $"{sibling.baseName}.{nucleus.name}"; + Handles.Label(labelPos, name, style); + row++; + } + expandArray = false; + } + protected void DrawOutputs(Vector2 parentPos, float size) { // Determine the maximum value in this layer // This is used to 'scale' the output value colors of the nuclei @@ -532,7 +595,7 @@ namespace NanoBrain { else if (nucleus is Cluster cluster) DrawCluster(cluster, position, color, size); - if (expandArray == false || nucleus != currentNucleus) { + if (expandArray == false) {// || nucleus != currentNucleus) { // put name below nucleus Vector3 labelPos = position - Vector3.down * (size + 5); // below neuron style.alignment = TextAnchor.UpperCenter; @@ -726,24 +789,33 @@ namespace NanoBrain { protected void OnNeuronClick(Nucleus nucleus) { if (nucleus == this.currentNucleus) { - if (Application.isPlaying) { - if (nucleus is Cluster) - expandArray = !expandArray; - else - expandArray = false; - } - else { - if (nucleus is Cluster cluster) - OnClusterClick(cluster); - } + this.selectedSynapseNeuron = null; + // if (Application.isPlaying) { + // if (nucleus is Cluster) + // expandArray = !expandArray; + // else + // expandArray = false; + // } + // else { + if (nucleus is Cluster cluster) + OnClusterClick(cluster); + // } } else if (nucleus.parent != null && this.currentNucleus != null && nucleus.parent != this.currentNucleus.parent) { // We go to a different cluster if (Application.isPlaying) { - this.currentNucleus = nucleus; - if (this.currentNucleus is Neuron neuron && neuron.receivers.Count == 0) - this.selectedOutput = this.currentNucleus; - expandArray = false; + if (this.selectedSynapseNeuron == null && nucleus.parent.instanceCount > 1) { + this.selectedSynapseNeuron = nucleus; + expandArray = false; + } + else { + this.currentNucleus = nucleus; + if (this.currentNucleus is Neuron neuron && neuron.receivers.Count == 0) + this.selectedOutput = this.currentNucleus; + this.selectedSynapseNeuron = null; + expandArray = false; + } + } else { // select the cluster, not the neuron in the cluster diff --git a/Runtime/Scripts/Core/Cluster.cs b/Runtime/Scripts/Core/Cluster.cs index 0b89721..87366f3 100644 --- a/Runtime/Scripts/Core/Cluster.cs +++ b/Runtime/Scripts/Core/Cluster.cs @@ -32,9 +32,11 @@ namespace NanoBrain { } // This should not be serialized - [SerializeReference] + //[SerializeReference] + [NonSerialized] public Cluster[] siblingClusters; // This serialization should be enough + [SerializeField] public int instanceCount = 1; public Dictionary thingClusters = new(); @@ -93,6 +95,8 @@ namespace NanoBrain { nucleus.ShallowCloneTo(this); } Nucleus[] clonedNuclei = this.clusterNuclei.ToArray(); + // foreach (Nucleus n in clonedNuclei) + // n.name += "(c)"; // Now clone the connections for (int nucleusIx = 0; nucleusIx < prefabNuclei.Length; nucleusIx++) { @@ -106,19 +110,15 @@ namespace NanoBrain { foreach (Synapse prefabSynapse in prefabNeuron.synapses) { Neuron synapseNeuron = prefabSynapse.neuron; - if (synapseNeuron.parent is not null && synapseNeuron.clusterPrefab != this.clusterPrefab) { + if (synapseNeuron.clusterPrefab != null && synapseNeuron.clusterPrefab != this.prefab) { // Neuron is in another cluster, find the cloned cluster first - Cluster prefabCluster = synapseNeuron.parent; - int clusterIx = GetNucleusIndex(prefabNuclei, prefabCluster); - if (clusterIx < 0) - // Could not find the cluster in the prefab - continue; - if (clonedNuclei[clusterIx] is not Cluster clonedCluster) - // Could not find the cloned cluster + ClusterPrefab prefabCluster = synapseNeuron.clusterPrefab; + Cluster clonedCluster = this.clusterNuclei.Find(n => n.name == prefabCluster.name) as Cluster; + if (clonedCluster == null) continue; // Now find the neuron in that cloned cluster - int neuronIx = GetNucleusIndex(prefabCluster.prefab.nuclei, prefabSynapse.neuron); + int neuronIx = GetNucleusIndex(prefabCluster.nuclei, prefabSynapse.neuron.name); if (neuronIx < 0) // Could not find the neuron in the prefab cluster continue; @@ -127,6 +127,7 @@ namespace NanoBrain { continue; clonedSender.AddReceiver(clonedNeuron, prefabSynapse.weight); + //Debug.Log($"Add synapse {clonedCluster.name}.{clonedSender.name} -> {clonedNeuron.name} [{clonedSender.receivers.Count}]"); } else { int ix = GetNucleusIndex(prefabNuclei, prefabSynapse.neuron); @@ -137,6 +138,7 @@ namespace NanoBrain { // Copy the receivers which will also create the synapse clonedSender.AddReceiver(clonedNeuron, prefabSynapse.weight); + // Debug.Log($"Add synapse {clonedSender.name} -> {clonedNeuron.name}"); } } @@ -162,99 +164,157 @@ namespace NanoBrain { // clonedNeuron.AddReceiver(clonedReceiver, weight); // } } - /* - // 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; + if (Application.isPlaying) { + // Only create cluster siblings at runtime + foreach (Nucleus clonedNucleus in clonedNuclei) { + if (clonedNucleus is not Cluster clonedCluster) + 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.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; - } - } - - /* - // Collect the subclusters - List subClusters = new(); - foreach (Nucleus nucleus in prefabNuclei) { - foreach (Synapse synapse in nucleus.synapses) { - Nucleus synapseNucleus = synapse.neuron; - Cluster subCluster = synapseNucleus.parent; - if (subCluster is null || - synapseNucleus.clusterPrefab == this.clusterPrefab) { - - continue; - } - // if (synapseNucleus is not Cluster subCluster) - // continue; - if (subClusters.Contains(subCluster)) - continue; - subClusters.Add(subCluster); - } - } - // Create the subcluster instances - foreach (Cluster subCluster in subClusters) { - for (int ix = 0; ix < subCluster.instanceCount; ix++) { - // create the new instance - Cluster clusterInstance = new(subCluster.prefab); - // connect it - foreach ((Neuron sender, Nucleus receiver) in subCluster.CollectConnections()) { - int receiverIx = GetNucleusIndex(prefabNuclei, receiver); - if (receiverIx < 0) - continue; - - if (clonedNuclei[receiverIx] is not Nucleus clonedReceiver) - continue; - - // Find the synapse for the weight - float weight = 1; - foreach (Synapse synapse in receiver.synapses) { - // Find the weight for this synapse - if (synapse.neuron == sender) { - weight = synapse.weight; - break; - } - } - - if (clusterInstance.GetNucleus(sender.name) is not Neuron clonedSender) - continue; - - clonedSender.AddReceiver(clonedReceiver, weight); - } - } - } - */ - - foreach (Nucleus nucleus in this.clusterNuclei) { - if (nucleus is Cluster clonedSubCluster) - RestoreAllExternalReceivers(clonedSubCluster, this.prefab, this); + List siblings = new() { + clonedCluster + }; + for (int instanceIx = 1; instanceIx < clonedCluster.instanceCount; instanceIx++) { + // Create another sibling + Debug.Log($"create {clonedCluster.prefab.name} sibling"); + Cluster sibling = new(clonedCluster.prefab, this) { + name = $"{clonedCluster.baseName}: {instanceIx}", + clusterPrefab = this.clusterPrefab, + instanceCount = this.instanceCount, + }; + siblings.Add(sibling); + CopyAllExternalReceivers(clonedCluster, sibling, clonedCluster.prefab, this); + } + Cluster[] siblingClusters = siblings.ToArray(); + foreach (Cluster sibling in siblings) + sibling.siblingClusters = siblingClusters; + } } + /* + for (int nucleusIx = 0; nucleusIx < clonedNuclei.Length; nucleusIx++) { + Nucleus prefabNucleus = prefabNuclei[nucleusIx]; + if (prefabNucleus is not Cluster prefabCluster) + continue; + + if (prefabCluster.instanceCount <= 1) + 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.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; + } + } + } + + /* + // Collect the subclusters + List subClusters = new(); + foreach (Nucleus nucleus in prefabNuclei) { + foreach (Synapse synapse in nucleus.synapses) { + Nucleus synapseNucleus = synapse.neuron; + Cluster subCluster = synapseNucleus.parent; + if (subCluster is null || + synapseNucleus.clusterPrefab == this.clusterPrefab) { + + continue; + } + // if (synapseNucleus is not Cluster subCluster) + // continue; + if (subClusters.Contains(subCluster)) + continue; + subClusters.Add(subCluster); + } + } + // Create the subcluster instances + foreach (Cluster subCluster in subClusters) { + for (int ix = 0; ix < subCluster.instanceCount; ix++) { + // create the new instance + Cluster clusterInstance = new(subCluster.prefab); + // connect it + foreach ((Neuron sender, Nucleus receiver) in subCluster.CollectConnections()) { + int receiverIx = GetNucleusIndex(prefabNuclei, receiver); + if (receiverIx < 0) + continue; + + if (clonedNuclei[receiverIx] is not Nucleus clonedReceiver) + continue; + + // Find the synapse for the weight + float weight = 1; + foreach (Synapse synapse in receiver.synapses) { + // Find the weight for this synapse + if (synapse.neuron == sender) { + weight = synapse.weight; + break; + } + } + + if (clusterInstance.GetNucleus(sender.name) is not Neuron clonedSender) + continue; + + clonedSender.AddReceiver(clonedReceiver, weight); + } + } + } + */ + + // foreach (Nucleus nucleus in this.clusterNuclei) { + // if (nucleus is Cluster clonedSubCluster) + // RestoreAllExternalReceivers(clonedSubCluster, this.prefab, this); + // } + } + + private void CloneSynapses(Neuron prefabNeuron, Neuron clonedNeuron) { + foreach (Synapse prefabSynapse in prefabNeuron.synapses) { + Neuron synapseNeuron = prefabSynapse.neuron; + if (synapseNeuron.clusterPrefab != null && synapseNeuron.clusterPrefab != this.prefab) { + // Neuron is in another cluster, find the cloned cluster first + ClusterPrefab prefabCluster = synapseNeuron.clusterPrefab; + Cluster clonedCluster = this.clusterNuclei.Find(n => n.name == prefabCluster.name) as Cluster; + if (clonedCluster == null) + continue; + + // Now find the neuron in that cloned cluster + int neuronIx = GetNucleusIndex(prefabCluster.nuclei, prefabSynapse.neuron.name); + if (neuronIx < 0) + // Could not find the neuron in the prefab cluster + continue; + if (clonedCluster.clusterNuclei[neuronIx] is not Neuron clonedSender) + // Could not find the neuron in the cloned cluster + continue; + + clonedSender.AddReceiver(clonedNeuron, prefabSynapse.weight); + //Debug.Log($"Add synapse {clonedCluster.name}.{clonedSender.name} -> {clonedNeuron.name} [{clonedSender.receivers.Count}]"); + } + else { + Neuron clonedSender = this.clusterNuclei.Find(n => n.name == prefabSynapse.neuron.name) as Neuron; + // Copy the receivers which will also create the synapse + clonedSender.AddReceiver(clonedNeuron, prefabSynapse.weight); + // Debug.Log($"Add synapse {clonedSender.name} -> {clonedNeuron.name}"); + } + } + } /// @@ -347,33 +407,29 @@ namespace NanoBrain { Cluster clone = new(this.prefab, parent) { name = this.name, clusterPrefab = this.clusterPrefab, + instanceCount = this.instanceCount, }; // Somehow siblingClusters should be cloned too. Believe I do this in ClonePrefab right now. return clone; } - private static void RestoreAllExternalReceivers(Cluster clonedCluster, ClusterPrefab prefabParent, Cluster clonedParent) { - int clonedClusterIx = GetNucleusIndex(clonedParent.clusterNuclei, clonedCluster); - if (prefabParent.nuclei[clonedClusterIx] is not Cluster sourceCluster) - return; + private static void CopyAllExternalReceivers(Cluster sourceCluster, Cluster sibling, ClusterPrefab prefabParent, Cluster clonedParent) { for (int nucleusIx = 0; nucleusIx < sourceCluster.clusterNuclei.Count; nucleusIx++) { Nucleus sourceNucleus = sourceCluster.clusterNuclei[nucleusIx]; if (sourceNucleus is not Neuron sourceNeuron) continue; - if (clonedCluster.clusterNuclei[nucleusIx] is not Neuron clonedNeuron) + if (sibling.clusterNuclei[nucleusIx] is not Neuron clonedNeuron) continue; - // copy the receivers (and thus synapses) from the source to the clone + // copy the receivers (and thus synapses) from the source to the sibling foreach (Nucleus receiver in sourceNeuron.receivers) { - int ix = GetNucleusIndex(prefabParent.nuclei, receiver); + int ix = GetNucleusIndex(clonedParent.clusterNuclei, receiver); if (ix < 0 || ix >= clonedParent.clusterNuclei.Count) continue; - Nucleus clonedReceiver = clonedParent.clusterNuclei[ix]; - // Find the synapse for the weight float weight = 1; foreach (Synapse synapse in receiver.synapses) { @@ -384,10 +440,11 @@ namespace NanoBrain { } } - clonedNeuron.AddReceiver(clonedReceiver, weight); - // Debug.Log($"external: {clonedReceiver.name} receives from {clonedNeuron.name} {clonedNeuron.GetHashCode()}"); + clonedNeuron.AddReceiver(receiver, weight); + Debug.Log($"external: {receiver.name} receives from {clonedNeuron.name} {clonedNeuron.GetHashCode()}"); } } + } protected int GetNucleusIndex(Nucleus[] nuclei, Nucleus nucleus) { @@ -402,13 +459,25 @@ namespace NanoBrain { int i = 0; foreach (Nucleus nucleiElement in nuclei) { //for (int i = 0; i < nuclei.Length; i++) { - if (nucleus == nucleiElement) + if (nucleiElement == nucleus) return i; i++; } return -1; } + public static int GetNucleusIndex(List nuclei, string nucleusName) { + int i = 0; + foreach (Nucleus nucleiElement in nuclei) { + //for (int i = 0; i < nuclei.Length; i++) { + if (nucleiElement.name == nucleusName) + return i; + i++; + } + return -1; + } + + #endregion Init #region Cluster Array @@ -470,6 +539,7 @@ namespace NanoBrain { return cluster; Cluster selectedCluster = SelectCluster(); + selectedCluster.name = baseName + ": " + thingName; thingClusters[thingId] = selectedCluster; return selectedCluster; } @@ -528,10 +598,6 @@ namespace NanoBrain { #endregion ClusterArray - - - //public Dictionary nucleiDict = new(); - public List _inputs = null; public virtual List inputs { get { @@ -550,22 +616,33 @@ namespace NanoBrain { public Dictionary> computeOrders = new(); private void ComputeOrders() { - foreach (Nucleus input in this._inputs) - computeOrders[input] = TopologicalSort2(input); + foreach (Nucleus nucleus in this.clusterNuclei) { + // if (nucleus is Cluster cluster) { + // List synapses = this.CollectSynapsesTo(cluster); + // foreach (Synapse synapse in synapses) { + // computeOrders[synapse.neuron] = TopologicalSort2(synapse.neuron); + // Debug.Log($"{this.baseName}: Order for {cluster.baseName}.{synapse.neuron.name}"); + // } + // // List receivers = cluster.CollectReceivers(); + // // foreach (Nucleus receiver in receivers) + // // computeOrders[receiver] = TopologicalSort2(receiver); + // } + // else { + computeOrders[nucleus] = TopologicalSort2(nucleus); + Debug.Log($"{this.baseName} Order for {nucleus.name}"); + // } + } } private List TopologicalSort2(Nucleus startNode) { Dictionary inDegree = new(); - HashSet visited = new(); - - // Initialize in-degrees and mark all nodes as unvisited - foreach (Nucleus node in this.clusterNuclei) - inDegree[node] = 0; + //HashSet visited = new(); // Calculate in-degrees for all nodes reachable from the start node - Queue queue = new Queue(); + Queue queue = new(); queue.Enqueue(startNode); - visited.Add(startNode); + //visited.Add(startNode); + inDegree[startNode] = 0; while (queue.Count > 0) { Nucleus current = queue.Dequeue(); @@ -575,25 +652,24 @@ namespace NanoBrain { else if (current is Cluster cluster) receivers = cluster.CollectReceivers(); - // if (current is Neuron neuron) { foreach (Nucleus receiver in receivers) { - if (!visited.Contains(receiver)) { - visited.Add(receiver); + if (!inDegree.ContainsKey(receiver)) { + //visited.Add(receiver); + inDegree[receiver] = 0; queue.Enqueue(receiver); } inDegree[receiver]++; } - // } } // Perform topological sort on all reachable nodes queue.Clear(); - foreach (Nucleus node in visited) { + foreach (Nucleus node in inDegree.Keys) { if (inDegree[node] == 0) queue.Enqueue(node); } - List sortedOrder = new List(); + List sortedOrder = new(); while (queue.Count > 0) { Nucleus current = queue.Dequeue(); sortedOrder.Add(current); // Process the node @@ -604,21 +680,18 @@ namespace NanoBrain { else if (current is Cluster cluster) receivers = cluster.CollectReceivers(); - //if (current is Neuron neuron) { - foreach (Nucleus receiver in receivers) { - if (visited.Contains(receiver)) { + if (inDegree.ContainsKey(receiver)) { inDegree[receiver]--; if (inDegree[receiver] == 0) // If all dependencies resolved queue.Enqueue(receiver); } } - //} } // Check for cycles in the graph - if (sortedOrder.Count != visited.Count) - throw new InvalidOperationException("Graph is not a DAG; a cycle exists."); + // if (sortedOrder.Count != visited.Count) + // throw new InvalidOperationException("Graph is not a DAG; a cycle exists."); return sortedOrder; } @@ -643,6 +716,9 @@ namespace NanoBrain { return this._outputs; } } + public void RefreshOutputs() { + this._outputs = null; + } public bool TryGetNucleus(string nucleusName, out Nucleus foundNucleus) { foreach (Nucleus receptor in this.clusterNuclei) { @@ -685,18 +761,39 @@ namespace NanoBrain { } } + public bool DeleteNucleus(Nucleus nucleus) { + if (this.clusterNuclei.Contains(nucleus) == false) { + // Try to find the nucleus by name + if (TryGetNucleus(nucleus.name, out nucleus) == false) + return false; + } + + Neuron.Delete(nucleus); + int nucleusIx = this.clusterNuclei.IndexOf(nucleus); + this.clusterNuclei.Remove(nucleus); + this.prefab.nuclei.RemoveAt(nucleusIx); + RefreshOutputs(); + + return true; + } + #region Receivers - public virtual List CollectReceivers() { + public virtual List CollectReceivers(bool removeDuplicates = false) { List receivers = new(); foreach (Nucleus outputNucleus in this.clusterNuclei) { if (outputNucleus is not Neuron output) continue; + // Debug.Log($"output {this.name} {outputNucleus.name}"); foreach (Nucleus receiver in output.receivers) { - // Only add receivers outside this cluster - if (receiver.clusterPrefab != this.prefab) - receivers.Add(receiver); + // Debug.Log($"output {receiver.name}"); + // Only add receivers outside this cluster + if (receiver.clusterPrefab != this.prefab) { + if (removeDuplicates == false || receivers.Contains(receiver) == false) + // Debug.Log($" YES"); + receivers.Add(receiver); + } } } return receivers; @@ -717,6 +814,19 @@ namespace NanoBrain { } return connections; } + public List CollectSynapsesTo(Cluster otherCluster) { + List collectedSynapses = new(); + + foreach (Nucleus nucleus in this.clusterNuclei) { + if (nucleus is not Neuron neuron) + continue; + foreach (Synapse synapse in nucleus.synapses) { + if (synapse.neuron.parent == otherCluster) + collectedSynapses.Add(synapse); + } + } + return collectedSynapses; + } public void MoveReceivers(Cluster newCluster) { Debug.Log($"Move receivers for {this.name} to {newCluster.name}"); @@ -752,23 +862,31 @@ namespace NanoBrain { // no bias+synapse input state calculation for now... if (this.computeOrders.ContainsKey(startNucleus) == false) { - //Debug.LogError($"{this.name} compute orders does not contain an order for {startNucleus.name}"); + Debug.LogError($"{this.name} compute orders does not contain an order for {startNucleus.name}"); return; } List computeOrder = this.computeOrders[startNucleus]; - if (startNucleus.trace) - Debug.Log($"Update from {startNucleus.name}"); + //if (startNucleus.trace) + Debug.Log($"Update from {startNucleus.name}"); foreach (Nucleus nucleus in computeOrder) { if (nucleus is not Cluster) { nucleus.UpdateStateIsolated(); - if (startNucleus.trace && nucleus is Neuron neuron) - Debug.Log($" {nucleus.name}[{nucleus.GetHashCode()}]"); // = {neuron.outputValue}"); + //if (startNucleus.trace && nucleus is Neuron neuron) + Debug.Log($" {nucleus.name}"); + if (nucleus is Neuron neuron) { + foreach (Nucleus receiver in neuron.receivers) { + if (receiver.parent != this) { + Debug.Log($" External: {receiver.parent.name}.{receiver.name}"); + receiver.parent.UpdateFromNucleus(receiver); + } + } + } } } // continue in parent - this.parent?.UpdateFromNucleus(this); + //this.parent?.UpdateFromNucleus(this); UpdateNuclei(); } diff --git a/Runtime/Scripts/Core/Neuron.cs b/Runtime/Scripts/Core/Neuron.cs index d0f9473..a4bbed8 100644 --- a/Runtime/Scripts/Core/Neuron.cs +++ b/Runtime/Scripts/Core/Neuron.cs @@ -33,8 +33,10 @@ namespace NanoBrain { public Neuron(ClusterPrefab prefab, string name) { this.clusterPrefab = prefab; this.name = name; - if (this.clusterPrefab != null) + if (this.clusterPrefab != null) { this.clusterPrefab.nuclei.Add(this); + this.clusterPrefab.RefreshOutputs(); + } else Debug.LogError("No prefab when adding neuron to prefab"); } @@ -264,15 +266,19 @@ namespace NanoBrain { } public static void Delete(Nucleus nucleus) { - foreach (Synapse synapse in nucleus.synapses) { - if (synapse.neuron is Neuron synapse_nucleus) { - if (synapse_nucleus.receivers.Count > 1) { - // there is another nucleus feeding into this input nucleus - synapse_nucleus.receivers.RemoveAll(r => r == nucleus); - } - else { - // No other links, delete it. - Neuron.Delete(synapse_nucleus); + if (nucleus == null) + return; + if (nucleus.synapses != null) { + foreach (Synapse synapse in nucleus.synapses) { + if (synapse.neuron is Neuron synapse_nucleus) { + if (synapse_nucleus.receivers.Count > 1) { + // there is another nucleus feeding into this input nucleus + synapse_nucleus.receivers.RemoveAll(r => r == nucleus); + } + else { + // No other links, delete it. + Neuron.Delete(synapse_nucleus); + } } } } @@ -520,6 +526,8 @@ namespace NanoBrain { public virtual void AddReceiver(Nucleus receiverToAdd, float weight = 1) { this._receivers.Add(receiverToAdd); receiverToAdd.AddSynapse(this, weight); + //Debug.Log($"Add synapse {this.clusterPrefab.name}.{this.name} -> {receiverToAdd.name} --- [{this.receivers.Count}]"); + } public virtual void RemoveReceiver(Nucleus receiverToRemove) { diff --git a/Runtime/Scripts/Core/Synapse.cs b/Runtime/Scripts/Core/Synapse.cs index e71130d..9e685c4 100644 --- a/Runtime/Scripts/Core/Synapse.cs +++ b/Runtime/Scripts/Core/Synapse.cs @@ -29,11 +29,7 @@ namespace NanoBrain { this.weight = weight; } - public bool isSleeping { - get { - return this.neuron.isSleeping; - } - } + public bool isSleeping => this.neuron.isSleeping; } } \ No newline at end of file From 79376c30ea1326bbf3e1f25c7ce5aa2642bce05b Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 5 May 2026 10:59:24 +0200 Subject: [PATCH 27/38] Cleanup and fix connect neuron --- NanoBrain/Editor/ClusterEditor.cs | 110 +++++---- NanoBrain/Editor/ClusterViewer.cs | 10 +- NanoBrain/Runtime/Scripts/Brain.cs | 2 +- NanoBrain/Runtime/Scripts/Core/Cluster.cs | 108 ++++---- NanoBrain/Runtime/Scripts/Core/Neuron.cs | 120 +++++++-- NanoBrain/Runtime/Scripts/Core/Nucleus.cs | 113 ++++----- .../ScriptableObjects/ClusterPrefab.cs | 187 +++++++------- Runtime/Scripts/Ant.cs | 36 +-- Samples/Brain/Foraging.asset | 233 ------------------ Samples/Brain/New Cluster Prefab.asset | 109 ++++++++ ...set.meta => New Cluster Prefab.asset.meta} | 2 +- 11 files changed, 514 insertions(+), 516 deletions(-) delete mode 100644 Samples/Brain/Foraging.asset create mode 100644 Samples/Brain/New Cluster Prefab.asset rename Samples/Brain/{Foraging.asset.meta => New Cluster Prefab.asset.meta} (79%) diff --git a/NanoBrain/Editor/ClusterEditor.cs b/NanoBrain/Editor/ClusterEditor.cs index 725b27d..ae1a535 100644 --- a/NanoBrain/Editor/ClusterEditor.cs +++ b/NanoBrain/Editor/ClusterEditor.cs @@ -64,22 +64,23 @@ namespace NanoBrain { public class GraphEditor : GraphView { protected ClusterPrefab prefab; - protected Nucleus currentPrefabNucleus; + //protected Nucleus currentPrefabNucleus; protected override Nucleus currentNucleus { get => base.currentNucleus; set { base.currentNucleus = value; - this.currentPrefabNucleus = value != null ? this.prefab.GetNucleus(value.name) : null; + // this.currentPrefabNucleus = value != null ? this.prefab.GetNucleus(value.name) : null; } } - public GraphEditor(ClusterPrefab prefab) : base(prefab.output.parent) { + public GraphEditor(ClusterPrefab prefab) : base(prefab.cluster.defaultOutput.parent) { this.prefab = prefab; // In a Prefab editor, no instance exists but we need it for the ClusterViewer. // So we create a temporary instance - this.currentCluster = new(prefab); + //this.currentCluster = new(prefab); + this.currentCluster = prefab.cluster; } public void SetGraph(GameObject gameObject, VisualElement inspectorContainer) { @@ -120,7 +121,7 @@ namespace NanoBrain { // create a SerializedObject wrapper so Unity inspector controls work (and Undo) SerializedObject so = new(prefabAsset); - foreach (Nucleus nucleus in this.prefab.nuclei) { + foreach (Nucleus nucleus in this.prefab.cluster.nuclei) { nucleus.Initialize(); } @@ -163,7 +164,8 @@ namespace NanoBrain { GUILayout.Label(nucleusType, headerStyle); // Nucleus name - Cluster cluster = this.currentPrefabNucleus as Cluster; + //Cluster cluster = this.currentPrefabNucleus as Cluster; + Cluster cluster = this.currentNucleus as Cluster; if (cluster != null) { EditorGUILayout.BeginHorizontal(); if (GUILayout.Button(this.currentNucleus.parent.name)) @@ -182,7 +184,7 @@ namespace NanoBrain { prefabNucleus.name = newName; // This changes it in the temporary cluster instance this.currentNucleus.name = newName; - this.prefab.RefreshOutputs(); + this.prefab.cluster.RefreshOutputs(); // outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList(); anythingChanged = true; } @@ -281,9 +283,9 @@ namespace NanoBrain { if (breakOnWake && this.currentNucleus is Neuron currentNeuron) { if (currentNeuron.isSleeping == false) Debug.Break(); + trace = EditorGUILayout.Toggle("Trace", trace); + currentNeuron.trace = trace; } - trace = EditorGUILayout.Toggle("Trace", trace); - this.currentNucleus.trace = trace; } protected void SynapsesInspector(ref bool anythingChanged) { @@ -293,31 +295,32 @@ namespace NanoBrain { Neuron.CombinatorType newCombinator = (Neuron.CombinatorType)EditorGUILayout.EnumPopup("Combinator", neuron2.combinator); anythingChanged |= newCombinator != neuron2.combinator; neuron2.combinator = newCombinator; - } - EditorGUIUtility.wideMode = true; - float previousLabelWidth = EditorGUIUtility.labelWidth; - EditorGUIUtility.labelWidth = 100; + EditorGUIUtility.wideMode = true; + float previousLabelWidth = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 100; - Vector3 newBias = EditorGUILayout.Vector3Field("Bias", this.currentNucleus.bias); - if (newBias != this.currentPrefabNucleus.bias) { - anythingChanged |= newBias != this.currentNucleus.bias; - this.currentPrefabNucleus.bias = newBias; - this.currentNucleus.bias = newBias; + Vector3 newBias = EditorGUILayout.Vector3Field("Bias", neuron2.bias); + if (newBias != neuron2.bias) { + anythingChanged |= newBias != neuron2.bias; + neuron2.bias = newBias; + } + EditorGUIUtility.labelWidth = previousLabelWidth; } - EditorGUIUtility.labelWidth = previousLabelWidth; Nucleus[] array = null; int elementIx = -1; - if (this.currentPrefabNucleus.synapses.Count > 0) { - Synapse[] synapses = this.currentPrefabNucleus.synapses.ToArray(); + //if (this.currentPrefabNucleus is Neuron prefabNeuron && prefabNeuron.synapses.Count > 0) { + // Synapse[] synapses = prefabNeuron.synapses.ToArray(); + if (this.currentNucleus is Neuron currentNeuron && currentNeuron.synapses.Count > 0) { + Synapse[] synapses = currentNeuron.synapses.ToArray(); foreach (Synapse synapse in synapses) { if (synapse.neuron == null) continue; if (array != null) { if (synapse.neuron.parent is Cluster iCluster && elementIx > 0) { - int thisElementIx = Cluster.GetNucleusIndex(iCluster.clusterNuclei, synapse.neuron); + int thisElementIx = Cluster.GetNucleusIndex(iCluster.nuclei, synapse.neuron); if (thisElementIx == elementIx) continue; else @@ -332,7 +335,7 @@ namespace NanoBrain { if (synapse.neuron.parent is Cluster iReceptor) { array = iReceptor.siblingClusters; if (iReceptor is Cluster iCluster) - elementIx = Cluster.GetNucleusIndex(iCluster.clusterNuclei, synapse.neuron); + elementIx = Cluster.GetNucleusIndex(iCluster.nuclei, synapse.neuron); } } @@ -356,13 +359,13 @@ namespace NanoBrain { labelWidth = labelStyle.CalcSize(new GUIContent($"{synapse.neuron.clusterPrefab.name}.")).x; GUILayout.Label($"{synapse.neuron.clusterPrefab.name}", GUILayout.Width(labelWidth)); } - string[] options = synapse.neuron.clusterPrefab.nuclei.Select(n => n.name).ToArray(); + string[] options = synapse.neuron.clusterPrefab.cluster.nuclei.Select(n => n.name).ToArray(); int selectedIndex = System.Array.IndexOf(options, synapse.neuron.name); int newIndex = EditorGUILayout.Popup(selectedIndex, options); if (newIndex != selectedIndex) { // Nucleus selectedNucleus = synapse.neuron.parent.clusterNuclei[newIndex]; // Neuron newNeuron = selectedNucleus as Neuron; - Neuron newNeuron = synapse.neuron.clusterPrefab.nuclei[newIndex] as Neuron; + Neuron newNeuron = synapse.neuron.clusterPrefab.cluster.nuclei[newIndex] as Neuron; ChangeSynapse(synapse, newNeuron); } } @@ -370,13 +373,12 @@ namespace NanoBrain { GUILayout.Label(synapse.neuron.name); bool disconnecting = GUILayout.Button("Disconnect", GUILayout.Width(80)); - if (disconnecting && synapse.neuron is Neuron synapseNeuron) { - synapseNeuron.RemoveReceiver(this.currentNucleus); + if (disconnecting) { + synapse.neuron.RemoveReceiver(this.currentNucleus); this.prefab.GarbageCollection(); anythingChanged = true; } EditorGUILayout.EndHorizontal(); - } EditorGUI.indentLevel++; @@ -493,11 +495,12 @@ namespace NanoBrain { if (cluster == null) return false; - IEnumerable synapseNuclei = this.currentNucleus.synapses + Neuron currentNeuron = this.currentNucleus as Neuron; + IEnumerable synapseNuclei = currentNeuron.synapses .Where(synapse => synapse.neuron != null) .Select(synapse => synapse.neuron); - IEnumerable nuclei = cluster.nuclei + IEnumerable nuclei = cluster.cluster.nuclei .Except(synapseNuclei); IEnumerable nucleiNames = nuclei .Select(n => { @@ -513,14 +516,36 @@ namespace NanoBrain { EditorGUILayout.EndHorizontal(); if (connecting) { Nucleus nucleus = nuclei.ElementAt(selectedConnectNucleus); - if (nucleus is Cluster subCluster) + // Nucleus prefabNucleus = this.prefab.cluster.nuclei.ElementAt(selectedConnectNucleus); + if (nucleus is Cluster subCluster) { subCluster.AddArrayReceiver(this.currentNucleus); - else if (nucleus is Neuron neuron) + // Cluster prefabSubCluster = prefabNucleus as Cluster; + } + else if (nucleus is Neuron neuron) { neuron.AddReceiver(this.currentNucleus); + // if (prefabNucleus is Neuron prefabNeuron) + // prefabNeuron.AddReceiver(this.currentPrefabNucleus); + } } return connecting; } + protected virtual void DisconnectNucleus(Neuron nucleus) { + if (this.currentNucleus.clusterPrefab == null) + return; + Neuron currentNeuron = this.currentNucleus as Neuron; + string[] names = currentNeuron.synapses.Select(synapse => synapse.neuron.name).ToArray(); + int selectedIndex = -1; + selectedIndex = EditorGUILayout.Popup("Disconnect from", selectedIndex, names); + if (selectedIndex >= 0 && selectedIndex < this.currentNucleus.clusterPrefab.cluster.nuclei.Count) { + Synapse synapse = currentNeuron.synapses[selectedIndex]; + synapse.neuron.RemoveReceiver(this.currentNucleus); + + // synapse = currentNeuron.synapses[selectedIndex]; + // synapse.neuron.RemoveReceiver(this.currentPrefabNucleus); + } + } + protected virtual void DeleteNucleus(Nucleus nucleus) { if (nucleus == null) return; @@ -537,10 +562,10 @@ namespace NanoBrain { // this.prefab.nuclei.Remove(nucleus); // Neuron.Delete(nucleus); - this.prefab.RefreshOutputs(); + this.prefab.cluster.RefreshOutputs(); - this.currentNucleus = this.prefab.output; + this.currentNucleus = this.prefab.cluster.defaultOutput; this.selectedOutput = this.currentNucleus; } @@ -596,8 +621,8 @@ namespace NanoBrain { // } // else { // it is a neuron in a subcluster - synapseNeuron.RemoveReceiver(this.currentPrefabNucleus); - newNucleus.AddReceiver(this.currentPrefabNucleus); + synapseNeuron.RemoveReceiver(this.currentNucleus); + newNucleus.AddReceiver(this.currentNucleus); // } } else { @@ -606,19 +631,6 @@ namespace NanoBrain { } } - protected virtual void DisconnectNucleus(Neuron nucleus) { - if (this.currentNucleus.clusterPrefab == null) - return; - string[] names = this.currentNucleus.synapses.Select(synapse => synapse.neuron.name).ToArray(); - int selectedIndex = -1; - selectedIndex = EditorGUILayout.Popup("Disconnect from", selectedIndex, names); - if (selectedIndex >= 0 && selectedIndex < this.currentNucleus.clusterPrefab.nuclei.Count) { - Synapse synapse = this.currentNucleus.synapses[selectedIndex]; - Neuron synapseNeuron = synapse.neuron as Neuron; - synapseNeuron.RemoveReceiver(this.currentNucleus); - } - } - #endregion Synapses #endregion Inspector diff --git a/NanoBrain/Editor/ClusterViewer.cs b/NanoBrain/Editor/ClusterViewer.cs index eda9701..565fdc5 100644 --- a/NanoBrain/Editor/ClusterViewer.cs +++ b/NanoBrain/Editor/ClusterViewer.cs @@ -213,7 +213,8 @@ namespace NanoBrain { } private void DescendGraph(Dag.Node receiver, ref int ix, Dag dag) { - foreach (Synapse synapse in receiver.nucleus.synapses) { + Neuron receiverNeuron = receiver.nucleus as Neuron; + foreach (Synapse synapse in receiverNeuron.synapses) { Nucleus nucleus = synapse.neuron; if (nucleus.parent != null && nucleus.parent != currentNucleus.parent) { nucleus = nucleus.parent; @@ -386,6 +387,9 @@ namespace NanoBrain { } protected void DrawSynapses(Nucleus nucleus, Vector3 parentPos, float size) { + if (nucleus is not Neuron neuron) + return; + if (this.selectedSynapseNeuron != null) { DrawClusterSynapses(this.selectedSynapseNeuron, parentPos, size); return; @@ -398,7 +402,7 @@ namespace NanoBrain { float maxValue = 0; int neuronCount = 0; List drawnNeuronNames = new(); - foreach (Synapse synapse in nucleus.synapses) { + foreach (Synapse synapse in neuron.synapses) { if (synapse.neuron == null) continue; @@ -425,7 +429,7 @@ namespace NanoBrain { int row = 0; //List drawnNeurons = new(); drawnNeuronNames = new(); - foreach (Synapse synapse in nucleus.synapses) { + foreach (Synapse synapse in neuron.synapses) { if (synapse.neuron is null) continue; diff --git a/NanoBrain/Runtime/Scripts/Brain.cs b/NanoBrain/Runtime/Scripts/Brain.cs index acb28f3..afffba0 100644 --- a/NanoBrain/Runtime/Scripts/Brain.cs +++ b/NanoBrain/Runtime/Scripts/Brain.cs @@ -45,7 +45,7 @@ namespace NanoBrain { /// The name of the Neuron for which the weights are updated /// The new Synapse weight public static void UpdateWeight(Cluster brain, string name, float weight) { - Nucleus root = brain.defaultOutput; + Neuron root = brain.defaultOutput; foreach (Synapse synapse in root.synapses) { if (synapse.neuron.name == name) { if (synapse.weight != weight) { diff --git a/NanoBrain/Runtime/Scripts/Core/Cluster.cs b/NanoBrain/Runtime/Scripts/Core/Cluster.cs index 87366f3..657ae08 100644 --- a/NanoBrain/Runtime/Scripts/Core/Cluster.cs +++ b/NanoBrain/Runtime/Scripts/Core/Cluster.cs @@ -41,7 +41,7 @@ namespace NanoBrain { public Dictionary thingClusters = new(); [SerializeReference] - public List clusterNuclei = new(); + public List nuclei = new(); // the nuclei sorted using topological sorting // to ensure that the cluster is computer in the right order public List sortedNuclei; @@ -58,10 +58,10 @@ namespace NanoBrain { this.name = prefab.name; this.parent = parent; - this.parent?.clusterNuclei.Add(this); + this.parent?.nuclei.Add(this); ClonePrefab(); _ = this.inputs; - this.sortedNuclei = TopologicalSort(this.clusterNuclei); + this.sortedNuclei = TopologicalSort(this.nuclei); } /// @@ -75,11 +75,11 @@ namespace NanoBrain { this.clusterPrefab = parent; if (this.clusterPrefab != null) - this.clusterPrefab.nuclei.Add(this); + this.clusterPrefab.cluster.nuclei.Add(this); ClonePrefab(); _ = this.inputs; - this.sortedNuclei = TopologicalSort(this.clusterNuclei); + this.sortedNuclei = TopologicalSort(this.nuclei); } /// @@ -88,15 +88,13 @@ namespace NanoBrain { /// Strange that this does not take any parameters or return values. /// Where which the clone be found??? private void ClonePrefab() { - Nucleus[] prefabNuclei = this.prefab.nuclei.ToArray(); + Nucleus[] prefabNuclei = this.prefab.cluster.nuclei.ToArray(); // first clone the nuclei without their connections foreach (Nucleus nucleus in prefabNuclei) { nucleus.ShallowCloneTo(this); } - Nucleus[] clonedNuclei = this.clusterNuclei.ToArray(); - // foreach (Nucleus n in clonedNuclei) - // n.name += "(c)"; + Nucleus[] clonedNuclei = this.nuclei.ToArray(); // Now clone the connections for (int nucleusIx = 0; nucleusIx < prefabNuclei.Length; nucleusIx++) { @@ -113,16 +111,16 @@ namespace NanoBrain { if (synapseNeuron.clusterPrefab != null && synapseNeuron.clusterPrefab != this.prefab) { // Neuron is in another cluster, find the cloned cluster first ClusterPrefab prefabCluster = synapseNeuron.clusterPrefab; - Cluster clonedCluster = this.clusterNuclei.Find(n => n.name == prefabCluster.name) as Cluster; + Cluster clonedCluster = this.nuclei.Find(n => n.name == prefabCluster.name) as Cluster; if (clonedCluster == null) continue; // Now find the neuron in that cloned cluster - int neuronIx = GetNucleusIndex(prefabCluster.nuclei, prefabSynapse.neuron.name); + int neuronIx = GetNucleusIndex(prefabCluster.cluster.nuclei, prefabSynapse.neuron.name); if (neuronIx < 0) // Could not find the neuron in the prefab cluster continue; - if (clonedCluster.clusterNuclei[neuronIx] is not Neuron clonedSender) + if (clonedCluster.nuclei[neuronIx] is not Neuron clonedSender) // Could not find the neuron in the cloned cluster continue; @@ -291,16 +289,16 @@ namespace NanoBrain { if (synapseNeuron.clusterPrefab != null && synapseNeuron.clusterPrefab != this.prefab) { // Neuron is in another cluster, find the cloned cluster first ClusterPrefab prefabCluster = synapseNeuron.clusterPrefab; - Cluster clonedCluster = this.clusterNuclei.Find(n => n.name == prefabCluster.name) as Cluster; + Cluster clonedCluster = this.nuclei.Find(n => n.name == prefabCluster.name) as Cluster; if (clonedCluster == null) continue; // Now find the neuron in that cloned cluster - int neuronIx = GetNucleusIndex(prefabCluster.nuclei, prefabSynapse.neuron.name); + int neuronIx = GetNucleusIndex(prefabCluster.cluster.nuclei, prefabSynapse.neuron.name); if (neuronIx < 0) // Could not find the neuron in the prefab cluster continue; - if (clonedCluster.clusterNuclei[neuronIx] is not Neuron clonedSender) + if (clonedCluster.nuclei[neuronIx] is not Neuron clonedSender) // Could not find the neuron in the cloned cluster continue; @@ -308,7 +306,7 @@ namespace NanoBrain { //Debug.Log($"Add synapse {clonedCluster.name}.{clonedSender.name} -> {clonedNeuron.name} [{clonedSender.receivers.Count}]"); } else { - Neuron clonedSender = this.clusterNuclei.Find(n => n.name == prefabSynapse.neuron.name) as Neuron; + Neuron clonedSender = this.nuclei.Find(n => n.name == prefabSynapse.neuron.name) as Neuron; // Copy the receivers which will also create the synapse clonedSender.AddReceiver(clonedNeuron, prefabSynapse.weight); // Debug.Log($"Add synapse {clonedSender.name} -> {clonedNeuron.name}"); @@ -378,20 +376,20 @@ namespace NanoBrain { public override Nucleus Clone(ClusterPrefab parent) { Cluster clone = new(this.prefab, parent); - foreach (Synapse synapse in this.synapses) { - Synapse clonedSynapse = clone.AddSynapse(synapse.neuron); - clonedSynapse.weight = synapse.weight; - } + // foreach (Synapse synapse in this.synapses) { + // Synapse clonedSynapse = clone.AddSynapse(synapse.neuron); + // clonedSynapse.weight = synapse.weight; + // } - foreach (Nucleus nucleus in this.clusterNuclei) { + foreach (Nucleus nucleus in this.nuclei) { if (nucleus is Neuron output) { foreach (Nucleus receiver in output.receivers) { - int ix = GetNucleusIndex(this.clusterNuclei, output); + int ix = GetNucleusIndex(this.nuclei, output); Debug.Log($"{output.name} -> {receiver.name}: {ix}"); if (ix < 0) continue; - if (clone.clusterNuclei[ix] is not Neuron clonedOutput) + if (clone.nuclei[ix] is not Neuron clonedOutput) continue; clonedOutput.AddReceiver(receiver); @@ -416,23 +414,26 @@ namespace NanoBrain { private static void CopyAllExternalReceivers(Cluster sourceCluster, Cluster sibling, ClusterPrefab prefabParent, Cluster clonedParent) { - for (int nucleusIx = 0; nucleusIx < sourceCluster.clusterNuclei.Count; nucleusIx++) { - Nucleus sourceNucleus = sourceCluster.clusterNuclei[nucleusIx]; + for (int nucleusIx = 0; nucleusIx < sourceCluster.nuclei.Count; nucleusIx++) { + Nucleus sourceNucleus = sourceCluster.nuclei[nucleusIx]; if (sourceNucleus is not Neuron sourceNeuron) continue; - if (sibling.clusterNuclei[nucleusIx] is not Neuron clonedNeuron) + if (sibling.nuclei[nucleusIx] is not Neuron clonedNeuron) continue; // copy the receivers (and thus synapses) from the source to the sibling foreach (Nucleus receiver in sourceNeuron.receivers) { - int ix = GetNucleusIndex(clonedParent.clusterNuclei, receiver); - if (ix < 0 || ix >= clonedParent.clusterNuclei.Count) + if (receiver is not Neuron receiverNeuron) + continue; + + int ix = GetNucleusIndex(clonedParent.nuclei, receiver); + if (ix < 0 || ix >= clonedParent.nuclei.Count) continue; // Find the synapse for the weight float weight = 1; - foreach (Synapse synapse in receiver.synapses) { + foreach (Synapse synapse in receiverNeuron.synapses) { // Find the weight for this synapse if (synapse.neuron == sourceNucleus) { weight = synapse.weight; @@ -603,9 +604,12 @@ namespace NanoBrain { get { if (this._inputs == null) { this._inputs = new(); - foreach (Nucleus nucleus in this.clusterNuclei) { + foreach (Nucleus nucleus in this.nuclei) { + if (nucleus is not Neuron neuron) + continue; + // inputs have no synapses - if (nucleus.synapses.Count == 0) + if (neuron.synapses.Count == 0) this._inputs.Add(nucleus); } ComputeOrders(); @@ -616,7 +620,7 @@ namespace NanoBrain { public Dictionary> computeOrders = new(); private void ComputeOrders() { - foreach (Nucleus nucleus in this.clusterNuclei) { + foreach (Nucleus nucleus in this.nuclei) { // if (nucleus is Cluster cluster) { // List synapses = this.CollectSynapsesTo(cluster); // foreach (Synapse synapse in synapses) { @@ -628,8 +632,8 @@ namespace NanoBrain { // // computeOrders[receiver] = TopologicalSort2(receiver); // } // else { - computeOrders[nucleus] = TopologicalSort2(nucleus); - Debug.Log($"{this.baseName} Order for {nucleus.name}"); + computeOrders[nucleus] = TopologicalSort2(nucleus); + //Debug.Log($"{this.baseName} Order for {nucleus.name}"); // } } } @@ -698,8 +702,8 @@ namespace NanoBrain { public virtual Neuron defaultOutput {//=> this.nuclei[0] as Nucleus; get { - if (this.clusterNuclei.Count > 0) - return this.clusterNuclei[0] as Neuron; + if (this.nuclei.Count > 0) + return this.nuclei[0] as Neuron; return null; } } @@ -708,7 +712,7 @@ namespace NanoBrain { get { if (this._outputs == null) { this._outputs = new(); - foreach (Nucleus nucleus in this.clusterNuclei) { + foreach (Nucleus nucleus in this.nuclei) { if (nucleus is Neuron neuron && neuron.receivers.Count == 0) this._outputs.Add(neuron); } @@ -721,7 +725,7 @@ namespace NanoBrain { } public bool TryGetNucleus(string nucleusName, out Nucleus foundNucleus) { - foreach (Nucleus receptor in this.clusterNuclei) { + foreach (Nucleus receptor in this.nuclei) { if (receptor is Nucleus nucleus) if (nucleus.name == nucleusName) { foundNucleus = nucleus; @@ -737,7 +741,7 @@ namespace NanoBrain { if (dotPosition >= 0) { string clusterName = nucleusName[..dotPosition]; string clusterName0 = clusterName + ": 0"; - foreach (Nucleus nucleus in this.clusterNuclei) { + foreach (Nucleus nucleus in this.nuclei) { if (nucleus is Cluster cluster) { if (cluster.name == clusterName || cluster.name == clusterName0) { string subNucleusName = nucleusName[(dotPosition + 1)..]; @@ -749,7 +753,7 @@ namespace NanoBrain { } else { string nucleusName0 = nucleusName + ": 0"; - foreach (Nucleus nucleus in this.clusterNuclei) { + foreach (Nucleus nucleus in this.nuclei) { if (nucleus is Cluster) { //IReceptor receptor) { if (nucleus.name == nucleusName | nucleus.name == nucleusName0) return nucleus; @@ -762,16 +766,16 @@ namespace NanoBrain { } public bool DeleteNucleus(Nucleus nucleus) { - if (this.clusterNuclei.Contains(nucleus) == false) { + if (this.nuclei.Contains(nucleus) == false) { // Try to find the nucleus by name if (TryGetNucleus(nucleus.name, out nucleus) == false) return false; } Neuron.Delete(nucleus); - int nucleusIx = this.clusterNuclei.IndexOf(nucleus); - this.clusterNuclei.Remove(nucleus); - this.prefab.nuclei.RemoveAt(nucleusIx); + int nucleusIx = this.nuclei.IndexOf(nucleus); + this.nuclei.Remove(nucleus); + this.prefab.cluster.nuclei.RemoveAt(nucleusIx); RefreshOutputs(); return true; @@ -781,7 +785,7 @@ namespace NanoBrain { public virtual List CollectReceivers(bool removeDuplicates = false) { List receivers = new(); - foreach (Nucleus outputNucleus in this.clusterNuclei) { + foreach (Nucleus outputNucleus in this.nuclei) { if (outputNucleus is not Neuron output) continue; @@ -802,7 +806,7 @@ namespace NanoBrain { public List<(Neuron, Nucleus)> CollectConnections() { List<(Neuron, Nucleus)> connections = new(); - foreach (Nucleus outputNucleus in this.clusterNuclei) { + foreach (Nucleus outputNucleus in this.nuclei) { if (outputNucleus is not Neuron output) continue; @@ -817,10 +821,10 @@ namespace NanoBrain { public List CollectSynapsesTo(Cluster otherCluster) { List collectedSynapses = new(); - foreach (Nucleus nucleus in this.clusterNuclei) { + foreach (Nucleus nucleus in this.nuclei) { if (nucleus is not Neuron neuron) continue; - foreach (Synapse synapse in nucleus.synapses) { + foreach (Synapse synapse in neuron.synapses) { if (synapse.neuron.parent == otherCluster) collectedSynapses.Add(synapse); } @@ -830,7 +834,7 @@ namespace NanoBrain { public void MoveReceivers(Cluster newCluster) { Debug.Log($"Move receivers for {this.name} to {newCluster.name}"); - foreach (Nucleus outputNucleus in this.clusterNuclei) { + foreach (Nucleus outputNucleus in this.nuclei) { if (outputNucleus is not Neuron output) continue; @@ -846,7 +850,9 @@ namespace NanoBrain { // Replace synapse with new synapse // to the new cluster Debug.Log($"move {receiver.name} from {this.name}.{output.name} to {newCluster.name}.{newOutput.name}"); - Synapse synapse = receiver.GetSynapse(output); + if (receiver is not Neuron receiverNeuron) + continue; + Synapse synapse = receiverNeuron.GetSynapse(output); newOutput.AddReceiver(receiver, synapse.weight); output.RemoveReceiver(receiver); } @@ -896,7 +902,7 @@ namespace NanoBrain { } public override void UpdateNuclei() { - foreach (Nucleus nucleus in this.clusterNuclei) + foreach (Nucleus nucleus in this.nuclei) nucleus.UpdateNuclei(); } diff --git a/NanoBrain/Runtime/Scripts/Core/Neuron.cs b/NanoBrain/Runtime/Scripts/Core/Neuron.cs index a4bbed8..f85a2e3 100644 --- a/NanoBrain/Runtime/Scripts/Core/Neuron.cs +++ b/NanoBrain/Runtime/Scripts/Core/Neuron.cs @@ -23,7 +23,7 @@ namespace NanoBrain { public Neuron(Cluster parent, string name) { this.parent = parent; this.name = name; - this.parent?.clusterNuclei.Add(this); + this.parent?.nuclei.Add(this); } /// /// Create a new Neuron in a Cluster Prefab @@ -34,8 +34,8 @@ namespace NanoBrain { this.clusterPrefab = prefab; this.name = name; if (this.clusterPrefab != null) { - this.clusterPrefab.nuclei.Add(this); - this.clusterPrefab.RefreshOutputs(); + this.clusterPrefab.cluster.nuclei.Add(this); + this.clusterPrefab.cluster.RefreshOutputs(); } else Debug.LogError("No prefab when adding neuron to prefab"); @@ -43,6 +43,71 @@ namespace NanoBrain { #region Serialization + /// + /// The bias + /// + /// The bias which a value which is always added to the combined value of the neuron + /// It does not have a synapse and therefore no weight of source nucleus + public Vector3 bias = Vector3.zero; + + + #region Synapses + + [SerializeField] + private List _synapses = new(); + /// + /// The synapses of the nucleus + /// + public List synapses => _synapses; + + /// + /// Add a new synapse to this nuclues + /// + /// The nucleus from which the signals may originate + /// The weight applied to the input. Default value = 1 + /// The created Synapse + /// This will add a new input to this nucleus with the given weight. + public Synapse AddSynapse(Neuron sendingNucleus, float weight = 1) { + Synapse synapse = new(sendingNucleus, weight); + this.synapses.Add(synapse); + return synapse; + } + + // public Synapse AddSynapse(ClusterPrefab clusterPrefab, string neuronName, float weight = 1) { + + // } + + /// + /// Find a synapse + /// + /// The sender of the input to the Synapse + /// The found Synapse or null when the sender has no synapse to this nucleus. + public Synapse GetSynapse(Nucleus sender) { + foreach (Synapse synapse in this.synapses) + if (synapse.neuron == sender) + return synapse; + return null; + } + + /// + /// Remove a synapse from a Nucleus + /// + /// Remote the synapse connecting to this Nucleus + public void RemoveSynapse(Nucleus sendingNucleus) { + this.synapses.RemoveAll(synapse => synapse.neuron == sendingNucleus); + } + + #endregion Synapses + + /// + /// Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus + /// + /// + public virtual void SetBias(Vector3 inputValue) { + this.bias = inputValue; + this.parent.UpdateFromNucleus(this); + } + /// /// The type of combinators /// @@ -231,13 +296,20 @@ namespace NanoBrain { } } + /// + /// Toggle for printing debugging trace data + /// + public bool trace = false; + [NonSerialized] public float lastUpdate = 0; public readonly float timeToSleep = 1f; /// \copydoc NanoBrain::Nucleus::ShallowCloneTo public override Nucleus ShallowCloneTo(Cluster newParent) { - Neuron clone = new(newParent, this.name); + Neuron clone = new(newParent, this.name) { + // prefabNucleus = this + }; CloneFields(clone); return clone; } @@ -268,8 +340,8 @@ namespace NanoBrain { public static void Delete(Nucleus nucleus) { if (nucleus == null) return; - if (nucleus.synapses != null) { - foreach (Synapse synapse in nucleus.synapses) { + if (nucleus is Neuron neuron) { + foreach (Synapse synapse in neuron.synapses) { if (synapse.neuron is Neuron synapse_nucleus) { if (synapse_nucleus.receivers.Count > 1) { // there is another nucleus feeding into this input nucleus @@ -281,19 +353,21 @@ namespace NanoBrain { } } } - } - if (nucleus is Neuron neuron) { foreach (Nucleus receiver in neuron.receivers) { - if (receiver != null && receiver.synapses != null) - receiver.synapses.RemoveAll(s => s.neuron == nucleus); + if (receiver is not Neuron receiverNeuron) + continue; + if (receiver != null && receiverNeuron.synapses != null) + receiverNeuron.synapses.RemoveAll(s => s.neuron == nucleus); } } else if (nucleus is Cluster cluster) { // remove all receivers for this cluster - foreach (Nucleus clusterNucleus in cluster.clusterNuclei) { + foreach (Nucleus clusterNucleus in cluster.nuclei) { if (clusterNucleus is Neuron output) { foreach (Nucleus receiver in output.receivers) { - receiver.synapses.RemoveAll(s => s.neuron == output); + if (receiver is not Neuron receiverNeuron) + continue; + receiverNeuron.synapses.RemoveAll(s => s.neuron == output); } } } @@ -301,8 +375,8 @@ namespace NanoBrain { if (nucleus.clusterPrefab != null) { - nucleus.clusterPrefab.nuclei.RemoveAll(n => n == nucleus); - nucleus.clusterPrefab.RefreshOutputs(); + nucleus.clusterPrefab.cluster.nuclei.RemoveAll(n => n == nucleus); + nucleus.clusterPrefab.cluster.RefreshOutputs(); nucleus.clusterPrefab.GarbageCollection(); } } @@ -524,15 +598,25 @@ namespace NanoBrain { } public virtual void AddReceiver(Nucleus receiverToAdd, float weight = 1) { - this._receivers.Add(receiverToAdd); - receiverToAdd.AddSynapse(this, weight); + if (receiverToAdd is not Neuron receiverNeuron) + return; + this._receivers.Add(receiverNeuron); + receiverNeuron.AddSynapse(this, weight); //Debug.Log($"Add synapse {this.clusterPrefab.name}.{this.name} -> {receiverToAdd.name} --- [{this.receivers.Count}]"); } public virtual void RemoveReceiver(Nucleus receiverToRemove) { - this._receivers.RemoveAll(receiver => receiver == receiverToRemove); - receiverToRemove.synapses.RemoveAll(synapse => synapse.neuron == this); + if (receiverToRemove is not Neuron receiverNeuron) + return; + this._receivers.RemoveAll(receiver => receiver == receiverNeuron); + receiverNeuron.synapses.RemoveAll(synapse => synapse.neuron == this); + + // Nucleus prefabReceiver = receiverToRemove.prefabNucleus; + // if (this.prefabNucleus is Neuron prefabNeuron && prefabReceiver != null) { + // prefabNeuron.receivers.RemoveAll(receiver => receiver == prefabReceiver); + // prefabReceiver.synapses.RemoveAll(synapse => synapse.neuron == prefabNeuron); + // } } diff --git a/NanoBrain/Runtime/Scripts/Core/Nucleus.cs b/NanoBrain/Runtime/Scripts/Core/Nucleus.cs index 314fee3..ecd9579 100644 --- a/NanoBrain/Runtime/Scripts/Core/Nucleus.cs +++ b/NanoBrain/Runtime/Scripts/Core/Nucleus.cs @@ -17,6 +17,9 @@ public abstract class Nucleus { /// public string name; + // [NonSerialized] + // public Nucleus prefabNucleus; + /// /// The cluster prefab in which the nucleus is located /// @@ -31,7 +34,7 @@ public abstract class Nucleus { /// /// Toggle for printing debugging trace data /// - public bool trace = false; + //public bool trace = false; /// /// Function to make a partial clone of this nucleus @@ -61,60 +64,60 @@ public abstract class Nucleus { public virtual void Initialize() {} - #region Synapses + // #region Synapses - /// - /// The bias of the nucleus - /// - /// The bias which a value which is always added to the combined value of the nucleus - /// It does not have a synapse and therefore no weight of source nucleus - public Vector3 bias = Vector3.zero; + // /// + // /// The bias of the nucleus + // /// + // /// The bias which a value which is always added to the combined value of the nucleus + // /// It does not have a synapse and therefore no weight of source nucleus + // //public Vector3 bias = Vector3.zero; - [SerializeField] - private List _synapses = new(); - /// - /// The synapses of the nucleus - /// - public List synapses => _synapses; + // [SerializeField] + // private List _synapses = new(); + // /// + // /// The synapses of the nucleus + // /// + // public List synapses => _synapses; - /// - /// Add a new synapse to this nuclues - /// - /// The nucleus from which the signals may originate - /// The weight applied to the input. Default value = 1 - /// The created Synapse - /// This will add a new input to this nucleus with the given weight. - public Synapse AddSynapse(Neuron sendingNucleus, float weight = 1) { - Synapse synapse = new(sendingNucleus, weight); - this.synapses.Add(synapse); - return synapse; - } + // /// + // /// Add a new synapse to this nuclues + // /// + // /// The nucleus from which the signals may originate + // /// The weight applied to the input. Default value = 1 + // /// The created Synapse + // /// This will add a new input to this nucleus with the given weight. + // public Synapse AddSynapse(Neuron sendingNucleus, float weight = 1) { + // Synapse synapse = new(sendingNucleus, weight); + // this.synapses.Add(synapse); + // return synapse; + // } - // public Synapse AddSynapse(ClusterPrefab clusterPrefab, string neuronName, float weight = 1) { + // // public Synapse AddSynapse(ClusterPrefab clusterPrefab, string neuronName, float weight = 1) { - // } + // // } - /// - /// Find a synapse - /// - /// The sender of the input to the Synapse - /// The found Synapse or null when the sender has no synapse to this nucleus. - public Synapse GetSynapse(Nucleus sender) { - foreach (Synapse synapse in this.synapses) - if (synapse.neuron == sender) - return synapse; - return null; - } + // /// + // /// Find a synapse + // /// + // /// The sender of the input to the Synapse + // /// The found Synapse or null when the sender has no synapse to this nucleus. + // public Synapse GetSynapse(Nucleus sender) { + // foreach (Synapse synapse in this.synapses) + // if (synapse.neuron == sender) + // return synapse; + // return null; + // } - /// - /// Remove a synapse from a Nucleus - /// - /// Remote the synapse connecting to this Nucleus - public void RemoveSynapse(Nucleus sendingNucleus) { - this.synapses.RemoveAll(synapse => synapse.neuron == sendingNucleus); - } + // /// + // /// Remove a synapse from a Nucleus + // /// + // /// Remote the synapse connecting to this Nucleus + // public void RemoveSynapse(Nucleus sendingNucleus) { + // this.synapses.RemoveAll(synapse => synapse.neuron == sendingNucleus); + // } - #endregion Synapses + // #endregion Synapses #region Update @@ -129,14 +132,14 @@ public abstract class Nucleus { public virtual void UpdateNuclei() { } - /// - /// Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus - /// - /// - public virtual void SetBias(Vector3 inputValue) { - this.bias = inputValue; - this.parent.UpdateFromNucleus(this); - } + // /// + // /// Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus + // /// + // /// + // public virtual void SetBias(Vector3 inputValue) { + // this.bias = inputValue; + // this.parent.UpdateFromNucleus(this); + // } /// /// Process an external stimulus diff --git a/NanoBrain/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs b/NanoBrain/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs index 2920733..df72c27 100644 --- a/NanoBrain/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs +++ b/NanoBrain/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs @@ -8,87 +8,94 @@ namespace NanoBrain { /// [CreateAssetMenu(menuName = "Passer/Cluster")] public class ClusterPrefab : ScriptableObject { - /// The nuclei in this cluster - [SerializeReference] - // This list should not include any clusters... - public List nuclei = new(); - /// - /// The output of this cluster - /// - /// This only returens the first(default) nucleus. Use outputs[0] instead - public virtual Nucleus output => this.nuclei[0] as Nucleus; + public Cluster cluster; + /* + /// The nuclei in this cluster + [SerializeReference] + // This list should not include any clusters... + public List nuclei = new(); - /// - /// The nuclei in this cluster which are meant for receiving signals from outside the cluster - /// - /// This is currently the nuclei which do not have any incoming synapse - public List _inputs = null; - public virtual List inputs { - get { - if (this._inputs == null) { - this._inputs = new(); - foreach (Nucleus receptor in this.nuclei) { - if (receptor is Nucleus nucleus) { - // inputs have no incoming synapses yet. - if (nucleus.synapses.Count == 0) - this._inputs.Add(nucleus); + /// + /// The output of this cluster + /// + /// This only returens the first(default) nucleus. Use outputs[0] instead + public virtual Nucleus output => this.nuclei[0] as Nucleus; + + /// + /// The nuclei in this cluster which are meant for receiving signals from outside the cluster + /// + /// This is currently the nuclei which do not have any incoming synapse + public List _inputs = null; + public virtual List inputs { + get { + if (this._inputs == null) { + this._inputs = new(); + foreach (Nucleus receptor in this.nuclei) { + if (receptor is Nucleus nucleus) { + // inputs have no incoming synapses yet. + if (nucleus.synapses.Count == 0) + this._inputs.Add(nucleus); + } + } } + return this._inputs; } } - return this._inputs; - } - } - /// - /// The nuclei in this cluster which are meant for sending signals onward - /// - private List _outputs = null; - public List outputs { - get { - if (this._outputs == null) - RefreshOutputs(); - return this._outputs; - } - } - /// - /// Redetermine the outpus in the cluster - /// - public void RefreshOutputs() { - this._outputs = new(); - foreach (Nucleus nucleus in this.nuclei) { - if (nucleus is Neuron neuron && neuron.receivers.Count == 0) - this._outputs.Add(nucleus); - } - } - + /// + /// The nuclei in this cluster which are meant for sending signals onward + /// + private List _outputs = null; + public List outputs { + get { + if (this._outputs == null) + RefreshOutputs(); + return this._outputs; + } + } + /// + /// Redetermine the outpus in the cluster + /// + public void RefreshOutputs() { + this._outputs = new(); + foreach (Nucleus nucleus in this.nuclei) { + if (nucleus is Neuron neuron && neuron.receivers.Count == 0) + this._outputs.Add(nucleus); + } + } + */ /// /// Retrieve a nucleus in this cluster /// /// The name of the nucleus /// The Nucleus with the given name or null if no such Nucleus could be found public Nucleus GetNucleus(string nucleusName) { - foreach (Nucleus nucleus in this.nuclei) { - if (nucleus.name == nucleusName) - return nucleus; - } - return null; + return cluster.GetNucleus(nucleusName); + // foreach (Nucleus nucleus in this.nuclei) { + // if (nucleus.name == nucleusName) + // return nucleus; + // } + // return null; } // Call this function to ensure that there is at least one nucleus // This is an invariant and should be ensured before the nucleus is used // because output requires it. public void EnsureInitialization() { - nuclei ??= new List(); - if (nuclei.Count == 0) + this.cluster.nuclei ??= new List(); + if (this.cluster.nuclei.Count <= 0) new Neuron(this, "Output"); // Every cluster should have at least 1 neuron + // nuclei ??= new List(); + // if (nuclei.Count == 0) + // new Neuron(this, "Output"); // Every cluster should have at least 1 neuron } public void GarbageCollection() { - HashSet visitedNuclei = new(); - foreach (Nucleus output in this.outputs) - MarkNuclei(visitedNuclei, output); - //Debug.Log($"Garbage collection found {visitedNuclei.Count} Nuclei"); - this.nuclei.RemoveAll(nucleus => visitedNuclei.Contains(nucleus) == false); + // HashSet visitedNuclei = new(); + // foreach (Nucleus output in this.outputs) + // MarkNuclei(visitedNuclei, output); + // //Debug.Log($"Garbage collection found {visitedNuclei.Count} Nuclei"); + // this.nuclei.RemoveAll(nucleus => visitedNuclei.Contains(nucleus) == false); } public void MarkNuclei(HashSet visitedNuclei, Nucleus nucleus) { @@ -99,43 +106,45 @@ namespace NanoBrain { visitedNuclei.Add(nucleus.parent); else visitedNuclei.Add(nucleus); - if (nucleus.synapses != null) { - HashSet visitedSynapses = new(); - foreach (Synapse synapse in nucleus.synapses) { - if (synapse != null && synapse.neuron != null) { - visitedSynapses.Add(synapse); - if (synapse.neuron is Nucleus synapse_nucleus) - MarkNuclei(visitedNuclei, synapse_nucleus); + if (nucleus is Neuron neuron) { + if (neuron.synapses != null) { + HashSet visitedSynapses = new(); + foreach (Synapse synapse in neuron.synapses) { + if (synapse != null && synapse.neuron != null) { + visitedSynapses.Add(synapse); + if (synapse.neuron is Nucleus synapse_nucleus) + MarkNuclei(visitedNuclei, synapse_nucleus); + } } + neuron.synapses.RemoveAll(synapse => visitedSynapses.Contains(synapse) == false); } - nucleus.synapses.RemoveAll(synapse => visitedSynapses.Contains(synapse) == false); - } - if (nucleus is Neuron neuron && neuron.receivers != null) { - HashSet visitedReceivers = new(); - foreach (Nucleus receiver in neuron.receivers) { - if (receiver != null && receiver != null) { - visitedReceivers.Add(receiver); - visitedNuclei.Add(receiver); + if (neuron.receivers != null) { + HashSet visitedReceivers = new(); + foreach (Nucleus receiver in neuron.receivers) { + if (receiver != null && receiver != null) { + visitedReceivers.Add(receiver); + visitedNuclei.Add(receiver); + } } + neuron.receivers.RemoveAll(receiver => visitedReceivers.Contains(receiver) == false); } - neuron.receivers.RemoveAll(receiver => visitedReceivers.Contains(receiver) == false); } } - public virtual void UpdateNuclei() { - foreach (Nucleus nucleus in this.nuclei) - nucleus.UpdateNuclei(); - } + // public virtual void UpdateNuclei() { + // foreach (Nucleus nucleus in this.nuclei) + // nucleus.UpdateNuclei(); + // } - public int GetNucleusIndex(Nucleus receiver) { - int ix = 0; - foreach (Nucleus nucleus in this.nuclei) { - if (receiver == nucleus) - return ix; - ix++; - } - return -1; - } + // public int GetNucleusIndex(Nucleus receiver) { + // int ix = 0; + // foreach (Nucleus nucleus in this.nuclei) { + // if (receiver == nucleus) + // return ix; + // ix++; + // } + // return -1; + // } } } diff --git a/Runtime/Scripts/Ant.cs b/Runtime/Scripts/Ant.cs index 7eb26cc..5049d38 100644 --- a/Runtime/Scripts/Ant.cs +++ b/Runtime/Scripts/Ant.cs @@ -43,11 +43,11 @@ namespace CreatureControl { /// /// It is used by the brain to do things periodically /// like placing pheromones - public Nucleus beat; + public Neuron beat; - public Nucleus pheromoneSteering; - public Nucleus hitLeft; - public Nucleus hitRight; + public Neuron pheromoneSteering; + public Neuron hitLeft; + public Neuron hitRight; public Neuron foodReceptor; public Neuron homeReceptor; @@ -60,6 +60,22 @@ namespace CreatureControl { base.Awake(); this.nanoBrain = GetComponentInChildren(); + + Cluster brain = this.nanoBrain.brain; + if (brain != null) { + //--- brain inputs + + this.beat = brain.GetNucleus("Beat") as Neuron; + this.hitLeft = brain.GetNucleus("Hit Left") as Neuron; + this.hitRight = brain.GetNucleus("Hit Right") as Neuron; + this.foodReceptor = brain.GetNucleus("Food Receptor") as Neuron; + this.homeReceptor = brain.GetNucleus("Home Receptor") as Neuron; + this.pheromoneSteering = brain.GetNucleus("Pheromone Steering") as Neuron; + + //--- brain outputs + this.targetDirection = brain.GetNucleus("Output") as Neuron; + this.hasFood = brain.GetNucleus("Having Food") as Neuron; + } } #endregion Init @@ -71,17 +87,6 @@ namespace CreatureControl { Cluster brain = this.nanoBrain.brain; if (brain != null) { - //--- brain inputs - - this.beat = brain.GetNucleus("Beat"); - this.hitLeft = brain.GetNucleus("Hit Left"); - this.hitRight = brain.GetNucleus("Hit Right"); - this.foodReceptor = brain.GetNucleus("Food Receptor") as Neuron; - this.homeReceptor = brain.GetNucleus("Home Receptor") as Neuron; - this.pheromoneSteering = brain.GetNucleus("Pheromone Steering"); - - //--- brain outputs - this.targetDirection = brain.defaultOutput; // Try to find the Home Pheromones Neuron if (brain.GetNucleus("Home Pheromones") is Neuron homePheromones) @@ -92,7 +97,6 @@ namespace CreatureControl { // and call PlaceFoodPheromone when it is firing foodPheromones.WhenFiring += PlaceFoodPheromone; - this.hasFood = brain.GetNucleus("Having Food") as Neuron; } // Initialize the callbacks for the antenna colliders diff --git a/Samples/Brain/Foraging.asset b/Samples/Brain/Foraging.asset deleted file mode 100644 index 1a95a08..0000000 --- a/Samples/Brain/Foraging.asset +++ /dev/null @@ -1,233 +0,0 @@ -%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: Foraging - m_EditorClassIdentifier: - nuclei: - - rid: 2642584373999960064 - - rid: 2642584373999960065 - references: - version: 2 - RefIds: - - rid: -2 - type: {class: , ns: , asm: } - - rid: 2642584373999960064 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Output - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _curvePreset: 0 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - curveMax: 1 - _receivers: [] - - rid: 2642584373999960065 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Collision Steering - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2642584373999960066 - - rid: 2642584373999960068 - - rid: 2642584373999960066 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Output - clusterPrefab: {fileID: 11400000} - parent: - rid: 2642584373999960067 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 2642584373999960065 - weight: 1 - combinator: 0 - _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 - _receivers: [] - - rid: 2642584373999960067 - type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Foraging - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - prefab: {fileID: 11400000} - siblingClusters: [] - instanceCount: 1 - clusterNuclei: - - rid: 2642584373999960066 - - rid: 2642584373999960068 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Output - clusterPrefab: {fileID: 11400000} - parent: - rid: 2642584373999960069 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 2642584373999960065 - weight: 1 - combinator: 0 - _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 - _receivers: [] - - rid: 2642584373999960069 - type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Foraging - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - prefab: {fileID: 11400000} - siblingClusters: [] - instanceCount: 1 - clusterNuclei: - - rid: 2642584373999960068 - - rid: 2642584373999960070 - - rid: 2642584373999960070 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Collision Steering - clusterPrefab: {fileID: 11400000} - parent: - rid: 2642584373999960069 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: [] diff --git a/Samples/Brain/New Cluster Prefab.asset b/Samples/Brain/New Cluster Prefab.asset new file mode 100644 index 0000000..a68edb6 --- /dev/null +++ b/Samples/Brain/New Cluster Prefab.asset @@ -0,0 +1,109 @@ +%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 Prefab + m_EditorClassIdentifier: + cluster: + name: + clusterPrefab: {fileID: 0} + parent: + rid: -2 + prefab: {fileID: 0} + instanceCount: 0 + nuclei: + - rid: 4201949831649034293 + - rid: 4201949831649034294 + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } + - rid: 4201949831649034293 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Output + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 4201949831649034294 + weight: 1 + combinator: 0 + _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 + trace: 0 + _receivers: [] + - rid: 4201949831649034294 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New neuron + clusterPrefab: {fileID: 11400000} + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + trace: 0 + _receivers: + - rid: 4201949831649034293 diff --git a/Samples/Brain/Foraging.asset.meta b/Samples/Brain/New Cluster Prefab.asset.meta similarity index 79% rename from Samples/Brain/Foraging.asset.meta rename to Samples/Brain/New Cluster Prefab.asset.meta index cc22036..551433b 100644 --- a/Samples/Brain/Foraging.asset.meta +++ b/Samples/Brain/New Cluster Prefab.asset.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 81292defec7ff5278a48a5d154659d00 +guid: c8e4b0990eb7dbbc4bee34addd9cd2b8 NativeFormatImporter: externalObjects: {} mainObjectFileID: 11400000 From d2ef26b6f8464427518e74a40f9808c70a7bbe62 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 5 May 2026 11:14:35 +0200 Subject: [PATCH 28/38] Removed clusterPrefab property --- NanoBrain/Editor/ClusterEditor.cs | 27 ++++++------- NanoBrain/Runtime/Scripts/Core/Cluster.cs | 24 ++++++------ NanoBrain/Runtime/Scripts/Core/MemoryCell.cs | 2 +- NanoBrain/Runtime/Scripts/Core/Neuron.cs | 32 ++++++++-------- NanoBrain/Runtime/Scripts/Core/Nucleus.cs | 5 ++- .../ScriptableObjects/ClusterPrefab.cs | 5 ++- Samples/Brain/New Cluster Prefab.asset | 38 +++++++++++-------- 7 files changed, 73 insertions(+), 60 deletions(-) diff --git a/NanoBrain/Editor/ClusterEditor.cs b/NanoBrain/Editor/ClusterEditor.cs index ae1a535..ce75239 100644 --- a/NanoBrain/Editor/ClusterEditor.cs +++ b/NanoBrain/Editor/ClusterEditor.cs @@ -232,7 +232,7 @@ namespace NanoBrain { bool connecting = GUILayout.Button("Add Output Neuron"); if (connecting) { - Nucleus newOutput = new Neuron(this.prefab, "New Output"); + Nucleus newOutput = new Neuron(this.prefab.cluster, "New Output"); // Regenerate the temporary clsuter instance // See also the constructor this.currentCluster = new(this.prefab); @@ -351,21 +351,21 @@ namespace NanoBrain { else { EditorGUILayout.BeginHorizontal(); - if (synapse.neuron.clusterPrefab != this.currentNucleus.clusterPrefab) { + if (synapse.neuron.parent.prefab != this.currentNucleus.parent.prefab) { // If it is a different cluster GUIStyle labelStyle = new(GUI.skin.label); float labelWidth = 200; - if (synapse.neuron.clusterPrefab != null) { - labelWidth = labelStyle.CalcSize(new GUIContent($"{synapse.neuron.clusterPrefab.name}.")).x; - GUILayout.Label($"{synapse.neuron.clusterPrefab.name}", GUILayout.Width(labelWidth)); + if (synapse.neuron.parent.prefab != null) { + labelWidth = labelStyle.CalcSize(new GUIContent($"{synapse.neuron.parent.prefab.name}.")).x; + GUILayout.Label($"{synapse.neuron.parent.prefab.name}", GUILayout.Width(labelWidth)); } - string[] options = synapse.neuron.clusterPrefab.cluster.nuclei.Select(n => n.name).ToArray(); + string[] options = synapse.neuron.parent.prefab.cluster.nuclei.Select(n => n.name).ToArray(); int selectedIndex = System.Array.IndexOf(options, synapse.neuron.name); int newIndex = EditorGUILayout.Popup(selectedIndex, options); if (newIndex != selectedIndex) { // Nucleus selectedNucleus = synapse.neuron.parent.clusterNuclei[newIndex]; // Neuron newNeuron = selectedNucleus as Neuron; - Neuron newNeuron = synapse.neuron.clusterPrefab.cluster.nuclei[newIndex] as Neuron; + Neuron newNeuron = synapse.neuron.parent.prefab.cluster.nuclei[newIndex] as Neuron; ChangeSynapse(synapse, newNeuron); } } @@ -445,13 +445,14 @@ namespace NanoBrain { } protected virtual void AddNeuronInput(Nucleus nucleus) { - Neuron newNeuroid = new(this.prefab, "New neuron"); - newNeuroid.AddReceiver(nucleus); - this.currentNucleus = newNeuroid; + Neuron newNeuron = new (this.currentCluster, "New Neuron"); + //Neuron newNeuroid = new(this.prefab.cluster, "New neuron"); + newNeuron.AddReceiver(nucleus); + this.currentNucleus = newNeuron; } protected virtual void AddMemoryCellInput(Nucleus nucleus) { - MemoryCell newMemory = new(this.prefab, "New memory cell"); + MemoryCell newMemory = new(this.prefab.cluster, "New memory cell"); newMemory.AddReceiver(nucleus); this.currentNucleus = newMemory; } @@ -531,13 +532,13 @@ namespace NanoBrain { } protected virtual void DisconnectNucleus(Neuron nucleus) { - if (this.currentNucleus.clusterPrefab == null) + if (this.currentNucleus.parent.prefab == null) return; Neuron currentNeuron = this.currentNucleus as Neuron; string[] names = currentNeuron.synapses.Select(synapse => synapse.neuron.name).ToArray(); int selectedIndex = -1; selectedIndex = EditorGUILayout.Popup("Disconnect from", selectedIndex, names); - if (selectedIndex >= 0 && selectedIndex < this.currentNucleus.clusterPrefab.cluster.nuclei.Count) { + if (selectedIndex >= 0 && selectedIndex < this.currentNucleus.parent.prefab.cluster.nuclei.Count) { Synapse synapse = currentNeuron.synapses[selectedIndex]; synapse.neuron.RemoveReceiver(this.currentNucleus); diff --git a/NanoBrain/Runtime/Scripts/Core/Cluster.cs b/NanoBrain/Runtime/Scripts/Core/Cluster.cs index 657ae08..7dcf31c 100644 --- a/NanoBrain/Runtime/Scripts/Core/Cluster.cs +++ b/NanoBrain/Runtime/Scripts/Core/Cluster.cs @@ -72,10 +72,10 @@ namespace NanoBrain { public Cluster(ClusterPrefab prefab, ClusterPrefab parent = null) { this.prefab = prefab; this.name = prefab.name; - this.clusterPrefab = parent; + this.parent.prefab = parent; - if (this.clusterPrefab != null) - this.clusterPrefab.cluster.nuclei.Add(this); + if (this.parent.prefab != null) + this.parent.prefab.cluster.nuclei.Add(this); ClonePrefab(); _ = this.inputs; @@ -108,9 +108,9 @@ namespace NanoBrain { foreach (Synapse prefabSynapse in prefabNeuron.synapses) { Neuron synapseNeuron = prefabSynapse.neuron; - if (synapseNeuron.clusterPrefab != null && synapseNeuron.clusterPrefab != this.prefab) { + if (synapseNeuron.parent.prefab != null && synapseNeuron.parent.prefab != this.prefab) { // Neuron is in another cluster, find the cloned cluster first - ClusterPrefab prefabCluster = synapseNeuron.clusterPrefab; + ClusterPrefab prefabCluster = synapseNeuron.parent.prefab; Cluster clonedCluster = this.nuclei.Find(n => n.name == prefabCluster.name) as Cluster; if (clonedCluster == null) continue; @@ -177,7 +177,7 @@ namespace NanoBrain { Debug.Log($"create {clonedCluster.prefab.name} sibling"); Cluster sibling = new(clonedCluster.prefab, this) { name = $"{clonedCluster.baseName}: {instanceIx}", - clusterPrefab = this.clusterPrefab, + parent = this.parent, instanceCount = this.instanceCount, }; siblings.Add(sibling); @@ -286,9 +286,9 @@ namespace NanoBrain { private void CloneSynapses(Neuron prefabNeuron, Neuron clonedNeuron) { foreach (Synapse prefabSynapse in prefabNeuron.synapses) { Neuron synapseNeuron = prefabSynapse.neuron; - if (synapseNeuron.clusterPrefab != null && synapseNeuron.clusterPrefab != this.prefab) { + if (synapseNeuron.parent.prefab != null && synapseNeuron.parent.prefab != this.prefab) { // Neuron is in another cluster, find the cloned cluster first - ClusterPrefab prefabCluster = synapseNeuron.clusterPrefab; + ClusterPrefab prefabCluster = synapseNeuron.parent.prefab; Cluster clonedCluster = this.nuclei.Find(n => n.name == prefabCluster.name) as Cluster; if (clonedCluster == null) continue; @@ -404,7 +404,7 @@ namespace NanoBrain { // Clusters should not be cloned, but instantiated from the prefab.... Cluster clone = new(this.prefab, parent) { name = this.name, - clusterPrefab = this.clusterPrefab, + parent = this.parent, instanceCount = this.instanceCount, }; // Somehow siblingClusters should be cloned too. Believe I do this in ClonePrefab right now. @@ -793,7 +793,7 @@ namespace NanoBrain { foreach (Nucleus receiver in output.receivers) { // Debug.Log($"output {receiver.name}"); // Only add receivers outside this cluster - if (receiver.clusterPrefab != this.prefab) { + if (receiver.parent.prefab != this.prefab) { if (removeDuplicates == false || receivers.Contains(receiver) == false) // Debug.Log($" YES"); receivers.Add(receiver); @@ -812,7 +812,7 @@ namespace NanoBrain { foreach (Nucleus receiver in output.receivers) { // Only add receivers outside this cluster - if (receiver.clusterPrefab != this.prefab) + if (receiver.parent.prefab != this.prefab) connections.Add((output, receiver)); } } @@ -846,7 +846,7 @@ namespace NanoBrain { Debug.Log($"Check {this.name}.{output.name} receivers"); Nucleus[] receivers = output.receivers.ToArray(); foreach (Nucleus receiver in receivers) { - if (receiver.clusterPrefab != this.prefab) { + if (receiver.parent.prefab != this.prefab) { // Replace synapse with new synapse // to the new cluster Debug.Log($"move {receiver.name} from {this.name}.{output.name} to {newCluster.name}.{newOutput.name}"); diff --git a/NanoBrain/Runtime/Scripts/Core/MemoryCell.cs b/NanoBrain/Runtime/Scripts/Core/MemoryCell.cs index 7f9fe6e..e959e16 100644 --- a/NanoBrain/Runtime/Scripts/Core/MemoryCell.cs +++ b/NanoBrain/Runtime/Scripts/Core/MemoryCell.cs @@ -12,7 +12,7 @@ namespace NanoBrain { [Serializable] public class MemoryCell : Neuron { - public MemoryCell(ClusterPrefab cluster, string name) : base(cluster, name) { } + // public MemoryCell(ClusterPrefab cluster, string name) : base(cluster, name) { } public MemoryCell(Cluster parent, string name) : base(parent, name) { } public bool staticMemory = false; diff --git a/NanoBrain/Runtime/Scripts/Core/Neuron.cs b/NanoBrain/Runtime/Scripts/Core/Neuron.cs index f85a2e3..1dd884f 100644 --- a/NanoBrain/Runtime/Scripts/Core/Neuron.cs +++ b/NanoBrain/Runtime/Scripts/Core/Neuron.cs @@ -30,16 +30,16 @@ namespace NanoBrain { /// /// The Cluster Preafb in which the new Neuron should be created /// The name of the new Neuron - public Neuron(ClusterPrefab prefab, string name) { - this.clusterPrefab = prefab; - this.name = name; - if (this.clusterPrefab != null) { - this.clusterPrefab.cluster.nuclei.Add(this); - this.clusterPrefab.cluster.RefreshOutputs(); - } - else - Debug.LogError("No prefab when adding neuron to prefab"); - } + // public Neuron(ClusterPrefab prefab, string name) { + // this.clusterPrefab = prefab; + // this.name = name; + // if (this.clusterPrefab != null) { + // this.clusterPrefab.cluster.nuclei.Add(this); + // this.clusterPrefab.cluster.RefreshOutputs(); + // } + // else + // Debug.LogError("No prefab when adding neuron to prefab"); + // } #region Serialization @@ -316,7 +316,7 @@ namespace NanoBrain { /// \copydoc NanoBrain::Nucleus::Clone public override Nucleus Clone(ClusterPrefab prefab) { - Neuron clone = new(prefab, this.name); + Neuron clone = new(prefab.cluster, this.name); CloneFields(clone); foreach (Synapse synapse in this.synapses) { Synapse clonedSynapse = clone.AddSynapse(synapse.neuron); @@ -329,7 +329,7 @@ namespace NanoBrain { } protected virtual void CloneFields(Neuron clone) { - clone.clusterPrefab = this.clusterPrefab; + clone.parent = this.parent; clone.bias = this.bias; clone.combinator = this.combinator; clone.curve = this.curve; @@ -374,10 +374,10 @@ namespace NanoBrain { } - if (nucleus.clusterPrefab != null) { - nucleus.clusterPrefab.cluster.nuclei.RemoveAll(n => n == nucleus); - nucleus.clusterPrefab.cluster.RefreshOutputs(); - nucleus.clusterPrefab.GarbageCollection(); + if (nucleus.parent.prefab != null) { + nucleus.parent.prefab.cluster.nuclei.RemoveAll(n => n == nucleus); + nucleus.parent.prefab.cluster.RefreshOutputs(); + nucleus.parent.prefab.GarbageCollection(); } } diff --git a/NanoBrain/Runtime/Scripts/Core/Nucleus.cs b/NanoBrain/Runtime/Scripts/Core/Nucleus.cs index ecd9579..5c91a4a 100644 --- a/NanoBrain/Runtime/Scripts/Core/Nucleus.cs +++ b/NanoBrain/Runtime/Scripts/Core/Nucleus.cs @@ -23,8 +23,9 @@ public abstract class Nucleus { /// /// The cluster prefab in which the nucleus is located /// - [SerializeReference] - public ClusterPrefab clusterPrefab; + // [SerializeReference] + // public ClusterPrefab clusterPrefab; + /// /// The cluster instance in which the nucleus is located /// diff --git a/NanoBrain/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs b/NanoBrain/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs index df72c27..574552d 100644 --- a/NanoBrain/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs +++ b/NanoBrain/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs @@ -82,9 +82,12 @@ namespace NanoBrain { // This is an invariant and should be ensured before the nucleus is used // because output requires it. public void EnsureInitialization() { + this.cluster.prefab = this; + this.cluster.name = this.name; this.cluster.nuclei ??= new List(); if (this.cluster.nuclei.Count <= 0) - new Neuron(this, "Output"); // Every cluster should have at least 1 neuron + new Neuron(this.cluster, "Output"); // Every cluster should have at least 1 neuron + this.cluster.instanceCount = 1; // nuclei ??= new List(); // if (nuclei.Count == 0) // new Neuron(this, "Output"); // Every cluster should have at least 1 neuron diff --git a/Samples/Brain/New Cluster Prefab.asset b/Samples/Brain/New Cluster Prefab.asset index a68edb6..5640dec 100644 --- a/Samples/Brain/New Cluster Prefab.asset +++ b/Samples/Brain/New Cluster Prefab.asset @@ -13,31 +13,29 @@ MonoBehaviour: m_Name: New Cluster Prefab m_EditorClassIdentifier: cluster: - name: - clusterPrefab: {fileID: 0} + name: New Cluster Prefab parent: rid: -2 - prefab: {fileID: 0} - instanceCount: 0 + prefab: {fileID: 11400000} + instanceCount: 1 nuclei: - - rid: 4201949831649034293 - - rid: 4201949831649034294 + - rid: 4201949831649034317 + - rid: 4201949831649034319 references: version: 2 RefIds: - rid: -2 type: {class: , ns: , asm: } - - rid: 4201949831649034293 + - rid: 4201949831649034317 type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} data: name: Output - clusterPrefab: {fileID: 11400000} parent: - rid: -2 + rid: 4201949831649034318 bias: {x: 0, y: 0, z: 0} _synapses: - neuron: - rid: 4201949831649034294 + rid: 4201949831649034319 weight: 1 combinator: 0 _curvePreset: 0 @@ -68,13 +66,23 @@ MonoBehaviour: curveMax: 1 trace: 0 _receivers: [] - - rid: 4201949831649034294 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + - rid: 4201949831649034318 + type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} data: - name: New neuron - clusterPrefab: {fileID: 11400000} + name: New Cluster Prefab parent: rid: -2 + prefab: {fileID: 11400000} + instanceCount: 1 + nuclei: + - rid: 4201949831649034317 + - rid: 4201949831649034319 + - rid: 4201949831649034319 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New Neuron + parent: + rid: 4201949831649034318 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -106,4 +114,4 @@ MonoBehaviour: curveMax: 1 trace: 0 _receivers: - - rid: 4201949831649034293 + - rid: 4201949831649034317 From 3f0ed444bb79763d65e93a10eb26a966b9d6a86b Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 5 May 2026 11:52:04 +0200 Subject: [PATCH 29/38] Make it work again --- CreatureControl/Runtime/Scripts/Creature.cs | 10 +- NanoBrain/Editor/ClusterEditor.cs | 37 +- NanoBrain/Runtime/Scripts/Core/Cluster.cs | 15 +- NanoBrain/Runtime/Scripts/Core/Neuron.cs | 5 +- .../ScriptableObjects/ClusterPrefab.cs | 62 +- Runtime/Scripts/Ant.cs | 4 +- Samples/Brain/New Cluster Prefab.asset | 112 ++- Samples/Foraging.unity | 780 ++++++++++++++++++ 8 files changed, 946 insertions(+), 79 deletions(-) diff --git a/CreatureControl/Runtime/Scripts/Creature.cs b/CreatureControl/Runtime/Scripts/Creature.cs index 2d67f04..62214bc 100644 --- a/CreatureControl/Runtime/Scripts/Creature.cs +++ b/CreatureControl/Runtime/Scripts/Creature.cs @@ -256,9 +256,9 @@ namespace CreatureControl { } public float GetDistanceToGround(float maxDistance, out Transform ground, out Vector3 normal) { - normal = Physics.gravity.normalized; + normal = -Physics.gravity.normalized; - Vector3 rayDirection = -normal; + Vector3 rayDirection = normal; int layerMask = Physics.DefaultRaycastLayers; float distance = maxDistance; @@ -275,8 +275,8 @@ namespace CreatureControl { 1 => transform.TransformDirection(Vector3.up), _ => transform.TransformDirection(Vector3.forward), }; - Vector3 p1 = centerWorld + up * half - normal * maxDistance; // top point - Vector3 p2 = centerWorld - up * half - normal * maxDistance; // bottom point + Vector3 p1 = centerWorld + up * half + normal * maxDistance; // top point + Vector3 p2 = centerWorld - up * half + normal * maxDistance; // bottom point // Debug.DrawRay(p1, 2 * maxDistance * -rayDirection, Color.magenta); // Debug.DrawRay(p2, 2 * maxDistance * -rayDirection, Color.magenta); @@ -284,7 +284,7 @@ namespace CreatureControl { maxDistance += colliderToGround; } else { - Vector3 rayStart = this.transform.position + normal * maxDistance; + Vector3 rayStart = this.transform.position - normal * maxDistance; // Debug.DrawRay(rayStart, 2 * maxDistance * rayDirection, Color.magenta); hits = Physics.RaycastAll(rayStart, rayDirection, maxDistance * 2, layerMask, QueryTriggerInteraction.Ignore); } diff --git a/NanoBrain/Editor/ClusterEditor.cs b/NanoBrain/Editor/ClusterEditor.cs index ce75239..868297d 100644 --- a/NanoBrain/Editor/ClusterEditor.cs +++ b/NanoBrain/Editor/ClusterEditor.cs @@ -88,7 +88,7 @@ namespace NanoBrain { if (Application.isPlaying == false) this.serializedBrain = new SerializedObject(this.prefab); - this.selectedOutput = this.currentCluster.outputs[0]; + this.selectedOutput = this.currentCluster.defaultOutput; this.currentNucleus = this.selectedOutput; //this.currentCluster = this.currentNucleus.parent; Rebuild(inspectorContainer); @@ -375,7 +375,7 @@ namespace NanoBrain { bool disconnecting = GUILayout.Button("Disconnect", GUILayout.Width(80)); if (disconnecting) { synapse.neuron.RemoveReceiver(this.currentNucleus); - this.prefab.GarbageCollection(); + this.currentCluster.Refresh(); anythingChanged = true; } EditorGUILayout.EndHorizontal(); @@ -517,35 +517,32 @@ namespace NanoBrain { EditorGUILayout.EndHorizontal(); if (connecting) { Nucleus nucleus = nuclei.ElementAt(selectedConnectNucleus); - // Nucleus prefabNucleus = this.prefab.cluster.nuclei.ElementAt(selectedConnectNucleus); if (nucleus is Cluster subCluster) { subCluster.AddArrayReceiver(this.currentNucleus); - // Cluster prefabSubCluster = prefabNucleus as Cluster; } else if (nucleus is Neuron neuron) { neuron.AddReceiver(this.currentNucleus); - // if (prefabNucleus is Neuron prefabNeuron) - // prefabNeuron.AddReceiver(this.currentPrefabNucleus); } + this.currentCluster.Refresh(); } return connecting; } - protected virtual void DisconnectNucleus(Neuron nucleus) { - if (this.currentNucleus.parent.prefab == null) - return; - Neuron currentNeuron = this.currentNucleus as Neuron; - string[] names = currentNeuron.synapses.Select(synapse => synapse.neuron.name).ToArray(); - int selectedIndex = -1; - selectedIndex = EditorGUILayout.Popup("Disconnect from", selectedIndex, names); - if (selectedIndex >= 0 && selectedIndex < this.currentNucleus.parent.prefab.cluster.nuclei.Count) { - Synapse synapse = currentNeuron.synapses[selectedIndex]; - synapse.neuron.RemoveReceiver(this.currentNucleus); + // protected virtual void DisconnectNucleus(Neuron nucleus) { + // if (this.currentNucleus.parent.prefab == null) + // return; + // Neuron currentNeuron = this.currentNucleus as Neuron; + // string[] names = currentNeuron.synapses.Select(synapse => synapse.neuron.name).ToArray(); + // int selectedIndex = -1; + // selectedIndex = EditorGUILayout.Popup("Disconnect from", selectedIndex, names); + // if (selectedIndex >= 0 && selectedIndex < this.currentNucleus.parent.prefab.cluster.nuclei.Count) { + // Synapse synapse = currentNeuron.synapses[selectedIndex]; + // synapse.neuron.RemoveReceiver(this.currentNucleus); - // synapse = currentNeuron.synapses[selectedIndex]; - // synapse.neuron.RemoveReceiver(this.currentPrefabNucleus); - } - } + // // synapse = currentNeuron.synapses[selectedIndex]; + // // synapse.neuron.RemoveReceiver(this.currentPrefabNucleus); + // } + // } protected virtual void DeleteNucleus(Nucleus nucleus) { if (nucleus == null) diff --git a/NanoBrain/Runtime/Scripts/Core/Cluster.cs b/NanoBrain/Runtime/Scripts/Core/Cluster.cs index 7dcf31c..b25222c 100644 --- a/NanoBrain/Runtime/Scripts/Core/Cluster.cs +++ b/NanoBrain/Runtime/Scripts/Core/Cluster.cs @@ -72,10 +72,11 @@ namespace NanoBrain { public Cluster(ClusterPrefab prefab, ClusterPrefab parent = null) { this.prefab = prefab; this.name = prefab.name; - this.parent.prefab = parent; + if (parent != null) + this.parent = parent.cluster; - if (this.parent.prefab != null) - this.parent.prefab.cluster.nuclei.Add(this); + // if (this.parent.prefab != null) + // this.parent.prefab.cluster.nuclei.Add(this); ClonePrefab(); _ = this.inputs; @@ -773,9 +774,9 @@ namespace NanoBrain { } Neuron.Delete(nucleus); - int nucleusIx = this.nuclei.IndexOf(nucleus); + //int nucleusIx = this.nuclei.IndexOf(nucleus); this.nuclei.Remove(nucleus); - this.prefab.cluster.nuclei.RemoveAt(nucleusIx); + //this.prefab.cluster.nuclei.RemoveAt(nucleusIx); RefreshOutputs(); return true; @@ -908,6 +909,10 @@ namespace NanoBrain { #endregion Update + public void Refresh() { + RefreshOutputs(); + } + } } \ No newline at end of file diff --git a/NanoBrain/Runtime/Scripts/Core/Neuron.cs b/NanoBrain/Runtime/Scripts/Core/Neuron.cs index 1dd884f..1c2144f 100644 --- a/NanoBrain/Runtime/Scripts/Core/Neuron.cs +++ b/NanoBrain/Runtime/Scripts/Core/Neuron.cs @@ -105,7 +105,7 @@ namespace NanoBrain { /// public virtual void SetBias(Vector3 inputValue) { this.bias = inputValue; - this.parent.UpdateFromNucleus(this); + this.parent?.UpdateFromNucleus(this); } /// @@ -623,10 +623,9 @@ namespace NanoBrain { #endregion Receivers public override void ProcessStimulus(Vector3 inputValue) { - ; this.lastUpdate = Time.time; this.bias = inputValue; - this.parent.UpdateFromNucleus(this); + this.parent?.UpdateFromNucleus(this); } } diff --git a/NanoBrain/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs b/NanoBrain/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs index 574552d..c00f234 100644 --- a/NanoBrain/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs +++ b/NanoBrain/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs @@ -101,38 +101,38 @@ namespace NanoBrain { // this.nuclei.RemoveAll(nucleus => visitedNuclei.Contains(nucleus) == false); } - public void MarkNuclei(HashSet visitedNuclei, Nucleus nucleus) { - if (nucleus is null) - return; + // public void MarkNuclei(HashSet visitedNuclei, Nucleus nucleus) { + // if (nucleus is null) + // return; - if (nucleus.parent != null && nucleus.parent.prefab != this) - visitedNuclei.Add(nucleus.parent); - else - visitedNuclei.Add(nucleus); - if (nucleus is Neuron neuron) { - if (neuron.synapses != null) { - HashSet visitedSynapses = new(); - foreach (Synapse synapse in neuron.synapses) { - if (synapse != null && synapse.neuron != null) { - visitedSynapses.Add(synapse); - if (synapse.neuron is Nucleus synapse_nucleus) - MarkNuclei(visitedNuclei, synapse_nucleus); - } - } - neuron.synapses.RemoveAll(synapse => visitedSynapses.Contains(synapse) == false); - } - if (neuron.receivers != null) { - HashSet visitedReceivers = new(); - foreach (Nucleus receiver in neuron.receivers) { - if (receiver != null && receiver != null) { - visitedReceivers.Add(receiver); - visitedNuclei.Add(receiver); - } - } - neuron.receivers.RemoveAll(receiver => visitedReceivers.Contains(receiver) == false); - } - } - } + // if (nucleus.parent != null && nucleus.parent.prefab != this) + // visitedNuclei.Add(nucleus.parent); + // else + // visitedNuclei.Add(nucleus); + // if (nucleus is Neuron neuron) { + // if (neuron.synapses != null) { + // HashSet visitedSynapses = new(); + // foreach (Synapse synapse in neuron.synapses) { + // if (synapse != null && synapse.neuron != null) { + // visitedSynapses.Add(synapse); + // if (synapse.neuron is Nucleus synapse_nucleus) + // MarkNuclei(visitedNuclei, synapse_nucleus); + // } + // } + // neuron.synapses.RemoveAll(synapse => visitedSynapses.Contains(synapse) == false); + // } + // if (neuron.receivers != null) { + // HashSet visitedReceivers = new(); + // foreach (Nucleus receiver in neuron.receivers) { + // if (receiver != null && receiver != null) { + // visitedReceivers.Add(receiver); + // visitedNuclei.Add(receiver); + // } + // } + // neuron.receivers.RemoveAll(receiver => visitedReceivers.Contains(receiver) == false); + // } + // } + // } // public virtual void UpdateNuclei() { // foreach (Nucleus nucleus in this.nuclei) diff --git a/Runtime/Scripts/Ant.cs b/Runtime/Scripts/Ant.cs index 5049d38..219d5c8 100644 --- a/Runtime/Scripts/Ant.cs +++ b/Runtime/Scripts/Ant.cs @@ -51,7 +51,7 @@ namespace CreatureControl { public Neuron foodReceptor; public Neuron homeReceptor; - public Vector3 linearVelocity = Vector3.forward; + public Vector3 linearVelocity; // = Vector3.forward; public Vector3 angularVelocity; #region Init @@ -124,7 +124,7 @@ namespace CreatureControl { public override void Update() { base.Update(); - UpdateSmell(); + //UpdateSmell(); UpdateMovement(); } diff --git a/Samples/Brain/New Cluster Prefab.asset b/Samples/Brain/New Cluster Prefab.asset index 5640dec..92a02db 100644 --- a/Samples/Brain/New Cluster Prefab.asset +++ b/Samples/Brain/New Cluster Prefab.asset @@ -19,23 +19,25 @@ MonoBehaviour: prefab: {fileID: 11400000} instanceCount: 1 nuclei: - - rid: 4201949831649034317 - - rid: 4201949831649034319 + - rid: 4201949831649034325 + - rid: 4201949831649034327 + - rid: 4201949831649034328 + - rid: 4201949831649034329 references: version: 2 RefIds: - rid: -2 type: {class: , ns: , asm: } - - rid: 4201949831649034317 + - rid: 4201949831649034325 type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} data: name: Output parent: - rid: 4201949831649034318 - bias: {x: 0, y: 0, z: 0} + rid: 4201949831649034326 + bias: {x: 0, y: 0, z: 1} _synapses: - neuron: - rid: 4201949831649034319 + rid: 4201949831649034327 weight: 1 combinator: 0 _curvePreset: 0 @@ -66,7 +68,7 @@ MonoBehaviour: curveMax: 1 trace: 0 _receivers: [] - - rid: 4201949831649034318 + - rid: 4201949831649034326 type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} data: name: New Cluster Prefab @@ -75,14 +77,60 @@ MonoBehaviour: prefab: {fileID: 11400000} instanceCount: 1 nuclei: - - rid: 4201949831649034317 - - rid: 4201949831649034319 - - rid: 4201949831649034319 + - rid: 4201949831649034325 + - rid: 4201949831649034327 + - rid: 4201949831649034328 + - rid: 4201949831649034329 + - rid: 4201949831649034327 type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} data: - name: New Neuron + name: Collision parent: - rid: 4201949831649034318 + rid: 4201949831649034326 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 4201949831649034328 + weight: 1 + - neuron: + rid: 4201949831649034329 + weight: 1 + combinator: 0 + _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 + trace: 0 + _receivers: + - rid: 4201949831649034325 + - rid: 4201949831649034328 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Hit Left + parent: + rid: 4201949831649034326 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -114,4 +162,42 @@ MonoBehaviour: curveMax: 1 trace: 0 _receivers: - - rid: 4201949831649034317 + - rid: 4201949831649034327 + - rid: 4201949831649034329 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Hit Right + parent: + rid: 4201949831649034326 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + trace: 0 + _receivers: + - rid: 4201949831649034327 diff --git a/Samples/Foraging.unity b/Samples/Foraging.unity index 02e9183..b18dbe1 100644 --- a/Samples/Foraging.unity +++ b/Samples/Foraging.unity @@ -5243,6 +5243,618 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: + - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: -0.0040905434 + objectReference: {fileID: 0} + - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0061656996 + objectReference: {fileID: 0} + - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9162944 + objectReference: {fileID: 0} + - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.21589416 + objectReference: {fileID: 0} + - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.32834327 + objectReference: {fileID: 0} + - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.07736312 + objectReference: {fileID: 0} + - target: {fileID: 1004982706826917178, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: -0.02829995 + objectReference: {fileID: 0} + - target: {fileID: 1004982706826917178, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.6843936 + objectReference: {fileID: 0} + - target: {fileID: 1004982706826917178, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.71126705 + objectReference: {fileID: 0} + - target: {fileID: 1004982706826917178, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.15780915 + objectReference: {fileID: 0} + - target: {fileID: 1035200439474759374, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: forwardSpeed + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1035200439474759374, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: rotationSpeed + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 1.7462298e-10 + objectReference: {fileID: 0} + - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: 5.820766e-11 + objectReference: {fileID: 0} + - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0024082724 + objectReference: {fileID: 0} + - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.58369815 + objectReference: {fileID: 0} + - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.8119708 + objectReference: {fileID: 0} + - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.00000032782555 + objectReference: {fileID: 0} + - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000059604645 + objectReference: {fileID: 0} + - target: {fileID: 1310879476154348518, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.70777005 + objectReference: {fileID: 0} + - target: {fileID: 1310879476154348518, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.38709375 + objectReference: {fileID: 0} + - target: {fileID: 1310879476154348518, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.17679271 + objectReference: {fileID: 0} + - target: {fileID: 1310879476154348518, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.56388324 + objectReference: {fileID: 0} + - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 8.489559e-10 + objectReference: {fileID: 0} + - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: 4.6566123e-10 + objectReference: {fileID: 0} + - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0042412244 + objectReference: {fileID: 0} + - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.96049416 + objectReference: {fileID: 0} + - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.27830014 + objectReference: {fileID: 0} + - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.000000049062358 + objectReference: {fileID: 0} + - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.00000003573343 + objectReference: {fileID: 0} + - target: {fileID: 2057489726524823425, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.61066824 + objectReference: {fileID: 0} + - target: {fileID: 2057489726524823425, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.25755236 + objectReference: {fileID: 0} + - target: {fileID: 2057489726524823425, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.5535674 + objectReference: {fileID: 0} + - target: {fileID: 2057489726524823425, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.5042959 + objectReference: {fileID: 0} + - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: -8.458901e-12 + objectReference: {fileID: 0} + - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: 9.313226e-10 + objectReference: {fileID: 0} + - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0030214668 + objectReference: {fileID: 0} + - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9807038 + objectReference: {fileID: 0} + - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.19549987 + objectReference: {fileID: 0} + - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.000000048625225 + objectReference: {fileID: 0} + - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000041054268 + objectReference: {fileID: 0} + - target: {fileID: 2149330539247012361, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.75097865 + objectReference: {fileID: 0} + - target: {fileID: 2149330539247012361, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.2175455 + objectReference: {fileID: 0} + - target: {fileID: 2149330539247012361, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.5988421 + objectReference: {fileID: 0} + - target: {fileID: 2149330539247012361, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.1734742 + objectReference: {fileID: 0} + - target: {fileID: 2380027669956049854, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.75851125 + objectReference: {fileID: 0} + - target: {fileID: 2380027669956049854, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.5723842 + objectReference: {fileID: 0} + - target: {fileID: 2380027669956049854, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.00878774 + objectReference: {fileID: 0} + - target: {fileID: 2380027669956049854, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.31138372 + objectReference: {fileID: 0} + - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: 5.820766e-11 + objectReference: {fileID: 0} + - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.003004016 + objectReference: {fileID: 0} + - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.8242286 + objectReference: {fileID: 0} + - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.56625736 + objectReference: {fileID: 0} + - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.000000014901161 + objectReference: {fileID: 0} + - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.0000000055879354 + objectReference: {fileID: 0} + - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: -0.005221289 + objectReference: {fileID: 0} + - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0023040995 + objectReference: {fileID: 0} + - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.76335764 + objectReference: {fileID: 0} + - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.1690564 + objectReference: {fileID: 0} + - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.6087132 + objectReference: {fileID: 0} + - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.13480821 + objectReference: {fileID: 0} + - target: {fileID: 3025673039819971543, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9646967 + objectReference: {fileID: 0} + - target: {fileID: 3025673039819971543, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.158927 + objectReference: {fileID: 0} + - target: {fileID: 3025673039819971543, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.20721303 + objectReference: {fileID: 0} + - target: {fileID: 3025673039819971543, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.034136884 + objectReference: {fileID: 0} + - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 3.4924597e-10 + objectReference: {fileID: 0} + - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: -1.7462298e-10 + objectReference: {fileID: 0} + - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.003004015 + objectReference: {fileID: 0} + - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7585622 + objectReference: {fileID: 0} + - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.6516007 + objectReference: {fileID: 0} + - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.000000029802322 + objectReference: {fileID: 0} + - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000007450581 + objectReference: {fileID: 0} + - target: {fileID: 3303214404428789969, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.32846013 + objectReference: {fileID: 0} + - target: {fileID: 3303214404428789969, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.8921972 + objectReference: {fileID: 0} + - target: {fileID: 3303214404428789969, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.29727954 + objectReference: {fileID: 0} + - target: {fileID: 3303214404428789969, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.087881245 + objectReference: {fileID: 0} + - target: {fileID: 3735440054552339591, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: brainPrefab + value: + objectReference: {fileID: 11400000, guid: c8e4b0990eb7dbbc4bee34addd9cd2b8, type: 2} + - target: {fileID: 3748243631002723431, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.47020024 + objectReference: {fileID: 0} + - target: {fileID: 3748243631002723431, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.13349901 + objectReference: {fileID: 0} + - target: {fileID: 3748243631002723431, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.7921706 + objectReference: {fileID: 0} + - target: {fileID: 3748243631002723431, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.36545247 + objectReference: {fileID: 0} + - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: -2.0372681e-10 + objectReference: {fileID: 0} + - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: -5.820766e-11 + objectReference: {fileID: 0} + - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0024082726 + objectReference: {fileID: 0} + - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.72951615 + objectReference: {fileID: 0} + - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.68396366 + objectReference: {fileID: 0} + - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.00000017881393 + objectReference: {fileID: 0} + - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000007450581 + objectReference: {fileID: 0} + - target: {fileID: 5108746397492641501, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: -0.14248966 + objectReference: {fileID: 0} + - target: {fileID: 5108746397492641501, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.00803566 + objectReference: {fileID: 0} + - target: {fileID: 5108746397492641501, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.9881935 + objectReference: {fileID: 0} + - target: {fileID: 5108746397492641501, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.055728883 + objectReference: {fileID: 0} + - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 4.4745083e-11 + objectReference: {fileID: 0} + - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: 4.6566123e-10 + objectReference: {fileID: 0} + - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0041765133 + objectReference: {fileID: 0} + - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.96809804 + objectReference: {fileID: 0} + - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.2505719 + objectReference: {fileID: 0} + - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.00000009663677 + objectReference: {fileID: 0} + - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.00000006014907 + objectReference: {fileID: 0} + - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 0.0025763595 + objectReference: {fileID: 0} + - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0072106724 + objectReference: {fileID: 0} + - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.95996726 + objectReference: {fileID: 0} + - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.18536535 + objectReference: {fileID: 0} + - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.20619719 + objectReference: {fileID: 0} + - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.039815746 + objectReference: {fileID: 0} + - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 1.1641532e-10 + objectReference: {fileID: 0} + - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: -2.910383e-11 + objectReference: {fileID: 0} + - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.00190334 + objectReference: {fileID: 0} + - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.86583054 + objectReference: {fileID: 0} + - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.50033724 + objectReference: {fileID: 0} + - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.000000059604638 + objectReference: {fileID: 0} + - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000021420417 + objectReference: {fileID: 0} + - target: {fileID: 5823700145767964246, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.85402167 + objectReference: {fileID: 0} + - target: {fileID: 5823700145767964246, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.32501373 + objectReference: {fileID: 0} + - target: {fileID: 5823700145767964246, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.22636825 + objectReference: {fileID: 0} + - target: {fileID: 5823700145767964246, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.33729884 + objectReference: {fileID: 0} + - target: {fileID: 5850833608922183593, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.032780167 + objectReference: {fileID: 0} + - target: {fileID: 5850833608922183593, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.044935193 + objectReference: {fileID: 0} + - target: {fileID: 5850833608922183593, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.8327052 + objectReference: {fileID: 0} + - target: {fileID: 5850833608922183593, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.5509159 + objectReference: {fileID: 0} + - target: {fileID: 6207803342309021390, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: -0.5112795 + objectReference: {fileID: 0} + - target: {fileID: 6207803342309021390, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.8116232 + objectReference: {fileID: 0} + - target: {fileID: 6207803342309021390, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.25970182 + objectReference: {fileID: 0} + - target: {fileID: 6207803342309021390, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.11142756 + objectReference: {fileID: 0} + - target: {fileID: 6513804325188258242, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7431155 + objectReference: {fileID: 0} + - target: {fileID: 6513804325188258242, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.29594904 + objectReference: {fileID: 0} + - target: {fileID: 6513804325188258242, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.55757076 + objectReference: {fileID: 0} + - target: {fileID: 6513804325188258242, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.2220551 + objectReference: {fileID: 0} + - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 0.0035855488 + objectReference: {fileID: 0} + - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.002454592 + objectReference: {fileID: 0} + - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.770837 + objectReference: {fileID: 0} + - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.21358104 + objectReference: {fileID: 0} + - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.5783706 + objectReference: {fileID: 0} + - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.16025306 + objectReference: {fileID: 0} + - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 1.2718623e-10 + objectReference: {fileID: 0} + - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: 4.656613e-10 + objectReference: {fileID: 0} + - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0041295583 + objectReference: {fileID: 0} + - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9558599 + objectReference: {fileID: 0} + - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.29382288 + objectReference: {fileID: 0} + - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.00000020186695 + objectReference: {fileID: 0} + - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000145828 + objectReference: {fileID: 0} + - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 3.9170928e-10 + objectReference: {fileID: 0} + - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: -2.3283064e-10 + objectReference: {fileID: 0} + - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.00410612 + objectReference: {fileID: 0} + - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.96942157 + objectReference: {fileID: 0} + - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.24540132 + objectReference: {fileID: 0} + - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.000000010759126 + objectReference: {fileID: 0} + - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000013880826 + objectReference: {fileID: 0} + - target: {fileID: 6620083584134435749, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.92331064 + objectReference: {fileID: 0} + - target: {fileID: 6620083584134435749, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.18358408 + objectReference: {fileID: 0} + - target: {fileID: 6620083584134435749, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.33085752 + objectReference: {fileID: 0} + - target: {fileID: 6620083584134435749, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.06578521 + objectReference: {fileID: 0} - target: {fileID: 7021329035324230484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x value: 0 @@ -5283,10 +5895,178 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 5.820766e-11 + objectReference: {fileID: 0} + - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: -1.4551915e-11 + objectReference: {fileID: 0} + - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0019033395 + objectReference: {fileID: 0} + - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7118299 + objectReference: {fileID: 0} + - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.702352 + objectReference: {fileID: 0} + - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.00000017881392 + objectReference: {fileID: 0} + - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000048428767 + objectReference: {fileID: 0} + - target: {fileID: 7378712539761125858, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.58558106 + objectReference: {fileID: 0} + - target: {fileID: 7378712539761125858, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.4692841 + objectReference: {fileID: 0} + - target: {fileID: 7378712539761125858, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.6377756 + objectReference: {fileID: 0} + - target: {fileID: 7378712539761125858, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.17352132 + objectReference: {fileID: 0} + - target: {fileID: 7394846002605678119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.81694216 + objectReference: {fileID: 0} + - target: {fileID: 7394846002605678119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.43574914 + objectReference: {fileID: 0} + - target: {fileID: 7394846002605678119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.14708121 + objectReference: {fileID: 0} + - target: {fileID: 7394846002605678119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.34798768 + objectReference: {fileID: 0} + - target: {fileID: 7400717801484663767, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.48328745 + objectReference: {fileID: 0} + - target: {fileID: 7400717801484663767, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.07811397 + objectReference: {fileID: 0} + - target: {fileID: 7400717801484663767, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.8607985 + objectReference: {fileID: 0} + - target: {fileID: 7400717801484663767, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.13913132 + objectReference: {fileID: 0} + - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: -0.0022254882 + objectReference: {fileID: 0} + - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: -0.002710371 + objectReference: {fileID: 0} + - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: -0.13751179 + objectReference: {fileID: 0} + - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.038188737 + objectReference: {fileID: 0} + - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.9536711 + objectReference: {fileID: 0} + - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.2648463 + objectReference: {fileID: 0} - target: {fileID: 7654735227470959086, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_Name value: LowPolyAntRigged objectReference: {fileID: 0} + - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 0.0029576183 + objectReference: {fileID: 0} + - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: -0.0004493922 + objectReference: {fileID: 0} + - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.4621276 + objectReference: {fileID: 0} + - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.16157556 + objectReference: {fileID: 0} + - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.8231099 + objectReference: {fileID: 0} + - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.28778726 + objectReference: {fileID: 0} + - target: {fileID: 8801464852371122986, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.28808263 + objectReference: {fileID: 0} + - target: {fileID: 8801464852371122986, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.5423468 + objectReference: {fileID: 0} + - target: {fileID: 8801464852371122986, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.5076533 + objectReference: {fileID: 0} + - target: {fileID: 8801464852371122986, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.60428184 + objectReference: {fileID: 0} + - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 1.7680413e-11 + objectReference: {fileID: 0} + - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: 6.9849193e-10 + objectReference: {fileID: 0} + - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0029819128 + objectReference: {fileID: 0} + - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9604722 + objectReference: {fileID: 0} + - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.2783759 + objectReference: {fileID: 0} + - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.00000008648073 + objectReference: {fileID: 0} + - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.00000009121207 + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] From fdae20b6b49e97ccc82d6faee09af69007d5b796 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 5 May 2026 12:39:04 +0200 Subject: [PATCH 30/38] Ant is walking again --- NanoBrain/Editor/ClusterEditor.cs | 5 - NanoBrain/Runtime/Scripts/Core/Cluster.cs | 39 +- NanoBrain/Runtime/Scripts/Core/Neuron.cs | 2 - Samples/Brain/New Cluster Prefab.asset | 52 + Samples/Foraging.unity | 2455 ++------------------- 5 files changed, 300 insertions(+), 2253 deletions(-) diff --git a/NanoBrain/Editor/ClusterEditor.cs b/NanoBrain/Editor/ClusterEditor.cs index 868297d..3086b0a 100644 --- a/NanoBrain/Editor/ClusterEditor.cs +++ b/NanoBrain/Editor/ClusterEditor.cs @@ -180,12 +180,7 @@ namespace NanoBrain { else { string newName = EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); if (newName != this.currentNucleus.name) { - Nucleus prefabNucleus = this.prefab.GetNucleus(this.currentNucleus.name); - prefabNucleus.name = newName; - // This changes it in the temporary cluster instance this.currentNucleus.name = newName; - this.prefab.cluster.RefreshOutputs(); - // outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList(); anythingChanged = true; } } diff --git a/NanoBrain/Runtime/Scripts/Core/Cluster.cs b/NanoBrain/Runtime/Scripts/Core/Cluster.cs index b25222c..9106984 100644 --- a/NanoBrain/Runtime/Scripts/Core/Cluster.cs +++ b/NanoBrain/Runtime/Scripts/Core/Cluster.cs @@ -188,6 +188,11 @@ namespace NanoBrain { foreach (Cluster sibling in siblings) sibling.siblingClusters = siblingClusters; } + + // Ensure that all neurons are computed to initialize bias + foreach (Nucleus clonedNucleus in clonedNuclei) { + clonedNucleus.UpdateStateIsolated(); + } } /* for (int nucleusIx = 0; nucleusIx < clonedNuclei.Length; nucleusIx++) { @@ -613,31 +618,26 @@ namespace NanoBrain { if (neuron.synapses.Count == 0) this._inputs.Add(nucleus); } - ComputeOrders(); + RefreshComputeOrders(); } return this._inputs; } } - public Dictionary> computeOrders = new(); - private void ComputeOrders() { - foreach (Nucleus nucleus in this.nuclei) { - // if (nucleus is Cluster cluster) { - // List synapses = this.CollectSynapsesTo(cluster); - // foreach (Synapse synapse in synapses) { - // computeOrders[synapse.neuron] = TopologicalSort2(synapse.neuron); - // Debug.Log($"{this.baseName}: Order for {cluster.baseName}.{synapse.neuron.name}"); - // } - // // List receivers = cluster.CollectReceivers(); - // // foreach (Nucleus receiver in receivers) - // // computeOrders[receiver] = TopologicalSort2(receiver); - // } - // else { - computeOrders[nucleus] = TopologicalSort2(nucleus); - //Debug.Log($"{this.baseName} Order for {nucleus.name}"); - // } + private Dictionary> _computeOrders; + public Dictionary> computeOrders { + get { + if (_computeOrders == null || _computeOrders.Count == 0) { + _computeOrders = new(); + foreach (Nucleus nucleus in this.nuclei) + _computeOrders[nucleus] = TopologicalSort2(nucleus); + } + return _computeOrders; } } + public void RefreshComputeOrders() { + this._computeOrders = null; + } private List TopologicalSort2(Nucleus startNode) { Dictionary inDegree = new(); @@ -711,7 +711,7 @@ namespace NanoBrain { protected List _outputs = null; public List outputs { get { - if (this._outputs == null) { + if (this._outputs == null || this._outputs.Count == 0) { this._outputs = new(); foreach (Nucleus nucleus in this.nuclei) { if (nucleus is Neuron neuron && neuron.receivers.Count == 0) @@ -911,6 +911,7 @@ namespace NanoBrain { public void Refresh() { RefreshOutputs(); + RefreshComputeOrders(); } } diff --git a/NanoBrain/Runtime/Scripts/Core/Neuron.cs b/NanoBrain/Runtime/Scripts/Core/Neuron.cs index 1c2144f..02fa2df 100644 --- a/NanoBrain/Runtime/Scripts/Core/Neuron.cs +++ b/NanoBrain/Runtime/Scripts/Core/Neuron.cs @@ -50,7 +50,6 @@ namespace NanoBrain { /// It does not have a synapse and therefore no weight of source nucleus public Vector3 bias = Vector3.zero; - #region Synapses [SerializeField] @@ -329,7 +328,6 @@ namespace NanoBrain { } protected virtual void CloneFields(Neuron clone) { - clone.parent = this.parent; clone.bias = this.bias; clone.combinator = this.combinator; clone.curve = this.curve; diff --git a/Samples/Brain/New Cluster Prefab.asset b/Samples/Brain/New Cluster Prefab.asset index 92a02db..11aa3ef 100644 --- a/Samples/Brain/New Cluster Prefab.asset +++ b/Samples/Brain/New Cluster Prefab.asset @@ -23,6 +23,7 @@ MonoBehaviour: - rid: 4201949831649034327 - rid: 4201949831649034328 - rid: 4201949831649034329 + - rid: 4201949831649034476 references: version: 2 RefIds: @@ -201,3 +202,54 @@ MonoBehaviour: trace: 0 _receivers: - rid: 4201949831649034327 + - rid: 4201949831649034476 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Beat + parent: + rid: 4201949831649034477 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + trace: 0 + _receivers: [] + - rid: 4201949831649034477 + type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: New Cluster Prefab + parent: + rid: -2 + prefab: {fileID: 11400000} + instanceCount: 1 + nuclei: + - rid: 4201949831649034325 + - rid: 4201949831649034327 + - rid: 4201949831649034328 + - rid: 4201949831649034329 + - rid: 4201949831649034476 diff --git a/Samples/Foraging.unity b/Samples/Foraging.unity index b18dbe1..fb4dd99 100644 --- a/Samples/Foraging.unity +++ b/Samples/Foraging.unity @@ -122,69 +122,6 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} ---- !u!1 &23532513 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 23532514} - m_Layer: 0 - m_Name: LeftMiddle_Tibia - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &23532514 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 23532513} - serializedVersion: 2 - m_LocalRotation: {x: 0.80737054, y: 0.00000008940697, z: 0.000000044703484, w: 0.59004486} - m_LocalPosition: {x: 0, y: 0, z: 0.004816545} - m_LocalScale: {x: 0.9999998, y: 1, z: 1.0000001} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1046556278} - m_Father: {fileID: 1541404099} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &90659803 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 90659804} - m_Layer: 0 - m_Name: LeftHind_Tarsus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &90659804 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 90659803} - serializedVersion: 2 - m_LocalRotation: {x: -0.47292906, y: 0.17234407, z: 0.038568486, w: -0.8632196} - m_LocalPosition: {x: 0, y: 0, z: 0.008212241} - m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 0.9999999} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1757828249} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &94386191 GameObject: m_ObjectHideFlags: 0 @@ -279,204 +216,6 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1 &128928878 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 128928880} - - component: {fileID: 128928879} - m_Layer: 0 - m_Name: LeftFront_Femur - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &128928879 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 128928878} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} - m_Name: - m_EditorClassIdentifier: - bones: - _coxa: {fileID: 0} - _femur: {fileID: 128928880} - _tibia: {fileID: 1055832138} - _tarsus: {fileID: 164314500} - _phalanges: {fileID: 0} - _end: {fileID: 0} - _femurLength: 0.00380668 - _tibiaLength: 0.005963828 - _tarsusLength: 0 - _phalangesLength: 0 - side: 0 - target: {fileID: 604205123} - targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} - targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} ---- !u!4 &128928880 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 128928878} - serializedVersion: 2 - m_LocalRotation: {x: -0.16464044, y: -0.20846698, z: -0.035625506, w: 0.9634137} - m_LocalPosition: {x: -0.002, y: 0.004, z: -0.002} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1055832138} - m_Father: {fileID: 658804661} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &140096619 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 140096620} - - component: {fileID: 140096622} - - component: {fileID: 140096621} - m_Layer: 0 - m_Name: LeftHind_Target - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &140096620 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 140096619} - serializedVersion: 2 - m_LocalRotation: {x: 0.31411165, y: -0.6442087, z: 0.69609904, w: 0.042132646} - m_LocalPosition: {x: -0.006812622, y: 0, z: -0.01323235} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 969006086} - m_Father: {fileID: 1972141019} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!54 &140096621 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 140096619} - serializedVersion: 4 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!114 &140096622 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 140096619} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} - m_Name: - m_EditorClassIdentifier: - leg: {fileID: 770696509} - footCollider: {fileID: 0} - sphereRenderer: {fileID: 0} ---- !u!1 &164314499 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 164314500} - m_Layer: 0 - m_Name: LeftFront_Tarsus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &164314500 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 164314499} - serializedVersion: 2 - m_LocalRotation: {x: -0.0855568, y: 0.6380306, z: 0.42223957, w: 0.63820904} - m_LocalPosition: {x: 0, y: 0, z: 0.005963828} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1055832138} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &219111718 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 219111719} - m_Layer: 0 - m_Name: RightHind_Tarsus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &219111719 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 219111718} - serializedVersion: 2 - m_LocalRotation: {x: 0.48380893, y: -0.2750721, z: 0.20774265, w: 0.8044299} - m_LocalPosition: {x: 0, y: 0, z: 0.008482451} - m_LocalScale: {x: 1, y: 0.9999999, z: 0.9999999} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 931091334} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &232829777 GameObject: m_ObjectHideFlags: 0 @@ -617,66 +356,6 @@ Transform: - {fileID: 1880435926} m_Father: {fileID: 1075240960} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &249293163 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 249293165} - - component: {fileID: 249293164} - m_Layer: 0 - m_Name: RightHind_Femur - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &249293164 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 249293163} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} - m_Name: - m_EditorClassIdentifier: - bones: - _coxa: {fileID: 0} - _femur: {fileID: 249293165} - _tibia: {fileID: 931091334} - _tarsus: {fileID: 219111719} - _phalanges: {fileID: 0} - _end: {fileID: 0} - _femurLength: 0.006008031 - _tibiaLength: 0.008482452 - _tarsusLength: 0 - _phalangesLength: 0 - side: 0 - target: {fileID: 649117740} - targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} - targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} ---- !u!4 &249293165 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 249293163} - serializedVersion: 2 - m_LocalRotation: {x: -0.08576872, y: 0.912694, z: 0.30887008, w: 0.25344196} - m_LocalPosition: {x: 0.002, y: 0.004, z: -0.006} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 931091334} - m_Father: {fileID: 658804661} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &266176282 GameObject: m_ObjectHideFlags: 0 @@ -936,100 +615,6 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 330205048} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &362020948 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 362020950} - - component: {fileID: 362020949} - m_Layer: 0 - m_Name: RightMiddle_Femur - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &362020949 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 362020948} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} - m_Name: - m_EditorClassIdentifier: - bones: - _coxa: {fileID: 0} - _femur: {fileID: 362020950} - _tibia: {fileID: 1488622526} - _tarsus: {fileID: 776655108} - _phalanges: {fileID: 0} - _end: {fileID: 0} - _femurLength: 0.004816547 - _tibiaLength: 0.008353032 - _tarsusLength: 0 - _phalangesLength: 0 - side: 0 - target: {fileID: 1445635527} - targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} - targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} ---- !u!4 &362020950 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 362020948} - serializedVersion: 2 - m_LocalRotation: {x: -0.30156556, y: 0.57948405, z: 0.24379048, w: 0.71681434} - m_LocalPosition: {x: 0.002, y: 0.004, z: -0.0045} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1488622526} - m_Father: {fileID: 658804661} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &390443499 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 390443500} - m_Layer: 0 - m_Name: LeftFeetTarget - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &390443500 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 390443499} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1947988475} - - {fileID: 1272710240} - - {fileID: 649117740} - m_Father: {fileID: 1980490809} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &467453031 GameObject: m_ObjectHideFlags: 0 @@ -1135,239 +720,6 @@ Transform: m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} m_PrefabInstance: {fileID: 566787347} m_PrefabAsset: {fileID: 0} ---- !u!1 &604205122 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 604205123} - - component: {fileID: 604205125} - - component: {fileID: 604205124} - m_Layer: 0 - m_Name: LeftFront_Target - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &604205123 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 604205122} - serializedVersion: 2 - m_LocalRotation: {x: 0.10340257, y: 0.19714029, z: 0.72879976, w: 0.6475296} - m_LocalPosition: {x: -0.00464314, y: 0, z: 0.003821565} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1639738099} - m_Father: {fileID: 1972141019} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!54 &604205124 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 604205122} - serializedVersion: 4 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!114 &604205125 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 604205122} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} - m_Name: - m_EditorClassIdentifier: - leg: {fileID: 128928879} - footCollider: {fileID: 0} - sphereRenderer: {fileID: 0} ---- !u!1 &649117739 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 649117740} - - component: {fileID: 649117742} - - component: {fileID: 649117741} - m_Layer: 0 - m_Name: RighHind_Target - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &649117740 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 649117739} - serializedVersion: 2 - m_LocalRotation: {x: 0.25241286, y: 0.31570747, z: -0.7996064, w: 0.44412404} - m_LocalPosition: {x: 0.006352237, y: 0, z: -0.01323235} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1007722913} - m_Father: {fileID: 390443500} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!54 &649117741 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 649117739} - serializedVersion: 4 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!114 &649117742 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 649117739} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} - m_Name: - m_EditorClassIdentifier: - leg: {fileID: 249293164} - footCollider: {fileID: 0} - sphereRenderer: {fileID: 0} ---- !u!1 &658804658 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 658804661} - - component: {fileID: 658804660} - - component: {fileID: 658804659} - m_Layer: 0 - m_Name: Target Rig - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!95 &658804659 -Animator: - serializedVersion: 5 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 658804658} - m_Enabled: 1 - m_Avatar: {fileID: 0} - m_Controller: {fileID: 9100000, guid: ba169e741a830f910bdde9e04f7c88f4, type: 2} - m_CullingMode: 0 - m_UpdateMode: 0 - m_ApplyRootMotion: 1 - m_LinearVelocityBlending: 0 - m_StabilizeFeet: 0 - m_WarningMessage: - m_HasTransformHierarchy: 1 - m_AllowConstantClipSamplingOptimization: 1 - m_KeepAnimatorStateOnDisable: 0 - m_WriteDefaultValuesOnDisable: 0 ---- !u!114 &658804660 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 658804658} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a25e8575da1d1cba48dc2b8da7a2b0ab, type: 3} - m_Name: - m_EditorClassIdentifier: - leftFrontLeg: {fileID: 128928879} - leftMiddleLeg: {fileID: 1541404098} - leftBackLeg: {fileID: 770696509} - rightFrontLeg: {fileID: 818182968} - rightMiddleLeg: {fileID: 362020949} - rightBackLeg: {fileID: 249293164} - render: 1 - legLength: 0.0031432603 ---- !u!4 &658804661 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 658804658} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 128928880} - - {fileID: 1541404099} - - {fileID: 770696510} - - {fileID: 818182969} - - {fileID: 362020950} - - {fileID: 249293165} - - {fileID: 1980490809} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &691526234 PrefabInstance: m_ObjectHideFlags: 0 @@ -1438,66 +790,6 @@ Transform: m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} m_PrefabInstance: {fileID: 691526234} m_PrefabAsset: {fileID: 0} ---- !u!1 &770696508 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 770696510} - - component: {fileID: 770696509} - m_Layer: 0 - m_Name: LeftHind_Femur - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &770696509 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 770696508} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} - m_Name: - m_EditorClassIdentifier: - bones: - _coxa: {fileID: 0} - _femur: {fileID: 770696510} - _tibia: {fileID: 1757828249} - _tarsus: {fileID: 90659804} - _phalanges: {fileID: 0} - _end: {fileID: 0} - _femurLength: 0.0031432603 - _tibiaLength: 0.008212241 - _tarsusLength: 0 - _phalangesLength: 0 - side: 0 - target: {fileID: 140096620} - targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} - targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} ---- !u!4 &770696510 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 770696508} - serializedVersion: 2 - m_LocalRotation: {x: 0.07720129, y: 0.92252225, z: 0.25537315, w: -0.27888587} - m_LocalPosition: {x: -0.002, y: 0.004, z: -0.006} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1757828249} - m_Father: {fileID: 658804661} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &775612060 GameObject: m_ObjectHideFlags: 0 @@ -1590,97 +882,6 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} ---- !u!1 &776655107 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 776655108} - m_Layer: 0 - m_Name: RightMiddle_Tarsus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &776655108 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 776655107} - serializedVersion: 2 - m_LocalRotation: {x: 0.38045225, y: -0.47525752, z: -0.47922108, w: 0.6322449} - m_LocalPosition: {x: 0, y: 0, z: 0.00835303} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1488622526} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &818182967 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 818182969} - - component: {fileID: 818182968} - m_Layer: 0 - m_Name: RightFront_Femur - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &818182968 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 818182967} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} - m_Name: - m_EditorClassIdentifier: - bones: - _coxa: {fileID: 0} - _femur: {fileID: 818182969} - _tibia: {fileID: 1013915773} - _tarsus: {fileID: 1146434365} - _phalanges: {fileID: 0} - _end: {fileID: 0} - _femurLength: 0.003806679 - _tibiaLength: 0.0060429377 - _tarsusLength: 0 - _phalangesLength: 0 - side: 0 - target: {fileID: 1947988475} - targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} - targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} ---- !u!4 &818182969 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 818182967} - serializedVersion: 2 - m_LocalRotation: {x: -0.17474006, y: 0.20808172, z: 0.037810877, w: 0.96163315} - m_LocalPosition: {x: 0.002, y: 0.004, z: -0.002} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1013915773} - m_Father: {fileID: 658804661} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &834383114 PrefabInstance: m_ObjectHideFlags: 0 @@ -1856,311 +1057,6 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 906427684} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &931091333 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 931091334} - m_Layer: 0 - m_Name: RightHind_Tibia - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &931091334 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 931091333} - serializedVersion: 2 - m_LocalRotation: {x: 0.77590793, y: -0.000000074505806, z: -0.000000029802322, w: 0.63084626} - m_LocalPosition: {x: 0, y: 0, z: 0.006008029} - m_LocalScale: {x: 1, y: 1.0000001, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 219111719} - m_Father: {fileID: 249293165} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &969006085 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 969006086} - - component: {fileID: 969006089} - - component: {fileID: 969006088} - - component: {fileID: 969006087} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &969006086 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 969006085} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 140096620} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!135 &969006087 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 969006085} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 1 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &969006088 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 969006085} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &969006089 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 969006085} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1007722912 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1007722913} - - component: {fileID: 1007722916} - - component: {fileID: 1007722915} - - component: {fileID: 1007722914} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1007722913 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1007722912} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 649117740} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!135 &1007722914 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1007722912} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 1 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &1007722915 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1007722912} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &1007722916 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1007722912} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1013915772 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1013915773} - m_Layer: 0 - m_Name: RightFront_Tibia - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1013915773 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1013915772} - serializedVersion: 2 - m_LocalRotation: {x: 0.6604676, y: -0.000000014901161, z: 0.000000026077032, w: 0.7508546} - m_LocalPosition: {x: 0, y: 0, z: 0.003806679} - m_LocalScale: {x: 0.99999994, y: 1, z: 0.99999994} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1146434365} - m_Father: {fileID: 818182969} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1046556277 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1046556278} - m_Layer: 0 - m_Name: LeftMiddle_Tarsus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1046556278 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1046556277} - serializedVersion: 2 - m_LocalRotation: {x: -0.44156945, y: -0.45806098, z: -0.5668178, w: -0.5233681} - m_LocalPosition: {x: 0, y: 0, z: 0.008259117} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 23532514} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1052160350 GameObject: m_ObjectHideFlags: 0 @@ -2267,38 +1163,6 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1052160350} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1055832137 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1055832138} - m_Layer: 0 - m_Name: LeftFront_Tibia - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1055832138 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1055832137} - serializedVersion: 2 - m_LocalRotation: {x: 0.65185237, y: 0.000000074505806, z: -0.000000020489097, w: 0.7583459} - m_LocalPosition: {x: 0, y: 0, z: 0.00380668} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 164314500} - m_Father: {fileID: 128928880} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1075240959 GameObject: m_ObjectHideFlags: 0 @@ -2441,37 +1305,6 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: -17.01, y: 0, z: 0} ---- !u!1 &1146434364 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1146434365} - m_Layer: 0 - m_Name: RightFront_Tarsus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1146434365 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1146434364} - serializedVersion: 2 - m_LocalRotation: {x: 0.018655328, y: -0.9132966, z: -0.1308956, w: -0.3852372} - m_LocalPosition: {x: 0, y: 0, z: 0.006042937} - m_LocalScale: {x: 1.0000001, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1013915773} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1187775863 GameObject: m_ObjectHideFlags: 0 @@ -2507,82 +1340,6 @@ Transform: - {fileID: 1973137220} m_Father: {fileID: 1075240960} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1272710239 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1272710240} - - component: {fileID: 1272710242} - - component: {fileID: 1272710241} - m_Layer: 0 - m_Name: LeftMiddle_Target - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1272710240 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1272710239} - serializedVersion: 2 - m_LocalRotation: {x: -0.05136092, y: 0.062381554, z: -0.97098094, w: -0.22509275} - m_LocalPosition: {x: -0.009, y: 0, z: -0.003} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1952639986} - m_Father: {fileID: 390443500} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!54 &1272710241 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1272710239} - serializedVersion: 4 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!114 &1272710242 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1272710239} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} - m_Name: - m_EditorClassIdentifier: - leg: {fileID: 1541404098} - footCollider: {fileID: 0} - sphereRenderer: {fileID: 0} --- !u!1001 &1413549757 PrefabInstance: m_ObjectHideFlags: 0 @@ -2653,187 +1410,6 @@ Transform: m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} m_PrefabInstance: {fileID: 1413549757} m_PrefabAsset: {fileID: 0} ---- !u!1 &1427151305 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1427151306} - - component: {fileID: 1427151309} - - component: {fileID: 1427151308} - - component: {fileID: 1427151307} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1427151306 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1427151305} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1445635527} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!135 &1427151307 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1427151305} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 1 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &1427151308 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1427151305} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &1427151309 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1427151305} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1445635526 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1445635527} - - component: {fileID: 1445635529} - - component: {fileID: 1445635528} - m_Layer: 0 - m_Name: RightMiddle_Target - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1445635527 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445635526} - serializedVersion: 2 - m_LocalRotation: {x: 0.096186325, y: 0.093534976, z: -0.9225138, w: 0.36189467} - m_LocalPosition: {x: 0.009, y: 0, z: -0.003} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1427151306} - m_Father: {fileID: 1972141019} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!54 &1445635528 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445635526} - serializedVersion: 4 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!114 &1445635529 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445635526} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} - m_Name: - m_EditorClassIdentifier: - leg: {fileID: 362020949} - footCollider: {fileID: 0} - sphereRenderer: {fileID: 0} --- !u!1 &1485508511 GameObject: m_ObjectHideFlags: 0 @@ -2939,308 +1515,6 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1485508511} m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1488622525 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1488622526} - m_Layer: 0 - m_Name: RightMiddle_Tibia - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1488622526 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1488622525} - serializedVersion: 2 - m_LocalRotation: {x: 0.8123018, y: -0.00000008940697, z: -0.00000008940697, w: 0.5832374} - m_LocalPosition: {x: 0, y: 0, z: 0.004816546} - m_LocalScale: {x: 1, y: 1.0000001, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 776655108} - m_Father: {fileID: 362020950} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1541404097 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1541404099} - - component: {fileID: 1541404098} - m_Layer: 0 - m_Name: LeftMiddle_Femur - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1541404098 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1541404097} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} - m_Name: - m_EditorClassIdentifier: - bones: - _coxa: {fileID: 0} - _femur: {fileID: 1541404099} - _tibia: {fileID: 23532514} - _tarsus: {fileID: 1046556278} - _phalanges: {fileID: 0} - _end: {fileID: 0} - _femurLength: 0.004816545 - _tibiaLength: 0.008259119 - _tarsusLength: 0 - _phalangesLength: 0 - side: 0 - target: {fileID: 1272710240} - targetToBoneFemur: {x: 0, y: 0, z: 0, w: 0} - targetToBoneTibia: {x: 0, y: 0, z: 0, w: 0} ---- !u!4 &1541404099 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1541404097} - serializedVersion: 2 - m_LocalRotation: {x: -0.2941951, y: -0.58195484, z: -0.23783205, w: 0.7198707} - m_LocalPosition: {x: -0.002, y: 0.004, z: -0.0045} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 23532514} - m_Father: {fileID: 658804661} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1570305109 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1570305110} - - component: {fileID: 1570305113} - - component: {fileID: 1570305112} - - component: {fileID: 1570305111} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1570305110 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1570305109} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1947988475} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!135 &1570305111 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1570305109} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 1 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &1570305112 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1570305109} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &1570305113 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1570305109} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1639738098 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1639738099} - - component: {fileID: 1639738102} - - component: {fileID: 1639738101} - - component: {fileID: 1639738100} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1639738099 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1639738098} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 604205123} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!135 &1639738100 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1639738098} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 1 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &1639738101 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1639738098} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &1639738102 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1639738098} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &1670418292 GameObject: m_ObjectHideFlags: 0 @@ -4430,38 +2704,6 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 9be919da767fe3b26b7efaa9615d75a1, type: 3} ---- !u!1 &1757828248 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1757828249} - m_Layer: 0 - m_Name: LeftHind_Tibia - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1757828249 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1757828248} - serializedVersion: 2 - m_LocalRotation: {x: 0.6024822, y: 0.000000074505806, z: 0.000000044703484, w: 0.7981324} - m_LocalPosition: {x: 0, y: 0, z: 0.00314326} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 90659804} - m_Father: {fileID: 770696510} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1769394186 PrefabInstance: m_ObjectHideFlags: 0 @@ -4707,187 +2949,6 @@ Transform: m_CorrespondingSourceObject: {fileID: 4705673811730924170, guid: c815f0e5d65e077c5a63fa1bc48a2f08, type: 3} m_PrefabInstance: {fileID: 1880435925} m_PrefabAsset: {fileID: 0} ---- !u!1 &1947988474 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1947988475} - - component: {fileID: 1947988477} - - component: {fileID: 1947988476} - m_Layer: 0 - m_Name: RightFront_Target - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1947988475 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1947988474} - serializedVersion: 2 - m_LocalRotation: {x: -0.30181327, y: -0.7707289, z: -0.53122467, w: -0.18079302} - m_LocalPosition: {x: 0.00464314, y: 0, z: 0.003821564} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1570305110} - m_Father: {fileID: 390443500} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!54 &1947988476 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1947988474} - serializedVersion: 4 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!114 &1947988477 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1947988474} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} - m_Name: - m_EditorClassIdentifier: - leg: {fileID: 818182968} - footCollider: {fileID: 0} - sphereRenderer: {fileID: 0} ---- !u!1 &1952639985 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1952639986} - - component: {fileID: 1952639989} - - component: {fileID: 1952639988} - - component: {fileID: 1952639987} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1952639986 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1952639985} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1272710240} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!135 &1952639987 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1952639985} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 1 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &1952639988 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1952639985} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &1952639989 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1952639985} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &1953862409 GameObject: m_ObjectHideFlags: 0 @@ -4993,40 +3054,6 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1953862409} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1972141018 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1972141019} - m_Layer: 0 - m_Name: RightFeetTarget - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1972141019 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1972141018} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 604205123} - - {fileID: 1445635527} - - {fileID: 140096620} - m_Father: {fileID: 1980490809} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1973137219 GameObject: m_ObjectHideFlags: 0 @@ -5132,39 +3159,6 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1973137219} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1980490808 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1980490809} - m_Layer: 0 - m_Name: Body - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1980490809 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1980490808} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 390443500} - - {fileID: 1972141019} - m_Father: {fileID: 658804661} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &2063840326 PrefabInstance: m_ObjectHideFlags: 0 @@ -5245,11 +3239,11 @@ PrefabInstance: m_Modifications: - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -0.0040905434 + value: -0.0040905406 objectReference: {fileID: 0} - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0061656996 + value: 0.0061656977 objectReference: {fileID: 0} - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w @@ -5261,27 +3255,31 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.32834327 + value: -0.3283432 objectReference: {fileID: 0} - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.07736312 + value: 0.07736311 objectReference: {fileID: 0} - target: {fileID: 1004982706826917178, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: -0.02829995 + value: -0.02830007 objectReference: {fileID: 0} - target: {fileID: 1004982706826917178, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.6843936 + value: 0.6843938 objectReference: {fileID: 0} - target: {fileID: 1004982706826917178, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.71126705 + value: 0.71126676 objectReference: {fileID: 0} - target: {fileID: 1004982706826917178, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.15780915 + value: 0.15780945 + objectReference: {fileID: 0} + - target: {fileID: 1035200439474759374, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: useGravity + value: 0 objectReference: {fileID: 0} - target: {fileID: 1035200439474759374, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: forwardSpeed @@ -5291,37 +3289,41 @@ PrefabInstance: propertyPath: rotationSpeed value: 0 objectReference: {fileID: 0} + - target: {fileID: 1035200439474759374, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: linearVelocity.z + value: 0 + objectReference: {fileID: 0} - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 1.7462298e-10 + value: -2.3283064e-10 objectReference: {fileID: 0} - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: 5.820766e-11 + value: -1.1641532e-10 objectReference: {fileID: 0} - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0024082724 + value: 0.0024082721 objectReference: {fileID: 0} - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.58369815 + value: 0.5836979 objectReference: {fileID: 0} - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.8119708 + value: 0.81197095 objectReference: {fileID: 0} - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000032782555 + value: -0.000000059604645 objectReference: {fileID: 0} - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000059604645 + value: 0.000000044703484 objectReference: {fileID: 0} - target: {fileID: 1310879476154348518, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.70777005 + value: 0.70777 objectReference: {fileID: 0} - target: {fileID: 1310879476154348518, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x @@ -5329,59 +3331,59 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1310879476154348518, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.17679271 + value: -0.17679277 objectReference: {fileID: 0} - target: {fileID: 1310879476154348518, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.56388324 + value: -0.56388336 objectReference: {fileID: 0} - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 8.489559e-10 + value: -2.628231e-10 objectReference: {fileID: 0} - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: 4.6566123e-10 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0042412244 + value: 0.0042412225 objectReference: {fileID: 0} - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.96049416 + value: 0.96049404 objectReference: {fileID: 0} - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.27830014 + value: -0.27830058 objectReference: {fileID: 0} - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000049062358 + value: -0.000000012777276 objectReference: {fileID: 0} - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.00000003573343 + value: 0.000000016326851 objectReference: {fileID: 0} - target: {fileID: 2057489726524823425, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.61066824 + value: 0.6106683 objectReference: {fileID: 0} - target: {fileID: 2057489726524823425, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.25755236 + value: 0.25755244 objectReference: {fileID: 0} - target: {fileID: 2057489726524823425, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.5535674 + value: 0.5535675 objectReference: {fileID: 0} - target: {fileID: 2057489726524823425, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.5042959 + value: -0.50429565 objectReference: {fileID: 0} - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -8.458901e-12 + value: -1.9386133e-11 objectReference: {fileID: 0} - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y @@ -5389,167 +3391,167 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0030214668 + value: 0.0030214658 objectReference: {fileID: 0} - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.9807038 + value: 0.98070365 objectReference: {fileID: 0} - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.19549987 + value: -0.19550046 objectReference: {fileID: 0} - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000048625225 + value: 0.00000007145249 objectReference: {fileID: 0} - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000041054268 + value: -0.0000000653011 objectReference: {fileID: 0} - target: {fileID: 2149330539247012361, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.75097865 + value: 0.7509788 objectReference: {fileID: 0} - target: {fileID: 2149330539247012361, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.2175455 + value: -0.21754554 objectReference: {fileID: 0} - target: {fileID: 2149330539247012361, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.5988421 + value: -0.5988418 objectReference: {fileID: 0} - target: {fileID: 2149330539247012361, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.1734742 + value: -0.17347416 objectReference: {fileID: 0} - target: {fileID: 2380027669956049854, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.75851125 + value: 0.75851095 objectReference: {fileID: 0} - target: {fileID: 2380027669956049854, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.5723842 + value: 0.57238424 objectReference: {fileID: 0} - target: {fileID: 2380027669956049854, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.00878774 + value: -0.008788032 objectReference: {fileID: 0} - target: {fileID: 2380027669956049854, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.31138372 + value: -0.3113844 objectReference: {fileID: 0} - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: -2.3283064e-10 objectReference: {fileID: 0} - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: -1.1641532e-10 + objectReference: {fileID: 0} + - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0030040161 + objectReference: {fileID: 0} + - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.8242284 + objectReference: {fileID: 0} + - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.5662575 + objectReference: {fileID: 0} + - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.00000008940697 + objectReference: {fileID: 0} + - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000016763806 + objectReference: {fileID: 0} + - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: -0.0052212896 + objectReference: {fileID: 0} + - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.002304103 + objectReference: {fileID: 0} + - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7633579 + objectReference: {fileID: 0} + - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.16905636 + objectReference: {fileID: 0} + - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.608713 + objectReference: {fileID: 0} + - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.13480808 + objectReference: {fileID: 0} + - target: {fileID: 3025673039819971543, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.96469665 + objectReference: {fileID: 0} + - target: {fileID: 3025673039819971543, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.15892707 + objectReference: {fileID: 0} + - target: {fileID: 3025673039819971543, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.20721304 + objectReference: {fileID: 0} + - target: {fileID: 3025673039819971543, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.0341369 + objectReference: {fileID: 0} + - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 1.1641532e-10 + objectReference: {fileID: 0} + - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y value: 5.820766e-11 objectReference: {fileID: 0} - - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalPosition.z - value: 0.003004016 - objectReference: {fileID: 0} - - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalRotation.w - value: 0.8242286 - objectReference: {fileID: 0} - - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalRotation.x - value: 0.56625736 - objectReference: {fileID: 0} - - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalRotation.y - value: 0.000000014901161 - objectReference: {fileID: 0} - - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalRotation.z - value: 0.0000000055879354 - objectReference: {fileID: 0} - - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalPosition.x - value: -0.005221289 - objectReference: {fileID: 0} - - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalPosition.z - value: 0.0023040995 - objectReference: {fileID: 0} - - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalRotation.w - value: 0.76335764 - objectReference: {fileID: 0} - - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalRotation.x - value: 0.1690564 - objectReference: {fileID: 0} - - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalRotation.y - value: -0.6087132 - objectReference: {fileID: 0} - - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalRotation.z - value: 0.13480821 - objectReference: {fileID: 0} - - target: {fileID: 3025673039819971543, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalRotation.w - value: 0.9646967 - objectReference: {fileID: 0} - - target: {fileID: 3025673039819971543, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalRotation.x - value: -0.158927 - objectReference: {fileID: 0} - - target: {fileID: 3025673039819971543, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalRotation.y - value: 0.20721303 - objectReference: {fileID: 0} - - target: {fileID: 3025673039819971543, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalRotation.z - value: 0.034136884 - objectReference: {fileID: 0} - - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalPosition.x - value: 3.4924597e-10 - objectReference: {fileID: 0} - - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: m_LocalPosition.y - value: -1.7462298e-10 - objectReference: {fileID: 0} - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.003004015 + value: 0.0030040154 objectReference: {fileID: 0} - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.7585622 + value: 0.75856185 objectReference: {fileID: 0} - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.6516007 + value: 0.651601 objectReference: {fileID: 0} - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.000000029802322 + value: 0.000000029802319 objectReference: {fileID: 0} - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000007450581 + value: 0.000000029802319 objectReference: {fileID: 0} - target: {fileID: 3303214404428789969, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.32846013 + value: 0.3284602 objectReference: {fileID: 0} - target: {fileID: 3303214404428789969, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.8921972 + value: 0.8921973 objectReference: {fileID: 0} - target: {fileID: 3303214404428789969, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.29727954 + value: 0.29727888 objectReference: {fileID: 0} - target: {fileID: 3303214404428789969, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.087881245 + value: -0.087880984 objectReference: {fileID: 0} - target: {fileID: 3735440054552339591, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: brainPrefab @@ -5557,55 +3559,55 @@ PrefabInstance: objectReference: {fileID: 11400000, guid: c8e4b0990eb7dbbc4bee34addd9cd2b8, type: 2} - target: {fileID: 3748243631002723431, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.47020024 + value: 0.47020042 objectReference: {fileID: 0} - target: {fileID: 3748243631002723431, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.13349901 + value: 0.13349907 objectReference: {fileID: 0} - target: {fileID: 3748243631002723431, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.7921706 + value: 0.79217046 objectReference: {fileID: 0} - target: {fileID: 3748243631002723431, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.36545247 + value: -0.36545265 objectReference: {fileID: 0} - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -2.0372681e-10 + value: -1.7462298e-10 objectReference: {fileID: 0} - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: -5.820766e-11 + value: -2.910383e-11 objectReference: {fileID: 0} - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0024082726 + value: 0.0024082724 objectReference: {fileID: 0} - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.72951615 + value: 0.72951627 objectReference: {fileID: 0} - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.68396366 + value: 0.6839635 objectReference: {fileID: 0} - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000017881393 + value: 0.000000059604645 objectReference: {fileID: 0} - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000007450581 + value: 0.000000067055225 objectReference: {fileID: 0} - target: {fileID: 5108746397492641501, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: -0.14248966 + value: -0.14248975 objectReference: {fileID: 0} - target: {fileID: 5108746397492641501, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.00803566 + value: 0.00803577 objectReference: {fileID: 0} - target: {fileID: 5108746397492641501, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y @@ -5613,19 +3615,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5108746397492641501, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.055728883 + value: 0.05572958 objectReference: {fileID: 0} - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 4.4745083e-11 + value: -5.072226e-10 objectReference: {fileID: 0} - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: 4.6566123e-10 + value: 9.3132246e-10 objectReference: {fileID: 0} - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0041765133 + value: 0.0041765124 objectReference: {fileID: 0} - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w @@ -5633,15 +3635,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.2505719 + value: -0.2505718 objectReference: {fileID: 0} - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000009663677 + value: -0.000000011752768 objectReference: {fileID: 0} - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.00000006014907 + value: 0.0000000036914773 objectReference: {fileID: 0} - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x @@ -5649,7 +3651,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0072106724 + value: 0.0072106714 objectReference: {fileID: 0} - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w @@ -5657,7 +3659,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.18536535 + value: 0.18536544 objectReference: {fileID: 0} - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y @@ -5665,55 +3667,55 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.039815746 + value: -0.03981577 objectReference: {fileID: 0} - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 1.1641532e-10 + value: 5.820766e-11 objectReference: {fileID: 0} - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: -2.910383e-11 + value: 2.910383e-11 objectReference: {fileID: 0} - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.00190334 + value: 0.0019033402 objectReference: {fileID: 0} - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.86583054 + value: 0.8658299 objectReference: {fileID: 0} - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.50033724 + value: 0.5003386 objectReference: {fileID: 0} - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.000000059604638 + value: -0.000000059604645 objectReference: {fileID: 0} - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000021420417 + value: 0.00000003213063 objectReference: {fileID: 0} - target: {fileID: 5823700145767964246, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.85402167 + value: 0.8540216 objectReference: {fileID: 0} - target: {fileID: 5823700145767964246, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.32501373 + value: -0.32501385 objectReference: {fileID: 0} - target: {fileID: 5823700145767964246, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.22636825 + value: 0.22636823 objectReference: {fileID: 0} - target: {fileID: 5823700145767964246, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.33729884 + value: 0.33729893 objectReference: {fileID: 0} - target: {fileID: 5850833608922183593, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.032780167 + value: 0.032780226 objectReference: {fileID: 0} - target: {fileID: 5850833608922183593, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x @@ -5737,43 +3739,43 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6207803342309021390, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.25970182 + value: 0.25970167 objectReference: {fileID: 0} - target: {fileID: 6207803342309021390, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.11142756 + value: -0.11142774 objectReference: {fileID: 0} - target: {fileID: 6513804325188258242, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.7431155 + value: 0.74311537 objectReference: {fileID: 0} - target: {fileID: 6513804325188258242, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.29594904 + value: -0.29594934 objectReference: {fileID: 0} - target: {fileID: 6513804325188258242, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.55757076 + value: 0.5575707 objectReference: {fileID: 0} - target: {fileID: 6513804325188258242, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.2220551 + value: 0.22205523 objectReference: {fileID: 0} - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 0.0035855488 + value: 0.0035855481 objectReference: {fileID: 0} - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.002454592 + value: 0.0024545912 objectReference: {fileID: 0} - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.770837 + value: 0.7708369 objectReference: {fileID: 0} - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.21358104 + value: 0.21358114 objectReference: {fileID: 0} - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y @@ -5781,15 +3783,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.16025306 + value: -0.16025315 objectReference: {fileID: 0} - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 1.2718623e-10 + value: -1.4534605e-10 objectReference: {fileID: 0} - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: 4.656613e-10 + value: -4.656613e-10 objectReference: {fileID: 0} - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z @@ -5801,59 +3803,59 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.29382288 + value: -0.29382274 objectReference: {fileID: 0} - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000020186695 + value: 0.00000004464533 objectReference: {fileID: 0} - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000145828 + value: -0.000000054249732 objectReference: {fileID: 0} - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 3.9170928e-10 + value: -3.2083558e-10 objectReference: {fileID: 0} - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: -2.3283064e-10 + value: -4.656613e-10 objectReference: {fileID: 0} - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.00410612 + value: 0.0041061193 objectReference: {fileID: 0} - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.96942157 + value: 0.9694216 objectReference: {fileID: 0} - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.24540132 + value: -0.24540135 objectReference: {fileID: 0} - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000010759126 + value: -0.00000007383186 objectReference: {fileID: 0} - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000013880826 + value: 0.000000052860386 objectReference: {fileID: 0} - target: {fileID: 6620083584134435749, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.92331064 + value: 0.9233107 objectReference: {fileID: 0} - target: {fileID: 6620083584134435749, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.18358408 + value: -0.18358405 objectReference: {fileID: 0} - target: {fileID: 6620083584134435749, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.33085752 + value: -0.33085743 objectReference: {fileID: 0} - target: {fileID: 6620083584134435749, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.06578521 + value: -0.0657852 objectReference: {fileID: 0} - target: {fileID: 7021329035324230484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x @@ -5897,7 +3899,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 5.820766e-11 + value: -1.1641532e-10 objectReference: {fileID: 0} - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y @@ -5905,39 +3907,39 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0019033395 + value: 0.0019033402 objectReference: {fileID: 0} - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.7118299 + value: 0.71182936 objectReference: {fileID: 0} - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.702352 + value: 0.70235246 objectReference: {fileID: 0} - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000017881392 + value: -0.00000023841858 objectReference: {fileID: 0} - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000048428767 + value: 0.00000011175871 objectReference: {fileID: 0} - target: {fileID: 7378712539761125858, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.58558106 + value: 0.5855806 objectReference: {fileID: 0} - target: {fileID: 7378712539761125858, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.4692841 + value: -0.46928528 objectReference: {fileID: 0} - target: {fileID: 7378712539761125858, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.6377756 + value: -0.63777494 objectReference: {fileID: 0} - target: {fileID: 7378712539761125858, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.17352132 + value: -0.17352198 objectReference: {fileID: 0} - target: {fileID: 7394846002605678119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w @@ -5949,51 +3951,51 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7394846002605678119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.14708121 + value: 0.1470813 objectReference: {fileID: 0} - target: {fileID: 7394846002605678119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.34798768 + value: -0.34798744 objectReference: {fileID: 0} - target: {fileID: 7400717801484663767, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.48328745 + value: 0.48328754 objectReference: {fileID: 0} - target: {fileID: 7400717801484663767, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.07811397 + value: -0.078114174 objectReference: {fileID: 0} - target: {fileID: 7400717801484663767, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.8607985 + value: 0.86079836 objectReference: {fileID: 0} - target: {fileID: 7400717801484663767, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.13913132 + value: 0.13913158 objectReference: {fileID: 0} - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -0.0022254882 + value: -0.0022254875 objectReference: {fileID: 0} - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: -0.002710371 + value: -0.0027103669 objectReference: {fileID: 0} - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: -0.13751179 + value: -0.1375119 objectReference: {fileID: 0} - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.038188737 + value: -0.038188778 objectReference: {fileID: 0} - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.9536711 + value: 0.95367104 objectReference: {fileID: 0} - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.2648463 + value: -0.26484644 objectReference: {fileID: 0} - target: {fileID: 7654735227470959086, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_Name @@ -6001,27 +4003,27 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 0.0029576183 + value: 0.0029576167 objectReference: {fileID: 0} - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: -0.0004493922 + value: -0.00044939033 objectReference: {fileID: 0} - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.4621276 + value: 0.46212772 objectReference: {fileID: 0} - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.16157556 + value: 0.16157565 objectReference: {fileID: 0} - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.8231099 + value: 0.82310987 objectReference: {fileID: 0} - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.28778726 + value: -0.28778735 objectReference: {fileID: 0} - target: {fileID: 8801464852371122986, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w @@ -6029,7 +4031,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8801464852371122986, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.5423468 + value: -0.5423464 objectReference: {fileID: 0} - target: {fileID: 8801464852371122986, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y @@ -6037,35 +4039,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8801464852371122986, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.60428184 + value: 0.60428214 objectReference: {fileID: 0} - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 1.7680413e-11 + value: -8.5655455e-11 objectReference: {fileID: 0} - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: 6.9849193e-10 + value: 0.0000000013969839 objectReference: {fileID: 0} - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0029819128 + value: 0.0029819133 objectReference: {fileID: 0} - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.9604722 + value: 0.9604721 objectReference: {fileID: 0} - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.2783759 + value: -0.2783762 objectReference: {fileID: 0} - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000008648073 + value: 0.00000014039327 objectReference: {fileID: 0} - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.00000009121207 + value: -0.00000018561477 objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] @@ -7274,4 +5276,3 @@ SceneRoots: - {fileID: 1733975501} - {fileID: 1131923926} - {fileID: 2573365365212359253} - - {fileID: 658804661} From 10d99bce87daacc76671c5409823574789d877b3 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 5 May 2026 14:05:51 +0200 Subject: [PATCH 31/38] Improve ant walking speed --- CreatureControl/Runtime/Scripts/Creature.cs | 16 +- NanoBrain/Editor/ClusterViewer.cs | 3 + Samples/Animation/AntAnimator3.controller | 14 +- .../Prefabs/LowPolyAntRigged Variant.prefab | 3574 +++++++++-------- 4 files changed, 1840 insertions(+), 1767 deletions(-) diff --git a/CreatureControl/Runtime/Scripts/Creature.cs b/CreatureControl/Runtime/Scripts/Creature.cs index 62214bc..878dfa5 100644 --- a/CreatureControl/Runtime/Scripts/Creature.cs +++ b/CreatureControl/Runtime/Scripts/Creature.cs @@ -138,10 +138,10 @@ namespace CreatureControl { UpdatePose(); // copy animator root motion to the creature - this.transform.SetPositionAndRotation(targetRig.transform.position, targetRig.transform.rotation); + //this.transform.SetPositionAndRotation(targetRig.transform.position, targetRig.transform.rotation); // As target rig is probably a child of this.transform, // We need to restore the position/rotation of the targetsRig. - targetRig.transform.SetPositionAndRotation(this.transform.position, this.transform.rotation); + //targetRig.transform.SetPositionAndRotation(this.transform.position, this.transform.rotation); } /// @@ -161,10 +161,16 @@ namespace CreatureControl { public virtual void UpdateModel() { if (this.model == null) return; - - Vector3 newPosition = this.targetRig.transform.position + this.targetToModelTranslation; - Quaternion newOrientation = this.targetRig.transform.rotation * this.targetToModelRotation; + + this.targetRig.transform.GetPositionAndRotation(out Vector3 targetRigPosition, out Quaternion targetRigOrientation); + + Vector3 newPosition = targetRigPosition + this.targetToModelTranslation; + Quaternion newOrientation = targetRigOrientation * this.targetToModelRotation; this.model.SetPositionAndRotation(newPosition, newOrientation); + // This leads to problems when the targetRig is a child of the model + // (which is often the case) + // to prevent this, we restore the targetRig pose + this.targetRig.transform.SetPositionAndRotation(targetRigPosition, targetRigOrientation); } #region Collisions diff --git a/NanoBrain/Editor/ClusterViewer.cs b/NanoBrain/Editor/ClusterViewer.cs index 565fdc5..86ae2a4 100644 --- a/NanoBrain/Editor/ClusterViewer.cs +++ b/NanoBrain/Editor/ClusterViewer.cs @@ -503,6 +503,9 @@ namespace NanoBrain { } protected void DrawOutputs(Vector2 parentPos, float size) { + if (this.currentCluster == null) + return; + // Determine the maximum value in this layer // This is used to 'scale' the output value colors of the nuclei float maxValue = 0; diff --git a/Samples/Animation/AntAnimator3.controller b/Samples/Animation/AntAnimator3.controller index 3548c46..46e9e6e 100644 --- a/Samples/Animation/AntAnimator3.controller +++ b/Samples/Animation/AntAnimator3.controller @@ -12,7 +12,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: ab82ff68e62ea3b1c8e6523f8d46c142, type: 2} m_Threshold: -1 m_Position: {x: 0, y: 1} - m_TimeScale: 1 + m_TimeScale: 0.5 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -28,7 +28,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: 91229db5e929c379bbfd5bf417848488, type: 2} m_Threshold: 1 m_Position: {x: 1, y: 0} - m_TimeScale: 1 + m_TimeScale: 0.5 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -51,7 +51,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: 138594cdb62397137913b39c26d3de5a, type: 2} m_Threshold: 0 m_Position: {x: 0, y: 0} - m_TimeScale: 1 + m_TimeScale: 0.5 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -59,7 +59,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: b8a731a1533b8c960b3f3688d4922a24, type: 2} m_Threshold: 0.25 m_Position: {x: 0, y: 1} - m_TimeScale: 1 + m_TimeScale: 0.5 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -67,7 +67,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: 240c3a3c6c28272059bf7b591ff818b1, type: 2} m_Threshold: 0.5 m_Position: {x: -1, y: 0} - m_TimeScale: 1 + m_TimeScale: 0.5 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -75,7 +75,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: 501d5503172629df192bb4ad015fb4f7, type: 2} m_Threshold: 0.75 m_Position: {x: 1, y: 0} - m_TimeScale: 1 + m_TimeScale: 0.5 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -83,7 +83,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: b8a731a1533b8c960b3f3688d4922a24, type: 2} m_Threshold: 1 m_Position: {x: 0, y: -1} - m_TimeScale: -1 + m_TimeScale: -0.5 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 diff --git a/Samples/Prefabs/LowPolyAntRigged Variant.prefab b/Samples/Prefabs/LowPolyAntRigged Variant.prefab index 09d643b..a272ee9 100644 --- a/Samples/Prefabs/LowPolyAntRigged Variant.prefab +++ b/Samples/Prefabs/LowPolyAntRigged Variant.prefab @@ -1,6 +1,6 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!1 &48814082094993782 +--- !u!1 &2818627139358830 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8,70 +8,10 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 6620083584134435749} - - component: {fileID: 332666212402510700} - m_Layer: 0 - m_Name: RightHind_Femur - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &6620083584134435749 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 48814082094993782} - serializedVersion: 2 - m_LocalRotation: {x: -0.18358338, y: -0.3308578, z: -0.06578502, w: 0.9233107} - m_LocalPosition: {x: -0.0009336879, y: 0.0024799206, z: 0.0023264561} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 3274992126458333413} - m_Father: {fileID: 5455741408827371642} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &332666212402510700 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 48814082094993782} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} - m_Name: - m_EditorClassIdentifier: - bones: - _coxa: {fileID: 0} - _femur: {fileID: 6620083584134435749} - _tibia: {fileID: 3274992126458333413} - _tarsus: {fileID: 1815117023348536243} - _phalanges: {fileID: 0} - _end: {fileID: 0} - _femurLength: 0.003004015 - _tibiaLength: 0.004241225 - _tarsusLength: 0 - _phalangesLength: 0 - side: 0 - target: {fileID: 695389755773980816} - targetToBoneFemur: {x: 0.68627733, y: -0.17036346, z: -0.17036389, w: 0.68627715} - targetToBoneTibia: {x: 0.6842575, y: -0.17830275, z: -0.17830281, w: 0.68425745} ---- !u!1 &416341717470637372 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1147253866681693926} - - component: {fileID: 765056943644537310} - - component: {fileID: 5706269701432903497} - - component: {fileID: 623407551900395286} + - component: {fileID: 8069611745943835583} + - component: {fileID: 615705637602634332} + - component: {fileID: 6940442340241899671} + - component: {fileID: 109103061147911809} m_Layer: 0 m_Name: Sphere m_TagString: Untagged @@ -79,36 +19,36 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1147253866681693926 +--- !u!4 &8069611745943835583 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 416341717470637372} + m_GameObject: {fileID: 2818627139358830} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 2994943864588667712} + m_Father: {fileID: 2063238250592969972} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &765056943644537310 +--- !u!33 &615705637602634332 MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 416341717470637372} + m_GameObject: {fileID: 2818627139358830} m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &5706269701432903497 +--- !u!23 &6940442340241899671 MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 416341717470637372} + m_GameObject: {fileID: 2818627139358830} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 @@ -144,13 +84,13 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!135 &623407551900395286 +--- !u!135 &109103061147911809 SphereCollider: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 416341717470637372} + m_GameObject: {fileID: 2818627139358830} m_Material: {fileID: 0} m_IncludeLayers: serializedVersion: 2 @@ -165,7 +105,7 @@ SphereCollider: serializedVersion: 3 m_Radius: 0.5 m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &760677620665191546 +--- !u!1 &310226470799096867 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -173,54 +113,54 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 6524871249661584575} - - component: {fileID: 2921123688466122419} - - component: {fileID: 2976802081314220338} + - component: {fileID: 2063238250592969972} + - component: {fileID: 1190737658547431808} + - component: {fileID: 8793866636301085868} m_Layer: 0 - m_Name: LeftMiddle_Target + m_Name: LeftHind_Target m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &6524871249661584575 +--- !u!4 &2063238250592969972 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 760677620665191546} + m_GameObject: {fileID: 310226470799096867} serializedVersion: 2 - m_LocalRotation: {x: 0.21358053, y: 0.5783707, z: -0.16025272, w: 0.77083707} - m_LocalPosition: {x: 0.0035855595, y: 0, z: 0.0024545942} + m_LocalRotation: {x: 0.039815675, y: -0.9599674, z: 0.1853655, w: 0.20619667} + m_LocalPosition: {x: -0.002576354, y: 0, z: -0.007210674} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 4335119159191562342} - m_Father: {fileID: 1973083541448087081} + - {fileID: 8069611745943835583} + m_Father: {fileID: 1146359114110152748} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &2921123688466122419 +--- !u!114 &1190737658547431808 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 760677620665191546} + m_GameObject: {fileID: 310226470799096867} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} m_Name: m_EditorClassIdentifier: - leg: {fileID: 8104549368886974640} + leg: {fileID: 7898445315015180395} footCollider: {fileID: 0} sphereRenderer: {fileID: 0} ---- !u!54 &2976802081314220338 +--- !u!54 &8793866636301085868 Rigidbody: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 760677620665191546} + m_GameObject: {fileID: 310226470799096867} serializedVersion: 4 m_Mass: 1 m_Drag: 0 @@ -241,7 +181,7 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 0 m_CollisionDetection: 0 ---- !u!1 &768774003839910012 +--- !u!1 &627474747923666567 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -249,31 +189,59 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 5685316299564663885} + - component: {fileID: 8091081424583978495} + - component: {fileID: 5829124374734479753} m_Layer: 0 - m_Name: RightFront_Tibia + m_Name: RightFront_Femur m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &5685316299564663885 +--- !u!4 &8091081424583978495 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 768774003839910012} + m_GameObject: {fileID: 627474747923666567} serializedVersion: 2 - m_LocalRotation: {x: 0.5003333, y: -0, z: 0.000000009778887, w: 0.8658329} - m_LocalPosition: {x: 5.820766e-11, y: 1.4551915e-11, z: 0.0019033396} - m_LocalScale: {x: 0.99999994, y: 1, z: 0.99999994} + m_LocalRotation: {x: -0.055727027, y: 0.14248894, z: 0.008035352, w: 0.98819375} + m_LocalPosition: {x: 0.0011845141, y: 0.0022176225, z: -0.0008242579} + m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 2100924547480595579} - m_Father: {fileID: 5108746397492641501} + - {fileID: 2179315757048009861} + m_Father: {fileID: 1186408022295929665} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1172085276506359845 +--- !u!114 &5829124374734479753 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 627474747923666567} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 8091081424583978495} + _tibia: {fileID: 2179315757048009861} + _tarsus: {fileID: 2356608666883495351} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0019033402 + _tibiaLength: 0.0030214654 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 6702413818536640054} + targetToBoneFemur: {x: -0.39405388, y: 0.5871299, z: 0.5871303, w: -0.39405403} + targetToBoneTibia: {x: 0.16597588, y: 0.6873515, z: 0.68735147, w: 0.16597602} +--- !u!1 &794584019555967318 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -281,7 +249,7 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2569903554710171135} + - component: {fileID: 4544836246457456813} m_Layer: 0 m_Name: LeftHind_Tibia m_TagString: Untagged @@ -289,23 +257,23 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &2569903554710171135 +--- !u!4 &4544836246457456813 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1172085276506359845} + m_GameObject: {fileID: 794584019555967318} serializedVersion: 2 - m_LocalRotation: {x: 0.5662565, y: 0.000000074505806, z: -0.000000029802322, w: 0.82422906} - m_LocalPosition: {x: -2.3283064e-10, y: -1.1641532e-10, z: 0.0030040164} + m_LocalRotation: {x: 0.5662575, y: -0.000000014901161, z: -0.000000013038516, w: 0.82422847} + m_LocalPosition: {x: -1.1641532e-10, y: 0, z: 0.0030040161} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 6572398933426288654} - m_Father: {fileID: 3025673039819971543} + - {fileID: 2143803970633277119} + m_Father: {fileID: 2469329805429469346} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1707527511329441970 +--- !u!1 &879920836154580446 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -313,9 +281,1569 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 5455741408827371642} - - component: {fileID: 6225543280879680199} - - component: {fileID: 5769218204124627899} + - component: {fileID: 6594209482403568318} + - component: {fileID: 1260190849521237178} + - component: {fileID: 6854476533032069088} + m_Layer: 0 + m_Name: LeftMiddle_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6594209482403568318 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 879920836154580446} + serializedVersion: 2 + m_LocalRotation: {x: 0.16025275, y: -0.7708369, z: 0.21358046, w: 0.5783709} + m_LocalPosition: {x: -0.0035855589, y: 0, z: -0.002454592} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1654903289352118111} + m_Father: {fileID: 2897418291226250779} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1260190849521237178 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 879920836154580446} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 6053023809026804920} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &6854476533032069088 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 879920836154580446} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &1046291156767383927 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 166916568455411127} + - component: {fileID: 3938860759020036166} + - component: {fileID: 4885213966044054843} + m_Layer: 0 + m_Name: RighHind_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &166916568455411127 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1046291156767383927} + serializedVersion: 2 + m_LocalRotation: {x: -0.07736307, y: -0.91629434, z: 0.2158938, w: -0.32834357} + m_LocalPosition: {x: 0.0040905527, y: 0, z: -0.0061657066} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6731229827978058710} + m_Father: {fileID: 2897418291226250779} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &3938860759020036166 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1046291156767383927} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 8422479635121319079} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &4885213966044054843 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1046291156767383927} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &1381374271869641024 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6702413818536640054} + - component: {fileID: 2984370684138112095} + - component: {fileID: 714482282448698588} + m_Layer: 0 + m_Name: RightFront_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6702413818536640054 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1381374271869641024} + serializedVersion: 2 + m_LocalRotation: {x: 0.26484564, y: 0.1375111, z: -0.03818843, w: 0.9536714} + m_LocalPosition: {x: 0.0022254856, y: 0, z: 0.0027103818} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 9027093101409739505} + m_Father: {fileID: 2897418291226250779} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2984370684138112095 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1381374271869641024} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 5829124374734479753} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &714482282448698588 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1381374271869641024} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &1853081531070899003 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1146359114110152748} + m_Layer: 0 + m_Name: RightFeetTarget + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1146359114110152748 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1853081531070899003} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1817326604091929521} + - {fileID: 1136115525120555845} + - {fileID: 2063238250592969972} + m_Father: {fileID: 6693967616387045584} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2391558079143476650 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2179315757048009861} + m_Layer: 0 + m_Name: RightFront_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2179315757048009861 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2391558079143476650} + serializedVersion: 2 + m_LocalRotation: {x: 0.500334, y: -0.000000014901159, z: -9.3132246e-10, w: 0.86583245} + m_LocalPosition: {x: -5.820766e-11, y: 1.4551915e-11, z: 0.0019033402} + m_LocalScale: {x: 0.99999994, y: 1, z: 0.99999994} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2356608666883495351} + m_Father: {fileID: 8091081424583978495} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2737017325502982318 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4506122210810578416} + m_Layer: 0 + m_Name: LeftMiddle_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4506122210810578416 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2737017325502982318} + serializedVersion: 2 + m_LocalRotation: {x: -0.29382282, y: -0.00000015715536, z: 0.00000013800356, w: 0.9558599} + m_LocalPosition: {x: 3.6353678e-10, y: 4.656613e-10, z: 0.004129558} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7509758028014155536} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2770742525480886761 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 448567282493537997} + - component: {fileID: 2384230199114995033} + - component: {fileID: 3061345768287683477} + - component: {fileID: 4580021351885497170} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &448567282493537997 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2770742525480886761} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1136115525120555845} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &2384230199114995033 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2770742525480886761} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3061345768287683477 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2770742525480886761} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &4580021351885497170 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2770742525480886761} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &3188458486668866969 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2143803970633277119} + m_Layer: 0 + m_Name: LeftHind_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2143803970633277119 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3188458486668866969} + serializedVersion: 2 + m_LocalRotation: {x: -0.24540132, y: 0.000000010059308, z: -0.0000000052178937, w: 0.9694216} + m_LocalPosition: {x: -7.757306e-11, y: 9.313226e-10, z: 0.0041061183} + m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 0.9999999} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4544836246457456813} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &4167713860447769177 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2598972606701937627} + m_Layer: 0 + m_Name: RightMiddle_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2598972606701937627 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4167713860447769177} + serializedVersion: 2 + m_LocalRotation: {x: 0.6839624, y: -0.000000029802322, z: 0.000000037252903, w: 0.7295173} + m_LocalPosition: {x: -1.1641532e-10, y: 0, z: 0.002408273} + m_LocalScale: {x: 1, y: 1.0000001, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8773790806045806296} + m_Father: {fileID: 594818000277378115} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &4337532486384028974 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1136115525120555845} + - component: {fileID: 6202936925396664277} + - component: {fileID: 5754004656901118418} + m_Layer: 0 + m_Name: RightMiddle_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1136115525120555845 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4337532486384028974} + serializedVersion: 2 + m_LocalRotation: {x: -0.13480783, y: -0.763358, z: 0.16905607, w: -0.60871303} + m_LocalPosition: {x: 0.005221297, y: 0, z: -0.0023041053} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 448567282493537997} + m_Father: {fileID: 1146359114110152748} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &6202936925396664277 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4337532486384028974} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 5547063884946925271} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &5754004656901118418 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4337532486384028974} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &4402769994744622567 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5436606965322799968} + - component: {fileID: 8408187979788404300} + - component: {fileID: 1547823637431222641} + - component: {fileID: 5709894870924098988} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5436606965322799968 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4402769994744622567} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1817326604091929521} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8408187979788404300 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4402769994744622567} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1547823637431222641 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4402769994744622567} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &5709894870924098988 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4402769994744622567} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &4785709934359029167 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2469329805429469346} + - component: {fileID: 7898445315015180395} + m_Layer: 0 + m_Name: LeftHind_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2469329805429469346 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4785709934359029167} + serializedVersion: 2 + m_LocalRotation: {x: -0.03413683, y: -0.96469676, z: -0.15892707, w: 0.20721252} + m_LocalPosition: {x: -0.00033019992, y: 0.002194208, z: -0.0022233187} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4544836246457456813} + m_Father: {fileID: 1186408022295929665} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &7898445315015180395 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4785709934359029167} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 2469329805429469346} + _tibia: {fileID: 4544836246457456813} + _tarsus: {fileID: 2143803970633277119} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0030040164 + _tibiaLength: 0.004106119 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 2063238250592969972} + targetToBoneFemur: {x: -0.42978364, y: 0.5615034, z: 0.56150335, w: -0.42978367} + targetToBoneTibia: {x: -0.69554174, y: 0.12736538, z: 0.12736535, w: -0.6955417} +--- !u!1 &5099577226509260816 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6693967616387045584} + m_Layer: 0 + m_Name: Body + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6693967616387045584 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5099577226509260816} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2897418291226250779} + - {fileID: 1146359114110152748} + m_Father: {fileID: 1186408022295929665} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &5132672650264838643 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1817326604091929521} + - component: {fileID: 7330182162625389834} + - component: {fileID: 6653358190846575494} + m_Layer: 0 + m_Name: LeftFront_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1817326604091929521 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5132672650264838643} + serializedVersion: 2 + m_LocalRotation: {x: 0.28778678, y: -0.46212685, z: 0.16157489, w: 0.8231107} + m_LocalPosition: {x: -0.0029576225, y: 0, z: 0.0004494015} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5436606965322799968} + m_Father: {fileID: 1146359114110152748} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &7330182162625389834 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5132672650264838643} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 155438744560988365} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &6653358190846575494 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5132672650264838643} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &5309068433442998760 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6958972504176507483} + - component: {fileID: 8422479635121319079} + m_Layer: 0 + m_Name: RightHind_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6958972504176507483 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5309068433442998760} + serializedVersion: 2 + m_LocalRotation: {x: 0.065785, y: -0.9233107, z: -0.18358336, w: -0.33085784} + m_LocalPosition: {x: 0.0009336879, y: 0.0024799206, z: -0.0023264561} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7424123368923134861} + m_Father: {fileID: 1186408022295929665} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8422479635121319079 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5309068433442998760} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 6958972504176507483} + _tibia: {fileID: 7424123368923134861} + _tarsus: {fileID: 3777766915705757037} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0030040152 + _tibiaLength: 0.0042412262 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 166916568455411127} + targetToBoneFemur: {x: 0.6862771, y: -0.17036358, z: -0.17036386, w: 0.6862772} + targetToBoneTibia: {x: 0.6842577, y: -0.17830297, z: -0.17830284, w: 0.6842573} +--- !u!1 &5681202965352357062 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9027093101409739505} + - component: {fileID: 7832848972917158104} + - component: {fileID: 5397275688707798435} + - component: {fileID: 7382278788440192791} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &9027093101409739505 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5681202965352357062} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6702413818536640054} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &7832848972917158104 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5681202965352357062} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &5397275688707798435 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5681202965352357062} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &7382278788440192791 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5681202965352357062} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &6065556123495316645 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2897418291226250779} + m_Layer: 0 + m_Name: LeftFeetTarget + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2897418291226250779 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6065556123495316645} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6702413818536640054} + - {fileID: 6594209482403568318} + - {fileID: 166916568455411127} + m_Father: {fileID: 6693967616387045584} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &6159996709595705846 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2356608666883495351} + m_Layer: 0 + m_Name: RightFront_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2356608666883495351 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6159996709595705846} + serializedVersion: 2 + m_LocalRotation: {x: -0.1954987, y: 0.0000000031388354, z: 0.000000006370368, w: 0.98070395} + m_LocalPosition: {x: -6.543855e-11, y: -2.3283064e-10, z: 0.0030214656} + m_LocalScale: {x: 1.0000001, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2179315757048009861} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &6316072838432425663 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8773790806045806296} + m_Layer: 0 + m_Name: RightMiddle_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8773790806045806296 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6316072838432425663} + serializedVersion: 2 + m_LocalRotation: {x: -0.25057152, y: 0.00000005042321, z: -0.0000000456221, w: 0.96809804} + m_LocalPosition: {x: 3.5153447e-10, y: 4.6566123e-10, z: 0.0041765133} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2598972606701937627} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &6989243030111056437 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1844943529442369595} + m_Layer: 0 + m_Name: LeftFront_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1844943529442369595 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6989243030111056437} + serializedVersion: 2 + m_LocalRotation: {x: 0.70235044, y: -0.00000008940697, z: 0.00000008568168, w: 0.7118314} + m_LocalPosition: {x: 2.3283064e-10, y: 0, z: 0.0019033396} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5848079605461954508} + m_Father: {fileID: 2694996827067636066} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &7017512270174935616 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1654903289352118111} + - component: {fileID: 8349509800371278860} + - component: {fileID: 3364568146045265353} + - component: {fileID: 549420281024163742} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1654903289352118111 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7017512270174935616} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6594209482403568318} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8349509800371278860 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7017512270174935616} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3364568146045265353 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7017512270174935616} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &549420281024163742 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7017512270174935616} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &7045146692761223360 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5848079605461954508} + m_Layer: 0 + m_Name: LeftFront_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5848079605461954508 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7045146692761223360} + serializedVersion: 2 + m_LocalRotation: {x: -0.27837536, y: 0.0000001223605, z: -0.00000015950943, w: 0.96047235} + m_LocalPosition: {x: 9.0370045e-11, y: 6.9849193e-10, z: 0.0029819128} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1844943529442369595} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &7106826106671323122 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6731229827978058710} + - component: {fileID: 596401111427621659} + - component: {fileID: 3072047335373344687} + - component: {fileID: 5789410500210666822} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6731229827978058710 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7106826106671323122} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 166916568455411127} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &596401111427621659 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7106826106671323122} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3072047335373344687 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7106826106671323122} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &5789410500210666822 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7106826106671323122} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &7120345591145567988 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7424123368923134861} + m_Layer: 0 + m_Name: RightHind_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7424123368923134861 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7120345591145567988} + serializedVersion: 2 + m_LocalRotation: {x: 0.6515992, y: 0.00000008940696, z: -0.000000014901159, w: 0.75856334} + m_LocalPosition: {x: -1.1641532e-10, y: -5.820766e-11, z: 0.0030040147} + m_LocalScale: {x: 1, y: 1.0000001, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3777766915705757037} + m_Father: {fileID: 6958972504176507483} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &7446482324527034130 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 503879584753174156} + - component: {fileID: 6053023809026804920} + m_Layer: 0 + m_Name: LeftMiddle_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &503879584753174156 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7446482324527034130} + serializedVersion: 2 + m_LocalRotation: {x: -0.22205469, y: -0.74311554, z: -0.2959484, w: 0.5575712} + m_LocalPosition: {x: -0.00024003958, y: 0.0020915146, z: -0.0014802816} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7509758028014155536} + m_Father: {fileID: 1186408022295929665} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &6053023809026804920 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7446482324527034130} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 503879584753174156} + _tibia: {fileID: 7509758028014155536} + _tarsus: {fileID: 4506122210810578416} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0024082728 + _tibiaLength: 0.0041295583 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 6594209482403568318} + targetToBoneFemur: {x: -0.07596305, y: 0.7030147, z: 0.70301473, w: -0.07596322} + targetToBoneTibia: {x: 0.5739336, y: 0.41303775, z: 0.41303787, w: 0.57393366} +--- !u!1 &7711405578978141862 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3777766915705757037} + m_Layer: 0 + m_Name: RightHind_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3777766915705757037 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7711405578978141862} + serializedVersion: 2 + m_LocalRotation: {x: -0.27829936, y: -0.00000005742217, z: 0.0000000255697, w: 0.9604944} + m_LocalPosition: {x: 7.901253e-10, y: 0.0000000013969836, z: 0.0042412253} + m_LocalScale: {x: 1, y: 0.9999999, z: 0.9999999} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7424123368923134861} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &8096372255630545175 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 594818000277378115} + - component: {fileID: 5547063884946925271} + m_Layer: 0 + m_Name: RightMiddle_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &594818000277378115 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8096372255630545175} + serializedVersion: 2 + m_LocalRotation: {x: 0.17347363, y: -0.75097907, z: -0.21754494, w: -0.5988419} + m_LocalPosition: {x: 0.0008435269, y: 0.0020915149, z: -0.0013045785} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2598972606701937627} + m_Father: {fileID: 1186408022295929665} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &5547063884946925271 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8096372255630545175} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 594818000277378115} + _tibia: {fileID: 2598972606701937627} + _tarsus: {fileID: 8773790806045806296} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0024082735 + _tibiaLength: 0.0041765138 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 1136115525120555845} + targetToBoneFemur: {x: 0.66122663, y: -0.25055847, z: -0.25055844, w: 0.66122663} + targetToBoneTibia: {x: 0.58079475, y: -0.40333292, z: -0.4033329, w: 0.580795} +--- !u!1 &8337622648895462336 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1186408022295929665} + - component: {fileID: 3246096951653456320} + - component: {fileID: 4226361316839711815} m_Layer: 0 m_Name: Target Rig m_TagString: Untagged @@ -323,56 +1851,56 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &5455741408827371642 +--- !u!4 &1186408022295929665 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1707527511329441970} + m_GameObject: {fileID: 8337622648895462336} serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 7400717801484663767} - - {fileID: 6513804325188258242} - - {fileID: 3025673039819971543} - - {fileID: 5108746397492641501} - - {fileID: 2149330539247012361} - - {fileID: 6620083584134435749} - - {fileID: 3032351043825914991} + - {fileID: 2694996827067636066} + - {fileID: 503879584753174156} + - {fileID: 2469329805429469346} + - {fileID: 8091081424583978495} + - {fileID: 594818000277378115} + - {fileID: 6958972504176507483} + - {fileID: 6693967616387045584} m_Father: {fileID: 7021329035324230484} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &6225543280879680199 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} +--- !u!114 &3246096951653456320 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1707527511329441970} + m_GameObject: {fileID: 8337622648895462336} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: a25e8575da1d1cba48dc2b8da7a2b0ab, type: 3} m_Name: m_EditorClassIdentifier: - leftFrontLeg: {fileID: 5737181765023906041} - leftMiddleLeg: {fileID: 8104549368886974640} - leftBackLeg: {fileID: 247438257786629943} - rightFrontLeg: {fileID: 9079939580604013961} - rightMiddleLeg: {fileID: 1490908466784209397} - rightBackLeg: {fileID: 332666212402510700} + leftFrontLeg: {fileID: 155438744560988365} + leftMiddleLeg: {fileID: 6053023809026804920} + leftBackLeg: {fileID: 7898445315015180395} + rightFrontLeg: {fileID: 5829124374734479753} + rightMiddleLeg: {fileID: 5547063884946925271} + rightBackLeg: {fileID: 8422479635121319079} render: 1 - legLength: 0.0031432603 ---- !u!95 &5769218204124627899 + legLength: 0.009770508 +--- !u!95 &4226361316839711815 Animator: serializedVersion: 5 m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1707527511329441970} + m_GameObject: {fileID: 8337622648895462336} m_Enabled: 1 m_Avatar: {fileID: 0} m_Controller: {fileID: 9100000, guid: ba169e741a830f910bdde9e04f7c88f4, type: 2} @@ -386,7 +1914,7 @@ Animator: m_AllowConstantClipSamplingOptimization: 1 m_KeepAnimatorStateOnDisable: 0 m_WriteDefaultValuesOnDisable: 0 ---- !u!1 &1905952260995010657 +--- !u!1 &8471587059027499795 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -394,1152 +1922,7 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 5108746397492641501} - - component: {fileID: 9079939580604013961} - m_Layer: 0 - m_Name: RightFront_Femur - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &5108746397492641501 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1905952260995010657} - serializedVersion: 2 - m_LocalRotation: {x: 0.008035312, y: 0.98819375, z: 0.055726767, w: -0.1424891} - m_LocalPosition: {x: -0.0011845141, y: 0.0022176225, z: 0.0008242579} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 5685316299564663885} - m_Father: {fileID: 5455741408827371642} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &9079939580604013961 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1905952260995010657} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} - m_Name: - m_EditorClassIdentifier: - bones: - _coxa: {fileID: 0} - _femur: {fileID: 5108746397492641501} - _tibia: {fileID: 5685316299564663885} - _tarsus: {fileID: 2100924547480595579} - _phalanges: {fileID: 0} - _end: {fileID: 0} - _femurLength: 0.0019033399 - _tibiaLength: 0.0030214663 - _tarsusLength: 0 - _phalangesLength: 0 - side: 0 - target: {fileID: 7535818317971162736} - targetToBoneFemur: {x: -0.39405388, y: 0.58712995, z: 0.58713025, w: -0.39405403} - targetToBoneTibia: {x: 0.16597556, y: 0.68735176, z: 0.6873516, w: 0.16597566} ---- !u!1 &2002995186414150031 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7535818317971162736} - - component: {fileID: 1564660168666174722} - - component: {fileID: 7458700492093133842} - m_Layer: 0 - m_Name: RightFront_Target - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7535818317971162736 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2002995186414150031} - serializedVersion: 2 - m_LocalRotation: {x: -0.038188487, y: 0.95367134, z: -0.26484576, w: -0.13751125} - m_LocalPosition: {x: -0.0022254877, y: 0, z: -0.0027103845} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 8784072832208096793} - m_Father: {fileID: 1973083541448087081} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1564660168666174722 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2002995186414150031} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} - m_Name: - m_EditorClassIdentifier: - leg: {fileID: 9079939580604013961} - footCollider: {fileID: 0} - sphereRenderer: {fileID: 0} ---- !u!54 &7458700492093133842 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2002995186414150031} - serializedVersion: 4 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!1 &2179671286471868525 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5257551609953188724} - m_Layer: 0 - m_Name: RightMiddle_Tarsus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &5257551609953188724 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2179671286471868525} - serializedVersion: 2 - m_LocalRotation: {x: -0.25057116, y: -0.000000065022775, z: 0.00000006945299, w: 0.96809816} - m_LocalPosition: {x: -3.238299e-10, y: -0.0000000013969836, z: 0.0041765124} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 4543089944971148809} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2380841201002348501 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4875846235429722894} - - component: {fileID: 2908643555560092782} - - component: {fileID: 2574878829964795765} - - component: {fileID: 810647718779632323} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4875846235429722894 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2380841201002348501} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 8598108513644155435} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &2908643555560092782 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2380841201002348501} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &2574878829964795765 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2380841201002348501} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!135 &810647718779632323 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2380841201002348501} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 1 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &2457472889863853332 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7400717801484663767} - - component: {fileID: 5737181765023906041} - m_Layer: 0 - m_Name: LeftFront_Femur - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7400717801484663767 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2457472889863853332} - serializedVersion: 2 - m_LocalRotation: {x: -0.07811355, y: 0.8607989, z: 0.13913086, w: 0.48328695} - m_LocalPosition: {x: 0.00058102724, y: 0.0022176215, z: 0.0009999603} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 7313217641663358484} - m_Father: {fileID: 5455741408827371642} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &5737181765023906041 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2457472889863853332} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} - m_Name: - m_EditorClassIdentifier: - bones: - _coxa: {fileID: 0} - _femur: {fileID: 7400717801484663767} - _tibia: {fileID: 7313217641663358484} - _tarsus: {fileID: 8921816082228033372} - _phalanges: {fileID: 0} - _end: {fileID: 0} - _femurLength: 0.0019033394 - _tibiaLength: 0.0029819128 - _tarsusLength: 0 - _phalangesLength: 0 - side: 0 - target: {fileID: 8598108513644155435} - targetToBoneFemur: {x: -0.54446507, y: 0.4511738, z: 0.4511738, w: -0.5444651} - targetToBoneTibia: {x: -0.4291711, y: -0.5619718, z: -0.5619717, w: -0.4291711} ---- !u!1 &3777701420985572540 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2100924547480595579} - m_Layer: 0 - m_Name: RightFront_Tarsus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2100924547480595579 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3777701420985572540} - serializedVersion: 2 - m_LocalRotation: {x: -0.19549796, y: -0.000000005094616, z: 0.000000017145215, w: 0.98070407} - m_LocalPosition: {x: -2.302496e-10, y: 4.656613e-10, z: 0.0030214668} - m_LocalScale: {x: 1.0000001, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 5685316299564663885} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &3920577155972359935 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7166545474223194656} - m_Layer: 0 - m_Name: RightFeetTarget - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7166545474223194656 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3920577155972359935} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 8598108513644155435} - - {fileID: 2994943864588667712} - - {fileID: 5432151846474450495} - m_Father: {fileID: 3032351043825914991} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &4065735907697761591 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3025673039819971543} - - component: {fileID: 247438257786629943} - m_Layer: 0 - m_Name: LeftHind_Femur - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3025673039819971543 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4065735907697761591} - serializedVersion: 2 - m_LocalRotation: {x: -0.15892647, y: 0.20721243, z: 0.03413669, w: 0.9646968} - m_LocalPosition: {x: 0.00033019992, y: 0.002194208, z: 0.0022233187} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 2569903554710171135} - m_Father: {fileID: 5455741408827371642} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &247438257786629943 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4065735907697761591} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} - m_Name: - m_EditorClassIdentifier: - bones: - _coxa: {fileID: 0} - _femur: {fileID: 3025673039819971543} - _tibia: {fileID: 2569903554710171135} - _tarsus: {fileID: 6572398933426288654} - _phalanges: {fileID: 0} - _end: {fileID: 0} - _femurLength: 0.0030040161 - _tibiaLength: 0.004106119 - _tarsusLength: 0 - _phalangesLength: 0 - side: 0 - target: {fileID: 5432151846474450495} - targetToBoneFemur: {x: -0.42978364, y: 0.56150335, z: 0.56150335, w: -0.42978373} - targetToBoneTibia: {x: -0.69554174, y: 0.12736525, z: 0.12736537, w: -0.69554156} ---- !u!1 &4182190929931663781 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1973083541448087081} - m_Layer: 0 - m_Name: LeftFeetTarget - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1973083541448087081 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4182190929931663781} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 7535818317971162736} - - {fileID: 6524871249661584575} - - {fileID: 695389755773980816} - m_Father: {fileID: 3032351043825914991} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &4952099904377439682 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1815117023348536243} - m_Layer: 0 - m_Name: RightHind_Tarsus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1815117023348536243 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4952099904377439682} - serializedVersion: 2 - m_LocalRotation: {x: -0.27829966, y: -0.000000042638188, z: 0.000000038007318, w: 0.9604943} - m_LocalPosition: {x: 4.529893e-10, y: 4.6566123e-10, z: 0.0042412244} - m_LocalScale: {x: 1, y: 0.9999999, z: 0.9999999} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 3274992126458333413} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &5078412544789699653 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8784072832208096793} - - component: {fileID: 8911320210562044992} - - component: {fileID: 3257845160480096208} - - component: {fileID: 205488134360900369} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &8784072832208096793 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5078412544789699653} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 7535818317971162736} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &8911320210562044992 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5078412544789699653} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &3257845160480096208 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5078412544789699653} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!135 &205488134360900369 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5078412544789699653} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 1 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &5281421315871977577 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3841319966920808315} - - component: {fileID: 8264832174447155669} - - component: {fileID: 1425301757130586281} - - component: {fileID: 7313344205372792901} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3841319966920808315 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5281421315871977577} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 5432151846474450495} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &8264832174447155669 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5281421315871977577} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &1425301757130586281 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5281421315871977577} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!135 &7313344205372792901 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5281421315871977577} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 1 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &5310401428433936744 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6513804325188258242} - - component: {fileID: 8104549368886974640} - m_Layer: 0 - m_Name: LeftMiddle_Femur - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &6513804325188258242 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5310401428433936744} - serializedVersion: 2 - m_LocalRotation: {x: -0.2959484, y: 0.557571, z: 0.22205457, w: 0.7431157} - m_LocalPosition: {x: 0.00024003958, y: 0.0020915146, z: 0.0014802816} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1060641200493147314} - m_Father: {fileID: 5455741408827371642} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &8104549368886974640 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5310401428433936744} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} - m_Name: - m_EditorClassIdentifier: - bones: - _coxa: {fileID: 0} - _femur: {fileID: 6513804325188258242} - _tibia: {fileID: 1060641200493147314} - _tarsus: {fileID: 6535965612457355736} - _phalanges: {fileID: 0} - _end: {fileID: 0} - _femurLength: 0.0024082724 - _tibiaLength: 0.004129558 - _tarsusLength: 0 - _phalangesLength: 0 - side: 0 - target: {fileID: 6524871249661584575} - targetToBoneFemur: {x: -0.07596299, y: 0.7030147, z: 0.70301473, w: -0.07596313} - targetToBoneTibia: {x: 0.5739338, y: 0.4130375, z: 0.41303754, w: 0.57393384} ---- !u!1 &5562197182297121653 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6535965612457355736} - m_Layer: 0 - m_Name: LeftMiddle_Tarsus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &6535965612457355736 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5562197182297121653} - serializedVersion: 2 - m_LocalRotation: {x: -0.2938226, y: -0.00000006842171, z: 0.000000027993332, w: 0.95586} - m_LocalPosition: {x: -3.2661936e-11, y: -4.656613e-10, z: 0.0041295574} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1060641200493147314} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &6190145159146150034 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3032351043825914991} - m_Layer: 0 - m_Name: Body - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3032351043825914991 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6190145159146150034} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1973083541448087081} - - {fileID: 7166545474223194656} - m_Father: {fileID: 5455741408827371642} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &6583053149302699544 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5432151846474450495} - - component: {fileID: 5860664376499223543} - - component: {fileID: 6463125562356195587} - m_Layer: 0 - m_Name: LeftHind_Target - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &5432151846474450495 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6583053149302699544} - serializedVersion: 2 - m_LocalRotation: {x: 0.18536524, y: 0.20619658, z: -0.039815597, w: 0.95996743} - m_LocalPosition: {x: 0.0025763547, y: 0, z: 0.007210679} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 3841319966920808315} - m_Father: {fileID: 7166545474223194656} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &5860664376499223543 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6583053149302699544} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} - m_Name: - m_EditorClassIdentifier: - leg: {fileID: 247438257786629943} - footCollider: {fileID: 0} - sphereRenderer: {fileID: 0} ---- !u!54 &6463125562356195587 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6583053149302699544} - serializedVersion: 4 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!1 &6801568934457079910 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2994943864588667712} - - component: {fileID: 5559140201310600965} - - component: {fileID: 1432832243362445666} - m_Layer: 0 - m_Name: RightMiddle_Target - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2994943864588667712 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6801568934457079910} - serializedVersion: 2 - m_LocalRotation: {x: 0.16905624, y: -0.60871303, z: 0.13480797, w: 0.7633579} - m_LocalPosition: {x: -0.005221297, y: 0, z: 0.0023041049} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1147253866681693926} - m_Father: {fileID: 7166545474223194656} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &5559140201310600965 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6801568934457079910} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} - m_Name: - m_EditorClassIdentifier: - leg: {fileID: 1490908466784209397} - footCollider: {fileID: 0} - sphereRenderer: {fileID: 0} ---- !u!54 &1432832243362445666 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6801568934457079910} - serializedVersion: 4 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!1 &6873385228662672074 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7313217641663358484} - m_Layer: 0 - m_Name: LeftFront_Tibia - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7313217641663358484 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6873385228662672074} - serializedVersion: 2 - m_LocalRotation: {x: 0.7023507, y: -0.000000119209275, z: -0.000000052154057, w: 0.71183115} - m_LocalPosition: {x: -5.820766e-11, y: -1.4551915e-11, z: 0.0019033395} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 8921816082228033372} - m_Father: {fileID: 7400717801484663767} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &6914182830566095201 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7627482398291295121} - - component: {fileID: 4565609942158302390} - - component: {fileID: 4188737614634612876} - - component: {fileID: 3813967880658986579} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7627482398291295121 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6914182830566095201} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 695389755773980816} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &4565609942158302390 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6914182830566095201} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &4188737614634612876 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6914182830566095201} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!135 &3813967880658986579 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6914182830566095201} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 1 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &7131816219117484372 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1060641200493147314} + - component: {fileID: 7509758028014155536} m_Layer: 0 m_Name: LeftMiddle_Tibia m_TagString: Untagged @@ -1547,23 +1930,23 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1060641200493147314 +--- !u!4 &7509758028014155536 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7131816219117484372} + m_GameObject: {fileID: 8471587059027499795} serializedVersion: 2 - m_LocalRotation: {x: 0.81196964, y: 0.000000029802322, z: -0.000000014901161, w: 0.5836997} - m_LocalPosition: {x: -2.910383e-10, y: -1.1641532e-10, z: 0.0024082724} + m_LocalRotation: {x: 0.8119699, y: 0.00000020861626, z: -0.000000014901161, w: 0.58369946} + m_LocalPosition: {x: -1.4551915e-10, y: 5.820766e-11, z: 0.0024082726} m_LocalScale: {x: 0.9999998, y: 1, z: 1.0000001} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 6535965612457355736} - m_Father: {fileID: 6513804325188258242} + - {fileID: 4506122210810578416} + m_Father: {fileID: 503879584753174156} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &7286684200615477946 +--- !u!1 &8679495084672713308 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1571,146 +1954,38 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 695389755773980816} - - component: {fileID: 8419874740830707076} - - component: {fileID: 6435354293840719115} + - component: {fileID: 2694996827067636066} + - component: {fileID: 155438744560988365} m_Layer: 0 - m_Name: RighHind_Target + m_Name: LeftFront_Femur m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &695389755773980816 +--- !u!4 &2694996827067636066 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7286684200615477946} + m_GameObject: {fileID: 8679495084672713308} serializedVersion: 2 - m_LocalRotation: {x: 0.21589375, y: -0.32834357, z: 0.07736305, w: 0.9162944} - m_LocalPosition: {x: -0.004090551, y: 0, z: 0.006165704} + m_LocalRotation: {x: -0.13913071, y: -0.48328665, z: -0.07811351, w: 0.860799} + m_LocalPosition: {x: -0.00058102724, y: 0.0022176215, z: -0.0009999603} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 7627482398291295121} - m_Father: {fileID: 1973083541448087081} + - {fileID: 1844943529442369595} + m_Father: {fileID: 1186408022295929665} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &8419874740830707076 +--- !u!114 &155438744560988365 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7286684200615477946} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} - m_Name: - m_EditorClassIdentifier: - leg: {fileID: 332666212402510700} - footCollider: {fileID: 0} - sphereRenderer: {fileID: 0} ---- !u!54 &6435354293840719115 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7286684200615477946} - serializedVersion: 4 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!1 &8160510656416894680 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4543089944971148809} - m_Layer: 0 - m_Name: RightMiddle_Tibia - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4543089944971148809 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8160510656416894680} - serializedVersion: 2 - m_LocalRotation: {x: 0.68396217, y: 0.00000011920929, z: -0.000000037252903, w: 0.7295175} - m_LocalPosition: {x: 8.731149e-11, y: -5.820766e-11, z: 0.0024082728} - m_LocalScale: {x: 1, y: 1.0000001, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 5257551609953188724} - m_Father: {fileID: 2149330539247012361} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &8426252934148981496 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2149330539247012361} - - component: {fileID: 1490908466784209397} - m_Layer: 0 - m_Name: RightMiddle_Femur - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2149330539247012361 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8426252934148981496} - serializedVersion: 2 - m_LocalRotation: {x: -0.21754476, y: -0.59884197, z: -0.17347345, w: 0.750979} - m_LocalPosition: {x: -0.0008435269, y: 0.0020915149, z: 0.0013045785} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 4543089944971148809} - m_Father: {fileID: 5455741408827371642} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1490908466784209397 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8426252934148981496} + m_GameObject: {fileID: 8679495084672713308} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} @@ -1718,294 +1993,19 @@ MonoBehaviour: m_EditorClassIdentifier: bones: _coxa: {fileID: 0} - _femur: {fileID: 2149330539247012361} - _tibia: {fileID: 4543089944971148809} - _tarsus: {fileID: 5257551609953188724} + _femur: {fileID: 2694996827067636066} + _tibia: {fileID: 1844943529442369595} + _tarsus: {fileID: 5848079605461954508} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0024082728 - _tibiaLength: 0.0041765124 + _femurLength: 0.0019033399 + _tibiaLength: 0.002981913 _tarsusLength: 0 _phalangesLength: 0 side: 0 - target: {fileID: 2994943864588667712} - targetToBoneFemur: {x: 0.6612267, y: -0.25055832, z: -0.25055864, w: 0.6612266} - targetToBoneTibia: {x: 0.580795, y: -0.40333298, z: -0.4033331, w: 0.5807951} ---- !u!1 &8493022310677088757 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6572398933426288654} - m_Layer: 0 - m_Name: LeftHind_Tarsus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &6572398933426288654 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8493022310677088757} - serializedVersion: 2 - m_LocalRotation: {x: -0.24540102, y: -0.00000008238297, z: 0.000000046868834, w: 0.9694216} - m_LocalPosition: {x: 1.2869883e-10, y: -6.9849193e-10, z: 0.004106119} - m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 0.9999999} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 2569903554710171135} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &8541204045262727826 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8921816082228033372} - m_Layer: 0 - m_Name: LeftFront_Tarsus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &8921816082228033372 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8541204045262727826} - serializedVersion: 2 - m_LocalRotation: {x: -0.27837536, y: 0.00000012499017, z: -0.00000010053604, w: 0.96047235} - m_LocalPosition: {x: 3.2853265e-10, y: 0, z: 0.0029819128} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 7313217641663358484} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &8708463665214363942 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4335119159191562342} - - component: {fileID: 793186625795647975} - - component: {fileID: 7530726407399149546} - - component: {fileID: 1806808629223865588} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4335119159191562342 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8708463665214363942} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 6524871249661584575} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &793186625795647975 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8708463665214363942} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &7530726407399149546 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8708463665214363942} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!135 &1806808629223865588 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8708463665214363942} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 1 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &8852874818565513860 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8598108513644155435} - - component: {fileID: 6317662830386040236} - - component: {fileID: 5483534907731950224} - m_Layer: 0 - m_Name: LeftFront_Target - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &8598108513644155435 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8852874818565513860} - serializedVersion: 2 - m_LocalRotation: {x: 0.16157505, y: 0.82311046, z: -0.28778687, w: 0.46212706} - m_LocalPosition: {x: 0.0029576225, y: 0, z: -0.0004493994} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 4875846235429722894} - m_Father: {fileID: 7166545474223194656} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &6317662830386040236 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8852874818565513860} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} - m_Name: - m_EditorClassIdentifier: - leg: {fileID: 5737181765023906041} - footCollider: {fileID: 0} - sphereRenderer: {fileID: 0} ---- !u!54 &5483534907731950224 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8852874818565513860} - serializedVersion: 4 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!1 &8858494942561296820 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3274992126458333413} - m_Layer: 0 - m_Name: RightHind_Tibia - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3274992126458333413 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8858494942561296820} - serializedVersion: 2 - m_LocalRotation: {x: 0.65159947, y: 0.00000008940697, z: -0.0000000037252903, w: 0.7585633} - m_LocalPosition: {x: 1.1641532e-10, y: -5.820766e-11, z: 0.003004015} - m_LocalScale: {x: 1, y: 1.0000001, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1815117023348536243} - m_Father: {fileID: 6620083584134435749} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + target: {fileID: 1817326604091929521} + targetToBoneFemur: {x: -0.5444651, y: 0.4511738, z: 0.4511738, w: -0.5444652} + targetToBoneTibia: {x: -0.42917106, y: -0.56197184, z: -0.5619719, w: -0.42917114} --- !u!1001 &268813082562621446 PrefabInstance: m_ObjectHideFlags: 0 @@ -2016,71 +2016,71 @@ PrefabInstance: m_Modifications: - target: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: -0.028299924 + value: -0.02829995 objectReference: {fileID: 0} - target: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.68439233 + value: 0.6843921 objectReference: {fileID: 0} - target: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.7112685 + value: 0.7112686 objectReference: {fileID: 0} - target: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: 0.15780877 + value: 0.15780888 objectReference: {fileID: 0} - target: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.70777136 + value: 0.70777094 objectReference: {fileID: 0} - target: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.38709292 + value: 0.38709322 objectReference: {fileID: 0} - target: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: -0.17679313 + value: -0.17679317 objectReference: {fileID: 0} - target: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.56388205 + value: -0.56388247 objectReference: {fileID: 0} - target: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6106688 + value: 0.6106683 objectReference: {fileID: 0} - target: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.25755203 + value: 0.25755247 objectReference: {fileID: 0} - target: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.5535677 + value: 0.55356723 objectReference: {fileID: 0} - target: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.50429505 + value: -0.5042959 objectReference: {fileID: 0} - target: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.7585124 + value: 0.7585123 objectReference: {fileID: 0} - target: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.57238305 + value: 0.572383 objectReference: {fileID: 0} - target: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: -0.008787777 + value: -0.008787926 objectReference: {fileID: 0} - target: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.31138325 + value: -0.31138334 objectReference: {fileID: 0} - target: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.3284602 + value: 0.3284601 objectReference: {fileID: 0} - target: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x @@ -2088,75 +2088,75 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.29728144 + value: 0.29728135 objectReference: {fileID: 0} - target: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.087881796 + value: -0.08788186 objectReference: {fileID: 0} - target: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.47020036 + value: 0.47020018 objectReference: {fileID: 0} - target: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.13349845 + value: 0.13349877 objectReference: {fileID: 0} - target: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.7921709 + value: 0.792171 objectReference: {fileID: 0} - target: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.3654518 + value: -0.36545172 objectReference: {fileID: 0} - target: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.032779932 + value: 0.03278032 objectReference: {fileID: 0} - target: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: -0.044935822 + value: -0.044935346 objectReference: {fileID: 0} - target: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.83270496 + value: 0.8327049 objectReference: {fileID: 0} - target: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.55091625 + value: -0.5509164 objectReference: {fileID: 0} - target: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.8540222 + value: 0.8540219 objectReference: {fileID: 0} - target: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: -0.32501346 + value: -0.3250136 objectReference: {fileID: 0} - target: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.2263683 + value: 0.22636837 objectReference: {fileID: 0} - target: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: 0.33729792 + value: 0.33729824 objectReference: {fileID: 0} - target: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: -0.5112793 + value: -0.51127905 objectReference: {fileID: 0} - target: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.8116233 + value: 0.8116234 objectReference: {fileID: 0} - target: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.25970224 + value: 0.2597024 objectReference: {fileID: 0} - target: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.111426905 + value: -0.11142661 objectReference: {fileID: 0} - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalPosition.x @@ -2200,35 +2200,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.8169425 + value: 0.81694245 objectReference: {fileID: 0} - target: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: -0.43574855 + value: -0.43574864 objectReference: {fileID: 0} - target: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.14708081 + value: 0.1470808 objectReference: {fileID: 0} - target: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.34798777 + value: -0.34798762 objectReference: {fileID: 0} - target: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.58558255 + value: 0.58558196 objectReference: {fileID: 0} - target: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: -0.46928045 + value: -0.46928108 objectReference: {fileID: 0} - target: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: -0.63777727 + value: -0.6377773 objectReference: {fileID: 0} - target: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.17351994 + value: -0.17352016 objectReference: {fileID: 0} - target: {fileID: 7602095073321034216, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_Name @@ -2236,33 +2236,33 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.2880835 + value: 0.28808346 objectReference: {fileID: 0} - target: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: -0.54234576 + value: -0.5423461 objectReference: {fileID: 0} - target: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: -0.50765467 + value: -0.50765437 objectReference: {fileID: 0} - target: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: 0.60428125 + value: 0.6042812 objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: - targetCorrespondingSourceObject: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} insertIndex: -1 - addedObject: {fileID: 5455741408827371642} + addedObject: {fileID: 1186408022295929665} m_AddedComponents: - targetCorrespondingSourceObject: {fileID: 7602095073321034216, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} insertIndex: -1 - addedObject: {fileID: 3735440054552339591} + addedObject: {fileID: 1502756290805107789} - targetCorrespondingSourceObject: {fileID: 7602095073321034216, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} insertIndex: -1 - addedObject: {fileID: 1035200439474759374} + addedObject: {fileID: 4024176016905394328} m_SourcePrefab: {fileID: 100100000, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} --- !u!4 &658830270699185039 stripped Transform: @@ -2364,7 +2364,7 @@ GameObject: m_CorrespondingSourceObject: {fileID: 7602095073321034216, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} m_PrefabInstance: {fileID: 268813082562621446} m_PrefabAsset: {fileID: 0} ---- !u!114 &3735440054552339591 +--- !u!114 &1502756290805107789 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2377,7 +2377,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: brainPrefab: {fileID: 0} ---- !u!114 &1035200439474759374 +--- !u!114 &4024176016905394328 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2390,19 +2390,19 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: model: {fileID: 0} - targetRig: {fileID: 6225543280879680199} + targetRig: {fileID: 3246096951653456320} targetToModelTranslation: {x: 0, y: 0, z: 0} targetToModelRotation: {x: 0, y: 0, z: 0, w: 0} - animator: {fileID: 5769218204124627899} + animator: {fileID: 4226361316839711815} animationsPath: Assets stepOffset: 0.3 - useGravity: 1 + useGravity: 0 slopeAlignment: 0.3 creatureRigidbody: {fileID: 0} bodyCollider: {fileID: 0} colliderToGround: 0 ground: {fileID: 0} - insectRig: {fileID: 6225543280879680199} + insectRig: {fileID: 3246096951653456320} forwardSpeed: 1 rotationSpeed: 1 thorax: {fileID: 0} @@ -2487,10 +2487,8 @@ MonoBehaviour: nanoBrain: {fileID: 0} targetDirection: name: - clusterPrefab: {fileID: 0} parent: rid: -2 - trace: 0 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -2502,13 +2500,12 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 0 + trace: 0 _receivers: [] hasFood: name: - clusterPrefab: {fileID: 0} parent: rid: -2 - trace: 0 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -2520,13 +2517,80 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 0 + trace: 0 + _receivers: [] + beat: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + trace: 0 + _receivers: [] + pheromoneSteering: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + trace: 0 + _receivers: [] + hitLeft: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + trace: 0 + _receivers: [] + hitRight: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + trace: 0 _receivers: [] foodReceptor: name: - clusterPrefab: {fileID: 0} parent: rid: -2 - trace: 0 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -2538,13 +2602,12 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 0 + trace: 0 _receivers: [] homeReceptor: name: - clusterPrefab: {fileID: 0} parent: rid: -2 - trace: 0 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -2556,8 +2619,9 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 0 + trace: 0 _receivers: [] - linearVelocity: {x: 0, y: 0, z: 1} + linearVelocity: {x: 0, y: 0, z: 0} angularVelocity: {x: 0, y: 0, z: 0} references: version: 2 From 7fb23e9b8927ed157514073c56da3b25c0cbec49 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 5 May 2026 17:37:59 +0200 Subject: [PATCH 32/38] Pheromones WIP --- NanoBrain/Editor/ClusterEditor.cs | 25 +- NanoBrain/Runtime/Scripts/Core/Cluster.cs | 20 +- NanoBrain/Runtime/Scripts/Core/Neuron.cs | 11 +- Runtime/Scripts/Ant.cs | 50 +- Runtime/Scripts/AntennaTouch.cs | 25 +- Runtime/Scripts/Mouth.cs | 3 +- Samples/Brain/Foraging.asset | 590 +++++++++ ... Prefab.asset.meta => Foraging.asset.meta} | 0 Samples/Brain/Foraging_old.asset | 1179 ----------------- Samples/Brain/Foraging_old.asset.meta | 8 - Samples/Brain/New Cluster Prefab.asset | 255 ---- Samples/Foraging.unity | 1162 +++++++++++++--- .../Prefabs/LowPolyAntRigged Variant.prefab | 568 +++++--- 13 files changed, 1994 insertions(+), 1902 deletions(-) create mode 100644 Samples/Brain/Foraging.asset rename Samples/Brain/{New Cluster Prefab.asset.meta => Foraging.asset.meta} (100%) delete mode 100644 Samples/Brain/Foraging_old.asset delete mode 100644 Samples/Brain/Foraging_old.asset.meta delete mode 100644 Samples/Brain/New Cluster Prefab.asset diff --git a/NanoBrain/Editor/ClusterEditor.cs b/NanoBrain/Editor/ClusterEditor.cs index 3086b0a..b67650c 100644 --- a/NanoBrain/Editor/ClusterEditor.cs +++ b/NanoBrain/Editor/ClusterEditor.cs @@ -81,6 +81,7 @@ namespace NanoBrain { // So we create a temporary instance //this.currentCluster = new(prefab); this.currentCluster = prefab.cluster; + this.currentCluster.Refresh(); } public void SetGraph(GameObject gameObject, VisualElement inspectorContainer) { @@ -227,10 +228,8 @@ namespace NanoBrain { bool connecting = GUILayout.Button("Add Output Neuron"); if (connecting) { - Nucleus newOutput = new Neuron(this.prefab.cluster, "New Output"); - // Regenerate the temporary clsuter instance - // See also the constructor - this.currentCluster = new(this.prefab); + Nucleus newOutput = new Neuron(this.currentCluster, "New Output"); + this.currentCluster.Refresh(); this.currentNucleus = newOutput; this.selectedOutput = this.currentNucleus; } @@ -358,8 +357,6 @@ namespace NanoBrain { int selectedIndex = System.Array.IndexOf(options, synapse.neuron.name); int newIndex = EditorGUILayout.Popup(selectedIndex, options); if (newIndex != selectedIndex) { - // Nucleus selectedNucleus = synapse.neuron.parent.clusterNuclei[newIndex]; - // Neuron newNeuron = selectedNucleus as Neuron; Neuron newNeuron = synapse.neuron.parent.prefab.cluster.nuclei[newIndex] as Neuron; ChangeSynapse(synapse, newNeuron); } @@ -523,22 +520,6 @@ namespace NanoBrain { return connecting; } - // protected virtual void DisconnectNucleus(Neuron nucleus) { - // if (this.currentNucleus.parent.prefab == null) - // return; - // Neuron currentNeuron = this.currentNucleus as Neuron; - // string[] names = currentNeuron.synapses.Select(synapse => synapse.neuron.name).ToArray(); - // int selectedIndex = -1; - // selectedIndex = EditorGUILayout.Popup("Disconnect from", selectedIndex, names); - // if (selectedIndex >= 0 && selectedIndex < this.currentNucleus.parent.prefab.cluster.nuclei.Count) { - // Synapse synapse = currentNeuron.synapses[selectedIndex]; - // synapse.neuron.RemoveReceiver(this.currentNucleus); - - // // synapse = currentNeuron.synapses[selectedIndex]; - // // synapse.neuron.RemoveReceiver(this.currentPrefabNucleus); - // } - // } - protected virtual void DeleteNucleus(Nucleus nucleus) { if (nucleus == null) return; diff --git a/NanoBrain/Runtime/Scripts/Core/Cluster.cs b/NanoBrain/Runtime/Scripts/Core/Cluster.cs index 9106984..8077e04 100644 --- a/NanoBrain/Runtime/Scripts/Core/Cluster.cs +++ b/NanoBrain/Runtime/Scripts/Core/Cluster.cs @@ -618,7 +618,7 @@ namespace NanoBrain { if (neuron.synapses.Count == 0) this._inputs.Add(nucleus); } - RefreshComputeOrders(); + RefreshComputeOrders(); } return this._inputs; } @@ -766,6 +766,14 @@ namespace NanoBrain { } } + public Neuron GetNeuron(string neuronName) { + foreach (Nucleus nucleus in this.nuclei) { + if (nucleus is Neuron neuron && neuron.name == neuronName) + return neuron; + } + return null; + } + public bool DeleteNucleus(Nucleus nucleus) { if (this.nuclei.Contains(nucleus) == false) { // Try to find the nucleus by name @@ -875,12 +883,12 @@ namespace NanoBrain { List computeOrder = this.computeOrders[startNucleus]; //if (startNucleus.trace) - Debug.Log($"Update from {startNucleus.name}"); + // Debug.Log($"Update from {startNucleus.name}"); foreach (Nucleus nucleus in computeOrder) { if (nucleus is not Cluster) { nucleus.UpdateStateIsolated(); //if (startNucleus.trace && nucleus is Neuron neuron) - Debug.Log($" {nucleus.name}"); + // Debug.Log($" {nucleus.name}"); if (nucleus is Neuron neuron) { foreach (Nucleus receiver in neuron.receivers) { if (receiver.parent != this) { @@ -910,6 +918,12 @@ namespace NanoBrain { #endregion Update public void Refresh() { + // This should not be needed, but somehow somewhere the parent is changed... + foreach (Nucleus nucleus in this.nuclei) { + if (nucleus is not Neuron neuron) + continue; + neuron.parent = this; + } RefreshOutputs(); RefreshComputeOrders(); } diff --git a/NanoBrain/Runtime/Scripts/Core/Neuron.cs b/NanoBrain/Runtime/Scripts/Core/Neuron.cs index 02fa2df..b5dcc66 100644 --- a/NanoBrain/Runtime/Scripts/Core/Neuron.cs +++ b/NanoBrain/Runtime/Scripts/Core/Neuron.cs @@ -104,6 +104,7 @@ namespace NanoBrain { /// public virtual void SetBias(Vector3 inputValue) { this.bias = inputValue; + this.lastUpdate = Time.time; this.parent?.UpdateFromNucleus(this); } @@ -277,7 +278,7 @@ namespace NanoBrain { #endif public bool isFiring { get { - SleepCheck(); + //SleepCheck(); return this.outputMagnitude > 0.5f; } } @@ -384,13 +385,15 @@ namespace NanoBrain { var result = Combinator(); this.outputValue = Activator(result); this.lastUpdate = Time.time; + // Debug.Log($"Update Neuron {this.name}"); } protected void CheckSleepingSynapses() { foreach (Synapse synapse in this.synapses) { - if (synapse.isSleeping) { - synapse.neuron.outputValue = Vector3.zero; - } + synapse.neuron.SleepCheck(); + // if (synapse.isSleeping) { + // synapse.neuron.outputValue = Vector3.zero; + // } } } diff --git a/Runtime/Scripts/Ant.cs b/Runtime/Scripts/Ant.cs index 219d5c8..99f272b 100644 --- a/Runtime/Scripts/Ant.cs +++ b/Runtime/Scripts/Ant.cs @@ -32,9 +32,6 @@ namespace CreatureControl { public AntennaTouch touchRight; public Brain nanoBrain; - // brain output - public Neuron targetDirection; - public Neuron hasFood; // brain input @@ -46,11 +43,13 @@ namespace CreatureControl { public Neuron beat; public Neuron pheromoneSteering; - public Neuron hitLeft; - public Neuron hitRight; public Neuron foodReceptor; public Neuron homeReceptor; + // brain output + public Neuron targetDirection; + public Neuron hasFood; + public Vector3 linearVelocity; // = Vector3.forward; public Vector3 angularVelocity; @@ -64,10 +63,9 @@ namespace CreatureControl { Cluster brain = this.nanoBrain.brain; if (brain != null) { //--- brain inputs - - this.beat = brain.GetNucleus("Beat") as Neuron; - this.hitLeft = brain.GetNucleus("Hit Left") as Neuron; - this.hitRight = brain.GetNucleus("Hit Right") as Neuron; + this.beat = brain.GetNeuron("Beat"); + touchLeft.receptor = brain.GetNucleus("Hit Left") as Neuron; + touchRight.receptor = brain.GetNucleus("Hit Right") as Neuron; this.foodReceptor = brain.GetNucleus("Food Receptor") as Neuron; this.homeReceptor = brain.GetNucleus("Home Receptor") as Neuron; this.pheromoneSteering = brain.GetNucleus("Pheromone Steering") as Neuron; @@ -87,24 +85,17 @@ namespace CreatureControl { Cluster brain = this.nanoBrain.brain; if (brain != null) { - // Try to find the Home Pheromones Neuron if (brain.GetNucleus("Home Pheromones") is Neuron homePheromones) // and call PlaceHomePheromone when it is firing homePheromones.WhenFiring += PlaceHomePheromone; // Try to find the Food Pheromones Neuron - if (brain.GetNucleus("Food Pheromones") is Neuron foodPheromones) + Neuron foodPheromones = brain.GetNeuron("Food Pheromones"); + if (foodPheromones != null) // and call PlaceFoodPheromone when it is firing foodPheromones.WhenFiring += PlaceFoodPheromone; - } - // Initialize the callbacks for the antenna colliders - if (touchLeft != null) - touchLeft.touched += OnAntennaTouchLeft; - if (touchRight != null) - touchRight.touched += OnAntennaTouchRight; - StartCoroutine(Beat()); } @@ -124,7 +115,7 @@ namespace CreatureControl { public override void Update() { base.Update(); - //UpdateSmell(); + UpdateSmell(); UpdateMovement(); } @@ -136,7 +127,7 @@ namespace CreatureControl { if (this.targetDirection == null || this.animator == null) return; - Vector3 movementDir = this.targetDirection.outputValue; + Vector3 movementDir = Quaternion.Euler(0, 180, 0) * this.targetDirection.outputValue; this.linearVelocity = (1 - this.inertia) * (Time.deltaTime * movementDir.normalized) + this.inertia * this.linearVelocity; @@ -177,8 +168,8 @@ namespace CreatureControl { SmellFood(collider); SmellHome(collider); } - if (nanoBrain != null && nanoBrain.brain != null) - nanoBrain.brain.UpdateNuclei(); + // if (nanoBrain != null && nanoBrain.brain != null) + // nanoBrain.brain.UpdateNuclei(); } void SmellPheromones(Collider thing) { @@ -215,7 +206,7 @@ namespace CreatureControl { Vector3 smellDirection = this.transform.InverseTransformPoint(food.transform.position); float distance = smellDirection.magnitude; - float angle = Vector3.Angle(Vector3.forward, smellDirection); + float angle = Vector3.Angle(Vector3.back, smellDirection); if (angle < smellAngle && distance > 0.01) { float intensity = food.StrengthAt(distance); foodReceptor?.ProcessStimulus(smellDirection.normalized * intensity); //, food.GetInstanceID(), "food"); @@ -243,19 +234,6 @@ namespace CreatureControl { } } - void OnAntennaTouchLeft(Collider other, bool isTouching) { - Vector3 touchDirection = Vector3.zero; - if (isTouching) - touchDirection = this.transform.InverseTransformVector(touchLeft.transform.forward); - hitLeft?.SetBias(touchDirection); - } - void OnAntennaTouchRight(Collider other, bool isTouching) { - Vector3 touchDirection = Vector3.zero; - if (isTouching) - touchDirection = this.transform.InverseTransformVector(touchRight.transform.forward); - hitRight?.SetBias(touchDirection); - } - #endregion Update } diff --git a/Runtime/Scripts/AntennaTouch.cs b/Runtime/Scripts/AntennaTouch.cs index d9e99aa..e928d3b 100644 --- a/Runtime/Scripts/AntennaTouch.cs +++ b/Runtime/Scripts/AntennaTouch.cs @@ -1,17 +1,22 @@ -using System; using UnityEngine; +using NanoBrain; +using CreatureControl; -public class AntennaTouch : MonoBehaviour -{ - public Action touched; +public class AntennaTouch : MonoBehaviour { + public Neuron receptor; + public Insect insect; - // void OnTriggerEnter(Collider other) { - // touched?.Invoke(other, true); - // } - void OnTriggerStay(Collider other) { - touched?.Invoke(other, true); + protected virtual void Awake() { + this.insect = GetComponentInParent(); } + + void OnTriggerStay(Collider other) { + Vector3 touchDirection = this.insect.transform.InverseTransformVector(this.transform.forward); + receptor?.SetBias(touchDirection); + } + // Perhaps I can leave this out and use the sleep state? void OnTriggerExit(Collider other) { - touched?.Invoke(other, false); + Vector3 touchDirection = Vector3.zero; + receptor?.SetBias(touchDirection); } } diff --git a/Runtime/Scripts/Mouth.cs b/Runtime/Scripts/Mouth.cs index 80e6ac9..89c48e0 100644 --- a/Runtime/Scripts/Mouth.cs +++ b/Runtime/Scripts/Mouth.cs @@ -18,7 +18,7 @@ namespace CreatureControl { if (nanoBrain.brain.GetNucleus("Mouth") is Neuron mouthNeuron) mouthNeuron.WhenFiring += CheckGrab; - this.havingFood = nanoBrain.brain.GetNucleus("Having Food") as Neuron; + this.havingFood = nanoBrain.brain.GetNeuron("Having Food"); } void Start() { @@ -28,6 +28,7 @@ namespace CreatureControl { protected void CheckGrab() { if (havingFood == null) return; + Collider[] colliders = Physics.OverlapSphere(this.transform.position, 0.04f); foreach (Collider c in colliders) { if (havingFood.outputValue.x > 0) { diff --git a/Samples/Brain/Foraging.asset b/Samples/Brain/Foraging.asset new file mode 100644 index 0000000..2509e82 --- /dev/null +++ b/Samples/Brain/Foraging.asset @@ -0,0 +1,590 @@ +%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: Foraging + m_EditorClassIdentifier: + cluster: + name: Foraging + parent: + rid: -2 + prefab: {fileID: 11400000} + instanceCount: 1 + nuclei: + - rid: 4201949831649034325 + - rid: 4201949831649034327 + - rid: 4201949831649034328 + - rid: 4201949831649034329 + - rid: 4201949834634854702 + - rid: 4201949834634854704 + - rid: 4201949834634854727 + - rid: 4201949834634854801 + - rid: 4201949834634854833 + - rid: 4201949834634854855 + - rid: 4201949834634854856 + - rid: 4201949834634854857 + - rid: 4201949834634854858 + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } + - rid: 4201949831649034325 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Output + parent: + rid: 4201949834634854873 + bias: {x: 0, y: 0, z: -1} + _synapses: + - neuron: + rid: 4201949831649034327 + weight: 1 + - neuron: + rid: 4201949834634854855 + weight: 1 + - neuron: + rid: 4201949834634854857 + weight: 1 + combinator: 0 + _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 + trace: 0 + _receivers: [] + - rid: 4201949831649034327 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Collision + parent: + rid: 4201949834634854873 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 4201949831649034328 + weight: 1 + - neuron: + rid: 4201949831649034329 + weight: -1 + combinator: 0 + _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 + trace: 0 + _receivers: + - rid: 4201949831649034325 + - rid: 4201949834634854801 + - rid: 4201949831649034328 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Hit Left + parent: + rid: 4201949834634854873 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + trace: 0 + _receivers: + - rid: 4201949831649034327 + - rid: 4201949831649034329 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Hit Right + parent: + rid: 4201949834634854873 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + trace: 0 + _receivers: + - rid: 4201949831649034327 + - rid: 4201949834634854702 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Beat + parent: + rid: 4201949834634854873 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + trace: 0 + _receivers: + - rid: 4201949834634854704 + - rid: 4201949834634854704 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Home Pheromones + parent: + rid: 4201949834634854873 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 4201949834634854702 + weight: 1 + combinator: 0 + _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 + trace: 0 + _receivers: [] + - rid: 4201949834634854727 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Food Receptor + parent: + rid: 4201949834634854873 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + trace: 0 + _receivers: + - rid: 4201949834634854857 + - rid: 4201949834634854801 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Mouth + parent: + rid: 4201949834634854873 + bias: {x: 0, y: 0, z: 0} + _synapses: + - neuron: + rid: 4201949831649034327 + weight: 1 + combinator: 0 + _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 + trace: 0 + _receivers: [] + - rid: 4201949834634854833 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Having Food + parent: + rid: 4201949834634854873 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + trace: 0 + _receivers: + - rid: 4201949834634854855 + - rid: 4201949834634854858 + - rid: 4201949834634854855 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Home Smell + parent: + rid: 4201949834634854873 + bias: {x: 1, y: 1, z: 1} + _synapses: + - neuron: + rid: 4201949834634854833 + weight: 1 + - neuron: + rid: 4201949834634854856 + weight: 1 + combinator: 1 + _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 + trace: 0 + _receivers: + - rid: 4201949831649034325 + - rid: 4201949834634854856 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Home Receptor + parent: + rid: 4201949834634854873 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + trace: 0 + _receivers: + - rid: 4201949834634854855 + - rid: 4201949834634854857 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Food Smell + parent: + rid: 4201949834634854873 + bias: {x: 1, y: 1, z: 1} + _synapses: + - neuron: + rid: 4201949834634854858 + weight: 1 + - neuron: + rid: 4201949834634854727 + weight: 1 + combinator: 1 + _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 + trace: 0 + _receivers: + - rid: 4201949831649034325 + - rid: 4201949834634854858 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Not having Food + parent: + rid: 4201949834634854873 + bias: {x: 1, y: 1, z: 1} + _synapses: + - neuron: + rid: 4201949834634854833 + weight: -1 + combinator: 0 + _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 + trace: 0 + _receivers: + - rid: 4201949834634854857 + - rid: 4201949834634854873 + type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Foraging + parent: + rid: -2 + prefab: {fileID: 11400000} + instanceCount: 1 + nuclei: + - rid: 4201949831649034325 + - rid: 4201949831649034327 + - rid: 4201949831649034328 + - rid: 4201949831649034329 + - rid: 4201949834634854702 + - rid: 4201949834634854704 + - rid: 4201949834634854727 + - rid: 4201949834634854801 + - rid: 4201949834634854833 + - rid: 4201949834634854855 + - rid: 4201949834634854856 + - rid: 4201949834634854857 + - rid: 4201949834634854858 diff --git a/Samples/Brain/New Cluster Prefab.asset.meta b/Samples/Brain/Foraging.asset.meta similarity index 100% rename from Samples/Brain/New Cluster Prefab.asset.meta rename to Samples/Brain/Foraging.asset.meta diff --git a/Samples/Brain/Foraging_old.asset b/Samples/Brain/Foraging_old.asset deleted file mode 100644 index cc32b51..0000000 --- a/Samples/Brain/Foraging_old.asset +++ /dev/null @@ -1,1179 +0,0 @@ -%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: Foraging_old - m_EditorClassIdentifier: Assembly-CSharp::ClusterPrefab - nuclei: - - rid: 5479437209301418101 - - rid: 5479437233826299911 - - rid: 5479437233826299913 - - rid: 5479437301218279525 - - rid: 5479437301218279531 - - rid: 5479437301218279533 - - rid: 5479437301218279535 - - rid: 5479437321628549179 - - rid: 5479437321628549183 - - rid: 5479437321628549189 - - rid: 5479437344462864575 - - rid: 5479437344462864598 - - rid: 5479437349790417078 - - rid: 5479437349790417080 - - rid: 5479437349790417084 - - rid: 5479437349790417088 - - rid: 2262690603760877647 - - rid: 2262690603760877698 - - rid: 2262690603760877722 - - rid: 2262690603760877723 - - rid: 2262690603760877724 - - rid: 2262690603760877753 - - rid: 2262690603760877783 - - rid: 2262690603760877784 - - rid: 2262690603760877785 - - rid: 2262690603760877786 - references: - version: 2 - RefIds: - - rid: -2 - type: {class: , ns: NanoBrain, asm: } - - rid: 2262690603760877647 - type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Food Receptor - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877783 - _array: - rid: 2262690603760877648 - - rid: 2262690603760877648 - type: {class: NucleusArray, ns: NanoBrain, asm: Assembly-CSharp} - data: - _nuclei: - - rid: 2262690603760877647 - - rid: 2262690603760877784 - - rid: 2262690603760877785 - - rid: 2262690603760877786 - - rid: 2262690603760877698 - type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Home Receptor - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877753 - _array: - rid: 2262690603760877699 - - rid: 2262690603760877699 - type: {class: NucleusArray, ns: NanoBrain, asm: Assembly-CSharp} - data: - _nuclei: - - rid: 2262690603760877698 - - rid: 2262690603760877722 - - rid: 2262690603760877723 - - rid: 2262690603760877724 - - rid: 2262690603760877722 - type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: 'Home Receptor: 1' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877753 - _array: - rid: 2262690603760877699 - - rid: 2262690603760877723 - type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: 'Home Receptor: 2' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877753 - _array: - rid: 2262690603760877699 - - rid: 2262690603760877724 - type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: 'Home Receptor: 3' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877753 - _array: - rid: 2262690603760877699 - - rid: 2262690603760877753 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Home Smell - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 2262690603760877698 - weight: 1 - - neuron: - rid: 2262690603760877722 - weight: 1 - - neuron: - rid: 2262690603760877723 - weight: 1 - - neuron: - rid: 2262690603760877724 - weight: 1 - combinator: 0 - _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 - _receivers: - - rid: 5479437349790417084 - - rid: 2262690603760877783 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Food Smell - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 2262690603760877647 - weight: 1 - - neuron: - rid: 2262690603760877784 - weight: 1 - - neuron: - rid: 2262690603760877785 - weight: 1 - - neuron: - rid: 2262690603760877786 - weight: 1 - combinator: 0 - _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 - _receivers: - - rid: 5479437349790417078 - - rid: 2262690603760877784 - type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: 'Food Receptor: 1' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877783 - _array: - rid: 2262690603760877648 - - rid: 2262690603760877785 - type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: 'Food Receptor: 2' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877783 - _array: - rid: 2262690603760877648 - - rid: 2262690603760877786 - type: {class: Receptor, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: 'Food Receptor: 3' - clusterPrefab: {fileID: 11400000} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 2262690603760877783 - _array: - rid: 2262690603760877648 - - rid: 5479437209301418101 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Output - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 5479437344462864575 - weight: 4 - - neuron: - rid: 5479437344462864598 - weight: 1 - - neuron: - rid: 5479437349790417078 - weight: 1 - - neuron: - rid: 5479437349790417084 - weight: 1 - combinator: 0 - _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 - _receivers: [] - - rid: 5479437233826299911 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Hit Left - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 5479437344462864575 - - rid: 5479437301218279533 - - rid: 5479437233826299913 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Hit Right - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 5479437344462864575 - - rid: 5479437301218279533 - - rid: 5479437301218279525 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Home Pheromones - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0.5, y: 0.5, z: 0.5} - _synapses: - - neuron: - rid: 5479437301218279531 - weight: 1 - - neuron: - rid: 5479437321628549179 - weight: 1 - combinator: 1 - _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 - _receivers: [] - - rid: 5479437301218279531 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Beat - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 5479437301218279525 - - rid: 5479437301218279535 - - rid: 5479437301218279533 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Mouth - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 5479437233826299911 - weight: 1 - - neuron: - rid: 5479437233826299913 - weight: 1 - combinator: 0 - _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 - _receivers: [] - - rid: 5479437301218279535 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Food Pheromones - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 1, y: 1, z: 1} - _synapses: - - neuron: - rid: 5479437301218279531 - weight: 1 - - neuron: - rid: 5479437321628549183 - weight: 1 - combinator: 1 - _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 - _receivers: [] - - rid: 5479437321628549179 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Looking for food - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0.5, y: 0.5, z: 0.5} - _synapses: - - neuron: - rid: 5479437321628549189 - weight: -0.5 - combinator: 0 - _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 - _receivers: - - rid: 5479437301218279525 - - rid: 5479437321628549183 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Going home - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0.5, y: 0.5, z: 0.5} - _synapses: - - neuron: - rid: 5479437321628549189 - weight: 0.5 - combinator: 0 - _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 - _receivers: - - rid: 5479437301218279535 - - rid: 5479437321628549189 - type: {class: MemoryCell, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Having Food - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 5479437321628549179 - - rid: 5479437321628549183 - - rid: 5479437349790417088 - - rid: 5479437349790417080 - staticMemory: 1 - - rid: 5479437344462864575 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Collision Steering - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 5479437233826299911 - weight: -1 - - neuron: - rid: 5479437233826299913 - weight: -1 - combinator: 0 - _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 - _receivers: - - rid: 5479437209301418101 - - rid: 5479437344462864598 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Pheromone Steering - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - _receivers: - - rid: 5479437209301418101 - - rid: 5479437349790417078 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Food steering - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 1, y: 1, z: 1} - _synapses: - - neuron: - rid: 5479437349790417080 - weight: 1 - - neuron: - rid: 2262690603760877783 - weight: 1 - combinator: 1 - _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 - _receivers: - - rid: 5479437209301418101 - - rid: 5479437349790417080 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Have no food - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0.5, y: 0.5, z: 0.5} - _synapses: - - neuron: - rid: 5479437321628549189 - weight: -0.5 - combinator: 0 - _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 - _receivers: - - rid: 5479437349790417078 - - rid: 5479437349790417084 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Home steering - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 1, y: 1, z: 1} - _synapses: - - neuron: - rid: 5479437349790417088 - weight: 1 - - neuron: - rid: 2262690603760877753 - weight: 1 - combinator: 1 - _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 - _receivers: - - rid: 5479437209301418101 - - rid: 5479437349790417088 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Have Food - clusterPrefab: {fileID: 0} - parent: - rid: -2 - trace: 0 - bias: {x: 0.5, y: 0.5, z: 0.5} - _synapses: - - neuron: - rid: 5479437321628549189 - weight: 0.5 - combinator: 0 - _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 - _receivers: - - rid: 5479437349790417084 diff --git a/Samples/Brain/Foraging_old.asset.meta b/Samples/Brain/Foraging_old.asset.meta deleted file mode 100644 index 34f9027..0000000 --- a/Samples/Brain/Foraging_old.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0f7345a3a2017e01383b1d8392b40304 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Samples/Brain/New Cluster Prefab.asset b/Samples/Brain/New Cluster Prefab.asset deleted file mode 100644 index 11aa3ef..0000000 --- a/Samples/Brain/New Cluster Prefab.asset +++ /dev/null @@ -1,255 +0,0 @@ -%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 Prefab - m_EditorClassIdentifier: - cluster: - name: New Cluster Prefab - parent: - rid: -2 - prefab: {fileID: 11400000} - instanceCount: 1 - nuclei: - - rid: 4201949831649034325 - - rid: 4201949831649034327 - - rid: 4201949831649034328 - - rid: 4201949831649034329 - - rid: 4201949831649034476 - references: - version: 2 - RefIds: - - rid: -2 - type: {class: , ns: , asm: } - - rid: 4201949831649034325 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Output - parent: - rid: 4201949831649034326 - bias: {x: 0, y: 0, z: 1} - _synapses: - - neuron: - rid: 4201949831649034327 - weight: 1 - combinator: 0 - _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 - trace: 0 - _receivers: [] - - rid: 4201949831649034326 - type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: New Cluster Prefab - parent: - rid: -2 - prefab: {fileID: 11400000} - instanceCount: 1 - nuclei: - - rid: 4201949831649034325 - - rid: 4201949831649034327 - - rid: 4201949831649034328 - - rid: 4201949831649034329 - - rid: 4201949831649034327 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Collision - parent: - rid: 4201949831649034326 - bias: {x: 0, y: 0, z: 0} - _synapses: - - neuron: - rid: 4201949831649034328 - weight: 1 - - neuron: - rid: 4201949831649034329 - weight: 1 - combinator: 0 - _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 - trace: 0 - _receivers: - - rid: 4201949831649034325 - - rid: 4201949831649034328 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Hit Left - parent: - rid: 4201949831649034326 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - trace: 0 - _receivers: - - rid: 4201949831649034327 - - rid: 4201949831649034329 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Hit Right - parent: - rid: 4201949831649034326 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - trace: 0 - _receivers: - - rid: 4201949831649034327 - - rid: 4201949831649034476 - type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: Beat - parent: - rid: 4201949831649034477 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _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 - trace: 0 - _receivers: [] - - rid: 4201949831649034477 - type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} - data: - name: New Cluster Prefab - parent: - rid: -2 - prefab: {fileID: 11400000} - instanceCount: 1 - nuclei: - - rid: 4201949831649034325 - - rid: 4201949831649034327 - - rid: 4201949831649034328 - - rid: 4201949831649034329 - - rid: 4201949831649034476 diff --git a/Samples/Foraging.unity b/Samples/Foraging.unity index fb4dd99..5967d7d 100644 --- a/Samples/Foraging.unity +++ b/Samples/Foraging.unity @@ -245,7 +245,7 @@ Transform: serializedVersion: 2 m_LocalRotation: {x: 0, y: 0.7071068, z: -0, w: -0.7071068} m_LocalPosition: {x: 0.15, y: 0, z: -0.15} - m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.5} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 467453032} @@ -539,7 +539,7 @@ Transform: serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0.15, y: 0, z: 0.15} - m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.5} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 467453032} @@ -981,7 +981,7 @@ Transform: serializedVersion: 2 m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068} m_LocalPosition: {x: -0.15, y: 0, z: 0.15} - m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.5} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 467453032} @@ -1611,7 +1611,7 @@ Transform: serializedVersion: 2 m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} m_LocalPosition: {x: -0.15, y: 0, z: -0.15} - m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.5} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 467453032} @@ -3237,13 +3237,141 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: + - target: {fileID: 166916568455411127, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 0.004090523 + objectReference: {fileID: 0} + - target: {fileID: 166916568455411127, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: -0.006165669 + objectReference: {fileID: 0} + - target: {fileID: 166916568455411127, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: -0.32834354 + objectReference: {fileID: 0} + - target: {fileID: 166916568455411127, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.07736367 + objectReference: {fileID: 0} + - target: {fileID: 166916568455411127, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.9162939 + objectReference: {fileID: 0} + - target: {fileID: 166916568455411127, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.21589538 + objectReference: {fileID: 0} + - target: {fileID: 247438257786629943, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: bones._femurLength + value: 0.0030040164 + objectReference: {fileID: 0} + - target: {fileID: 247438257786629943, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: bones._tibiaLength + value: 0.0041061193 + objectReference: {fileID: 0} + - target: {fileID: 247438257786629943, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.w + value: -0.42978376 + objectReference: {fileID: 0} + - target: {fileID: 247438257786629943, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.x + value: -0.42978367 + objectReference: {fileID: 0} + - target: {fileID: 247438257786629943, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.z + value: 0.5615034 + objectReference: {fileID: 0} + - target: {fileID: 247438257786629943, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.w + value: -0.6955417 + objectReference: {fileID: 0} + - target: {fileID: 247438257786629943, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.y + value: 0.12736534 + objectReference: {fileID: 0} + - target: {fileID: 247438257786629943, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.z + value: 0.12736532 + objectReference: {fileID: 0} + - target: {fileID: 332666212402510700, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: bones._femurLength + value: 0.0030040145 + objectReference: {fileID: 0} + - target: {fileID: 332666212402510700, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: bones._tibiaLength + value: 0.004241226 + objectReference: {fileID: 0} + - target: {fileID: 332666212402510700, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.w + value: 0.6862774 + objectReference: {fileID: 0} + - target: {fileID: 332666212402510700, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.x + value: 0.6862773 + objectReference: {fileID: 0} + - target: {fileID: 332666212402510700, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.y + value: -0.17036352 + objectReference: {fileID: 0} + - target: {fileID: 332666212402510700, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.z + value: -0.17036392 + objectReference: {fileID: 0} + - target: {fileID: 332666212402510700, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.w + value: 0.6842576 + objectReference: {fileID: 0} + - target: {fileID: 332666212402510700, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.x + value: 0.6842578 + objectReference: {fileID: 0} + - target: {fileID: 332666212402510700, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.y + value: -0.17830262 + objectReference: {fileID: 0} + - target: {fileID: 332666212402510700, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.z + value: -0.17830238 + objectReference: {fileID: 0} + - target: {fileID: 503879584753174156, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.5575714 + objectReference: {fileID: 0} + - target: {fileID: 503879584753174156, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.22205761 + objectReference: {fileID: 0} + - target: {fileID: 503879584753174156, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.74311334 + objectReference: {fileID: 0} + - target: {fileID: 503879584753174156, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.29595128 + objectReference: {fileID: 0} + - target: {fileID: 594818000277378115, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: -0.5988415 + objectReference: {fileID: 0} + - target: {fileID: 594818000277378115, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.1734765 + objectReference: {fileID: 0} + - target: {fileID: 594818000277378115, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.75097775 + objectReference: {fileID: 0} + - target: {fileID: 594818000277378115, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.21754834 + objectReference: {fileID: 0} - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -0.0040905406 + value: -0.004090549 objectReference: {fileID: 0} - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0061656977 + value: 0.006165704 objectReference: {fileID: 0} - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w @@ -3251,51 +3379,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.21589416 + value: 0.2158938 objectReference: {fileID: 0} - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.3283432 + value: -0.32834348 objectReference: {fileID: 0} - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.07736311 + value: 0.07736303 objectReference: {fileID: 0} - target: {fileID: 1004982706826917178, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: -0.02830007 + value: -0.028299736 objectReference: {fileID: 0} - target: {fileID: 1004982706826917178, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.6843938 + value: 0.684396 objectReference: {fileID: 0} - target: {fileID: 1004982706826917178, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.71126676 + value: 0.7112646 objectReference: {fileID: 0} - target: {fileID: 1004982706826917178, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.15780945 - objectReference: {fileID: 0} - - target: {fileID: 1035200439474759374, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: useGravity - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1035200439474759374, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: forwardSpeed - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1035200439474759374, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: rotationSpeed - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1035200439474759374, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} - propertyPath: linearVelocity.z - value: 0 + value: 0.15780956 objectReference: {fileID: 0} - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -2.3283064e-10 + value: -2.910383e-10 objectReference: {fileID: 0} - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y @@ -3303,87 +3415,219 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0024082721 + value: 0.0024082726 objectReference: {fileID: 0} - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.5836979 + value: 0.58369887 objectReference: {fileID: 0} - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.81197095 + value: 0.81197023 objectReference: {fileID: 0} - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.000000059604645 + value: 0.000000059604645 objectReference: {fileID: 0} - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000044703484 + value: 0.00000010430813 + objectReference: {fileID: 0} + - target: {fileID: 1136115525120555845, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 0.00522126 + objectReference: {fileID: 0} + - target: {fileID: 1136115525120555845, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: -0.0023040923 + objectReference: {fileID: 0} + - target: {fileID: 1136115525120555845, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: -0.60871315 + objectReference: {fileID: 0} + - target: {fileID: 1136115525120555845, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.13480917 + objectReference: {fileID: 0} + - target: {fileID: 1136115525120555845, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.7633573 + objectReference: {fileID: 0} + - target: {fileID: 1136115525120555845, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.16905755 objectReference: {fileID: 0} - target: {fileID: 1310879476154348518, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.70777 + value: 0.70776516 objectReference: {fileID: 0} - target: {fileID: 1310879476154348518, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.38709375 + value: 0.3870967 objectReference: {fileID: 0} - target: {fileID: 1310879476154348518, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.17679277 + value: -0.17679264 objectReference: {fileID: 0} - target: {fileID: 1310879476154348518, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.56388336 + value: -0.5638873 objectReference: {fileID: 0} + - target: {fileID: 1490908466784209397, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: bones._femurLength + value: 0.0024082724 + objectReference: {fileID: 0} + - target: {fileID: 1490908466784209397, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: bones._tibiaLength + value: 0.004176513 + objectReference: {fileID: 0} + - target: {fileID: 1490908466784209397, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.y + value: -0.25055853 + objectReference: {fileID: 0} + - target: {fileID: 1490908466784209397, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.z + value: -0.25055856 + objectReference: {fileID: 0} + - target: {fileID: 1490908466784209397, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.w + value: 0.580795 + objectReference: {fileID: 0} + - target: {fileID: 1490908466784209397, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.y + value: -0.40333295 + objectReference: {fileID: 0} + - target: {fileID: 1490908466784209397, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.z + value: -0.40333313 + objectReference: {fileID: 0} + - target: {fileID: 1502756290805107789, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: brainPrefab + value: + objectReference: {fileID: 11400000, guid: c8e4b0990eb7dbbc4bee34addd9cd2b8, type: 2} - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -2.628231e-10 + value: 2.3215063e-10 objectReference: {fileID: 0} - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: 9.3132246e-10 objectReference: {fileID: 0} - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0042412225 + value: 0.0042412253 objectReference: {fileID: 0} - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.96049404 + value: 0.9604943 objectReference: {fileID: 0} - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.27830058 + value: -0.27829984 objectReference: {fileID: 0} - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.000000012777276 + value: -0.00000006744899 objectReference: {fileID: 0} - target: {fileID: 1815117023348536243, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000016326851 + value: 0.0000000675895 + objectReference: {fileID: 0} + - target: {fileID: 1817326604091929521, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: -0.0029576076 + objectReference: {fileID: 0} + - target: {fileID: 1817326604091929521, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.00044938427 + objectReference: {fileID: 0} + - target: {fileID: 1817326604091929521, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.82310945 + objectReference: {fileID: 0} + - target: {fileID: 1817326604091929521, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.28778815 + objectReference: {fileID: 0} + - target: {fileID: 1817326604091929521, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.46212763 + objectReference: {fileID: 0} + - target: {fileID: 1817326604091929521, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.16157614 + objectReference: {fileID: 0} + - target: {fileID: 1844943529442369595, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 5.820766e-11 + objectReference: {fileID: 0} + - target: {fileID: 1844943529442369595, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: -2.910383e-11 + objectReference: {fileID: 0} + - target: {fileID: 1844943529442369595, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0019033393 + objectReference: {fileID: 0} + - target: {fileID: 1844943529442369595, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7118277 + objectReference: {fileID: 0} + - target: {fileID: 1844943529442369595, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.7023542 + objectReference: {fileID: 0} + - target: {fileID: 1844943529442369595, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.00000011920929 + objectReference: {fileID: 0} + - target: {fileID: 1844943529442369595, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000067055225 objectReference: {fileID: 0} - target: {fileID: 2057489726524823425, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.6106683 + value: 0.6106631 objectReference: {fileID: 0} - target: {fileID: 2057489726524823425, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.25755244 + value: 0.25755712 objectReference: {fileID: 0} - target: {fileID: 2057489726524823425, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.5535675 + value: 0.55356234 objectReference: {fileID: 0} - target: {fileID: 2057489726524823425, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.50429565 + value: -0.5043051 + objectReference: {fileID: 0} + - target: {fileID: 2063238250592969972, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: -0.002576328 + objectReference: {fileID: 0} + - target: {fileID: 2063238250592969972, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: -0.0072106277 + objectReference: {fileID: 0} + - target: {fileID: 2063238250592969972, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.20619622 + objectReference: {fileID: 0} + - target: {fileID: 2063238250592969972, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.0398159 + objectReference: {fileID: 0} + - target: {fileID: 2063238250592969972, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.95996714 + objectReference: {fileID: 0} + - target: {fileID: 2063238250592969972, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.18536691 objectReference: {fileID: 0} - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -1.9386133e-11 + value: -1.4716635e-10 objectReference: {fileID: 0} - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y @@ -3391,91 +3635,235 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0030214658 + value: 0.003021466 objectReference: {fileID: 0} - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.98070365 + value: 0.98070395 objectReference: {fileID: 0} - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.19550046 + value: -0.19549888 objectReference: {fileID: 0} - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000007145249 + value: -0.000000021710497 objectReference: {fileID: 0} - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.0000000653011 + value: 0.000000034797804 + objectReference: {fileID: 0} + - target: {fileID: 2143803970633277119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 6.8901274e-11 + objectReference: {fileID: 0} + - target: {fileID: 2143803970633277119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: 4.656613e-10 + objectReference: {fileID: 0} + - target: {fileID: 2143803970633277119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0041061183 + objectReference: {fileID: 0} + - target: {fileID: 2143803970633277119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9694203 + objectReference: {fileID: 0} + - target: {fileID: 2143803970633277119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.24540612 + objectReference: {fileID: 0} + - target: {fileID: 2143803970633277119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.00000004228629 + objectReference: {fileID: 0} + - target: {fileID: 2143803970633277119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000019819183 objectReference: {fileID: 0} - target: {fileID: 2149330539247012361, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.7509788 + value: 0.75097895 objectReference: {fileID: 0} - target: {fileID: 2149330539247012361, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.21754554 + value: -0.21754533 objectReference: {fileID: 0} - target: {fileID: 2149330539247012361, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.5988418 + value: -0.59884185 objectReference: {fileID: 0} - target: {fileID: 2149330539247012361, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.17347416 + value: -0.17347383 + objectReference: {fileID: 0} + - target: {fileID: 2179315757048009861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2179315757048009861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: -1.4551915e-11 + objectReference: {fileID: 0} + - target: {fileID: 2179315757048009861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0019033393 + objectReference: {fileID: 0} + - target: {fileID: 2179315757048009861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.865831 + objectReference: {fileID: 0} + - target: {fileID: 2179315757048009861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.50033665 + objectReference: {fileID: 0} + - target: {fileID: 2179315757048009861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 2179315757048009861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000009778887 + objectReference: {fileID: 0} + - target: {fileID: 2356608666883495351, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: -2.489696e-10 + objectReference: {fileID: 0} + - target: {fileID: 2356608666883495351, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2356608666883495351, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0030214654 + objectReference: {fileID: 0} + - target: {fileID: 2356608666883495351, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.98070383 + objectReference: {fileID: 0} + - target: {fileID: 2356608666883495351, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.19549948 + objectReference: {fileID: 0} + - target: {fileID: 2356608666883495351, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.000000025456563 + objectReference: {fileID: 0} + - target: {fileID: 2356608666883495351, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000019332997 objectReference: {fileID: 0} - target: {fileID: 2380027669956049854, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.75851095 + value: 0.75850624 objectReference: {fileID: 0} - target: {fileID: 2380027669956049854, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.57238424 + value: 0.5723893 objectReference: {fileID: 0} - target: {fileID: 2380027669956049854, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.008788032 + value: -0.00878704 objectReference: {fileID: 0} - target: {fileID: 2380027669956049854, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.3113844 + value: -0.31138656 + objectReference: {fileID: 0} + - target: {fileID: 2469329805429469346, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.20721191 + objectReference: {fileID: 0} + - target: {fileID: 2469329805429469346, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.034137964 + objectReference: {fileID: 0} + - target: {fileID: 2469329805429469346, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.96469593 + objectReference: {fileID: 0} + - target: {fileID: 2469329805429469346, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.15893278 objectReference: {fileID: 0} - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -2.3283064e-10 + value: 2.3283064e-10 objectReference: {fileID: 0} - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: -1.1641532e-10 + value: 1.7462298e-10 objectReference: {fileID: 0} - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0030040161 + value: 0.003004016 objectReference: {fileID: 0} - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.8242284 + value: 0.82422906 objectReference: {fileID: 0} - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.5662575 + value: 0.5662566 objectReference: {fileID: 0} - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000008940697 + value: -0.000000029802326 objectReference: {fileID: 0} - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000016763806 + value: 0.000000014901163 + objectReference: {fileID: 0} + - target: {fileID: 2598972606701937627, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2598972606701937627, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: -2.910383e-11 + objectReference: {fileID: 0} + - target: {fileID: 2598972606701937627, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0024082726 + objectReference: {fileID: 0} + - target: {fileID: 2598972606701937627, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7295115 + objectReference: {fileID: 0} + - target: {fileID: 2598972606701937627, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.68396866 + objectReference: {fileID: 0} + - target: {fileID: 2598972606701937627, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 2598972606701937627, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000029802319 + objectReference: {fileID: 0} + - target: {fileID: 2694996827067636066, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.8607982 + objectReference: {fileID: 0} + - target: {fileID: 2694996827067636066, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.13913217 + objectReference: {fileID: 0} + - target: {fileID: 2694996827067636066, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.4832876 + objectReference: {fileID: 0} + - target: {fileID: 2694996827067636066, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.078114524 objectReference: {fileID: 0} - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -0.0052212896 + value: -0.005221293 objectReference: {fileID: 0} - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.002304103 + value: 0.0023041037 objectReference: {fileID: 0} - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w @@ -3483,75 +3871,75 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.16905636 + value: 0.16905628 objectReference: {fileID: 0} - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.608713 + value: -0.60871303 objectReference: {fileID: 0} - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.13480808 + value: 0.13480802 objectReference: {fileID: 0} - target: {fileID: 3025673039819971543, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.96469665 + value: 0.96469676 objectReference: {fileID: 0} - target: {fileID: 3025673039819971543, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.15892707 + value: -0.15892649 objectReference: {fileID: 0} - target: {fileID: 3025673039819971543, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.20721304 + value: 0.20721272 objectReference: {fileID: 0} - target: {fileID: 3025673039819971543, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.0341369 + value: 0.03413673 objectReference: {fileID: 0} - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 1.1641532e-10 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: 5.820766e-11 + value: 1.1641532e-10 objectReference: {fileID: 0} - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0030040154 + value: 0.0030040145 objectReference: {fileID: 0} - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.75856185 + value: 0.7585629 objectReference: {fileID: 0} - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.651601 + value: 0.6515999 objectReference: {fileID: 0} - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000029802319 + value: 0.00000008940697 objectReference: {fileID: 0} - target: {fileID: 3274992126458333413, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000029802319 + value: -0.000000033527613 objectReference: {fileID: 0} - target: {fileID: 3303214404428789969, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.3284602 + value: 0.32846016 objectReference: {fileID: 0} - target: {fileID: 3303214404428789969, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.8921973 + value: 0.8921969 objectReference: {fileID: 0} - target: {fileID: 3303214404428789969, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.29727888 + value: 0.29727992 objectReference: {fileID: 0} - target: {fileID: 3303214404428789969, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.087880984 + value: -0.08788175 objectReference: {fileID: 0} - target: {fileID: 3735440054552339591, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: brainPrefab @@ -3559,75 +3947,167 @@ PrefabInstance: objectReference: {fileID: 11400000, guid: c8e4b0990eb7dbbc4bee34addd9cd2b8, type: 2} - target: {fileID: 3748243631002723431, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.47020042 + value: 0.4701995 objectReference: {fileID: 0} - target: {fileID: 3748243631002723431, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.13349907 + value: 0.1335026 objectReference: {fileID: 0} - target: {fileID: 3748243631002723431, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.79217046 + value: 0.7921698 objectReference: {fileID: 0} - target: {fileID: 3748243631002723431, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.36545265 + value: -0.3654538 + objectReference: {fileID: 0} + - target: {fileID: 3777766915705757037, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: -1.433268e-10 + objectReference: {fileID: 0} + - target: {fileID: 3777766915705757037, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: 4.6566123e-10 + objectReference: {fileID: 0} + - target: {fileID: 3777766915705757037, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.004241225 + objectReference: {fileID: 0} + - target: {fileID: 3777766915705757037, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9604934 + objectReference: {fileID: 0} + - target: {fileID: 3777766915705757037, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.27830288 + objectReference: {fileID: 0} + - target: {fileID: 3777766915705757037, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.000000012137115 + objectReference: {fileID: 0} + - target: {fileID: 3777766915705757037, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000014129231 + objectReference: {fileID: 0} + - target: {fileID: 4024176016905394328, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_Enabled + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4024176016905394328, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: homePheromonePrefab + value: + objectReference: {fileID: 733094908384848434, guid: 04af7f4320cef6537a2d13a3cf2f845f, type: 3} + - target: {fileID: 4506122210810578416, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 1.1303872e-10 + objectReference: {fileID: 0} + - target: {fileID: 4506122210810578416, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: 4.656613e-10 + objectReference: {fileID: 0} + - target: {fileID: 4506122210810578416, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.00412956 + objectReference: {fileID: 0} + - target: {fileID: 4506122210810578416, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9558596 + objectReference: {fileID: 0} + - target: {fileID: 4506122210810578416, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.29382387 + objectReference: {fileID: 0} + - target: {fileID: 4506122210810578416, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.000000044222787 + objectReference: {fileID: 0} + - target: {fileID: 4506122210810578416, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.00000004538929 objectReference: {fileID: 0} - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -1.7462298e-10 + value: 1.4551915e-10 objectReference: {fileID: 0} - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: -2.910383e-11 + value: -5.820766e-11 objectReference: {fileID: 0} - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0024082724 + value: 0.002408272 objectReference: {fileID: 0} - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.72951627 + value: 0.72951674 objectReference: {fileID: 0} - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.6839635 + value: 0.683963 objectReference: {fileID: 0} - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000059604645 + value: -0.000000059604645 objectReference: {fileID: 0} - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000067055225 + value: -0.000000014901161 + objectReference: {fileID: 0} + - target: {fileID: 4544836246457456813, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 1.1641532e-10 + objectReference: {fileID: 0} + - target: {fileID: 4544836246457456813, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: 5.820766e-11 + objectReference: {fileID: 0} + - target: {fileID: 4544836246457456813, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0030040157 + objectReference: {fileID: 0} + - target: {fileID: 4544836246457456813, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.82422143 + objectReference: {fileID: 0} + - target: {fileID: 4544836246457456813, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.56626767 + objectReference: {fileID: 0} + - target: {fileID: 4544836246457456813, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.000000014901161 + objectReference: {fileID: 0} + - target: {fileID: 4544836246457456813, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000007450581 objectReference: {fileID: 0} - target: {fileID: 5108746397492641501, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: -0.14248975 + value: -0.1424893 objectReference: {fileID: 0} - target: {fileID: 5108746397492641501, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.00803577 + value: 0.008035444 objectReference: {fileID: 0} - target: {fileID: 5108746397492641501, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.9881935 + value: 0.9881937 objectReference: {fileID: 0} - target: {fileID: 5108746397492641501, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.05572958 + value: 0.05572748 objectReference: {fileID: 0} - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -5.072226e-10 + value: -1.8249935e-10 objectReference: {fileID: 0} - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: 9.3132246e-10 + value: -9.3132246e-10 objectReference: {fileID: 0} - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0041765124 + value: 0.0041765133 objectReference: {fileID: 0} - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w @@ -3635,43 +4115,43 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.2505718 + value: -0.25057155 objectReference: {fileID: 0} - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.000000011752768 + value: 0.0000000071365625 objectReference: {fileID: 0} - target: {fileID: 5257551609953188724, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.0000000036914773 + value: -0.00000002772193 objectReference: {fileID: 0} - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 0.0025763595 + value: 0.0025763575 objectReference: {fileID: 0} - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0072106714 + value: 0.007210677 objectReference: {fileID: 0} - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.95996726 + value: 0.9599674 objectReference: {fileID: 0} - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.18536544 + value: 0.18536507 objectReference: {fileID: 0} - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.20619719 + value: 0.20619684 objectReference: {fileID: 0} - target: {fileID: 5432151846474450495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.03981577 + value: -0.039815616 objectReference: {fileID: 0} - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 5.820766e-11 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y @@ -3679,123 +4159,187 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0019033402 + value: 0.0019033403 objectReference: {fileID: 0} - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.8658299 + value: 0.8658321 objectReference: {fileID: 0} - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.5003386 + value: 0.5003348 objectReference: {fileID: 0} - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.000000059604645 + value: 0.000000059604645 objectReference: {fileID: 0} - target: {fileID: 5685316299564663885, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.00000003213063 + value: -0.000000038649887 + objectReference: {fileID: 0} + - target: {fileID: 5737181765023906041, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: bones._femurLength + value: 0.0019033405 + objectReference: {fileID: 0} + - target: {fileID: 5737181765023906041, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: bones._tibiaLength + value: 0.002981914 + objectReference: {fileID: 0} + - target: {fileID: 5737181765023906041, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.w + value: -0.5444652 + objectReference: {fileID: 0} + - target: {fileID: 5737181765023906041, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.x + value: -0.5444651 + objectReference: {fileID: 0} + - target: {fileID: 5737181765023906041, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.z + value: 0.45117378 + objectReference: {fileID: 0} + - target: {fileID: 5737181765023906041, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.w + value: -0.42917103 + objectReference: {fileID: 0} + - target: {fileID: 5737181765023906041, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.x + value: -0.42917085 + objectReference: {fileID: 0} + - target: {fileID: 5737181765023906041, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.y + value: -0.561972 + objectReference: {fileID: 0} + - target: {fileID: 5737181765023906041, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.z + value: -0.56197196 objectReference: {fileID: 0} - target: {fileID: 5823700145767964246, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.8540216 + value: 0.85401976 objectReference: {fileID: 0} - target: {fileID: 5823700145767964246, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.32501385 + value: -0.3250156 objectReference: {fileID: 0} - target: {fileID: 5823700145767964246, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.22636823 + value: 0.22636886 objectReference: {fileID: 0} - target: {fileID: 5823700145767964246, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.33729893 + value: 0.33730155 + objectReference: {fileID: 0} + - target: {fileID: 5848079605461954508, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: -1.767577e-10 + objectReference: {fileID: 0} + - target: {fileID: 5848079605461954508, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: -2.3283064e-10 + objectReference: {fileID: 0} + - target: {fileID: 5848079605461954508, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0029819123 + objectReference: {fileID: 0} + - target: {fileID: 5848079605461954508, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.960472 + objectReference: {fileID: 0} + - target: {fileID: 5848079605461954508, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.27837685 + objectReference: {fileID: 0} + - target: {fileID: 5848079605461954508, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.0000001045425 + objectReference: {fileID: 0} + - target: {fileID: 5848079605461954508, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.00000012607583 objectReference: {fileID: 0} - target: {fileID: 5850833608922183593, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.032780226 + value: 0.032783657 objectReference: {fileID: 0} - target: {fileID: 5850833608922183593, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.044935193 + value: -0.044930726 objectReference: {fileID: 0} - target: {fileID: 5850833608922183593, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.8327052 + value: 0.8327042 objectReference: {fileID: 0} - target: {fileID: 5850833608922183593, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.5509159 + value: -0.55091774 objectReference: {fileID: 0} - target: {fileID: 6207803342309021390, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: -0.5112795 + value: -0.51127934 objectReference: {fileID: 0} - target: {fileID: 6207803342309021390, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.8116232 + value: 0.8116235 objectReference: {fileID: 0} - target: {fileID: 6207803342309021390, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.25970167 + value: 0.2597009 objectReference: {fileID: 0} - target: {fileID: 6207803342309021390, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.11142774 + value: -0.11142829 objectReference: {fileID: 0} - target: {fileID: 6513804325188258242, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.74311537 + value: 0.7431155 objectReference: {fileID: 0} - target: {fileID: 6513804325188258242, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.29594934 + value: -0.29594883 objectReference: {fileID: 0} - target: {fileID: 6513804325188258242, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.5575707 + value: 0.55757093 objectReference: {fileID: 0} - target: {fileID: 6513804325188258242, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.22205523 + value: 0.2220549 objectReference: {fileID: 0} - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 0.0035855481 + value: 0.0035855551 objectReference: {fileID: 0} - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0024545912 + value: 0.0024545921 objectReference: {fileID: 0} - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.7708369 + value: 0.77083695 objectReference: {fileID: 0} - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.21358114 + value: 0.21358073 objectReference: {fileID: 0} - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.5783706 + value: 0.57837075 objectReference: {fileID: 0} - target: {fileID: 6524871249661584575, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.16025315 + value: -0.16025288 objectReference: {fileID: 0} - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -1.4534605e-10 + value: 1.6552497e-10 objectReference: {fileID: 0} - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: -4.656613e-10 + value: 9.313226e-10 objectReference: {fileID: 0} - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0041295583 + value: 0.0041295574 objectReference: {fileID: 0} - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w @@ -3803,27 +4347,27 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.29382274 + value: -0.29382277 objectReference: {fileID: 0} - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000004464533 + value: -0.00000010374005 objectReference: {fileID: 0} - target: {fileID: 6535965612457355736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000054249732 + value: -0.0000000054497487 objectReference: {fileID: 0} - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -3.2083558e-10 + value: -9.124479e-12 objectReference: {fileID: 0} - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: -4.656613e-10 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0041061193 + value: 0.0041061183 objectReference: {fileID: 0} - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w @@ -3831,15 +4375,39 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.24540135 + value: -0.24540123 objectReference: {fileID: 0} - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000007383186 + value: 0.000000008396855 objectReference: {fileID: 0} - target: {fileID: 6572398933426288654, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000052860386 + value: -0.000000018941392 + objectReference: {fileID: 0} + - target: {fileID: 6594209482403568318, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: -0.0035855214 + objectReference: {fileID: 0} + - target: {fileID: 6594209482403568318, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: -0.0024545693 + objectReference: {fileID: 0} + - target: {fileID: 6594209482403568318, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.57837176 + objectReference: {fileID: 0} + - target: {fileID: 6594209482403568318, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.16025467 + objectReference: {fileID: 0} + - target: {fileID: 6594209482403568318, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.77083534 + objectReference: {fileID: 0} + - target: {fileID: 6594209482403568318, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.21358229 objectReference: {fileID: 0} - target: {fileID: 6620083584134435749, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w @@ -3847,15 +4415,55 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6620083584134435749, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.18358405 + value: -0.18358365 objectReference: {fileID: 0} - target: {fileID: 6620083584134435749, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.33085743 + value: -0.3308577 objectReference: {fileID: 0} - target: {fileID: 6620083584134435749, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.0657852 + value: -0.06578509 + objectReference: {fileID: 0} + - target: {fileID: 6702413818536640054, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 0.0022254863 + objectReference: {fileID: 0} + - target: {fileID: 6702413818536640054, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.002710371 + objectReference: {fileID: 0} + - target: {fileID: 6702413818536640054, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.95367116 + objectReference: {fileID: 0} + - target: {fileID: 6702413818536640054, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.26484644 + objectReference: {fileID: 0} + - target: {fileID: 6702413818536640054, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.13751155 + objectReference: {fileID: 0} + - target: {fileID: 6702413818536640054, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.038188674 + objectReference: {fileID: 0} + - target: {fileID: 6958972504176507483, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: -0.33085763 + objectReference: {fileID: 0} + - target: {fileID: 6958972504176507483, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.065786354 + objectReference: {fileID: 0} + - target: {fileID: 6958972504176507483, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.9233099 + objectReference: {fileID: 0} + - target: {fileID: 6958972504176507483, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0.18358706 objectReference: {fileID: 0} - target: {fileID: 7021329035324230484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x @@ -3899,175 +4507,323 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -1.1641532e-10 + value: -2.3283064e-10 objectReference: {fileID: 0} - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: -1.4551915e-11 + value: 7.2759576e-11 objectReference: {fileID: 0} - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0019033402 + value: 0.0019033396 objectReference: {fileID: 0} - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.71182936 + value: 0.7118306 objectReference: {fileID: 0} - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.70235246 + value: 0.7023512 objectReference: {fileID: 0} - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.00000023841858 + value: -0.000000029802319 objectReference: {fileID: 0} - target: {fileID: 7313217641663358484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.00000011175871 + value: -0.00000004470348 objectReference: {fileID: 0} - target: {fileID: 7378712539761125858, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.5855806 + value: 0.5855809 objectReference: {fileID: 0} - target: {fileID: 7378712539761125858, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.46928528 + value: -0.46928382 objectReference: {fileID: 0} - target: {fileID: 7378712539761125858, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.63777494 + value: -0.6377762 objectReference: {fileID: 0} - target: {fileID: 7378712539761125858, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.17352198 + value: -0.17352039 objectReference: {fileID: 0} - target: {fileID: 7394846002605678119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.81694216 + value: 0.8169416 objectReference: {fileID: 0} - target: {fileID: 7394846002605678119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.43574914 + value: -0.43575144 objectReference: {fileID: 0} - target: {fileID: 7394846002605678119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.1470813 + value: 0.14708231 objectReference: {fileID: 0} - target: {fileID: 7394846002605678119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.34798744 + value: -0.3479854 objectReference: {fileID: 0} - target: {fileID: 7400717801484663767, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.48328754 + value: 0.48328704 objectReference: {fileID: 0} - target: {fileID: 7400717801484663767, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.078114174 + value: -0.0781137 objectReference: {fileID: 0} - target: {fileID: 7400717801484663767, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.86079836 + value: 0.8607987 objectReference: {fileID: 0} - target: {fileID: 7400717801484663767, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.13913158 + value: 0.13913104 + objectReference: {fileID: 0} + - target: {fileID: 7424123368923134861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7424123368923134861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7424123368923134861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.003004016 + objectReference: {fileID: 0} + - target: {fileID: 7424123368923134861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.75855726 + objectReference: {fileID: 0} + - target: {fileID: 7424123368923134861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.6516064 + objectReference: {fileID: 0} + - target: {fileID: 7424123368923134861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7424123368923134861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7509758028014155536, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7509758028014155536, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: -1.1641532e-10 + objectReference: {fileID: 0} + - target: {fileID: 7509758028014155536, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0024082726 + objectReference: {fileID: 0} + - target: {fileID: 7509758028014155536, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.5836928 + objectReference: {fileID: 0} + - target: {fileID: 7509758028014155536, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: 0.8119745 + objectReference: {fileID: 0} + - target: {fileID: 7509758028014155536, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.000000029802319 + objectReference: {fileID: 0} + - target: {fileID: 7509758028014155536, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000014901159 objectReference: {fileID: 0} - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -0.0022254875 + value: -0.002225488 objectReference: {fileID: 0} - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: -0.0027103669 + value: -0.0027103794 objectReference: {fileID: 0} - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: -0.1375119 + value: -0.13751148 objectReference: {fileID: 0} - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.038188778 + value: -0.03818857 objectReference: {fileID: 0} - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.95367104 + value: 0.9536713 objectReference: {fileID: 0} - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.26484644 + value: -0.26484585 objectReference: {fileID: 0} - target: {fileID: 7654735227470959086, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_Name value: LowPolyAntRigged objectReference: {fileID: 0} + - target: {fileID: 8091081424583978495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9881936 + objectReference: {fileID: 0} + - target: {fileID: 8091081424583978495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.05572837 + objectReference: {fileID: 0} + - target: {fileID: 8091081424583978495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: 0.14248942 + objectReference: {fileID: 0} + - target: {fileID: 8091081424583978495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.008035595 + objectReference: {fileID: 0} + - target: {fileID: 8104549368886974640, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: bones._tibiaLength + value: 0.0041295574 + objectReference: {fileID: 0} + - target: {fileID: 8104549368886974640, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.w + value: -0.075963095 + objectReference: {fileID: 0} + - target: {fileID: 8104549368886974640, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.x + value: -0.075962946 + objectReference: {fileID: 0} + - target: {fileID: 8104549368886974640, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.y + value: 0.7030146 + objectReference: {fileID: 0} + - target: {fileID: 8104549368886974640, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.x + value: 0.5739339 + objectReference: {fileID: 0} + - target: {fileID: 8104549368886974640, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.z + value: 0.4130375 + objectReference: {fileID: 0} - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 0.0029576167 + value: 0.0029576207 objectReference: {fileID: 0} - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: -0.00044939033 + value: -0.00044939684 objectReference: {fileID: 0} - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.46212772 + value: 0.46212727 objectReference: {fileID: 0} - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.16157565 + value: 0.16157524 objectReference: {fileID: 0} - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.82310987 + value: 0.8231103 objectReference: {fileID: 0} - target: {fileID: 8598108513644155435, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.28778735 + value: -0.28778702 + objectReference: {fileID: 0} + - target: {fileID: 8773790806045806296, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.x + value: -4.7164317e-10 + objectReference: {fileID: 0} + - target: {fileID: 8773790806045806296, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.y + value: -9.3132246e-10 + objectReference: {fileID: 0} + - target: {fileID: 8773790806045806296, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0041765133 + objectReference: {fileID: 0} + - target: {fileID: 8773790806045806296, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9680977 + objectReference: {fileID: 0} + - target: {fileID: 8773790806045806296, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.x + value: -0.25057337 + objectReference: {fileID: 0} + - target: {fileID: 8773790806045806296, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.y + value: -0.000000025835016 + objectReference: {fileID: 0} + - target: {fileID: 8773790806045806296, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_LocalRotation.z + value: 0.0000000050992326 objectReference: {fileID: 0} - target: {fileID: 8801464852371122986, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.28808263 + value: 0.2880804 objectReference: {fileID: 0} - target: {fileID: 8801464852371122986, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.5423464 + value: -0.54234964 objectReference: {fileID: 0} - target: {fileID: 8801464852371122986, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.5076533 + value: -0.5076485 objectReference: {fileID: 0} - target: {fileID: 8801464852371122986, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.60428214 + value: 0.6042844 objectReference: {fileID: 0} - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -8.5655455e-11 + value: -2.927781e-10 objectReference: {fileID: 0} - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: 0.0000000013969839 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0029819133 + value: 0.0029819128 objectReference: {fileID: 0} - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.9604721 + value: 0.96047235 objectReference: {fileID: 0} - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.2783762 + value: -0.2783757 objectReference: {fileID: 0} - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000014039327 + value: -0.000000026325239 objectReference: {fileID: 0} - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.00000018561477 + value: 0.000000035147085 + objectReference: {fileID: 0} + - target: {fileID: 9079939580604013961, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: bones._femurLength + value: 0.0019033406 + objectReference: {fileID: 0} + - target: {fileID: 9079939580604013961, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.x + value: -0.3940539 + objectReference: {fileID: 0} + - target: {fileID: 9079939580604013961, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.y + value: 0.5871299 + objectReference: {fileID: 0} + - target: {fileID: 9079939580604013961, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneFemur.z + value: 0.5871302 + objectReference: {fileID: 0} + - target: {fileID: 9079939580604013961, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.w + value: 0.16597569 + objectReference: {fileID: 0} + - target: {fileID: 9079939580604013961, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: targetToBoneTibia.x + value: 0.16597566 objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] diff --git a/Samples/Prefabs/LowPolyAntRigged Variant.prefab b/Samples/Prefabs/LowPolyAntRigged Variant.prefab index a272ee9..853d1af 100644 --- a/Samples/Prefabs/LowPolyAntRigged Variant.prefab +++ b/Samples/Prefabs/LowPolyAntRigged Variant.prefab @@ -131,8 +131,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 310226470799096867} serializedVersion: 2 - m_LocalRotation: {x: 0.039815675, y: -0.9599674, z: 0.1853655, w: 0.20619667} - m_LocalPosition: {x: -0.002576354, y: 0, z: -0.007210674} + m_LocalRotation: {x: 0.039815653, y: -0.9599674, z: 0.18536547, w: 0.20619658} + m_LocalPosition: {x: -0.0025763495, y: 0, z: -0.007210667} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -206,7 +206,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 627474747923666567} serializedVersion: 2 - m_LocalRotation: {x: -0.055727027, y: 0.14248894, z: 0.008035352, w: 0.98819375} + m_LocalRotation: {x: -0.05572752, y: 0.14248866, z: 0.008035409, w: 0.98819375} m_LocalPosition: {x: 0.0011845141, y: 0.0022176225, z: -0.0008242579} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -234,13 +234,13 @@ MonoBehaviour: _phalanges: {fileID: 0} _end: {fileID: 0} _femurLength: 0.0019033402 - _tibiaLength: 0.0030214654 + _tibiaLength: 0.0030214668 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 6702413818536640054} - targetToBoneFemur: {x: -0.39405388, y: 0.5871299, z: 0.5871303, w: -0.39405403} - targetToBoneTibia: {x: 0.16597588, y: 0.6873515, z: 0.68735147, w: 0.16597602} + targetToBoneFemur: {x: -0.39405382, y: 0.58713, z: 0.58713055, w: -0.3940538} + targetToBoneTibia: {x: 0.16597652, y: 0.68735147, z: 0.6873513, w: 0.16597664} --- !u!1 &794584019555967318 GameObject: m_ObjectHideFlags: 0 @@ -265,8 +265,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 794584019555967318} serializedVersion: 2 - m_LocalRotation: {x: 0.5662575, y: -0.000000014901161, z: -0.000000013038516, w: 0.82422847} - m_LocalPosition: {x: -1.1641532e-10, y: 0, z: 0.0030040161} + m_LocalRotation: {x: 0.56625897, y: -0, z: -0.000000014901161, w: 0.8242274} + m_LocalPosition: {x: 2.3283064e-10, y: 5.820766e-11, z: 0.0030040161} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -299,8 +299,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 879920836154580446} serializedVersion: 2 - m_LocalRotation: {x: 0.16025275, y: -0.7708369, z: 0.21358046, w: 0.5783709} - m_LocalPosition: {x: -0.0035855589, y: 0, z: -0.002454592} + m_LocalRotation: {x: 0.16025314, y: -0.77083653, z: 0.21358076, w: 0.57837117} + m_LocalPosition: {x: -0.0035855572, y: 0, z: -0.0024545877} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -375,8 +375,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1046291156767383927} serializedVersion: 2 - m_LocalRotation: {x: -0.07736307, y: -0.91629434, z: 0.2158938, w: -0.32834357} - m_LocalPosition: {x: 0.0040905527, y: 0, z: -0.0061657066} + m_LocalRotation: {x: -0.07736318, y: -0.9162943, z: 0.21589409, w: -0.32834357} + m_LocalPosition: {x: 0.0040905443, y: 0, z: -0.0061656963} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -451,8 +451,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1381374271869641024} serializedVersion: 2 - m_LocalRotation: {x: 0.26484564, y: 0.1375111, z: -0.03818843, w: 0.9536714} - m_LocalPosition: {x: 0.0022254856, y: 0, z: 0.0027103818} + m_LocalRotation: {x: 0.26484597, y: 0.1375108, z: -0.038188398, w: 0.95367134} + m_LocalPosition: {x: 0.0022254835, y: 0, z: 0.0027103818} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -559,8 +559,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2391558079143476650} serializedVersion: 2 - m_LocalRotation: {x: 0.500334, y: -0.000000014901159, z: -9.3132246e-10, w: 0.86583245} - m_LocalPosition: {x: -5.820766e-11, y: 1.4551915e-11, z: 0.0019033402} + m_LocalRotation: {x: 0.5003347, y: 0.000000014901161, z: -0.000000015366822, w: 0.86583215} + m_LocalPosition: {x: 0, y: 2.910383e-11, z: 0.0019033403} m_LocalScale: {x: 0.99999994, y: 1, z: 0.99999994} m_ConstrainProportionsScale: 0 m_Children: @@ -591,8 +591,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2737017325502982318} serializedVersion: 2 - m_LocalRotation: {x: -0.29382282, y: -0.00000015715536, z: 0.00000013800356, w: 0.9558599} - m_LocalPosition: {x: 3.6353678e-10, y: 4.656613e-10, z: 0.004129558} + m_LocalRotation: {x: -0.2938225, y: -0.00000024847017, z: 0.00000016629497, w: 0.9558601} + m_LocalPosition: {x: -9.477443e-11, y: 0, z: 0.004129558} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -727,8 +727,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3188458486668866969} serializedVersion: 2 - m_LocalRotation: {x: -0.24540132, y: 0.000000010059308, z: -0.0000000052178937, w: 0.9694216} - m_LocalPosition: {x: -7.757306e-11, y: 9.313226e-10, z: 0.0041061183} + m_LocalRotation: {x: -0.24540237, y: -0.000000015553981, z: 0.000000010133035, w: 0.96942127} + m_LocalPosition: {x: 2.9253944e-10, y: -4.656613e-10, z: 0.0041061183} m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 0.9999999} m_ConstrainProportionsScale: 0 m_Children: [] @@ -758,8 +758,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4167713860447769177} serializedVersion: 2 - m_LocalRotation: {x: 0.6839624, y: -0.000000029802322, z: 0.000000037252903, w: 0.7295173} - m_LocalPosition: {x: -1.1641532e-10, y: 0, z: 0.002408273} + m_LocalRotation: {x: 0.68396443, y: -0, z: -0.000000037252903, w: 0.72951543} + m_LocalPosition: {x: -4.0745363e-10, y: -5.820766e-11, z: 0.0024082726} m_LocalScale: {x: 1, y: 1.0000001, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -792,8 +792,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4337532486384028974} serializedVersion: 2 - m_LocalRotation: {x: -0.13480783, y: -0.763358, z: 0.16905607, w: -0.60871303} - m_LocalPosition: {x: 0.005221297, y: 0, z: -0.0023041053} + m_LocalRotation: {x: -0.13480844, y: -0.76335746, z: 0.16905662, w: -0.60871345} + m_LocalPosition: {x: 0.0052212873, y: 0, z: -0.0023040974} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -972,7 +972,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4785709934359029167} serializedVersion: 2 - m_LocalRotation: {x: -0.03413683, y: -0.96469676, z: -0.15892707, w: 0.20721252} + m_LocalRotation: {x: -0.034136977, y: -0.9646967, z: -0.15892783, w: 0.20721242} m_LocalPosition: {x: -0.00033019992, y: 0.002194208, z: -0.0022233187} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -999,14 +999,14 @@ MonoBehaviour: _tarsus: {fileID: 2143803970633277119} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0030040164 - _tibiaLength: 0.004106119 + _femurLength: 0.0030040161 + _tibiaLength: 0.0041061183 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 2063238250592969972} - targetToBoneFemur: {x: -0.42978364, y: 0.5615034, z: 0.56150335, w: -0.42978367} - targetToBoneTibia: {x: -0.69554174, y: 0.12736538, z: 0.12736535, w: -0.6955417} + targetToBoneFemur: {x: -0.42978352, y: 0.5615034, z: 0.56150347, w: -0.4297837} + targetToBoneTibia: {x: -0.69554156, y: 0.12736543, z: 0.12736532, w: -0.6955417} --- !u!1 &5099577226509260816 GameObject: m_ObjectHideFlags: 0 @@ -1066,8 +1066,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5132672650264838643} serializedVersion: 2 - m_LocalRotation: {x: 0.28778678, y: -0.46212685, z: 0.16157489, w: 0.8231107} - m_LocalPosition: {x: -0.0029576225, y: 0, z: 0.0004494015} + m_LocalRotation: {x: 0.28778702, y: -0.46212685, z: 0.16157502, w: 0.8231105} + m_LocalPosition: {x: -0.0029576211, y: 0, z: 0.00044940034} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -1141,7 +1141,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5309068433442998760} serializedVersion: 2 - m_LocalRotation: {x: 0.065785, y: -0.9233107, z: -0.18358336, w: -0.33085784} + m_LocalRotation: {x: 0.065785274, y: -0.9233106, z: -0.18358408, w: -0.33085778} m_LocalPosition: {x: 0.0009336879, y: 0.0024799206, z: -0.0023264561} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1168,14 +1168,14 @@ MonoBehaviour: _tarsus: {fileID: 3777766915705757037} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0030040152 - _tibiaLength: 0.0042412262 + _femurLength: 0.003004014 + _tibiaLength: 0.004241224 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 166916568455411127} - targetToBoneFemur: {x: 0.6862771, y: -0.17036358, z: -0.17036386, w: 0.6862772} - targetToBoneTibia: {x: 0.6842577, y: -0.17830297, z: -0.17830284, w: 0.6842573} + targetToBoneFemur: {x: 0.68627685, y: -0.17036399, z: -0.17036442, w: 0.68627715} + targetToBoneTibia: {x: 0.6842575, y: -0.17830266, z: -0.17830272, w: 0.6842572} --- !u!1 &5681202965352357062 GameObject: m_ObjectHideFlags: 0 @@ -1315,6 +1315,74 @@ Transform: - {fileID: 166916568455411127} m_Father: {fileID: 6693967616387045584} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &6124192267495229980 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6932093386260502758} + - component: {fileID: 8699427163021657133} + m_Layer: 0 + m_Name: Mouth + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6932093386260502758 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6124192267495229980} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0, y: -0.000577, z: -0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1981556834617787400} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8699427163021657133 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6124192267495229980} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 122a8c835cdbd95fb87b06d19573b3da, type: 3} + m_Name: + m_EditorClassIdentifier: + foodPrefab: {fileID: 4701327554883596395, guid: 0ff16166352f10e49bdefe6231ac3e38, type: 3} + nanoBrain: {fileID: 1502756290805107789} + havingFood: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + trace: 0 + _receivers: [] + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } --- !u!1 &6159996709595705846 GameObject: m_ObjectHideFlags: 0 @@ -1339,8 +1407,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6159996709595705846} serializedVersion: 2 - m_LocalRotation: {x: -0.1954987, y: 0.0000000031388354, z: 0.000000006370368, w: 0.98070395} - m_LocalPosition: {x: -6.543855e-11, y: -2.3283064e-10, z: 0.0030214656} + m_LocalRotation: {x: -0.19549859, y: -0.000000031247453, z: 0.00000004070294, w: 0.980704} + m_LocalPosition: {x: -1.7673688e-10, y: 2.3283064e-10, z: 0.003021467} m_LocalScale: {x: 1.0000001, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -1370,8 +1438,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6316072838432425663} serializedVersion: 2 - m_LocalRotation: {x: -0.25057152, y: 0.00000005042321, z: -0.0000000456221, w: 0.96809804} - m_LocalPosition: {x: 3.5153447e-10, y: 4.6566123e-10, z: 0.0041765133} + m_LocalRotation: {x: -0.2505717, y: -0.0000000460091, z: 0.00000005172026, w: 0.96809804} + m_LocalPosition: {x: 1.709376e-10, y: 9.3132246e-10, z: 0.004176514} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -1401,8 +1469,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6989243030111056437} serializedVersion: 2 - m_LocalRotation: {x: 0.70235044, y: -0.00000008940697, z: 0.00000008568168, w: 0.7118314} - m_LocalPosition: {x: 2.3283064e-10, y: 0, z: 0.0019033396} + m_LocalRotation: {x: 0.70235085, y: -0.00000014901161, z: 0.000000040978193, w: 0.7118309} + m_LocalPosition: {x: 0, y: 0, z: 0.0019033394} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -1538,8 +1606,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7045146692761223360} serializedVersion: 2 - m_LocalRotation: {x: -0.27837536, y: 0.0000001223605, z: -0.00000015950943, w: 0.96047235} - m_LocalPosition: {x: 9.0370045e-11, y: 6.9849193e-10, z: 0.0029819128} + m_LocalRotation: {x: -0.2783754, y: 0.000000111489335, z: -0.00000010702245, w: 0.9604724} + m_LocalPosition: {x: 3.3442643e-10, y: 2.3283064e-10, z: 0.0029819133} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -1674,8 +1742,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7120345591145567988} serializedVersion: 2 - m_LocalRotation: {x: 0.6515992, y: 0.00000008940696, z: -0.000000014901159, w: 0.75856334} - m_LocalPosition: {x: -1.1641532e-10, y: -5.820766e-11, z: 0.0030040147} + m_LocalRotation: {x: 0.6516009, y: -0, z: 0.0000000372529, w: 0.75856197} + m_LocalPosition: {x: 1.1641532e-10, y: -1.7462298e-10, z: 0.003004014} m_LocalScale: {x: 1, y: 1.0000001, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -1707,7 +1775,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7446482324527034130} serializedVersion: 2 - m_LocalRotation: {x: -0.22205469, y: -0.74311554, z: -0.2959484, w: 0.5575712} + m_LocalRotation: {x: -0.22205508, y: -0.7431151, z: -0.29594862, w: 0.5575715} m_LocalPosition: {x: -0.00024003958, y: 0.0020915146, z: -0.0014802816} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1734,14 +1802,14 @@ MonoBehaviour: _tarsus: {fileID: 4506122210810578416} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0024082728 - _tibiaLength: 0.0041295583 + _femurLength: 0.0024082721 + _tibiaLength: 0.004129559 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 6594209482403568318} - targetToBoneFemur: {x: -0.07596305, y: 0.7030147, z: 0.70301473, w: -0.07596322} - targetToBoneTibia: {x: 0.5739336, y: 0.41303775, z: 0.41303787, w: 0.57393366} + targetToBoneFemur: {x: -0.075963154, y: 0.7030146, z: 0.70301455, w: -0.07596326} + targetToBoneTibia: {x: 0.5739335, y: 0.41303802, z: 0.41303807, w: 0.57393354} --- !u!1 &7711405578978141862 GameObject: m_ObjectHideFlags: 0 @@ -1766,8 +1834,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7711405578978141862} serializedVersion: 2 - m_LocalRotation: {x: -0.27829936, y: -0.00000005742217, z: 0.0000000255697, w: 0.9604944} - m_LocalPosition: {x: 7.901253e-10, y: 0.0000000013969836, z: 0.0042412253} + m_LocalRotation: {x: -0.27830046, y: 0.0000000015411512, z: -0.000000014116679, w: 0.96049416} + m_LocalPosition: {x: 3.3623582e-10, y: 0, z: 0.0042412234} m_LocalScale: {x: 1, y: 0.9999999, z: 0.9999999} m_ConstrainProportionsScale: 0 m_Children: [] @@ -1798,7 +1866,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8096372255630545175} serializedVersion: 2 - m_LocalRotation: {x: 0.17347363, y: -0.75097907, z: -0.21754494, w: -0.5988419} + m_LocalRotation: {x: 0.17347476, y: -0.7509783, z: -0.21754616, w: -0.598842} m_LocalPosition: {x: 0.0008435269, y: 0.0020915149, z: -0.0013045785} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1825,14 +1893,14 @@ MonoBehaviour: _tarsus: {fileID: 8773790806045806296} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0024082735 - _tibiaLength: 0.0041765138 + _femurLength: 0.0024082726 + _tibiaLength: 0.0041765156 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 1136115525120555845} - targetToBoneFemur: {x: 0.66122663, y: -0.25055847, z: -0.25055844, w: 0.66122663} - targetToBoneTibia: {x: 0.58079475, y: -0.40333292, z: -0.4033329, w: 0.580795} + targetToBoneFemur: {x: 0.6612268, y: -0.25055802, z: -0.25055796, w: 0.66122675} + targetToBoneTibia: {x: 0.58079433, y: -0.40333354, z: -0.40333337, w: 0.5807947} --- !u!1 &8337622648895462336 GameObject: m_ObjectHideFlags: 0 @@ -1938,8 +2006,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8471587059027499795} serializedVersion: 2 - m_LocalRotation: {x: 0.8119699, y: 0.00000020861626, z: -0.000000014901161, w: 0.58369946} - m_LocalPosition: {x: -1.4551915e-10, y: 5.820766e-11, z: 0.0024082726} + m_LocalRotation: {x: 0.8119702, y: 0.00000020861626, z: 0.000000029802322, w: 0.583699} + m_LocalPosition: {x: -1.4551915e-10, y: 0, z: 0.0024082721} m_LocalScale: {x: 0.9999998, y: 1, z: 1.0000001} m_ConstrainProportionsScale: 0 m_Children: @@ -1971,7 +2039,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8679495084672713308} serializedVersion: 2 - m_LocalRotation: {x: -0.13913071, y: -0.48328665, z: -0.07811351, w: 0.860799} + m_LocalRotation: {x: -0.13913096, y: -0.48328662, z: -0.07811364, w: 0.86079895} m_LocalPosition: {x: -0.00058102724, y: 0.0022176215, z: -0.0009999603} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1998,14 +2066,14 @@ MonoBehaviour: _tarsus: {fileID: 5848079605461954508} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0019033399 - _tibiaLength: 0.002981913 + _femurLength: 0.0019033394 + _tibiaLength: 0.0029819133 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 1817326604091929521} - targetToBoneFemur: {x: -0.5444651, y: 0.4511738, z: 0.4511738, w: -0.5444652} - targetToBoneTibia: {x: -0.42917106, y: -0.56197184, z: -0.5619719, w: -0.42917114} + targetToBoneFemur: {x: -0.5444652, y: 0.45117378, z: 0.45117375, w: -0.5444651} + targetToBoneTibia: {x: -0.42917117, y: -0.5619719, z: -0.5619716, w: -0.4291713} --- !u!1001 &268813082562621446 PrefabInstance: m_ObjectHideFlags: 0 @@ -2016,91 +2084,91 @@ PrefabInstance: m_Modifications: - target: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: -0.02829995 + value: -0.028299756 objectReference: {fileID: 0} - target: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.6843921 + value: 0.68439233 objectReference: {fileID: 0} - target: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.7112686 + value: 0.7112683 objectReference: {fileID: 0} - target: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: 0.15780888 + value: 0.15780868 objectReference: {fileID: 0} - target: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.70777094 + value: 0.707769 objectReference: {fileID: 0} - target: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.38709322 + value: 0.38709393 objectReference: {fileID: 0} - target: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: -0.17679317 + value: -0.17679389 objectReference: {fileID: 0} - target: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.56388247 + value: -0.5638841 objectReference: {fileID: 0} - target: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6106683 + value: 0.6106675 objectReference: {fileID: 0} - target: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.25755247 + value: 0.25755313 objectReference: {fileID: 0} - target: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.55356723 + value: 0.55356663 objectReference: {fileID: 0} - target: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.5042959 + value: -0.5042972 objectReference: {fileID: 0} - target: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.7585123 + value: 0.7585109 objectReference: {fileID: 0} - target: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.572383 + value: 0.5723845 objectReference: {fileID: 0} - target: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: -0.008787926 + value: -0.008787027 objectReference: {fileID: 0} - target: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.31138334 + value: -0.31138423 objectReference: {fileID: 0} - target: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.3284601 + value: 0.32845983 objectReference: {fileID: 0} - target: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.8921965 + value: 0.8921967 objectReference: {fileID: 0} - target: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.29728135 + value: 0.29728103 objectReference: {fileID: 0} - target: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.08788186 + value: -0.08788225 objectReference: {fileID: 0} - target: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.47020018 + value: 0.47019994 objectReference: {fileID: 0} - target: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.13349877 + value: 0.13349949 objectReference: {fileID: 0} - target: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y @@ -2108,39 +2176,39 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.36545172 + value: -0.3654518 objectReference: {fileID: 0} - target: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.03278032 + value: 0.032780852 objectReference: {fileID: 0} - target: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: -0.044935346 + value: -0.044934776 objectReference: {fileID: 0} - target: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.8327049 + value: 0.83270484 objectReference: {fileID: 0} - target: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.5509164 + value: -0.5509165 objectReference: {fileID: 0} - target: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.8540219 + value: 0.854021 objectReference: {fileID: 0} - target: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: -0.3250136 + value: -0.32501414 objectReference: {fileID: 0} - target: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.22636837 + value: 0.22636889 objectReference: {fileID: 0} - target: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: 0.33729824 + value: 0.33729973 objectReference: {fileID: 0} - target: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w @@ -2152,11 +2220,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.2597024 + value: 0.25970218 objectReference: {fileID: 0} - target: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.11142661 + value: -0.111426696 objectReference: {fileID: 0} - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalPosition.x @@ -2200,35 +2268,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.81694245 + value: 0.8169423 objectReference: {fileID: 0} - target: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: -0.43574864 + value: -0.4357495 objectReference: {fileID: 0} - target: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.1470808 + value: 0.14708066 objectReference: {fileID: 0} - target: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.34798762 + value: -0.34798706 objectReference: {fileID: 0} - target: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.58558196 + value: 0.5855815 objectReference: {fileID: 0} - target: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: -0.46928108 + value: -0.46928173 objectReference: {fileID: 0} - target: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: -0.6377773 + value: -0.6377774 objectReference: {fileID: 0} - target: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.17352016 + value: -0.17351954 objectReference: {fileID: 0} - target: {fileID: 7602095073321034216, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_Name @@ -2236,19 +2304,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.28808346 + value: 0.28808337 objectReference: {fileID: 0} - target: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: -0.5423461 + value: -0.54234666 objectReference: {fileID: 0} - target: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: -0.50765437 + value: -0.50765383 objectReference: {fileID: 0} - target: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: 0.6042812 + value: 0.60428125 objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] @@ -2256,6 +2324,9 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} insertIndex: -1 addedObject: {fileID: 1186408022295929665} + - targetCorrespondingSourceObject: {fileID: 1784801363276559374, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + insertIndex: -1 + addedObject: {fileID: 6932093386260502758} m_AddedComponents: - targetCorrespondingSourceObject: {fileID: 7602095073321034216, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} insertIndex: -1 @@ -2263,6 +2334,21 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: 7602095073321034216, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} insertIndex: -1 addedObject: {fileID: 4024176016905394328} + - targetCorrespondingSourceObject: {fileID: 7602095073321034216, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + insertIndex: -1 + addedObject: {fileID: 7570327242161780228} + - targetCorrespondingSourceObject: {fileID: 7090007444517551404, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + insertIndex: -1 + addedObject: {fileID: 5751220258320626789} + - targetCorrespondingSourceObject: {fileID: 7090007444517551404, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + insertIndex: -1 + addedObject: {fileID: 1953633248282846413} + - targetCorrespondingSourceObject: {fileID: 5783641339264501955, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + insertIndex: -1 + addedObject: {fileID: 813130058200224771} + - targetCorrespondingSourceObject: {fileID: 5783641339264501955, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + insertIndex: -1 + addedObject: {fileID: 7107807689499336986} m_SourcePrefab: {fileID: 100100000, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} --- !u!4 &658830270699185039 stripped Transform: @@ -2289,6 +2375,11 @@ Transform: m_CorrespondingSourceObject: {fileID: 2012305571009694964, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} m_PrefabInstance: {fileID: 268813082562621446} m_PrefabAsset: {fileID: 0} +--- !u!4 &1981556834617787400 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 1784801363276559374, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} --- !u!4 &2057489726524823425 stripped Transform: m_CorrespondingSourceObject: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} @@ -2339,6 +2430,67 @@ Transform: m_CorrespondingSourceObject: {fileID: 5853788262327791853, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} m_PrefabInstance: {fileID: 268813082562621446} m_PrefabAsset: {fileID: 0} +--- !u!1 &6050756749802043589 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 5783641339264501955, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!114 &813130058200224771 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6050756749802043589} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 62f6712fb1e4fb40285b0bb5008716dc, type: 3} + m_Name: + m_EditorClassIdentifier: + receptor: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + trace: 0 + _receivers: [] + insect: {fileID: 0} + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } +--- !u!135 &7107807689499336986 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6050756749802043589} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.0002 + m_Center: {x: 0, y: 0, z: 0} --- !u!4 &6207803342309021390 stripped Transform: m_CorrespondingSourceObject: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} @@ -2349,6 +2501,67 @@ Transform: m_CorrespondingSourceObject: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} m_PrefabInstance: {fileID: 268813082562621446} m_PrefabAsset: {fileID: 0} +--- !u!1 &7052566818850377002 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 7090007444517551404, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} + m_PrefabInstance: {fileID: 268813082562621446} + m_PrefabAsset: {fileID: 0} +--- !u!114 &5751220258320626789 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7052566818850377002} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 62f6712fb1e4fb40285b0bb5008716dc, type: 3} + m_Name: + m_EditorClassIdentifier: + receptor: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + trace: 0 + _receivers: [] + insect: {fileID: 0} + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } +--- !u!135 &1953633248282846413 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7052566818850377002} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.0002 + m_Center: {x: 0, y: 0, z: 0} --- !u!4 &7378712539761125858 stripped Transform: m_CorrespondingSourceObject: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} @@ -2395,7 +2608,7 @@ MonoBehaviour: targetToModelRotation: {x: 0, y: 0, z: 0, w: 0} animator: {fileID: 4226361316839711815} animationsPath: Assets - stepOffset: 0.3 + stepOffset: 0.0001 useGravity: 0 slopeAlignment: 0.3 creatureRigidbody: {fileID: 0} @@ -2482,43 +2695,9 @@ MonoBehaviour: updateAnimations: 0 homePheromonePrefab: {fileID: 0} foodPheromonePrefab: {fileID: 0} - touchLeft: {fileID: 0} - touchRight: {fileID: 0} + touchLeft: {fileID: 813130058200224771} + touchRight: {fileID: 5751220258320626789} nanoBrain: {fileID: 0} - targetDirection: - name: - parent: - rid: -2 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _curvePreset: 0 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - curveMax: 0 - trace: 0 - _receivers: [] - hasFood: - name: - parent: - rid: -2 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _curvePreset: 0 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - curveMax: 0 - trace: 0 - _receivers: [] beat: name: parent: @@ -2553,40 +2732,6 @@ MonoBehaviour: curveMax: 0 trace: 0 _receivers: [] - hitLeft: - name: - parent: - rid: -2 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _curvePreset: 0 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - curveMax: 0 - trace: 0 - _receivers: [] - hitRight: - name: - parent: - rid: -2 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _curvePreset: 0 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - curveMax: 0 - trace: 0 - _receivers: [] foodReceptor: name: parent: @@ -2621,6 +2766,40 @@ MonoBehaviour: curveMax: 0 trace: 0 _receivers: [] + targetDirection: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + trace: 0 + _receivers: [] + hasFood: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + trace: 0 + _receivers: [] linearVelocity: {x: 0, y: 0, z: 0} angularVelocity: {x: 0, y: 0, z: 0} references: @@ -2628,6 +2807,33 @@ MonoBehaviour: RefIds: - rid: -2 type: {class: , ns: , asm: } +--- !u!54 &7570327242161780228 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7654735227470959086} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 --- !u!4 &8516272057858494884 stripped Transform: m_CorrespondingSourceObject: {fileID: 8472647778795970978, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} From 67beb5e48657b4876817e8b3707a0a8008bf96d3 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Wed, 6 May 2026 09:48:21 +0200 Subject: [PATCH 33/38] Add neuron property drawer --- Editor/Scripts/Ant_Editor.cs | 11 +++- NanoBrain/Editor/Neuron_Drawer.cs | 79 +++++++++++++++++++++++ NanoBrain/Editor/Neuron_Drawer.cs.meta | 11 ++++ NanoBrain/Runtime/Scripts/Core/Cluster.cs | 15 +++-- NanoBrain/Runtime/Scripts/Core/Neuron.cs | 2 +- Runtime/Scripts/Ant.cs | 2 +- 6 files changed, 108 insertions(+), 12 deletions(-) create mode 100644 NanoBrain/Editor/Neuron_Drawer.cs create mode 100644 NanoBrain/Editor/Neuron_Drawer.cs.meta diff --git a/Editor/Scripts/Ant_Editor.cs b/Editor/Scripts/Ant_Editor.cs index 72b5f76..a72fb2e 100644 --- a/Editor/Scripts/Ant_Editor.cs +++ b/Editor/Scripts/Ant_Editor.cs @@ -19,16 +19,21 @@ namespace CreatureControl { HomePheromonePrefabInspector(); FoodPheromonePrefabInspector(); + + EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(Ant.targetDirection))); + EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(Ant.foodReceptor))); + EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(Ant.homeReceptor))); + EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(Ant.hasFood))); } private void HomePheromonePrefabInspector() { SerializedProperty homePheromonePrefabProp = serializedObject.FindProperty(nameof(Ant.homePheromonePrefab)); - homePheromonePrefabProp.objectReferenceValue = (GameObject) EditorGUILayout.ObjectField("Home Pheromone Prefab", homePheromonePrefabProp.objectReferenceValue, typeof(GameObject), true); + homePheromonePrefabProp.objectReferenceValue = (GameObject)EditorGUILayout.ObjectField("Home Pheromone Prefab", homePheromonePrefabProp.objectReferenceValue, typeof(GameObject), true); } - + private void FoodPheromonePrefabInspector() { SerializedProperty foodPheromonePrefabProp = serializedObject.FindProperty(nameof(Ant.foodPheromonePrefab)); - foodPheromonePrefabProp.objectReferenceValue = (GameObject) EditorGUILayout.ObjectField("Food Pheromone Prefab", foodPheromonePrefabProp.objectReferenceValue, typeof(GameObject), true); + foodPheromonePrefabProp.objectReferenceValue = (GameObject)EditorGUILayout.ObjectField("Food Pheromone Prefab", foodPheromonePrefabProp.objectReferenceValue, typeof(GameObject), true); } } diff --git a/NanoBrain/Editor/Neuron_Drawer.cs b/NanoBrain/Editor/Neuron_Drawer.cs new file mode 100644 index 0000000..dac91b2 --- /dev/null +++ b/NanoBrain/Editor/Neuron_Drawer.cs @@ -0,0 +1,79 @@ +using UnityEngine; +using UnityEditor; +using Unity.Mathematics; +using System; +using System.Reflection; +using System.Collections; + +namespace NanoBrain { + [CustomPropertyDrawer(typeof(Neuron))] + class NeuronDrawer : PropertyDrawer { + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { + // Draw foldout + properties + label = EditorGUI.BeginProperty(position, label, property); + + // Begin indent block + int indent = EditorGUI.indentLevel; + EditorGUI.indentLevel = 0; + + object instance = GetTargetObjectOfProperty(property); + + float lineHeight = EditorGUIUtility.singleLineHeight; + Rect r = new(position.x, position.y, position.width, lineHeight); + if (instance != null) { + FieldInfo field = typeof(Neuron).GetField("_outputValue", BindingFlags.NonPublic | BindingFlags.Instance); + if (field != null) { + float3 val = (float3)field.GetValue(instance); + EditorGUI.Vector3Field(r, $"Neuron: {label}", val); + } + } + + EditorGUI.indentLevel = indent; + EditorGUI.EndProperty(); + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) { + // height for 1 line + return (EditorGUIUtility.singleLineHeight * 1) + (EditorGUIUtility.standardVerticalSpacing * 0); + } + + public static object GetTargetObjectOfProperty(SerializedProperty prop) { + var path = prop.propertyPath.Replace(".Array.data[", "["); + object obj = prop.serializedObject.targetObject; + var elements = path.Split('.'); + foreach (var element in elements) { + if (element.Contains("[")) { + var elementName = element.Substring(0, element.IndexOf("[")); + var index = Convert.ToInt32(element.Substring(element.IndexOf("[")).Replace("[", "").Replace("]", "")); + obj = GetValue_Imp(obj, elementName, index); + } + else { + obj = GetValue_Imp(obj, element); + } + } + return obj; + } + + static object GetValue_Imp(object source, string name) { + if (source == null) + return null; + + Type t = source.GetType(); + FieldInfo f = t.GetField(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + if (f != null) + return f.GetValue(source); + PropertyInfo p = t.GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + return p?.GetValue(source, null); + } + static object GetValue_Imp(object source, string name, int index) { + if (GetValue_Imp(source, name) is not IEnumerable enumerable) + return null; + IEnumerator en = enumerable.GetEnumerator(); + for (int i = 0; i <= index; i++) { + if (!en.MoveNext()) + return null; + } + return en.Current; + } + } +} \ No newline at end of file diff --git a/NanoBrain/Editor/Neuron_Drawer.cs.meta b/NanoBrain/Editor/Neuron_Drawer.cs.meta new file mode 100644 index 0000000..b3a4b00 --- /dev/null +++ b/NanoBrain/Editor/Neuron_Drawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aa0e340763ca6299e93d514b271ae38d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NanoBrain/Runtime/Scripts/Core/Cluster.cs b/NanoBrain/Runtime/Scripts/Core/Cluster.cs index 8077e04..973c692 100644 --- a/NanoBrain/Runtime/Scripts/Core/Cluster.cs +++ b/NanoBrain/Runtime/Scripts/Core/Cluster.cs @@ -556,14 +556,15 @@ namespace NanoBrain { return this; // Find a sleeping cluster - foreach (Cluster cluster in this.siblingClusters) { - if (cluster.defaultOutput.isSleeping) { - RemoveThingCluster(cluster); - return cluster; - } - } + // foreach (Cluster cluster in this.siblingClusters) { + // if (cluster.defaultOutput.isSleeping) { + // RemoveThingCluster(cluster); + // return cluster; + // } + // } - // Otherwise find longest unused cluster + // Find longest unused cluster + // Note this uses the default output... Cluster unusedCluster = this.siblingClusters[0]; for (int ix = 1; ix < this.siblingClusters.Length; ix++) { if (this.siblingClusters[ix].defaultOutput.lastUpdate < unusedCluster.defaultOutput.lastUpdate) diff --git a/NanoBrain/Runtime/Scripts/Core/Neuron.cs b/NanoBrain/Runtime/Scripts/Core/Neuron.cs index b5dcc66..d434b04 100644 --- a/NanoBrain/Runtime/Scripts/Core/Neuron.cs +++ b/NanoBrain/Runtime/Scripts/Core/Neuron.cs @@ -285,7 +285,7 @@ namespace NanoBrain { public Action WhenFiring; - public virtual bool isSleeping => Time.time - this.lastUpdate > this.timeToSleep; //this.outputMagnitude == 0; + public virtual bool isSleeping => false;// Time.time - this.lastUpdate > this.timeToSleep; //this.outputMagnitude == 0; public void SleepCheck() { if (this.isSleeping) { #if UNITY_MATHEMATICS diff --git a/Runtime/Scripts/Ant.cs b/Runtime/Scripts/Ant.cs index 99f272b..b9f5971 100644 --- a/Runtime/Scripts/Ant.cs +++ b/Runtime/Scripts/Ant.cs @@ -225,7 +225,7 @@ namespace CreatureControl { Vector3 smellDirection = this.transform.InverseTransformPoint(nest.transform.position); float distance = smellDirection.magnitude; - float angle = Vector3.Angle(Vector3.forward, smellDirection); + float angle = Vector3.Angle(Vector3.back, smellDirection); if (angle < smellAngle && distance > 0.01) { float intensity = nest.StrengthAt(distance); Vector3 value = smellDirection.normalized * intensity; From b1121eed878b354c15e96c60cba1eb39470b34e5 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Wed, 6 May 2026 12:10:26 +0200 Subject: [PATCH 34/38] Single smell works --- .../Editor/Scripts/Insect/Insect_Editor.cs | 10 +- CreatureControl/Runtime/Scripts/Creature.cs | 18 +- Editor/Scripts/Ant_Editor.cs | 8 +- NanoBrain/Editor/Neuron_Drawer.cs | 6 +- NanoBrain/Runtime/Scripts/Core/Neuron.cs | 5 +- Runtime/Scripts/Ant.cs | 56 +- Runtime/Scripts/AntennaTouch.cs | 7 + Runtime/Scripts/AntsNest.cs | 2 +- Runtime/Scripts/Mouth.cs | 6 +- Samples/Animation/AntAnimator3.controller | 14 +- Samples/Brain/Foraging.asset | 99 +- Samples/Foraging.unity | 1406 ++++++-- Samples/Prefabs/LowPolyAnt Variant.prefab | 2885 +++++++++++++++++ .../Prefabs/LowPolyAnt Variant.prefab.meta | 7 + Samples/Prefabs/LowPolyAnt.prefab | 96 + Samples/Prefabs/LowPolyAnt.prefab.meta | 7 + .../Prefabs/LowPolyAntRigged Variant.prefab | 226 +- Samples/Prefabs/LowPolyAntRigged.prefab | 6 +- Samples/Prefabs/LowPolyAnt_old.prefab | 171 +- 19 files changed, 4608 insertions(+), 427 deletions(-) create mode 100644 Samples/Prefabs/LowPolyAnt Variant.prefab create mode 100644 Samples/Prefabs/LowPolyAnt Variant.prefab.meta create mode 100644 Samples/Prefabs/LowPolyAnt.prefab create mode 100644 Samples/Prefabs/LowPolyAnt.prefab.meta diff --git a/CreatureControl/Editor/Scripts/Insect/Insect_Editor.cs b/CreatureControl/Editor/Scripts/Insect/Insect_Editor.cs index 76214e1..bc9e30d 100644 --- a/CreatureControl/Editor/Scripts/Insect/Insect_Editor.cs +++ b/CreatureControl/Editor/Scripts/Insect/Insect_Editor.cs @@ -10,7 +10,9 @@ namespace CreatureControl { protected Insect insect; public override void OnEnable() { - + if (target == null) + return; + insect = target as Insect; bool anythingChanged = false; @@ -153,10 +155,14 @@ namespace CreatureControl { SerializedProperty rightHindLegProp = serializedObject.FindProperty(nameof(Insect.rightHindLeg)); somethingChanged |= Leg_Editor.Inspector(rightHindLegProp, insect.insectRig.rightBackLeg, insect.rightHindLeg); + EditorGUILayout.Space(); + + EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(Ant.touchLeft))); + EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(Ant.touchRight))); + EditorGUI.indentLevel--; if (somethingChanged) { - Debug.Log("seomthin has changed"); // don't know if this apply/update is really needed.... serializedObject.Update(); // serializedObject.ApplyModifiedProperties(); diff --git a/CreatureControl/Runtime/Scripts/Creature.cs b/CreatureControl/Runtime/Scripts/Creature.cs index 878dfa5..44724a5 100644 --- a/CreatureControl/Runtime/Scripts/Creature.cs +++ b/CreatureControl/Runtime/Scripts/Creature.cs @@ -34,7 +34,7 @@ namespace CreatureControl { /// /// If there is not static object below the feet of the avatar the avatar will fall down until it reaches solid ground /// - public bool useGravity = true; + public bool useGravity = false; [Range(0f, 1f)] public float slopeAlignment = 0.3f; @@ -137,11 +137,13 @@ namespace CreatureControl { UpdatePose(); - // copy animator root motion to the creature - //this.transform.SetPositionAndRotation(targetRig.transform.position, targetRig.transform.rotation); - // As target rig is probably a child of this.transform, - // We need to restore the position/rotation of the targetsRig. - //targetRig.transform.SetPositionAndRotation(this.transform.position, this.transform.rotation); + if (this.model != this.transform) { + // copy animator root motion to the creature + this.transform.SetPositionAndRotation(targetRig.transform.position, targetRig.transform.rotation); + // As target rig is probably a child of this.transform, + // We need to restore the position/rotation of the targetsRig. + targetRig.transform.SetPositionAndRotation(this.transform.position, this.transform.rotation); + } } /// @@ -161,9 +163,9 @@ namespace CreatureControl { public virtual void UpdateModel() { if (this.model == null) return; - + this.targetRig.transform.GetPositionAndRotation(out Vector3 targetRigPosition, out Quaternion targetRigOrientation); - + Vector3 newPosition = targetRigPosition + this.targetToModelTranslation; Quaternion newOrientation = targetRigOrientation * this.targetToModelRotation; this.model.SetPositionAndRotation(newPosition, newOrientation); diff --git a/Editor/Scripts/Ant_Editor.cs b/Editor/Scripts/Ant_Editor.cs index a72fb2e..bffd26f 100644 --- a/Editor/Scripts/Ant_Editor.cs +++ b/Editor/Scripts/Ant_Editor.cs @@ -1,15 +1,16 @@ using UnityEditor; using UnityEngine; +using NanoBrain; namespace CreatureControl { [CustomEditor(typeof(Ant))] public class Ant_Editor : Insect_Editor { - protected Ant ant; + //protected Ant ant; public override void OnEnable() { - this.ant = target as Ant; + //this.ant = target as Ant; base.OnEnable(); } @@ -24,6 +25,7 @@ namespace CreatureControl { EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(Ant.foodReceptor))); EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(Ant.homeReceptor))); EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(Ant.hasFood))); + serializedObject.ApplyModifiedProperties(); } private void HomePheromonePrefabInspector() { @@ -37,4 +39,4 @@ namespace CreatureControl { } } -} \ No newline at end of file +} diff --git a/NanoBrain/Editor/Neuron_Drawer.cs b/NanoBrain/Editor/Neuron_Drawer.cs index dac91b2..6cb226c 100644 --- a/NanoBrain/Editor/Neuron_Drawer.cs +++ b/NanoBrain/Editor/Neuron_Drawer.cs @@ -7,7 +7,11 @@ using System.Collections; namespace NanoBrain { [CustomPropertyDrawer(typeof(Neuron))] - class NeuronDrawer : PropertyDrawer { + class Neuron_Drawer : PropertyDrawer { + public static void Insepctor(SerializedObject serializedObject, string propertyName ) { + EditorGUILayout.PropertyField(serializedObject.FindProperty(propertyName)); + } + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { // Draw foldout + properties label = EditorGUI.BeginProperty(position, label, property); diff --git a/NanoBrain/Runtime/Scripts/Core/Neuron.cs b/NanoBrain/Runtime/Scripts/Core/Neuron.cs index d434b04..43b6507 100644 --- a/NanoBrain/Runtime/Scripts/Core/Neuron.cs +++ b/NanoBrain/Runtime/Scripts/Core/Neuron.cs @@ -284,8 +284,8 @@ namespace NanoBrain { } public Action WhenFiring; - - public virtual bool isSleeping => false;// Time.time - this.lastUpdate > this.timeToSleep; //this.outputMagnitude == 0; + public bool persistOutput = false; + public virtual bool isSleeping => persistOutput ? false : (Time.time - this.lastUpdate > this.timeToSleep); public void SleepCheck() { if (this.isSleeping) { #if UNITY_MATHEMATICS @@ -330,6 +330,7 @@ namespace NanoBrain { protected virtual void CloneFields(Neuron clone) { clone.bias = this.bias; + clone.persistOutput = this.persistOutput; clone.combinator = this.combinator; clone.curve = this.curve; clone.curvePreset = this.curvePreset; diff --git a/Runtime/Scripts/Ant.cs b/Runtime/Scripts/Ant.cs index b9f5971..ec2eb22 100644 --- a/Runtime/Scripts/Ant.cs +++ b/Runtime/Scripts/Ant.cs @@ -45,6 +45,7 @@ namespace CreatureControl { public Neuron pheromoneSteering; public Neuron foodReceptor; public Neuron homeReceptor; + public Neuron foodSmell; // brain output public Neuron targetDirection; @@ -64,8 +65,10 @@ namespace CreatureControl { if (brain != null) { //--- brain inputs this.beat = brain.GetNeuron("Beat"); - touchLeft.receptor = brain.GetNucleus("Hit Left") as Neuron; - touchRight.receptor = brain.GetNucleus("Hit Right") as Neuron; + if (touchLeft != null) + touchLeft.receptor = brain.GetNucleus("Hit Left") as Neuron; + if (touchRight != null) + touchRight.receptor = brain.GetNucleus("Hit Right") as Neuron; this.foodReceptor = brain.GetNucleus("Food Receptor") as Neuron; this.homeReceptor = brain.GetNucleus("Home Receptor") as Neuron; this.pheromoneSteering = brain.GetNucleus("Pheromone Steering") as Neuron; @@ -104,10 +107,16 @@ namespace CreatureControl { #region Update void PlaceFoodPheromone() { + if (foodPheromonePrefab == null) + return; + GameObject pheromoneObj = Instantiate(foodPheromonePrefab); pheromoneObj.transform.position = this.model.position; } void PlaceHomePheromone() { + if (homePheromonePrefab == null) + return; + GameObject pheromoneObj = Instantiate(homePheromonePrefab); pheromoneObj.transform.position = this.model.position; } @@ -127,22 +136,22 @@ namespace CreatureControl { if (this.targetDirection == null || this.animator == null) return; - Vector3 movementDir = Quaternion.Euler(0, 180, 0) * this.targetDirection.outputValue; + Vector3 movementDir = this.targetDirection.outputValue; this.linearVelocity = (1 - this.inertia) * (Time.deltaTime * movementDir.normalized) + this.inertia * this.linearVelocity; this.linearVelocity = this.linearVelocity.normalized; - float forwardParam = this.linearVelocity.z; + this.forwardSpeed = this.linearVelocity.z; float angleRad = this.linearVelocity.sqrMagnitude > 1e-10f ? Mathf.Atan2(this.linearVelocity.x, this.linearVelocity.z) : 0; // map -20..20 degrees to -1..1 - float rotateParam = Mathf.Clamp(angleRad * 3, -1f, 1f); + this.rotationSpeed = Mathf.Clamp(angleRad * 3, -1f, 1f); - this.animator.SetFloat("Forward", forwardParam); - this.animator.SetFloat("Rotation", rotateParam); + this.animator.SetFloat("Forward", this.forwardSpeed); + this.animator.SetFloat("Rotation", this.rotationSpeed); } private static readonly WaitForSeconds _waitForSeconds3 = new(3); @@ -154,9 +163,9 @@ namespace CreatureControl { // Set random direction to simulate noisy smells perception // which will result in a bit of random walking when no clear // smells are received - float randomAngle = Random.Range(-smellAngle, smellAngle); + float randomAngle = Random.Range(-smellAngle/4, smellAngle/4); Vector3 randomDirection = Quaternion.AngleAxis(randomAngle, Vector3.up) * Vector3.forward; - pheromoneSteering?.SetBias(randomDirection); + foodReceptor?.SetBias(randomDirection); yield return _waitForSeconds3; } } @@ -168,8 +177,6 @@ namespace CreatureControl { SmellFood(collider); SmellHome(collider); } - // if (nanoBrain != null && nanoBrain.brain != null) - // nanoBrain.brain.UpdateNuclei(); } void SmellPheromones(Collider thing) { @@ -185,52 +192,43 @@ namespace CreatureControl { Vector3 smell = smellDirection.normalized * intensity; switch (pheromone.type) { case Pheromone.Type.Food: - foodReceptor?.ProcessStimulus(smellDirection.normalized * intensity); //, pheromone.GetInstanceID(), "food pheromone"); + foodReceptor?.ProcessStimulus(smell); break; case Pheromone.Type.Home: - homeReceptor?.ProcessStimulus(smellDirection.normalized * intensity); //, pheromone.GetInstanceID(), "home pheromone"); + homeReceptor?.ProcessStimulus(smell); break; } - //Debug.DrawLine(this.transform.position, pheromone.transform.position, Color.magenta); + // Debug.DrawLine(this.transform.position, pheromone.transform.position, Color.magenta); } } void SmellFood(Collider thing) { - if (hasFood != null && hasFood.outputValue.x > 0) - // if it has food... - return; - Food food = thing.GetComponentInParent(); if (food == null) return; Vector3 smellDirection = this.transform.InverseTransformPoint(food.transform.position); float distance = smellDirection.magnitude; - float angle = Vector3.Angle(Vector3.back, smellDirection); + float angle = Vector3.Angle(Vector3.forward, smellDirection); if (angle < smellAngle && distance > 0.01) { float intensity = food.StrengthAt(distance); - foodReceptor?.ProcessStimulus(smellDirection.normalized * intensity); //, food.GetInstanceID(), "food"); - Debug.DrawLine(this.transform.position, food.transform.position, Color.red); + foodReceptor?.ProcessStimulus(smellDirection.normalized * intensity); + //Debug.DrawLine(this.transform.position, food.transform.position, Color.red); } } void SmellHome(Collider thing) { - if (hasFood != null && hasFood.outputValue.x < 0) - // if it does not have food.... - return; - AntsNest nest = thing.GetComponentInParent(); if (nest == null) return; Vector3 smellDirection = this.transform.InverseTransformPoint(nest.transform.position); float distance = smellDirection.magnitude; - float angle = Vector3.Angle(Vector3.back, smellDirection); + float angle = Vector3.Angle(Vector3.forward, smellDirection); if (angle < smellAngle && distance > 0.01) { float intensity = nest.StrengthAt(distance); - Vector3 value = smellDirection.normalized * intensity; - homeReceptor?.ProcessStimulus(value); //, nest.GetInstanceID(), "nest"); - Debug.DrawLine(this.transform.position, nest.transform.position, Color.red); + homeReceptor?.ProcessStimulus(smellDirection.normalized * intensity); + //Debug.DrawLine(this.transform.position, nest.transform.position, Color.red); } } diff --git a/Runtime/Scripts/AntennaTouch.cs b/Runtime/Scripts/AntennaTouch.cs index e928d3b..a3f8399 100644 --- a/Runtime/Scripts/AntennaTouch.cs +++ b/Runtime/Scripts/AntennaTouch.cs @@ -6,16 +6,23 @@ public class AntennaTouch : MonoBehaviour { public Neuron receptor; public Insect insect; + public GameObject hitObject; + protected virtual void Awake() { this.insect = GetComponentInParent(); } void OnTriggerStay(Collider other) { + this.hitObject = other.gameObject; + Vector3 touchDirection = this.insect.transform.InverseTransformVector(this.transform.forward); receptor?.SetBias(touchDirection); } // Perhaps I can leave this out and use the sleep state? + // Sleep is currently only for clusters.. void OnTriggerExit(Collider other) { + this.hitObject = null; + Vector3 touchDirection = Vector3.zero; receptor?.SetBias(touchDirection); } diff --git a/Runtime/Scripts/AntsNest.cs b/Runtime/Scripts/AntsNest.cs index f32aa22..358ecb6 100644 --- a/Runtime/Scripts/AntsNest.cs +++ b/Runtime/Scripts/AntsNest.cs @@ -19,7 +19,7 @@ namespace CreatureControl { while (numberOfAnts > 0) { Ant ant = Instantiate(antPrefab); ant.transform.eulerAngles = 360 * Random.value * Vector3.up; - ant.transform.position = this.transform.position + ant.transform.forward * 0.1F; + ant.transform.position = this.transform.position + ant.transform.forward * 0.01F; ant.name = "Ant " + (++antCount); numberOfAnts--; yield return _waitForSeconds0_2; diff --git a/Runtime/Scripts/Mouth.cs b/Runtime/Scripts/Mouth.cs index 89c48e0..468f84a 100644 --- a/Runtime/Scripts/Mouth.cs +++ b/Runtime/Scripts/Mouth.cs @@ -22,7 +22,7 @@ namespace CreatureControl { } void Start() { - havingFood?.SetBias(-Vector3.one); + havingFood?.SetBias(Vector3.zero); } protected void CheckGrab() { @@ -62,8 +62,8 @@ namespace CreatureControl { toDelete.Add(transform.GetChild(i).gameObject); foreach (GameObject go in toDelete) Destroy(go); - - havingFood?.SetBias(-Vector3.one); + + havingFood?.SetBias(Vector3.zero); } } diff --git a/Samples/Animation/AntAnimator3.controller b/Samples/Animation/AntAnimator3.controller index 46e9e6e..3548c46 100644 --- a/Samples/Animation/AntAnimator3.controller +++ b/Samples/Animation/AntAnimator3.controller @@ -12,7 +12,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: ab82ff68e62ea3b1c8e6523f8d46c142, type: 2} m_Threshold: -1 m_Position: {x: 0, y: 1} - m_TimeScale: 0.5 + m_TimeScale: 1 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -28,7 +28,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: 91229db5e929c379bbfd5bf417848488, type: 2} m_Threshold: 1 m_Position: {x: 1, y: 0} - m_TimeScale: 0.5 + m_TimeScale: 1 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -51,7 +51,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: 138594cdb62397137913b39c26d3de5a, type: 2} m_Threshold: 0 m_Position: {x: 0, y: 0} - m_TimeScale: 0.5 + m_TimeScale: 1 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -59,7 +59,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: b8a731a1533b8c960b3f3688d4922a24, type: 2} m_Threshold: 0.25 m_Position: {x: 0, y: 1} - m_TimeScale: 0.5 + m_TimeScale: 1 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -67,7 +67,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: 240c3a3c6c28272059bf7b591ff818b1, type: 2} m_Threshold: 0.5 m_Position: {x: -1, y: 0} - m_TimeScale: 0.5 + m_TimeScale: 1 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -75,7 +75,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: 501d5503172629df192bb4ad015fb4f7, type: 2} m_Threshold: 0.75 m_Position: {x: 1, y: 0} - m_TimeScale: 0.5 + m_TimeScale: 1 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 @@ -83,7 +83,7 @@ BlendTree: m_Motion: {fileID: 7400000, guid: b8a731a1533b8c960b3f3688d4922a24, type: 2} m_Threshold: 1 m_Position: {x: 0, y: -1} - m_TimeScale: -0.5 + m_TimeScale: -1 m_CycleOffset: 0 m_DirectBlendParameter: Forward m_Mirror: 0 diff --git a/Samples/Brain/Foraging.asset b/Samples/Brain/Foraging.asset index 2509e82..eb473f0 100644 --- a/Samples/Brain/Foraging.asset +++ b/Samples/Brain/Foraging.asset @@ -32,6 +32,7 @@ MonoBehaviour: - rid: 4201949834634854856 - rid: 4201949834634854857 - rid: 4201949834634854858 + - rid: 4201949854258954578 references: version: 2 RefIds: @@ -42,8 +43,8 @@ MonoBehaviour: data: name: Output parent: - rid: 4201949834634854873 - bias: {x: 0, y: 0, z: -1} + rid: 4201949854258954746 + bias: {x: 0, y: 0, z: 1} _synapses: - neuron: rid: 4201949831649034327 @@ -81,6 +82,7 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 1 + persistOutput: 0 trace: 0 _receivers: [] - rid: 4201949831649034327 @@ -88,7 +90,7 @@ MonoBehaviour: data: name: Collision parent: - rid: 4201949834634854873 + rid: 4201949854258954746 bias: {x: 0, y: 0, z: 0} _synapses: - neuron: @@ -124,6 +126,7 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 1 + persistOutput: 0 trace: 0 _receivers: - rid: 4201949831649034325 @@ -133,7 +136,7 @@ MonoBehaviour: data: name: Hit Left parent: - rid: 4201949834634854873 + rid: 4201949854258954746 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -163,6 +166,7 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 1 + persistOutput: 0 trace: 0 _receivers: - rid: 4201949831649034327 @@ -171,7 +175,7 @@ MonoBehaviour: data: name: Hit Right parent: - rid: 4201949834634854873 + rid: 4201949854258954746 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -201,6 +205,7 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 1 + persistOutput: 0 trace: 0 _receivers: - rid: 4201949831649034327 @@ -209,7 +214,7 @@ MonoBehaviour: data: name: Beat parent: - rid: 4201949834634854873 + rid: 4201949854258954746 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -239,21 +244,26 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 1 + persistOutput: 0 trace: 0 _receivers: - rid: 4201949834634854704 + - rid: 4201949854258954578 - rid: 4201949834634854704 type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} data: name: Home Pheromones parent: - rid: 4201949834634854873 - bias: {x: 0, y: 0, z: 0} + rid: 4201949854258954746 + bias: {x: 1, y: 1, z: 1} _synapses: - neuron: rid: 4201949834634854702 weight: 1 - combinator: 0 + - neuron: + rid: 4201949834634854858 + weight: 1 + combinator: 1 _curvePreset: 0 curve: serializedVersion: 2 @@ -280,6 +290,7 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 1 + persistOutput: 0 trace: 0 _receivers: [] - rid: 4201949834634854727 @@ -287,7 +298,7 @@ MonoBehaviour: data: name: Food Receptor parent: - rid: 4201949834634854873 + rid: 4201949854258954746 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -317,6 +328,7 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 1 + persistOutput: 0 trace: 0 _receivers: - rid: 4201949834634854857 @@ -325,7 +337,7 @@ MonoBehaviour: data: name: Mouth parent: - rid: 4201949834634854873 + rid: 4201949854258954746 bias: {x: 0, y: 0, z: 0} _synapses: - neuron: @@ -358,6 +370,7 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 1 + persistOutput: 0 trace: 0 _receivers: [] - rid: 4201949834634854833 @@ -365,7 +378,7 @@ MonoBehaviour: data: name: Having Food parent: - rid: 4201949834634854873 + rid: 4201949854258954746 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -395,16 +408,18 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 1 + persistOutput: 1 trace: 0 _receivers: - rid: 4201949834634854855 - rid: 4201949834634854858 + - rid: 4201949854258954578 - rid: 4201949834634854855 type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} data: name: Home Smell parent: - rid: 4201949834634854873 + rid: 4201949854258954746 bias: {x: 1, y: 1, z: 1} _synapses: - neuron: @@ -440,6 +455,7 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 1 + persistOutput: 0 trace: 0 _receivers: - rid: 4201949831649034325 @@ -448,7 +464,7 @@ MonoBehaviour: data: name: Home Receptor parent: - rid: 4201949834634854873 + rid: 4201949854258954746 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -478,6 +494,7 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 1 + persistOutput: 0 trace: 0 _receivers: - rid: 4201949834634854855 @@ -486,7 +503,7 @@ MonoBehaviour: data: name: Food Smell parent: - rid: 4201949834634854873 + rid: 4201949854258954746 bias: {x: 1, y: 1, z: 1} _synapses: - neuron: @@ -522,6 +539,7 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 1 + persistOutput: 0 trace: 0 _receivers: - rid: 4201949831649034325 @@ -530,7 +548,7 @@ MonoBehaviour: data: name: Not having Food parent: - rid: 4201949834634854873 + rid: 4201949854258954746 bias: {x: 1, y: 1, z: 1} _synapses: - neuron: @@ -563,10 +581,56 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 1 + persistOutput: 1 trace: 0 _receivers: - rid: 4201949834634854857 - - rid: 4201949834634854873 + - rid: 4201949834634854704 + - rid: 4201949854258954578 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Food Pheromones + parent: + rid: 4201949854258954746 + bias: {x: 1, y: 1, z: 1} + _synapses: + - neuron: + rid: 4201949834634854702 + weight: 1 + - neuron: + rid: 4201949834634854833 + weight: 1 + combinator: 1 + _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 + persistOutput: 0 + trace: 0 + _receivers: [] + - rid: 4201949854258954746 type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} data: name: Foraging @@ -588,3 +652,4 @@ MonoBehaviour: - rid: 4201949834634854856 - rid: 4201949834634854857 - rid: 4201949834634854858 + - rid: 4201949854258954578 diff --git a/Samples/Foraging.unity b/Samples/Foraging.unity index 5967d7d..4650ae4 100644 --- a/Samples/Foraging.unity +++ b/Samples/Foraging.unity @@ -245,7 +245,7 @@ Transform: serializedVersion: 2 m_LocalRotation: {x: 0, y: 0.7071068, z: -0, w: -0.7071068} m_LocalPosition: {x: 0.15, y: 0, z: -0.15} - m_LocalScale: {x: 0.1, y: 0.1, z: 0.5} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 467453032} @@ -336,7 +336,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 2147483647 - m_IsActive: 1 + m_IsActive: 0 --- !u!4 &233567077 Transform: m_ObjectHideFlags: 0 @@ -539,7 +539,7 @@ Transform: serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0.15, y: 0, z: 0.15} - m_LocalScale: {x: 0.1, y: 0.1, z: 0.5} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 467453032} @@ -981,7 +981,7 @@ Transform: serializedVersion: 2 m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068} m_LocalPosition: {x: -0.15, y: 0, z: 0.15} - m_LocalScale: {x: 0.1, y: 0.1, z: 0.5} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 467453032} @@ -1611,7 +1611,7 @@ Transform: serializedVersion: 2 m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} m_LocalPosition: {x: -0.15, y: 0, z: -0.15} - m_LocalScale: {x: 0.1, y: 0.1, z: 0.5} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 467453032} @@ -3239,27 +3239,27 @@ PrefabInstance: m_Modifications: - target: {fileID: 166916568455411127, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 0.004090523 + value: 0.004090484 objectReference: {fileID: 0} - target: {fileID: 166916568455411127, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: -0.006165669 + value: -0.006165629 objectReference: {fileID: 0} - target: {fileID: 166916568455411127, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: -0.32834354 + value: -0.32834294 objectReference: {fileID: 0} - target: {fileID: 166916568455411127, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.07736367 + value: -0.07736425 objectReference: {fileID: 0} - target: {fileID: 166916568455411127, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.9162939 + value: -0.9162936 objectReference: {fileID: 0} - target: {fileID: 166916568455411127, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.21589538 + value: 0.21589734 objectReference: {fileID: 0} - target: {fileID: 247438257786629943, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: bones._femurLength @@ -3335,35 +3335,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 503879584753174156, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.5575714 + value: 0.55757105 objectReference: {fileID: 0} - target: {fileID: 503879584753174156, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.22205761 + value: -0.22205979 objectReference: {fileID: 0} - target: {fileID: 503879584753174156, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.74311334 + value: -0.74311197 objectReference: {fileID: 0} - target: {fileID: 503879584753174156, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.29595128 + value: -0.2959538 objectReference: {fileID: 0} - target: {fileID: 594818000277378115, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: -0.5988415 + value: -0.59883994 objectReference: {fileID: 0} - target: {fileID: 594818000277378115, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.1734765 + value: 0.1734803 objectReference: {fileID: 0} - target: {fileID: 594818000277378115, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.75097775 + value: -0.7509766 objectReference: {fileID: 0} - target: {fileID: 594818000277378115, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.21754834 + value: -0.21755333 objectReference: {fileID: 0} - target: {fileID: 695389755773980816, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x @@ -3391,19 +3391,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1004982706826917178, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: -0.028299736 + value: -0.028299432 objectReference: {fileID: 0} - target: {fileID: 1004982706826917178, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.684396 + value: 0.6843992 objectReference: {fileID: 0} - target: {fileID: 1004982706826917178, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.7112646 + value: 0.7112615 objectReference: {fileID: 0} - target: {fileID: 1004982706826917178, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.15780956 + value: 0.15781014 objectReference: {fileID: 0} - target: {fileID: 1060641200493147314, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x @@ -3435,19 +3435,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1136115525120555845, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 0.00522126 + value: 0.0052212086 objectReference: {fileID: 0} - target: {fileID: 1136115525120555845, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: -0.0023040923 + value: -0.0023040848 objectReference: {fileID: 0} - target: {fileID: 1136115525120555845, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: -0.60871315 + value: -0.6087125 objectReference: {fileID: 0} - target: {fileID: 1136115525120555845, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.13480917 + value: -0.13481024 objectReference: {fileID: 0} - target: {fileID: 1136115525120555845, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y @@ -3455,23 +3455,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1136115525120555845, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.16905755 + value: 0.1690591 objectReference: {fileID: 0} - target: {fileID: 1310879476154348518, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.70776516 + value: 0.7077573 objectReference: {fileID: 0} - target: {fileID: 1310879476154348518, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.3870967 + value: 0.3871017 objectReference: {fileID: 0} - target: {fileID: 1310879476154348518, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.17679264 + value: -0.17679042 objectReference: {fileID: 0} - target: {fileID: 1310879476154348518, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.5638873 + value: -0.56389457 objectReference: {fileID: 0} - target: {fileID: 1490908466784209397, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: bones._femurLength @@ -3535,19 +3535,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1817326604091929521, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -0.0029576076 + value: -0.0029575913 objectReference: {fileID: 0} - target: {fileID: 1817326604091929521, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.00044938427 + value: 0.0004493724 objectReference: {fileID: 0} - target: {fileID: 1817326604091929521, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.82310945 + value: 0.82310885 objectReference: {fileID: 0} - target: {fileID: 1817326604091929521, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.28778815 + value: 0.28778958 objectReference: {fileID: 0} - target: {fileID: 1817326604091929521, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y @@ -3555,75 +3555,75 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1817326604091929521, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.16157614 + value: 0.16157706 objectReference: {fileID: 0} - target: {fileID: 1844943529442369595, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 5.820766e-11 + value: -1.1641532e-10 objectReference: {fileID: 0} - target: {fileID: 1844943529442369595, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: -2.910383e-11 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1844943529442369595, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0019033393 + value: 0.0019033402 objectReference: {fileID: 0} - target: {fileID: 1844943529442369595, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.7118277 + value: 0.71182406 objectReference: {fileID: 0} - target: {fileID: 1844943529442369595, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.7023542 + value: 0.7023578 objectReference: {fileID: 0} - target: {fileID: 1844943529442369595, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000011920929 + value: -0.00000005960465 objectReference: {fileID: 0} - target: {fileID: 1844943529442369595, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000067055225 + value: 0.000000089406974 objectReference: {fileID: 0} - target: {fileID: 2057489726524823425, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.6106631 + value: 0.6106588 objectReference: {fileID: 0} - target: {fileID: 2057489726524823425, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.25755712 + value: 0.25756082 objectReference: {fileID: 0} - target: {fileID: 2057489726524823425, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.55356234 + value: 0.5535582 objectReference: {fileID: 0} - target: {fileID: 2057489726524823425, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.5043051 + value: -0.5043131 objectReference: {fileID: 0} - target: {fileID: 2063238250592969972, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -0.002576328 + value: -0.0025763097 objectReference: {fileID: 0} - target: {fileID: 2063238250592969972, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: -0.0072106277 + value: -0.0072105876 objectReference: {fileID: 0} - target: {fileID: 2063238250592969972, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.20619622 + value: 0.20619616 objectReference: {fileID: 0} - target: {fileID: 2063238250592969972, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.0398159 + value: 0.0398162 objectReference: {fileID: 0} - target: {fileID: 2063238250592969972, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.95996714 + value: -0.9599669 objectReference: {fileID: 0} - target: {fileID: 2063238250592969972, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.18536691 + value: 0.18536834 objectReference: {fileID: 0} - target: {fileID: 2100924547480595579, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x @@ -3655,11 +3655,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2143803970633277119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 6.8901274e-11 + value: 3.5015668e-10 objectReference: {fileID: 0} - target: {fileID: 2143803970633277119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: 4.656613e-10 + value: -6.9849193e-10 objectReference: {fileID: 0} - target: {fileID: 2143803970633277119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z @@ -3667,19 +3667,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2143803970633277119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.9694203 + value: 0.96941936 objectReference: {fileID: 0} - target: {fileID: 2143803970633277119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.24540612 + value: -0.24541011 objectReference: {fileID: 0} - target: {fileID: 2143803970633277119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.00000004228629 + value: -0.000000013148364 objectReference: {fileID: 0} - target: {fileID: 2143803970633277119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000019819183 + value: 0.000000004762716 objectReference: {fileID: 0} - target: {fileID: 2149330539247012361, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w @@ -3699,7 +3699,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2179315757048009861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: 5.820766e-11 objectReference: {fileID: 0} - target: {fileID: 2179315757048009861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y @@ -3707,83 +3707,83 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2179315757048009861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0019033393 + value: 0.0019033398 objectReference: {fileID: 0} - target: {fileID: 2179315757048009861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.865831 + value: 0.86582476 objectReference: {fileID: 0} - target: {fileID: 2179315757048009861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.50033665 + value: 0.5003475 objectReference: {fileID: 0} - target: {fileID: 2179315757048009861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: -0.000000014901163 objectReference: {fileID: 0} - target: {fileID: 2179315757048009861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.000000009778887 + value: 0.000000008847565 objectReference: {fileID: 0} - target: {fileID: 2356608666883495351, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -2.489696e-10 + value: -2.361578e-11 objectReference: {fileID: 0} - target: {fileID: 2356608666883495351, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: 9.313226e-10 objectReference: {fileID: 0} - target: {fileID: 2356608666883495351, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0030214654 + value: 0.0030214668 objectReference: {fileID: 0} - target: {fileID: 2356608666883495351, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.98070383 + value: 0.980703 objectReference: {fileID: 0} - target: {fileID: 2356608666883495351, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.19549948 + value: -0.19550377 objectReference: {fileID: 0} - target: {fileID: 2356608666883495351, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.000000025456563 + value: 0.000000011965648 objectReference: {fileID: 0} - target: {fileID: 2356608666883495351, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000019332997 + value: -0.000000011958076 objectReference: {fileID: 0} - target: {fileID: 2380027669956049854, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.75850624 + value: 0.75849944 objectReference: {fileID: 0} - target: {fileID: 2380027669956049854, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.5723893 + value: 0.57239604 objectReference: {fileID: 0} - target: {fileID: 2380027669956049854, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.00878704 + value: -0.00878823 objectReference: {fileID: 0} - target: {fileID: 2380027669956049854, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.31138656 + value: -0.31139073 objectReference: {fileID: 0} - target: {fileID: 2469329805429469346, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.20721191 + value: 0.20721173 objectReference: {fileID: 0} - target: {fileID: 2469329805429469346, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.034137964 + value: -0.034139026 objectReference: {fileID: 0} - target: {fileID: 2469329805429469346, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.96469593 + value: -0.96469516 objectReference: {fileID: 0} - target: {fileID: 2469329805429469346, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.15893278 + value: -0.1589377 objectReference: {fileID: 0} - target: {fileID: 2569903554710171135, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x @@ -3819,43 +3819,43 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2598972606701937627, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: -2.910383e-11 + value: -8.731149e-11 objectReference: {fileID: 0} - target: {fileID: 2598972606701937627, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0024082726 + value: 0.002408272 objectReference: {fileID: 0} - target: {fileID: 2598972606701937627, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.7295115 + value: 0.72950345 objectReference: {fileID: 0} - target: {fileID: 2598972606701937627, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.68396866 + value: 0.6839771 objectReference: {fileID: 0} - target: {fileID: 2598972606701937627, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: -0.000000059604645 objectReference: {fileID: 0} - target: {fileID: 2598972606701937627, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000029802319 + value: 0.000000074505806 objectReference: {fileID: 0} - target: {fileID: 2694996827067636066, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.8607982 + value: 0.86079776 objectReference: {fileID: 0} - target: {fileID: 2694996827067636066, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.13913217 + value: -0.13913375 objectReference: {fileID: 0} - target: {fileID: 2694996827067636066, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.4832876 + value: -0.48328763 objectReference: {fileID: 0} - target: {fileID: 2694996827067636066, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.078114524 + value: -0.078115486 objectReference: {fileID: 0} - target: {fileID: 2994943864588667712, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x @@ -3927,19 +3927,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3303214404428789969, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.32846016 + value: 0.3284589 objectReference: {fileID: 0} - target: {fileID: 3303214404428789969, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.8921969 + value: 0.8921993 objectReference: {fileID: 0} - target: {fileID: 3303214404428789969, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.29727992 + value: 0.29727438 objectReference: {fileID: 0} - target: {fileID: 3303214404428789969, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.08788175 + value: -0.08788115 objectReference: {fileID: 0} - target: {fileID: 3735440054552339591, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: brainPrefab @@ -3947,47 +3947,47 @@ PrefabInstance: objectReference: {fileID: 11400000, guid: c8e4b0990eb7dbbc4bee34addd9cd2b8, type: 2} - target: {fileID: 3748243631002723431, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.4701995 + value: 0.4701985 objectReference: {fileID: 0} - target: {fileID: 3748243631002723431, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.1335026 + value: 0.13350567 objectReference: {fileID: 0} - target: {fileID: 3748243631002723431, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.7921698 + value: 0.792169 objectReference: {fileID: 0} - target: {fileID: 3748243631002723431, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.3654538 + value: -0.3654559 objectReference: {fileID: 0} - target: {fileID: 3777766915705757037, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -1.433268e-10 + value: 4.4564735e-10 objectReference: {fileID: 0} - target: {fileID: 3777766915705757037, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: 4.6566123e-10 + value: 0.0000000018626449 objectReference: {fileID: 0} - target: {fileID: 3777766915705757037, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.004241225 + value: 0.0042412225 objectReference: {fileID: 0} - target: {fileID: 3777766915705757037, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.9604934 + value: 0.9604924 objectReference: {fileID: 0} - target: {fileID: 3777766915705757037, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.27830288 + value: -0.27830648 objectReference: {fileID: 0} - target: {fileID: 3777766915705757037, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000012137115 + value: 0.00000004054973 objectReference: {fileID: 0} - target: {fileID: 3777766915705757037, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000014129231 + value: -0.000000059747094 objectReference: {fileID: 0} - target: {fileID: 4024176016905394328, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_Enabled @@ -3999,31 +3999,31 @@ PrefabInstance: objectReference: {fileID: 733094908384848434, guid: 04af7f4320cef6537a2d13a3cf2f845f, type: 3} - target: {fileID: 4506122210810578416, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 1.1303872e-10 + value: 1.4366909e-10 objectReference: {fileID: 0} - target: {fileID: 4506122210810578416, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: 4.656613e-10 + value: -4.656613e-10 objectReference: {fileID: 0} - target: {fileID: 4506122210810578416, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.00412956 + value: 0.0041295574 objectReference: {fileID: 0} - target: {fileID: 4506122210810578416, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.9558596 + value: 0.9558592 objectReference: {fileID: 0} - target: {fileID: 4506122210810578416, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.29382387 + value: -0.29382527 objectReference: {fileID: 0} - target: {fileID: 4506122210810578416, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.000000044222787 + value: -0.00000006317171 objectReference: {fileID: 0} - target: {fileID: 4506122210810578416, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.00000004538929 + value: 0.0000001154026 objectReference: {fileID: 0} - target: {fileID: 4543089944971148809, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x @@ -4055,7 +4055,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4544836246457456813, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 1.1641532e-10 + value: -1.1641532e-10 objectReference: {fileID: 0} - target: {fileID: 4544836246457456813, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y @@ -4063,23 +4063,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4544836246457456813, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0030040157 + value: 0.0030040161 objectReference: {fileID: 0} - target: {fileID: 4544836246457456813, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.82422143 + value: 0.8242154 objectReference: {fileID: 0} - target: {fileID: 4544836246457456813, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.56626767 + value: 0.5662765 objectReference: {fileID: 0} - target: {fileID: 4544836246457456813, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.000000014901161 + value: 0.000000044703484 objectReference: {fileID: 0} - target: {fileID: 4544836246457456813, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000007450581 + value: -0 objectReference: {fileID: 0} - target: {fileID: 5108746397492641501, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w @@ -4215,79 +4215,79 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5823700145767964246, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.85401976 + value: 0.85401666 objectReference: {fileID: 0} - target: {fileID: 5823700145767964246, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.3250156 + value: -0.3250193 objectReference: {fileID: 0} - target: {fileID: 5823700145767964246, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.22636886 + value: 0.22636843 objectReference: {fileID: 0} - target: {fileID: 5823700145767964246, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.33730155 + value: 0.3373062 objectReference: {fileID: 0} - target: {fileID: 5848079605461954508, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -1.767577e-10 + value: -1.6458807e-10 objectReference: {fileID: 0} - target: {fileID: 5848079605461954508, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: -2.3283064e-10 + value: 2.3283064e-10 objectReference: {fileID: 0} - target: {fileID: 5848079605461954508, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0029819123 + value: 0.002981913 objectReference: {fileID: 0} - target: {fileID: 5848079605461954508, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.960472 + value: 0.9604716 objectReference: {fileID: 0} - target: {fileID: 5848079605461954508, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.27837685 + value: -0.27837828 objectReference: {fileID: 0} - target: {fileID: 5848079605461954508, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.0000001045425 + value: -0.00000003290217 objectReference: {fileID: 0} - target: {fileID: 5848079605461954508, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.00000012607583 + value: -0.000000022995573 objectReference: {fileID: 0} - target: {fileID: 5850833608922183593, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.032783657 + value: 0.032786306 objectReference: {fileID: 0} - target: {fileID: 5850833608922183593, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.044930726 + value: -0.04492661 objectReference: {fileID: 0} - target: {fileID: 5850833608922183593, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.8327042 + value: 0.8327036 objectReference: {fileID: 0} - target: {fileID: 5850833608922183593, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.55091774 + value: -0.55091876 objectReference: {fileID: 0} - target: {fileID: 6207803342309021390, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: -0.51127934 + value: -0.5112792 objectReference: {fileID: 0} - target: {fileID: 6207803342309021390, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.8116235 + value: 0.8116239 objectReference: {fileID: 0} - target: {fileID: 6207803342309021390, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.2597009 + value: 0.25969943 objectReference: {fileID: 0} - target: {fileID: 6207803342309021390, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.11142829 + value: -0.11142905 objectReference: {fileID: 0} - target: {fileID: 6513804325188258242, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w @@ -4387,27 +4387,27 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6594209482403568318, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -0.0035855214 + value: -0.0035854802 objectReference: {fileID: 0} - target: {fileID: 6594209482403568318, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: -0.0024545693 + value: -0.0024545526 objectReference: {fileID: 0} - target: {fileID: 6594209482403568318, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.57837176 + value: 0.5783719 objectReference: {fileID: 0} - target: {fileID: 6594209482403568318, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.16025467 + value: 0.16025636 objectReference: {fileID: 0} - target: {fileID: 6594209482403568318, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.77083534 + value: -0.7708344 objectReference: {fileID: 0} - target: {fileID: 6594209482403568318, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.21358229 + value: 0.21358424 objectReference: {fileID: 0} - target: {fileID: 6620083584134435749, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w @@ -4427,43 +4427,43 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6702413818536640054, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 0.0022254863 + value: 0.0022254784 objectReference: {fileID: 0} - target: {fileID: 6702413818536640054, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.002710371 + value: 0.0027103412 objectReference: {fileID: 0} - target: {fileID: 6702413818536640054, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.95367116 + value: 0.9536706 objectReference: {fileID: 0} - target: {fileID: 6702413818536640054, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.26484644 + value: 0.26484814 objectReference: {fileID: 0} - target: {fileID: 6702413818536640054, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.13751155 + value: 0.1375116 objectReference: {fileID: 0} - target: {fileID: 6702413818536640054, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.038188674 + value: -0.038188964 objectReference: {fileID: 0} - target: {fileID: 6958972504176507483, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: -0.33085763 + value: -0.33085692 objectReference: {fileID: 0} - target: {fileID: 6958972504176507483, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.065786354 + value: 0.065787725 objectReference: {fileID: 0} - target: {fileID: 6958972504176507483, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.9233099 + value: -0.92330927 objectReference: {fileID: 0} - target: {fileID: 6958972504176507483, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.18358706 + value: -0.18359117 objectReference: {fileID: 0} - target: {fileID: 7021329035324230484, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x @@ -4535,35 +4535,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7378712539761125858, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.5855809 + value: 0.58557636 objectReference: {fileID: 0} - target: {fileID: 7378712539761125858, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.46928382 + value: -0.469294 objectReference: {fileID: 0} - target: {fileID: 7378712539761125858, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.6377762 + value: -0.6377721 objectReference: {fileID: 0} - target: {fileID: 7378712539761125858, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.17352039 + value: -0.17352325 objectReference: {fileID: 0} - target: {fileID: 7394846002605678119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.8169416 + value: 0.81694037 objectReference: {fileID: 0} - target: {fileID: 7394846002605678119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.43575144 + value: -0.43575436 objectReference: {fileID: 0} - target: {fileID: 7394846002605678119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.14708231 + value: 0.14708516 objectReference: {fileID: 0} - target: {fileID: 7394846002605678119, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0.3479854 + value: -0.3479834 objectReference: {fileID: 0} - target: {fileID: 7400717801484663767, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w @@ -4583,59 +4583,59 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7424123368923134861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: -1.1641532e-10 objectReference: {fileID: 0} - target: {fileID: 7424123368923134861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: 5.820766e-11 objectReference: {fileID: 0} - target: {fileID: 7424123368923134861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.003004016 + value: 0.0030040147 objectReference: {fileID: 0} - target: {fileID: 7424123368923134861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.75855726 + value: 0.7585506 objectReference: {fileID: 0} - target: {fileID: 7424123368923134861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.6516064 + value: 0.6516142 objectReference: {fileID: 0} - target: {fileID: 7424123368923134861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: -0.000000059604645 objectReference: {fileID: 0} - target: {fileID: 7424123368923134861, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: -0 + value: 0.000000044703484 objectReference: {fileID: 0} - target: {fileID: 7509758028014155536, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: 5.820766e-11 objectReference: {fileID: 0} - target: {fileID: 7509758028014155536, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: -1.1641532e-10 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7509758028014155536, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z - value: 0.0024082726 + value: 0.0024082724 objectReference: {fileID: 0} - target: {fileID: 7509758028014155536, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.5836928 + value: 0.58368653 objectReference: {fileID: 0} - target: {fileID: 7509758028014155536, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: 0.8119745 + value: 0.81197906 objectReference: {fileID: 0} - target: {fileID: 7509758028014155536, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.000000029802319 + value: 0.00000023841855 objectReference: {fileID: 0} - target: {fileID: 7509758028014155536, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.000000014901159 + value: -0.0000000745058 objectReference: {fileID: 0} - target: {fileID: 7535818317971162736, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x @@ -4665,21 +4665,25 @@ PrefabInstance: propertyPath: m_Name value: LowPolyAntRigged objectReference: {fileID: 0} + - target: {fileID: 7654735227470959086, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} - target: {fileID: 8091081424583978495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.9881936 + value: 0.9881932 objectReference: {fileID: 0} - target: {fileID: 8091081424583978495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.05572837 + value: -0.05573461 objectReference: {fileID: 0} - target: {fileID: 8091081424583978495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: 0.14248942 + value: 0.14248948 objectReference: {fileID: 0} - target: {fileID: 8091081424583978495, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.008035595 + value: 0.008036478 objectReference: {fileID: 0} - target: {fileID: 8104549368886974640, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: bones._tibiaLength @@ -4731,11 +4735,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8773790806045806296, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x - value: -4.7164317e-10 + value: -1.8328407e-10 objectReference: {fileID: 0} - target: {fileID: 8773790806045806296, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.y - value: -9.3132246e-10 + value: 9.3132246e-10 objectReference: {fileID: 0} - target: {fileID: 8773790806045806296, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.z @@ -4743,35 +4747,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8773790806045806296, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.9680977 + value: 0.96809685 objectReference: {fileID: 0} - target: {fileID: 8773790806045806296, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.25057337 + value: -0.2505764 objectReference: {fileID: 0} - target: {fileID: 8773790806045806296, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.000000025835016 + value: 0.0000000050462177 objectReference: {fileID: 0} - target: {fileID: 8773790806045806296, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.0000000050992326 + value: -0.0000000627052 objectReference: {fileID: 0} - target: {fileID: 8801464852371122986, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.w - value: 0.2880804 + value: 0.28807673 objectReference: {fileID: 0} - target: {fileID: 8801464852371122986, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.x - value: -0.54234964 + value: -0.54235274 objectReference: {fileID: 0} - target: {fileID: 8801464852371122986, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.y - value: -0.5076485 + value: -0.5076434 objectReference: {fileID: 0} - target: {fileID: 8801464852371122986, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalRotation.z - value: 0.6042844 + value: 0.6042877 objectReference: {fileID: 0} - target: {fileID: 8921816082228033372, guid: 49b4f3c47b71346f2be821320af94de8, type: 3} propertyPath: m_LocalPosition.x @@ -6021,6 +6025,1027 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: a792a0d33cab158bd9eb15179d15267f, type: 3} +--- !u!1001 &7194236269538624252 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 343882332491731405, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: bones._tibiaLength + value: 0.004241225 + objectReference: {fileID: 0} + - target: {fileID: 343882332491731405, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneFemur.w + value: 0.68627733 + objectReference: {fileID: 0} + - target: {fileID: 343882332491731405, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneFemur.x + value: 0.68627733 + objectReference: {fileID: 0} + - target: {fileID: 343882332491731405, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneFemur.y + value: -0.17036347 + objectReference: {fileID: 0} + - target: {fileID: 343882332491731405, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneFemur.z + value: -0.17036377 + objectReference: {fileID: 0} + - target: {fileID: 343882332491731405, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.w + value: 0.6842572 + objectReference: {fileID: 0} + - target: {fileID: 343882332491731405, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.x + value: 0.68425745 + objectReference: {fileID: 0} + - target: {fileID: 343882332491731405, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.y + value: -0.17830317 + objectReference: {fileID: 0} + - target: {fileID: 343882332491731405, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.z + value: -0.17830336 + objectReference: {fileID: 0} + - target: {fileID: 429956009605333244, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.61066383 + objectReference: {fileID: 0} + - target: {fileID: 429956009605333244, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.25755614 + objectReference: {fileID: 0} + - target: {fileID: 429956009605333244, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.55356336 + objectReference: {fileID: 0} + - target: {fileID: 429956009605333244, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.50430375 + objectReference: {fileID: 0} + - target: {fileID: 615395507866503330, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 1.01275446e-10 + objectReference: {fileID: 0} + - target: {fileID: 615395507866503330, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.y + value: -6.9849193e-10 + objectReference: {fileID: 0} + - target: {fileID: 615395507866503330, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0.003021466 + objectReference: {fileID: 0} + - target: {fileID: 615395507866503330, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.98070335 + objectReference: {fileID: 0} + - target: {fileID: 615395507866503330, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.19550163 + objectReference: {fileID: 0} + - target: {fileID: 615395507866503330, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.000000022071644 + objectReference: {fileID: 0} + - target: {fileID: 615395507866503330, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000024251896 + objectReference: {fileID: 0} + - target: {fileID: 813747761359004827, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7077644 + objectReference: {fileID: 0} + - target: {fileID: 813747761359004827, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.38709837 + objectReference: {fileID: 0} + - target: {fileID: 813747761359004827, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0.17679238 + objectReference: {fileID: 0} + - target: {fileID: 813747761359004827, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.5638874 + objectReference: {fileID: 0} + - target: {fileID: 966666976176492455, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: -2.3283064e-10 + objectReference: {fileID: 0} + - target: {fileID: 966666976176492455, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.y + value: -5.820766e-11 + objectReference: {fileID: 0} + - target: {fileID: 966666976176492455, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0030040154 + objectReference: {fileID: 0} + - target: {fileID: 966666976176492455, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7585531 + objectReference: {fileID: 0} + - target: {fileID: 966666976176492455, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.6516113 + objectReference: {fileID: 0} + - target: {fileID: 966666976176492455, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.000000029802322 + objectReference: {fileID: 0} + - target: {fileID: 966666976176492455, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000011175871 + objectReference: {fileID: 0} + - target: {fileID: 976542044232966489, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: -2.0372681e-10 + objectReference: {fileID: 0} + - target: {fileID: 976542044232966489, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.y + value: -2.0372681e-10 + objectReference: {fileID: 0} + - target: {fileID: 976542044232966489, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0024082721 + objectReference: {fileID: 0} + - target: {fileID: 976542044232966489, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.72951066 + objectReference: {fileID: 0} + - target: {fileID: 976542044232966489, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.6839695 + objectReference: {fileID: 0} + - target: {fileID: 976542044232966489, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0.00000011920929 + objectReference: {fileID: 0} + - target: {fileID: 976542044232966489, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000044703484 + objectReference: {fileID: 0} + - target: {fileID: 1479508092080169543, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: -0.028300634 + objectReference: {fileID: 0} + - target: {fileID: 1479508092080169543, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.68439406 + objectReference: {fileID: 0} + - target: {fileID: 1479508092080169543, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.71126664 + objectReference: {fileID: 0} + - target: {fileID: 1479508092080169543, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0.15780914 + objectReference: {fileID: 0} + - target: {fileID: 1543367068185469221, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.33085755 + objectReference: {fileID: 0} + - target: {fileID: 1543367068185469221, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.06578734 + objectReference: {fileID: 0} + - target: {fileID: 1543367068185469221, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.9233093 + objectReference: {fileID: 0} + - target: {fileID: 1543367068185469221, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0.18358982 + objectReference: {fileID: 0} + - target: {fileID: 1619848046630859482, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: bones._femurLength + value: 0.0030040164 + objectReference: {fileID: 0} + - target: {fileID: 1619848046630859482, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: bones._tibiaLength + value: 0.004106118 + objectReference: {fileID: 0} + - target: {fileID: 1619848046630859482, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.w + value: -0.69554174 + objectReference: {fileID: 0} + - target: {fileID: 1619848046630859482, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.x + value: -0.6955416 + objectReference: {fileID: 0} + - target: {fileID: 1619848046630859482, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.y + value: 0.12736507 + objectReference: {fileID: 0} + - target: {fileID: 1619848046630859482, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.z + value: 0.12736507 + objectReference: {fileID: 0} + - target: {fileID: 1869889312292575410, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: bones._femurLength + value: 0.0024082728 + objectReference: {fileID: 0} + - target: {fileID: 1869889312292575410, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneFemur.w + value: 0.075962946 + objectReference: {fileID: 0} + - target: {fileID: 1869889312292575410, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneFemur.x + value: 0.07596277 + objectReference: {fileID: 0} + - target: {fileID: 1869889312292575410, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.w + value: -0.5739338 + objectReference: {fileID: 0} + - target: {fileID: 1869889312292575410, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.x + value: -0.5739338 + objectReference: {fileID: 0} + - target: {fileID: 1869889312292575410, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.y + value: -0.4130375 + objectReference: {fileID: 0} + - target: {fileID: 1869889312292575410, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.z + value: -0.41303763 + objectReference: {fileID: 0} + - target: {fileID: 2300420718370116349, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 5.820766e-11 + objectReference: {fileID: 0} + - target: {fileID: 2300420718370116349, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2300420718370116349, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0019033396 + objectReference: {fileID: 0} + - target: {fileID: 2300420718370116349, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.8658277 + objectReference: {fileID: 0} + - target: {fileID: 2300420718370116349, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.5003423 + objectReference: {fileID: 0} + - target: {fileID: 2300420718370116349, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0.000000014901159 + objectReference: {fileID: 0} + - target: {fileID: 2300420718370116349, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000008847564 + objectReference: {fileID: 0} + - target: {fileID: 3278129107402797850, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.47020045 + objectReference: {fileID: 0} + - target: {fileID: 3278129107402797850, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.13350198 + objectReference: {fileID: 0} + - target: {fileID: 3278129107402797850, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.7921686 + objectReference: {fileID: 0} + - target: {fileID: 3278129107402797850, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.3654553 + objectReference: {fileID: 0} + - target: {fileID: 3795814618417033132, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.32845944 + objectReference: {fileID: 0} + - target: {fileID: 3795814618417033132, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.8921982 + objectReference: {fileID: 0} + - target: {fileID: 3795814618417033132, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.2972771 + objectReference: {fileID: 0} + - target: {fileID: 3795814618417033132, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.08788132 + objectReference: {fileID: 0} + - target: {fileID: 3802825748686820492, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: bones._femurLength + value: 0.0024082724 + objectReference: {fileID: 0} + - target: {fileID: 3802825748686820492, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: bones._tibiaLength + value: 0.004176515 + objectReference: {fileID: 0} + - target: {fileID: 3802825748686820492, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneFemur.w + value: 0.6612265 + objectReference: {fileID: 0} + - target: {fileID: 3802825748686820492, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneFemur.x + value: 0.66122675 + objectReference: {fileID: 0} + - target: {fileID: 3802825748686820492, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneFemur.y + value: -0.2505582 + objectReference: {fileID: 0} + - target: {fileID: 3802825748686820492, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneFemur.z + value: -0.25055838 + objectReference: {fileID: 0} + - target: {fileID: 3802825748686820492, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.w + value: 0.5807953 + objectReference: {fileID: 0} + - target: {fileID: 3802825748686820492, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.x + value: 0.5807952 + objectReference: {fileID: 0} + - target: {fileID: 3802825748686820492, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.y + value: -0.4033328 + objectReference: {fileID: 0} + - target: {fileID: 3802825748686820492, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.z + value: -0.4033329 + objectReference: {fileID: 0} + - target: {fileID: 4070585806702619843, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.75850236 + objectReference: {fileID: 0} + - target: {fileID: 4070585806702619843, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.57239354 + objectReference: {fileID: 0} + - target: {fileID: 4070585806702619843, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0.008787658 + objectReference: {fileID: 0} + - target: {fileID: 4070585806702619843, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.31138822 + objectReference: {fileID: 0} + - target: {fileID: 4108875120565236669, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.5988415 + objectReference: {fileID: 0} + - target: {fileID: 4108875120565236669, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.17347696 + objectReference: {fileID: 0} + - target: {fileID: 4108875120565236669, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.75097746 + objectReference: {fileID: 0} + - target: {fileID: 4108875120565236669, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0.21754895 + objectReference: {fileID: 0} + - target: {fileID: 4575073385702270028, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_Name + value: LowPolyAnt + objectReference: {fileID: 0} + - target: {fileID: 4758204420827059156, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.5575701 + objectReference: {fileID: 0} + - target: {fileID: 4758204420827059156, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.22205774 + objectReference: {fileID: 0} + - target: {fileID: 4758204420827059156, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0.7431138 + objectReference: {fileID: 0} + - target: {fileID: 4758204420827059156, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.29595232 + objectReference: {fileID: 0} + - target: {fileID: 5208545581280796884, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.032783594 + objectReference: {fileID: 0} + - target: {fileID: 5208545581280796884, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.044931557 + objectReference: {fileID: 0} + - target: {fileID: 5208545581280796884, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.83270395 + objectReference: {fileID: 0} + - target: {fileID: 5208545581280796884, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.5509179 + objectReference: {fileID: 0} + - target: {fileID: 5250359002763488712, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0.0052212556 + objectReference: {fileID: 0} + - target: {fileID: 5250359002763488712, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: -0.002304089 + objectReference: {fileID: 0} + - target: {fileID: 5250359002763488712, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.6087133 + objectReference: {fileID: 0} + - target: {fileID: 5250359002763488712, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.13480924 + objectReference: {fileID: 0} + - target: {fileID: 5250359002763488712, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.7633571 + objectReference: {fileID: 0} + - target: {fileID: 5250359002763488712, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.16905756 + objectReference: {fileID: 0} + - target: {fileID: 5308581614777190699, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.85401917 + objectReference: {fileID: 0} + - target: {fileID: 5308581614777190699, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.32501605 + objectReference: {fileID: 0} + - target: {fileID: 5308581614777190699, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.2263696 + objectReference: {fileID: 0} + - target: {fileID: 5308581614777190699, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0.337302 + objectReference: {fileID: 0} + - target: {fileID: 5535986122466163059, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: -0.0029576106 + objectReference: {fileID: 0} + - target: {fileID: 5535986122466163059, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0004493994 + objectReference: {fileID: 0} + - target: {fileID: 5535986122466163059, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.8231107 + objectReference: {fileID: 0} + - target: {fileID: 5535986122466163059, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.28778785 + objectReference: {fileID: 0} + - target: {fileID: 5535986122466163059, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0.46212608 + objectReference: {fileID: 0} + - target: {fileID: 5535986122466163059, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0.16157518 + objectReference: {fileID: 0} + - target: {fileID: 5718624336128688563, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: -0.51127815 + objectReference: {fileID: 0} + - target: {fileID: 5718624336128688563, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.8116241 + objectReference: {fileID: 0} + - target: {fileID: 5718624336128688563, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.2597019 + objectReference: {fileID: 0} + - target: {fileID: 5718624336128688563, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.111426994 + objectReference: {fileID: 0} + - target: {fileID: 5961476926804711974, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0.002225484 + objectReference: {fileID: 0} + - target: {fileID: 5961476926804711974, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0027103557 + objectReference: {fileID: 0} + - target: {fileID: 5961476926804711974, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9536708 + objectReference: {fileID: 0} + - target: {fileID: 5961476926804711974, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.26484734 + objectReference: {fileID: 0} + - target: {fileID: 5961476926804711974, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.13751179 + objectReference: {fileID: 0} + - target: {fileID: 5961476926804711974, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.038188893 + objectReference: {fileID: 0} + - target: {fileID: 6035814526195247003, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: -0.20721151 + objectReference: {fileID: 0} + - target: {fileID: 6035814526195247003, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.03413775 + objectReference: {fileID: 0} + - target: {fileID: 6035814526195247003, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.9646961 + objectReference: {fileID: 0} + - target: {fileID: 6035814526195247003, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0.1589321 + objectReference: {fileID: 0} + - target: {fileID: 6146833842385304387, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: brainPrefab + value: + objectReference: {fileID: 11400000, guid: c8e4b0990eb7dbbc4bee34addd9cd2b8, type: 2} + - target: {fileID: 6295417488748167188, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: bones._femurLength + value: 0.0019033398 + objectReference: {fileID: 0} + - target: {fileID: 6295417488748167188, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: bones._tibiaLength + value: 0.0030214675 + objectReference: {fileID: 0} + - target: {fileID: 6295417488748167188, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneFemur.w + value: 0.39405382 + objectReference: {fileID: 0} + - target: {fileID: 6295417488748167188, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneFemur.x + value: 0.39405394 + objectReference: {fileID: 0} + - target: {fileID: 6295417488748167188, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.w + value: -0.16597596 + objectReference: {fileID: 0} + - target: {fileID: 6295417488748167188, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.x + value: -0.16597593 + objectReference: {fileID: 0} + - target: {fileID: 6295417488748167188, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.z + value: -0.6873514 + objectReference: {fileID: 0} + - target: {fileID: 6302994411678767122, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 2.3283064e-10 + objectReference: {fileID: 0} + - target: {fileID: 6302994411678767122, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.y + value: -5.820766e-11 + objectReference: {fileID: 0} + - target: {fileID: 6302994411678767122, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0.003004017 + objectReference: {fileID: 0} + - target: {fileID: 6302994411678767122, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.82422245 + objectReference: {fileID: 0} + - target: {fileID: 6302994411678767122, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.5662662 + objectReference: {fileID: 0} + - target: {fileID: 6302994411678767122, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0.000000014901161 + objectReference: {fileID: 0} + - target: {fileID: 6302994411678767122, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000007450581 + objectReference: {fileID: 0} + - target: {fileID: 6415599125966866927, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: -0.0035855067 + objectReference: {fileID: 0} + - target: {fileID: 6415599125966866927, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: -0.0024545754 + objectReference: {fileID: 0} + - target: {fileID: 6415599125966866927, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.5783706 + objectReference: {fileID: 0} + - target: {fileID: 6415599125966866927, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.16025476 + objectReference: {fileID: 0} + - target: {fileID: 6415599125966866927, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0.770836 + objectReference: {fileID: 0} + - target: {fileID: 6415599125966866927, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0.21358305 + objectReference: {fileID: 0} + - target: {fileID: 6893303343174068101, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893303343174068101, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893303343174068101, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893303343174068101, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6893303343174068101, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 6893303343174068101, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 6893303343174068101, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 6893303343174068101, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893303343174068101, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893303343174068101, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7133941337710929684, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: bones._femurLength + value: 0.0019033395 + objectReference: {fileID: 0} + - target: {fileID: 7133941337710929684, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: bones._tibiaLength + value: 0.0029819144 + objectReference: {fileID: 0} + - target: {fileID: 7133941337710929684, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneFemur.w + value: 0.544465 + objectReference: {fileID: 0} + - target: {fileID: 7133941337710929684, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneFemur.x + value: 0.544465 + objectReference: {fileID: 0} + - target: {fileID: 7133941337710929684, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneFemur.y + value: -0.45117387 + objectReference: {fileID: 0} + - target: {fileID: 7133941337710929684, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.w + value: 0.4291713 + objectReference: {fileID: 0} + - target: {fileID: 7133941337710929684, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.x + value: 0.4291711 + objectReference: {fileID: 0} + - target: {fileID: 7133941337710929684, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.y + value: 0.56197196 + objectReference: {fileID: 0} + - target: {fileID: 7133941337710929684, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: targetToBoneTibia.z + value: 0.5619718 + objectReference: {fileID: 0} + - target: {fileID: 7160506879154568279, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.28807968 + objectReference: {fileID: 0} + - target: {fileID: 7160506879154568279, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.5423495 + objectReference: {fileID: 0} + - target: {fileID: 7160506879154568279, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0.5076471 + objectReference: {fileID: 0} + - target: {fileID: 7160506879154568279, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0.60428596 + objectReference: {fileID: 0} + - target: {fileID: 7709324683507640849, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 6.1118044e-10 + objectReference: {fileID: 0} + - target: {fileID: 7709324683507640849, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 5.820766e-11 + objectReference: {fileID: 0} + - target: {fileID: 7709324683507640849, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0024082728 + objectReference: {fileID: 0} + - target: {fileID: 7709324683507640849, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.5836911 + objectReference: {fileID: 0} + - target: {fileID: 7709324683507640849, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.81197584 + objectReference: {fileID: 0} + - target: {fileID: 7709324683507640849, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0.00000008940697 + objectReference: {fileID: 0} + - target: {fileID: 7709324683507640849, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000029802322 + objectReference: {fileID: 0} + - target: {fileID: 7805495626236998544, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: -4.421683e-10 + objectReference: {fileID: 0} + - target: {fileID: 7805495626236998544, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 9.3132246e-10 + objectReference: {fileID: 0} + - target: {fileID: 7805495626236998544, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0041765138 + objectReference: {fileID: 0} + - target: {fileID: 7805495626236998544, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.96809757 + objectReference: {fileID: 0} + - target: {fileID: 7805495626236998544, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.2505736 + objectReference: {fileID: 0} + - target: {fileID: 7805495626236998544, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0.0000000016827355 + objectReference: {fileID: 0} + - target: {fileID: 7805495626236998544, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0.00000002014272 + objectReference: {fileID: 0} + - target: {fileID: 7871660662594056517, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0.004090503 + objectReference: {fileID: 0} + - target: {fileID: 7871660662594056517, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: -0.0061656423 + objectReference: {fileID: 0} + - target: {fileID: 7871660662594056517, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.3283436 + objectReference: {fileID: 0} + - target: {fileID: 7871660662594056517, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.07736408 + objectReference: {fileID: 0} + - target: {fileID: 7871660662594056517, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.9162937 + objectReference: {fileID: 0} + - target: {fileID: 7871660662594056517, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.21589644 + objectReference: {fileID: 0} + - target: {fileID: 8056997594033936271, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: -3.4031808e-10 + objectReference: {fileID: 0} + - target: {fileID: 8056997594033936271, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8056997594033936271, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0029819133 + objectReference: {fileID: 0} + - target: {fileID: 8056997594033936271, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9604722 + objectReference: {fileID: 0} + - target: {fileID: 8056997594033936271, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.27837595 + objectReference: {fileID: 0} + - target: {fileID: 8056997594033936271, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0.00000016579848 + objectReference: {fileID: 0} + - target: {fileID: 8056997594033936271, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0.00000016833911 + objectReference: {fileID: 0} + - target: {fileID: 8105911159671643989, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: -5.334999e-11 + objectReference: {fileID: 0} + - target: {fileID: 8105911159671643989, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0.0000000018626451 + objectReference: {fileID: 0} + - target: {fileID: 8105911159671643989, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0.00410612 + objectReference: {fileID: 0} + - target: {fileID: 8105911159671643989, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9694206 + objectReference: {fileID: 0} + - target: {fileID: 8105911159671643989, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.24540518 + objectReference: {fileID: 0} + - target: {fileID: 8105911159671643989, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.00000001350356 + objectReference: {fileID: 0} + - target: {fileID: 8105911159671643989, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000009084009 + objectReference: {fileID: 0} + - target: {fileID: 8196205064751031824, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 7.4306944e-10 + objectReference: {fileID: 0} + - target: {fileID: 8196205064751031824, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8196205064751031824, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0041295593 + objectReference: {fileID: 0} + - target: {fileID: 8196205064751031824, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9558595 + objectReference: {fileID: 0} + - target: {fileID: 8196205064751031824, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.29382426 + objectReference: {fileID: 0} + - target: {fileID: 8196205064751031824, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.00000010008373 + objectReference: {fileID: 0} + - target: {fileID: 8196205064751031824, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.00000011749588 + objectReference: {fileID: 0} + - target: {fileID: 8439091168374640007, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: -0.002576328 + objectReference: {fileID: 0} + - target: {fileID: 8439091168374640007, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: -0.00721064 + objectReference: {fileID: 0} + - target: {fileID: 8439091168374640007, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: -0.20619579 + objectReference: {fileID: 0} + - target: {fileID: 8439091168374640007, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.039815802 + objectReference: {fileID: 0} + - target: {fileID: 8439091168374640007, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.95996726 + objectReference: {fileID: 0} + - target: {fileID: 8439091168374640007, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.18536685 + objectReference: {fileID: 0} + - target: {fileID: 8492091921151321456, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: -6.243188e-10 + objectReference: {fileID: 0} + - target: {fileID: 8492091921151321456, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 9.3132246e-10 + objectReference: {fileID: 0} + - target: {fileID: 8492091921151321456, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0.004241225 + objectReference: {fileID: 0} + - target: {fileID: 8492091921151321456, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.96049273 + objectReference: {fileID: 0} + - target: {fileID: 8492091921151321456, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.2783051 + objectReference: {fileID: 0} + - target: {fileID: 8492091921151321456, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0.000000064069766 + objectReference: {fileID: 0} + - target: {fileID: 8492091921151321456, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0.000000010307705 + objectReference: {fileID: 0} + - target: {fileID: 8534503059331984444, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9881934 + objectReference: {fileID: 0} + - target: {fileID: 8534503059331984444, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.055731706 + objectReference: {fileID: 0} + - target: {fileID: 8534503059331984444, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.14248967 + objectReference: {fileID: 0} + - target: {fileID: 8534503059331984444, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0.008036076 + objectReference: {fileID: 0} + - target: {fileID: 8566358697884175510, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.x + value: -1.7462298e-10 + objectReference: {fileID: 0} + - target: {fileID: 8566358697884175510, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8566358697884175510, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0019033398 + objectReference: {fileID: 0} + - target: {fileID: 8566358697884175510, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.71182936 + objectReference: {fileID: 0} + - target: {fileID: 8566358697884175510, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0.70235246 + objectReference: {fileID: 0} + - target: {fileID: 8566358697884175510, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.00000023841855 + objectReference: {fileID: 0} + - target: {fileID: 8566358697884175510, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.000000026077029 + objectReference: {fileID: 0} + - target: {fileID: 9137912265148236082, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.8607993 + objectReference: {fileID: 0} + - target: {fileID: 9137912265148236082, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.13913172 + objectReference: {fileID: 0} + - target: {fileID: 9137912265148236082, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0.4832859 + objectReference: {fileID: 0} + - target: {fileID: 9137912265148236082, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.07811398 + objectReference: {fileID: 0} + - target: {fileID: 9159298283892096671, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.5855786 + objectReference: {fileID: 0} + - target: {fileID: 9159298283892096671, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.46928912 + objectReference: {fileID: 0} + - target: {fileID: 9159298283892096671, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0.63777393 + objectReference: {fileID: 0} + - target: {fileID: 9159298283892096671, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.17352195 + objectReference: {fileID: 0} + - target: {fileID: 9216031652685433178, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 0.816941 + objectReference: {fileID: 0} + - target: {fileID: 9216031652685433178, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0.43575278 + objectReference: {fileID: 0} + - target: {fileID: 9216031652685433178, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0.14708473 + objectReference: {fileID: 0} + - target: {fileID: 9216031652685433178, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0.34798425 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 270edf85af80c05d4805cd7aabaf41ab, type: 3} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 @@ -6032,3 +7057,4 @@ SceneRoots: - {fileID: 1733975501} - {fileID: 1131923926} - {fileID: 2573365365212359253} + - {fileID: 7194236269538624252} diff --git a/Samples/Prefabs/LowPolyAnt Variant.prefab b/Samples/Prefabs/LowPolyAnt Variant.prefab new file mode 100644 index 0000000..56af8da --- /dev/null +++ b/Samples/Prefabs/LowPolyAnt Variant.prefab @@ -0,0 +1,2885 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &143286242955637876 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4758204420827059156} + - component: {fileID: 1869889312292575410} + m_Layer: 0 + m_Name: LeftMiddle_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4758204420827059156 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 143286242955637876} + serializedVersion: 2 + m_LocalRotation: {x: -0.22205506, y: -0.7431153, z: -0.29594883, w: 0.55757105} + m_LocalPosition: {x: -0.00024003958, y: 0.0020915146, z: -0.0014802816} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7709324683507640849} + m_Father: {fileID: 3692623350806118549} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1869889312292575410 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 143286242955637876} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 4758204420827059156} + _tibia: {fileID: 7709324683507640849} + _tarsus: {fileID: 8196205064751031824} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0024082733 + _tibiaLength: 0.0041295574 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 6415599125966866927} + targetToBoneFemur: {x: 0.0759626, y: -0.70301473, z: -0.70301485, w: 0.075962685} + targetToBoneTibia: {x: -0.5739337, y: -0.41303778, z: -0.41303787, w: -0.5739338} +--- !u!1 &705568938082032721 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8439091168374640007} + - component: {fileID: 5365171951816653117} + - component: {fileID: 4759133654686424171} + m_Layer: 0 + m_Name: LeftHind_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8439091168374640007 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705568938082032721} + serializedVersion: 2 + m_LocalRotation: {x: -0.03981568, y: 0.9599673, z: -0.18536556, w: -0.20619665} + m_LocalPosition: {x: -0.0025763502, y: 0, z: -0.007210666} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8716261704610953511} + m_Father: {fileID: 6194177574238543981} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &5365171951816653117 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705568938082032721} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 1619848046630859482} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &4759133654686424171 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705568938082032721} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &771417713020922740 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2300420718370116349} + m_Layer: 0 + m_Name: RightFront_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2300420718370116349 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 771417713020922740} + serializedVersion: 2 + m_LocalRotation: {x: 0.50033474, y: -0.000000014901159, z: -0.0000000037252899, w: 0.86583203} + m_LocalPosition: {x: 0, y: 1.4551915e-11, z: 0.0019033401} + m_LocalScale: {x: 0.99999994, y: 1, z: 0.99999994} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 615395507866503330} + m_Father: {fileID: 8534503059331984444} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &854478626558788248 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5250359002763488712} + - component: {fileID: 5822731179470606379} + - component: {fileID: 8556768721929346915} + m_Layer: 0 + m_Name: RightMiddle_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5250359002763488712 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 854478626558788248} + serializedVersion: 2 + m_LocalRotation: {x: 0.13480826, y: 0.7633578, z: -0.16905655, w: 0.60871303} + m_LocalPosition: {x: 0.0052212873, y: 0, z: -0.0023041023} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2295993314221013982} + m_Father: {fileID: 6194177574238543981} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &5822731179470606379 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 854478626558788248} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 3802825748686820492} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &8556768721929346915 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 854478626558788248} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &1082377596589488752 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6194177574238543981} + m_Layer: 0 + m_Name: RightFeetTarget + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6194177574238543981 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1082377596589488752} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5535986122466163059} + - {fileID: 5250359002763488712} + - {fileID: 8439091168374640007} + m_Father: {fileID: 9153683025012755266} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1083078033105624184 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8566358697884175510} + m_Layer: 0 + m_Name: LeftFront_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8566358697884175510 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1083078033105624184} + serializedVersion: 2 + m_LocalRotation: {x: 0.7023513, y: 0.000000029802322, z: -0.000000052154064, w: 0.7118305} + m_LocalPosition: {x: 1.1641532e-10, y: -2.910383e-11, z: 0.0019033394} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8056997594033936271} + m_Father: {fileID: 9137912265148236082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1455010710599720760 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9153683025012755266} + m_Layer: 0 + m_Name: Body + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &9153683025012755266 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1455010710599720760} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1886022659920024833} + - {fileID: 6194177574238543981} + m_Father: {fileID: 3692623350806118549} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1776088556436683474 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4640116073770643066} + - component: {fileID: 2505926677163996265} + - component: {fileID: 6449841054297791280} + - component: {fileID: 4020727942271336430} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4640116073770643066 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1776088556436683474} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5535986122466163059} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &2505926677163996265 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1776088556436683474} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &6449841054297791280 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1776088556436683474} + m_Enabled: 0 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &4020727942271336430 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1776088556436683474} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &1846531079004612776 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1886022659920024833} + m_Layer: 0 + m_Name: LeftFeetTarget + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1886022659920024833 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1846531079004612776} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5961476926804711974} + - {fileID: 6415599125966866927} + - {fileID: 7871660662594056517} + m_Father: {fileID: 9153683025012755266} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2032809585173054758 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 966666976176492455} + m_Layer: 0 + m_Name: RightHind_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &966666976176492455 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2032809585173054758} + serializedVersion: 2 + m_LocalRotation: {x: 0.6516017, y: -0.000000059604645, z: 0.000000022351742, w: 0.7585614} + m_LocalPosition: {x: -1.1641532e-10, y: -5.820766e-11, z: 0.0030040154} + m_LocalScale: {x: 1, y: 1.0000001, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8492091921151321456} + m_Father: {fileID: 1543367068185469221} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2174179322558643890 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6302994411678767122} + m_Layer: 0 + m_Name: LeftHind_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6302994411678767122 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2174179322558643890} + serializedVersion: 2 + m_LocalRotation: {x: 0.5662592, y: 0.000000014901161, z: -0.0000000037252903, w: 0.8242272} + m_LocalPosition: {x: 0, y: -1.7462298e-10, z: 0.0030040164} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8105911159671643989} + m_Father: {fileID: 6035814526195247003} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2246141865427306680 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8106867155805742337} + - component: {fileID: 6027600637179741074} + m_Layer: 0 + m_Name: Mouth + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8106867155805742337 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2246141865427306680} + serializedVersion: 2 + m_LocalRotation: {x: -0.2542399, y: -0.010385725, z: -0.02084499, w: 0.9668608} + m_LocalPosition: {x: -0.000022, y: -0.000657, z: -0.000021} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3750983565270534416} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &6027600637179741074 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2246141865427306680} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 122a8c835cdbd95fb87b06d19573b3da, type: 3} + m_Name: + m_EditorClassIdentifier: + foodPrefab: {fileID: 4701327554883596395, guid: 0ff16166352f10e49bdefe6231ac3e38, type: 3} + nanoBrain: {fileID: 0} + havingFood: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + persistOutput: 0 + trace: 0 + _receivers: [] + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } +--- !u!1 &2247055388988280205 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7805495626236998544} + m_Layer: 0 + m_Name: RightMiddle_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7805495626236998544 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2247055388988280205} + serializedVersion: 2 + m_LocalRotation: {x: -0.25057173, y: -0.00000005535319, z: 0.000000071577944, w: 0.96809804} + m_LocalPosition: {x: -2.9282865e-10, y: 0, z: 0.004176515} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 976542044232966489} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2344423464168616931 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5535986122466163059} + - component: {fileID: 5724816169391259807} + - component: {fileID: 6218298637743748081} + m_Layer: 0 + m_Name: LeftFront_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5535986122466163059 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2344423464168616931} + serializedVersion: 2 + m_LocalRotation: {x: 0.28778726, y: -0.46212685, z: 0.16157518, w: 0.82311046} + m_LocalPosition: {x: -0.0029576193, y: 0, z: 0.00044939894} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4640116073770643066} + m_Father: {fileID: 6194177574238543981} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &5724816169391259807 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2344423464168616931} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 7133941337710929684} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &6218298637743748081 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2344423464168616931} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &2503148901578430105 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7709324683507640849} + m_Layer: 0 + m_Name: LeftMiddle_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7709324683507640849 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2503148901578430105} + serializedVersion: 2 + m_LocalRotation: {x: 0.8119707, y: -0.00000011920929, z: 0.000000014901161, w: 0.5836983} + m_LocalPosition: {x: 2.910383e-11, y: -2.3283064e-10, z: 0.002408273} + m_LocalScale: {x: 0.9999998, y: 1, z: 1.0000001} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8196205064751031824} + m_Father: {fileID: 4758204420827059156} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2882239523612217299 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 615395507866503330} + m_Layer: 0 + m_Name: RightFront_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &615395507866503330 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2882239523612217299} + serializedVersion: 2 + m_LocalRotation: {x: -0.19549885, y: 0.000000002172962, z: 0.0000000057906107, w: 0.9807039} + m_LocalPosition: {x: -2.7544242e-10, y: 6.9849193e-10, z: 0.0030214665} + m_LocalScale: {x: 1.0000001, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2300420718370116349} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &3374865219866590095 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8105911159671643989} + m_Layer: 0 + m_Name: LeftHind_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8105911159671643989 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3374865219866590095} + serializedVersion: 2 + m_LocalRotation: {x: -0.24540225, y: -0.000000010576111, z: 0.000000011730633, w: 0.9694213} + m_LocalPosition: {x: 1.1680018e-10, y: 6.9849193e-10, z: 0.0041061183} + m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 0.9999999} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6302994411678767122} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &3392280556579772079 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6415599125966866927} + - component: {fileID: 6720754972575702435} + - component: {fileID: 363766898386419182} + m_Layer: 0 + m_Name: LeftMiddle_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6415599125966866927 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3392280556579772079} + serializedVersion: 2 + m_LocalRotation: {x: 0.16025314, y: -0.7708367, z: 0.21358094, w: 0.5783709} + m_LocalPosition: {x: -0.0035855495, y: 0, z: -0.0024545891} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1481696938746705330} + m_Father: {fileID: 1886022659920024833} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &6720754972575702435 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3392280556579772079} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 1869889312292575410} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &363766898386419182 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3392280556579772079} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &3800556883426211010 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8534503059331984444} + - component: {fileID: 6295417488748167188} + m_Layer: 0 + m_Name: RightFront_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8534503059331984444 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3800556883426211010} + serializedVersion: 2 + m_LocalRotation: {x: -0.055727538, y: 0.1424893, z: 0.00803545, w: 0.9881937} + m_LocalPosition: {x: 0.0011845141, y: 0.0022176225, z: -0.0008242579} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2300420718370116349} + m_Father: {fileID: 3692623350806118549} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &6295417488748167188 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3800556883426211010} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 8534503059331984444} + _tibia: {fileID: 2300420718370116349} + _tarsus: {fileID: 615395507866503330} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0019033402 + _tibiaLength: 0.0030214665 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 5961476926804711974} + targetToBoneFemur: {x: 0.3940539, y: -0.58712995, z: -0.58713037, w: 0.39405394} + targetToBoneTibia: {x: -0.1659759, y: -0.6873515, z: -0.68735147, w: -0.1659759} +--- !u!1 &3918606941992177650 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9137912265148236082} + - component: {fileID: 7133941337710929684} + m_Layer: 0 + m_Name: LeftFront_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &9137912265148236082 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3918606941992177650} + serializedVersion: 2 + m_LocalRotation: {x: -0.13913122, y: -0.48328668, z: -0.07811372, w: 0.86079895} + m_LocalPosition: {x: -0.00058102724, y: 0.0022176215, z: -0.0009999603} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8566358697884175510} + m_Father: {fileID: 3692623350806118549} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &7133941337710929684 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3918606941992177650} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 9137912265148236082} + _tibia: {fileID: 8566358697884175510} + _tarsus: {fileID: 8056997594033936271} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0019033395 + _tibiaLength: 0.0029819135 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 5535986122466163059} + targetToBoneFemur: {x: 0.54446495, y: -0.4511739, z: -0.4511739, w: 0.54446507} + targetToBoneTibia: {x: 0.42917126, y: 0.5619716, z: 0.56197155, w: 0.4291714} +--- !u!1 &4040189390208258658 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7871660662594056517} + - component: {fileID: 533609167290149241} + - component: {fileID: 7100791663606062824} + m_Layer: 0 + m_Name: RighHind_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7871660662594056517 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4040189390208258658} + serializedVersion: 2 + m_LocalRotation: {x: 0.0773633, y: 0.9162942, z: -0.21589425, w: 0.32834378} + m_LocalPosition: {x: 0.004090543, y: 0, z: -0.006165691} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6540716866520675067} + m_Father: {fileID: 1886022659920024833} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &533609167290149241 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4040189390208258658} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 343882332491731405} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &7100791663606062824 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4040189390208258658} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &4382447241770005941 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2295993314221013982} + - component: {fileID: 2023593135367572438} + - component: {fileID: 4946104053802420847} + - component: {fileID: 6402557554419948186} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2295993314221013982 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4382447241770005941} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5250359002763488712} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &2023593135367572438 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4382447241770005941} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &4946104053802420847 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4382447241770005941} + m_Enabled: 0 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &6402557554419948186 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4382447241770005941} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &4708040903003570437 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4025124887052868558} + - component: {fileID: 5686149116853183247} + - component: {fileID: 2200648322291694921} + - component: {fileID: 5854467575646968078} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4025124887052868558 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4708040903003570437} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5961476926804711974} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &5686149116853183247 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4708040903003570437} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2200648322291694921 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4708040903003570437} + m_Enabled: 0 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &5854467575646968078 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4708040903003570437} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &4789320418346547653 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5961476926804711974} + - component: {fileID: 342365089886019184} + - component: {fileID: 4019880596855169071} + m_Layer: 0 + m_Name: RightFront_Target + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5961476926804711974 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4789320418346547653} + serializedVersion: 2 + m_LocalRotation: {x: 0.26484576, y: 0.13751145, z: -0.038188547, w: 0.95367134} + m_LocalPosition: {x: 0.002225488, y: 0, z: 0.00271038} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4025124887052868558} + m_Father: {fileID: 1886022659920024833} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &342365089886019184 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4789320418346547653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fda62ae0dd837da8cb37ba5c7396c6a3, type: 3} + m_Name: + m_EditorClassIdentifier: + leg: {fileID: 6295417488748167188} + footCollider: {fileID: 0} + sphereRenderer: {fileID: 0} +--- !u!54 &4019880596855169071 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4789320418346547653} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &4936026138323927830 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6540716866520675067} + - component: {fileID: 4275209584790053880} + - component: {fileID: 1274188250959651474} + - component: {fileID: 316807406671051711} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6540716866520675067 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4936026138323927830} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7871660662594056517} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &4275209584790053880 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4936026138323927830} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1274188250959651474 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4936026138323927830} + m_Enabled: 0 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &316807406671051711 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4936026138323927830} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &5872439506191515607 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 976542044232966489} + m_Layer: 0 + m_Name: RightMiddle_Tibia + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &976542044232966489 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5872439506191515607} + serializedVersion: 2 + m_LocalRotation: {x: 0.6839642, y: 0.00000011920929, z: -0.000000014901161, w: 0.7295157} + m_LocalPosition: {x: -2.0372681e-10, y: 2.910383e-11, z: 0.0024082721} + m_LocalScale: {x: 1, y: 1.0000001, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7805495626236998544} + m_Father: {fileID: 4108875120565236669} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &5934342576853380286 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6035814526195247003} + - component: {fileID: 1619848046630859482} + m_Layer: 0 + m_Name: LeftHind_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6035814526195247003 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5934342576853380286} + serializedVersion: 2 + m_LocalRotation: {x: 0.034137037, y: 0.9646966, z: 0.15892807, w: -0.20721248} + m_LocalPosition: {x: -0.00033019992, y: 0.002194208, z: -0.0022233187} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6302994411678767122} + m_Father: {fileID: 3692623350806118549} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1619848046630859482 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5934342576853380286} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 6035814526195247003} + _tibia: {fileID: 6302994411678767122} + _tarsus: {fileID: 8105911159671643989} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0030040168 + _tibiaLength: 0.004106119 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 8439091168374640007} + targetToBoneFemur: {x: -0.4297835, y: 0.56150347, z: 0.5615035, w: -0.42978358} + targetToBoneTibia: {x: -0.6955418, y: 0.12736529, z: 0.12736529, w: -0.6955415} +--- !u!1 &6065556596967559351 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8056997594033936271} + m_Layer: 0 + m_Name: LeftFront_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8056997594033936271 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6065556596967559351} + serializedVersion: 2 + m_LocalRotation: {x: -0.2783754, y: -0.000000037985085, z: 0.000000022928376, w: 0.96047235} + m_LocalPosition: {x: 1.2023199e-10, y: 0, z: 0.0029819133} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8566358697884175510} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &6293298600777026745 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1543367068185469221} + - component: {fileID: 343882332491731405} + m_Layer: 0 + m_Name: RightHind_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1543367068185469221 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6293298600777026745} + serializedVersion: 2 + m_LocalRotation: {x: -0.065785386, y: 0.92331046, z: 0.18358438, w: 0.33085796} + m_LocalPosition: {x: 0.0009336879, y: 0.0024799206, z: -0.0023264561} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 966666976176492455} + m_Father: {fileID: 3692623350806118549} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &343882332491731405 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6293298600777026745} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 1543367068185469221} + _tibia: {fileID: 966666976176492455} + _tarsus: {fileID: 8492091921151321456} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0030040152 + _tibiaLength: 0.0042412234 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 7871660662594056517} + targetToBoneFemur: {x: 0.68627703, y: -0.17036355, z: -0.1703638, w: 0.6862772} + targetToBoneTibia: {x: 0.6842575, y: -0.17830335, z: -0.17830299, w: 0.6842574} +--- !u!1 &7202005123023226514 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8716261704610953511} + - component: {fileID: 460827430955521299} + - component: {fileID: 1724658269862117460} + - component: {fileID: 2402754398373585360} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8716261704610953511 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7202005123023226514} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8439091168374640007} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &460827430955521299 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7202005123023226514} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1724658269862117460 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7202005123023226514} + m_Enabled: 0 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &2402754398373585360 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7202005123023226514} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &7595888998889654217 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3692623350806118549} + - component: {fileID: 3740724917995983621} + - component: {fileID: 2759552102760829552} + m_Layer: 0 + m_Name: Target Rig + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3692623350806118549 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7595888998889654217} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 9137912265148236082} + - {fileID: 4758204420827059156} + - {fileID: 6035814526195247003} + - {fileID: 8534503059331984444} + - {fileID: 4108875120565236669} + - {fileID: 1543367068185469221} + - {fileID: 9153683025012755266} + m_Father: {fileID: 6893303343174068101} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &3740724917995983621 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7595888998889654217} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a25e8575da1d1cba48dc2b8da7a2b0ab, type: 3} + m_Name: + m_EditorClassIdentifier: + leftFrontLeg: {fileID: 7133941337710929684} + leftMiddleLeg: {fileID: 1869889312292575410} + leftBackLeg: {fileID: 1619848046630859482} + rightFrontLeg: {fileID: 6295417488748167188} + rightMiddleLeg: {fileID: 3802825748686820492} + rightBackLeg: {fileID: 343882332491731405} + render: 0 + legLength: 0.004885253 +--- !u!95 &2759552102760829552 +Animator: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7595888998889654217} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: ba169e741a830f910bdde9e04f7c88f4, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 1 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &7731414149959408473 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4108875120565236669} + - component: {fileID: 3802825748686820492} + m_Layer: 0 + m_Name: RightMiddle_Femur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4108875120565236669 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7731414149959408473} + serializedVersion: 2 + m_LocalRotation: {x: -0.17347457, y: 0.75097865, z: 0.2175461, w: 0.5988417} + m_LocalPosition: {x: 0.0008435269, y: 0.0020915149, z: -0.0013045785} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 976542044232966489} + m_Father: {fileID: 3692623350806118549} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &3802825748686820492 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7731414149959408473} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f3394e8da3685a263901c13e2a231279, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: + _coxa: {fileID: 0} + _femur: {fileID: 4108875120565236669} + _tibia: {fileID: 976542044232966489} + _tarsus: {fileID: 7805495626236998544} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0.0024082721 + _tibiaLength: 0.004176515 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + target: {fileID: 5250359002763488712} + targetToBoneFemur: {x: 0.66122675, y: -0.25055832, z: -0.25055823, w: 0.66122663} + targetToBoneTibia: {x: 0.5807946, y: -0.40333316, z: -0.40333334, w: 0.58079493} +--- !u!1 &7870208251778510133 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1481696938746705330} + - component: {fileID: 6598668896550212260} + - component: {fileID: 7283309183648436328} + - component: {fileID: 7680443891285482114} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1481696938746705330 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7870208251778510133} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.002, y: 0.002, z: 0.002} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6415599125966866927} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &6598668896550212260 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7870208251778510133} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &7283309183648436328 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7870208251778510133} + m_Enabled: 0 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &7680443891285482114 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7870208251778510133} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &8102965106138119688 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8492091921151321456} + m_Layer: 0 + m_Name: RightHind_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8492091921151321456 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8102965106138119688} + serializedVersion: 2 + m_LocalRotation: {x: -0.2783009, y: 0.000000037683723, z: -0.000000053537306, w: 0.960494} + m_LocalPosition: {x: 9.294565e-12, y: 0, z: 0.0042412234} + m_LocalScale: {x: 1, y: 0.9999999, z: 0.9999999} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 966666976176492455} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &8620845555170327592 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8196205064751031824} + m_Layer: 0 + m_Name: LeftMiddle_Tarsus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8196205064751031824 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8620845555170327592} + serializedVersion: 2 + m_LocalRotation: {x: -0.29382303, y: 0.000000115436556, z: -0.0000000994468, w: 0.9558599} + m_LocalPosition: {x: 3.151205e-10, y: 0, z: 0.0041295574} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7709324683507640849} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &8299499293180514419 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 878733956556189420, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.w + value: 0.5855818 + objectReference: {fileID: 0} + - target: {fileID: 878733956556189420, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.x + value: -0.4692818 + objectReference: {fileID: 0} + - target: {fileID: 878733956556189420, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.y + value: -0.63777685 + objectReference: {fileID: 0} + - target: {fileID: 878733956556189420, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.z + value: -0.17352022 + objectReference: {fileID: 0} + - target: {fileID: 921079959415626025, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.w + value: 0.81694233 + objectReference: {fileID: 0} + - target: {fileID: 921079959415626025, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.x + value: -0.43574923 + objectReference: {fileID: 0} + - target: {fileID: 921079959415626025, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.y + value: 0.14708138 + objectReference: {fileID: 0} + - target: {fileID: 921079959415626025, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.z + value: -0.34798685 + objectReference: {fileID: 0} + - target: {fileID: 1185156659557624868, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.w + value: 0.28808329 + objectReference: {fileID: 0} + - target: {fileID: 1185156659557624868, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.x + value: -0.5423464 + objectReference: {fileID: 0} + - target: {fileID: 1185156659557624868, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.y + value: -0.5076532 + objectReference: {fileID: 0} + - target: {fileID: 1185156659557624868, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.z + value: 0.604282 + objectReference: {fileID: 0} + - target: {fileID: 3207777328726177782, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3207777328726177782, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3207777328726177782, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3207777328726177782, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3207777328726177782, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 3207777328726177782, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 3207777328726177782, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 3207777328726177782, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3207777328726177782, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3207777328726177782, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4217164170368883032, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.w + value: 0.8540212 + objectReference: {fileID: 0} + - target: {fileID: 4217164170368883032, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.x + value: -0.3250143 + objectReference: {fileID: 0} + - target: {fileID: 4217164170368883032, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.y + value: 0.22636859 + objectReference: {fileID: 0} + - target: {fileID: 4217164170368883032, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.z + value: 0.3372994 + objectReference: {fileID: 0} + - target: {fileID: 4280044992070512807, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.w + value: 0.03278106 + objectReference: {fileID: 0} + - target: {fileID: 4280044992070512807, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.x + value: -0.044934656 + objectReference: {fileID: 0} + - target: {fileID: 4280044992070512807, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.y + value: 0.8327048 + objectReference: {fileID: 0} + - target: {fileID: 4280044992070512807, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.z + value: -0.55091643 + objectReference: {fileID: 0} + - target: {fileID: 4355293283798979008, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.w + value: -0.5112789 + objectReference: {fileID: 0} + - target: {fileID: 4355293283798979008, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.x + value: 0.8116236 + objectReference: {fileID: 0} + - target: {fileID: 4355293283798979008, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.y + value: 0.2597021 + objectReference: {fileID: 0} + - target: {fileID: 4355293283798979008, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.z + value: -0.1114271 + objectReference: {fileID: 0} + - target: {fileID: 5152346580398522335, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.w + value: 0.32846028 + objectReference: {fileID: 0} + - target: {fileID: 5152346580398522335, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.x + value: 0.89219666 + objectReference: {fileID: 0} + - target: {fileID: 5152346580398522335, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.y + value: 0.29728088 + objectReference: {fileID: 0} + - target: {fileID: 5152346580398522335, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.z + value: -0.087881684 + objectReference: {fileID: 0} + - target: {fileID: 5426871202115288240, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.w + value: 0.75851035 + objectReference: {fileID: 0} + - target: {fileID: 5426871202115288240, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.x + value: 0.57238495 + objectReference: {fileID: 0} + - target: {fileID: 5426871202115288240, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.y + value: -0.008788292 + objectReference: {fileID: 0} + - target: {fileID: 5426871202115288240, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.z + value: -0.3113845 + objectReference: {fileID: 0} + - target: {fileID: 5498987105763849279, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_Name + value: LowPolyAnt Variant + objectReference: {fileID: 0} + - target: {fileID: 6797057378463114089, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.w + value: 0.4702007 + objectReference: {fileID: 0} + - target: {fileID: 6797057378463114089, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.x + value: 0.13349886 + objectReference: {fileID: 0} + - target: {fileID: 6797057378463114089, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.y + value: 0.79217046 + objectReference: {fileID: 0} + - target: {fileID: 6797057378463114089, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.z + value: -0.3654522 + objectReference: {fileID: 0} + - target: {fileID: 7468650878180815412, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.w + value: -0.028299622 + objectReference: {fileID: 0} + - target: {fileID: 7468650878180815412, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.x + value: 0.6843931 + objectReference: {fileID: 0} + - target: {fileID: 7468650878180815412, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.y + value: 0.71126777 + objectReference: {fileID: 0} + - target: {fileID: 7468650878180815412, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.z + value: 0.15780832 + objectReference: {fileID: 0} + - target: {fileID: 8564223698435002511, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.w + value: 0.6106671 + objectReference: {fileID: 0} + - target: {fileID: 8564223698435002511, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.x + value: 0.2575532 + objectReference: {fileID: 0} + - target: {fileID: 8564223698435002511, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.y + value: 0.5535667 + objectReference: {fileID: 0} + - target: {fileID: 8564223698435002511, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.z + value: -0.5042976 + objectReference: {fileID: 0} + - target: {fileID: 8675830525085349096, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.w + value: 0.70776933 + objectReference: {fileID: 0} + - target: {fileID: 8675830525085349096, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.x + value: 0.38709378 + objectReference: {fileID: 0} + - target: {fileID: 8675830525085349096, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.y + value: -0.17679322 + objectReference: {fileID: 0} + - target: {fileID: 8675830525085349096, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + propertyPath: m_LocalRotation.z + value: -0.563884 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: 3207777328726177782, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + insertIndex: -1 + addedObject: {fileID: 3692623350806118549} + - targetCorrespondingSourceObject: {fileID: 5126104695653669219, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + insertIndex: -1 + addedObject: {fileID: 8106867155805742337} + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 5498987105763849279, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + insertIndex: -1 + addedObject: {fileID: 2254741115594501600} + - targetCorrespondingSourceObject: {fileID: 5498987105763849279, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + insertIndex: -1 + addedObject: {fileID: 1919358760690860312} + - targetCorrespondingSourceObject: {fileID: 5498987105763849279, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + insertIndex: -1 + addedObject: {fileID: 6146833842385304387} + - targetCorrespondingSourceObject: {fileID: 831002309428038180, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + insertIndex: -1 + addedObject: {fileID: 7582553452565407503} + - targetCorrespondingSourceObject: {fileID: 831002309428038180, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + insertIndex: -1 + addedObject: {fileID: 600529615530160675} + - targetCorrespondingSourceObject: {fileID: 4156553221383077835, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + insertIndex: -1 + addedObject: {fileID: 950850747050432816} + - targetCorrespondingSourceObject: {fileID: 4156553221383077835, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + insertIndex: -1 + addedObject: {fileID: 3425486476024068148} + m_SourcePrefab: {fileID: 100100000, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} +--- !u!4 &84459971275189135 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8215042114174172156, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &429956009605333244 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8564223698435002511, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &813747761359004827 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8675830525085349096, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1179534173692081394 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7166127192311129217, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1437577212246939228 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6980283077441193519, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1479508092080169543 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7468650878180815412, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &2512591500195890980 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5905127352470787927, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &2872416656559305758 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6120780126738228333, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &3278129107402797850 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6797057378463114089, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &3750983565270534416 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5126104695653669219, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &3795814618417033132 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5152346580398522335, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &3949441404870422832 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5035731000834138435, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &4070585806702619843 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5426871202115288240, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!1 &4575073385702270028 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 5498987105763849279, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!54 &2254741115594501600 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4575073385702270028} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1919358760690860312 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4575073385702270028} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 456c8036e1196d245a3894315f92807d, type: 3} + m_Name: + m_EditorClassIdentifier: + model: {fileID: 0} + targetRig: {fileID: 3740724917995983621} + targetToModelTranslation: {x: 0, y: 0, z: 0} + targetToModelRotation: {x: 0, y: 0, z: 0, w: 0} + animator: {fileID: 2759552102760829552} + animationsPath: Assets + stepOffset: 0.0001 + useGravity: 0 + slopeAlignment: 0.3 + creatureRigidbody: {fileID: 0} + bodyCollider: {fileID: 0} + colliderToGround: 0 + ground: {fileID: 0} + insectRig: {fileID: 3740724917995983621} + forwardSpeed: 0 + rotationSpeed: 0 + thorax: {fileID: 0} + abdomen: {fileID: 0} + leftFrontLeg: + _coxa: {fileID: 0} + _femur: {fileID: 5718624336128688563} + _tibia: {fileID: 1479508092080169543} + _tarsus: {fileID: 5475813976886237078} + _phalanges: {fileID: 3949441404870422832} + _end: {fileID: 0} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + leftMiddleLeg: + _coxa: {fileID: 0} + _femur: {fileID: 3278129107402797850} + _tibia: {fileID: 7160506879154568279} + _tarsus: {fileID: 6985037577079330716} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + leftHindLeg: + _coxa: {fileID: 0} + _femur: {fileID: 5208545581280796884} + _tibia: {fileID: 429956009605333244} + _tarsus: {fileID: 2872416656559305758} + _phalanges: {fileID: 8022545806523926233} + _end: {fileID: 0} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + rightFrontLeg: + _coxa: {fileID: 0} + _femur: {fileID: 3795814618417033132} + _tibia: {fileID: 9159298283892096671} + _tarsus: {fileID: 2512591500195890980} + _phalanges: {fileID: 84459971275189135} + _end: {fileID: 0} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + rightMiddleLeg: + _coxa: {fileID: 0} + _femur: {fileID: 5308581614777190699} + _tibia: {fileID: 813747761359004827} + _tarsus: {fileID: 1179534173692081394} + _phalanges: {fileID: 0} + _end: {fileID: 0} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + rightHindLeg: + _coxa: {fileID: 0} + _femur: {fileID: 9216031652685433178} + _tibia: {fileID: 4070585806702619843} + _tarsus: {fileID: 7249020181501578876} + _phalanges: {fileID: 1437577212246939228} + _end: {fileID: 0} + _femurLength: 0 + _tibiaLength: 0 + _tarsusLength: 0 + _phalangesLength: 0 + side: 0 + updateAnimations: 0 + homePheromonePrefab: {fileID: 733094908384848434, guid: 04af7f4320cef6537a2d13a3cf2f845f, type: 3} + foodPheromonePrefab: {fileID: 733094908384848434, guid: 289d9024551239891a16e5cfc01fe383, type: 3} + touchLeft: {fileID: 950850747050432816} + touchRight: {fileID: 7582553452565407503} + nanoBrain: {fileID: 0} + beat: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + persistOutput: 0 + trace: 0 + _receivers: [] + pheromoneSteering: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + persistOutput: 0 + trace: 0 + _receivers: [] + foodReceptor: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + persistOutput: 0 + trace: 0 + _receivers: [] + homeReceptor: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + persistOutput: 0 + trace: 0 + _receivers: [] + foodSmell: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + persistOutput: 0 + trace: 0 + _receivers: [] + targetDirection: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + persistOutput: 0 + trace: 0 + _receivers: [] + hasFood: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + persistOutput: 0 + trace: 0 + _receivers: [] + linearVelocity: {x: 0, y: 0, z: 0} + angularVelocity: {x: 0, y: 0, z: 0} + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } +--- !u!114 &6146833842385304387 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4575073385702270028} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92f34a5e4027a1dc39efd8ce63cf6aba, type: 3} + m_Name: + m_EditorClassIdentifier: + brainPrefab: {fileID: 11400000, guid: c8e4b0990eb7dbbc4bee34addd9cd2b8, type: 2} +--- !u!4 &5208545581280796884 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4280044992070512807, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &5308581614777190699 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4217164170368883032, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!1 &5369053282258546616 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 4156553221383077835, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!114 &950850747050432816 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5369053282258546616} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 62f6712fb1e4fb40285b0bb5008716dc, type: 3} + m_Name: + m_EditorClassIdentifier: + receptor: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + persistOutput: 0 + trace: 0 + _receivers: [] + insect: {fileID: 0} + hitObject: {fileID: 0} + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } +--- !u!135 &3425486476024068148 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5369053282258546616} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.0002 + m_Center: {x: 0, y: 0, z: 0} +--- !u!4 &5475813976886237078 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4093844004864329701, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &5718624336128688563 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4355293283798979008, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &6893303343174068101 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 3207777328726177782, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &6985037577079330716 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 1423814821864851439, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7160506879154568279 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 1185156659557624868, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7249020181501578876 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 1708007548326206991, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &8022545806523926233 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 2051513074330490538, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!1 &8693616962168527447 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 831002309428038180, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!114 &7582553452565407503 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8693616962168527447} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 62f6712fb1e4fb40285b0bb5008716dc, type: 3} + m_Name: + m_EditorClassIdentifier: + receptor: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + persistOutput: 0 + trace: 0 + _receivers: [] + insect: {fileID: 1919358760690860312} + hitObject: {fileID: 0} + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } +--- !u!135 &600529615530160675 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8693616962168527447} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.0002 + m_Center: {x: 0, y: 0, z: 0} +--- !u!4 &9159298283892096671 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 878733956556189420, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} +--- !u!4 &9216031652685433178 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 921079959415626025, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} + m_PrefabInstance: {fileID: 8299499293180514419} + m_PrefabAsset: {fileID: 0} diff --git a/Samples/Prefabs/LowPolyAnt Variant.prefab.meta b/Samples/Prefabs/LowPolyAnt Variant.prefab.meta new file mode 100644 index 0000000..ec1b9b7 --- /dev/null +++ b/Samples/Prefabs/LowPolyAnt Variant.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 270edf85af80c05d4805cd7aabaf41ab +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Prefabs/LowPolyAnt.prefab b/Samples/Prefabs/LowPolyAnt.prefab new file mode 100644 index 0000000..da9e6d3 --- /dev/null +++ b/Samples/Prefabs/LowPolyAnt.prefab @@ -0,0 +1,96 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &5498987105763849279 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3207777328726177782} + m_Layer: 0 + m_Name: LowPolyAnt + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3207777328726177782 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5498987105763849279} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 803705186292288602} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &913646774892768177 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 3207777328726177782} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalRotation.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 180 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + propertyPath: m_Name + value: LowPolyAntRigged + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} +--- !u!4 &803705186292288602 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} + m_PrefabInstance: {fileID: 913646774892768177} + m_PrefabAsset: {fileID: 0} diff --git a/Samples/Prefabs/LowPolyAnt.prefab.meta b/Samples/Prefabs/LowPolyAnt.prefab.meta new file mode 100644 index 0000000..2b43706 --- /dev/null +++ b/Samples/Prefabs/LowPolyAnt.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4dff5bed1fdfdda6cb1a398623e62f76 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Prefabs/LowPolyAntRigged Variant.prefab b/Samples/Prefabs/LowPolyAntRigged Variant.prefab index 853d1af..daefac5 100644 --- a/Samples/Prefabs/LowPolyAntRigged Variant.prefab +++ b/Samples/Prefabs/LowPolyAntRigged Variant.prefab @@ -131,8 +131,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 310226470799096867} serializedVersion: 2 - m_LocalRotation: {x: 0.039815653, y: -0.9599674, z: 0.18536547, w: 0.20619658} - m_LocalPosition: {x: -0.0025763495, y: 0, z: -0.007210667} + m_LocalRotation: {x: 0.039815694, y: -0.9599674, z: 0.18536566, w: 0.20619659} + m_LocalPosition: {x: -0.002576349, y: 0, z: -0.007210666} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -206,7 +206,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 627474747923666567} serializedVersion: 2 - m_LocalRotation: {x: -0.05572752, y: 0.14248866, z: 0.008035409, w: 0.98819375} + m_LocalRotation: {x: 0.05572741, y: -0.1424888, z: -0.008035398, w: -0.98819375} m_LocalPosition: {x: 0.0011845141, y: 0.0022176225, z: -0.0008242579} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -233,14 +233,14 @@ MonoBehaviour: _tarsus: {fileID: 2356608666883495351} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0019033402 - _tibiaLength: 0.0030214668 + _femurLength: 0.0019033407 + _tibiaLength: 0.003021466 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 6702413818536640054} - targetToBoneFemur: {x: -0.39405382, y: 0.58713, z: 0.58713055, w: -0.3940538} - targetToBoneTibia: {x: 0.16597652, y: 0.68735147, z: 0.6873513, w: 0.16597664} + targetToBoneFemur: {x: -0.39405382, y: 0.58713007, z: 0.5871305, w: -0.3940537} + targetToBoneTibia: {x: 0.16597646, y: 0.68735164, z: 0.6873513, w: 0.16597664} --- !u!1 &794584019555967318 GameObject: m_ObjectHideFlags: 0 @@ -265,8 +265,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 794584019555967318} serializedVersion: 2 - m_LocalRotation: {x: 0.56625897, y: -0, z: -0.000000014901161, w: 0.8242274} - m_LocalPosition: {x: 2.3283064e-10, y: 5.820766e-11, z: 0.0030040161} + m_LocalRotation: {x: 0.5662594, y: -0.000000089406974, z: 0.000000050291423, w: 0.82422715} + m_LocalPosition: {x: 3.4924597e-10, y: 5.820766e-11, z: 0.0030040166} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -299,8 +299,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 879920836154580446} serializedVersion: 2 - m_LocalRotation: {x: 0.16025314, y: -0.77083653, z: 0.21358076, w: 0.57837117} - m_LocalPosition: {x: -0.0035855572, y: 0, z: -0.0024545877} + m_LocalRotation: {x: 0.16025312, y: -0.77083653, z: 0.21358071, w: 0.5783712} + m_LocalPosition: {x: -0.0035855556, y: 0, z: -0.002454587} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -375,8 +375,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1046291156767383927} serializedVersion: 2 - m_LocalRotation: {x: -0.07736318, y: -0.9162943, z: 0.21589409, w: -0.32834357} - m_LocalPosition: {x: 0.0040905443, y: 0, z: -0.0061656963} + m_LocalRotation: {x: -0.07736313, y: -0.91629434, z: 0.21589406, w: -0.32834345} + m_LocalPosition: {x: 0.004090541, y: 0, z: -0.006165694} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -451,8 +451,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1381374271869641024} serializedVersion: 2 - m_LocalRotation: {x: 0.26484597, y: 0.1375108, z: -0.038188398, w: 0.95367134} - m_LocalPosition: {x: 0.0022254835, y: 0, z: 0.0027103818} + m_LocalRotation: {x: 0.2648458, y: 0.13751096, z: -0.038188413, w: 0.9536714} + m_LocalPosition: {x: 0.0022254845, y: 0, z: 0.0027103813} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -559,8 +559,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2391558079143476650} serializedVersion: 2 - m_LocalRotation: {x: 0.5003347, y: 0.000000014901161, z: -0.000000015366822, w: 0.86583215} - m_LocalPosition: {x: 0, y: 2.910383e-11, z: 0.0019033403} + m_LocalRotation: {x: 0.50033456, y: -0.00000004470348, z: 0.000000014435498, w: 0.8658321} + m_LocalPosition: {x: 0, y: 2.910383e-11, z: 0.0019033406} m_LocalScale: {x: 0.99999994, y: 1, z: 0.99999994} m_ConstrainProportionsScale: 0 m_Children: @@ -591,8 +591,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2737017325502982318} serializedVersion: 2 - m_LocalRotation: {x: -0.2938225, y: -0.00000024847017, z: 0.00000016629497, w: 0.9558601} - m_LocalPosition: {x: -9.477443e-11, y: 0, z: 0.004129558} + m_LocalRotation: {x: 0.29382262, y: 0.00000007313275, z: -0.0000000645507, w: -0.95586} + m_LocalPosition: {x: -2.5287344e-10, y: 0, z: 0.0041295583} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -727,8 +727,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3188458486668866969} serializedVersion: 2 - m_LocalRotation: {x: -0.24540237, y: -0.000000015553981, z: 0.000000010133035, w: 0.96942127} - m_LocalPosition: {x: 2.9253944e-10, y: -4.656613e-10, z: 0.0041061183} + m_LocalRotation: {x: -0.24540237, y: 0.0000000850379, z: -0.000000077394354, w: 0.9694214} + m_LocalPosition: {x: 5.0200143e-11, y: 0.0000000018626451, z: 0.0041061183} m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 0.9999999} m_ConstrainProportionsScale: 0 m_Children: [] @@ -758,8 +758,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4167713860447769177} serializedVersion: 2 - m_LocalRotation: {x: 0.68396443, y: -0, z: -0.000000037252903, w: 0.72951543} - m_LocalPosition: {x: -4.0745363e-10, y: -5.820766e-11, z: 0.0024082726} + m_LocalRotation: {x: 0.68396413, y: -0, z: -0.000000007450581, w: 0.7295157} + m_LocalPosition: {x: -2.0372681e-10, y: -1.4551915e-10, z: 0.0024082721} m_LocalScale: {x: 1, y: 1.0000001, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -792,8 +792,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4337532486384028974} serializedVersion: 2 - m_LocalRotation: {x: -0.13480844, y: -0.76335746, z: 0.16905662, w: -0.60871345} - m_LocalPosition: {x: 0.0052212873, y: 0, z: -0.0023040974} + m_LocalRotation: {x: -0.13480838, y: -0.7633575, z: 0.16905655, w: -0.6087134} + m_LocalPosition: {x: 0.005221286, y: 0, z: -0.0023040976} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -972,7 +972,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4785709934359029167} serializedVersion: 2 - m_LocalRotation: {x: -0.034136977, y: -0.9646967, z: -0.15892783, w: 0.20721242} + m_LocalRotation: {x: -0.03413701, y: -0.9646966, z: -0.1589281, w: 0.20721239} m_LocalPosition: {x: -0.00033019992, y: 0.002194208, z: -0.0022233187} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -999,14 +999,14 @@ MonoBehaviour: _tarsus: {fileID: 2143803970633277119} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0030040161 + _femurLength: 0.0030040175 _tibiaLength: 0.0041061183 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 2063238250592969972} - targetToBoneFemur: {x: -0.42978352, y: 0.5615034, z: 0.56150347, w: -0.4297837} - targetToBoneTibia: {x: -0.69554156, y: 0.12736543, z: 0.12736532, w: -0.6955417} + targetToBoneFemur: {x: -0.42978355, y: 0.56150335, z: 0.56150347, w: -0.42978373} + targetToBoneTibia: {x: -0.69554156, y: 0.12736554, z: 0.12736543, w: -0.6955416} --- !u!1 &5099577226509260816 GameObject: m_ObjectHideFlags: 0 @@ -1066,8 +1066,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5132672650264838643} serializedVersion: 2 - m_LocalRotation: {x: 0.28778702, y: -0.46212685, z: 0.16157502, w: 0.8231105} - m_LocalPosition: {x: -0.0029576211, y: 0, z: 0.00044940034} + m_LocalRotation: {x: 0.2877871, y: -0.4621268, z: 0.16157505, w: 0.8231105} + m_LocalPosition: {x: -0.0029576207, y: 0, z: 0.00044940057} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -1141,7 +1141,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5309068433442998760} serializedVersion: 2 - m_LocalRotation: {x: 0.065785274, y: -0.9233106, z: -0.18358408, w: -0.33085778} + m_LocalRotation: {x: 0.065785326, y: -0.9233105, z: -0.18358435, w: -0.33085763} m_LocalPosition: {x: 0.0009336879, y: 0.0024799206, z: -0.0023264561} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1168,14 +1168,14 @@ MonoBehaviour: _tarsus: {fileID: 3777766915705757037} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.003004014 - _tibiaLength: 0.004241224 + _femurLength: 0.0030040164 + _tibiaLength: 0.0042412234 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 166916568455411127} - targetToBoneFemur: {x: 0.68627685, y: -0.17036399, z: -0.17036442, w: 0.68627715} - targetToBoneTibia: {x: 0.6842575, y: -0.17830266, z: -0.17830272, w: 0.6842572} + targetToBoneFemur: {x: 0.686277, y: -0.17036407, z: -0.1703644, w: 0.6862771} + targetToBoneTibia: {x: 0.6842573, y: -0.17830276, z: -0.1783026, w: 0.6842575} --- !u!1 &5681202965352357062 GameObject: m_ObjectHideFlags: 0 @@ -1407,8 +1407,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6159996709595705846} serializedVersion: 2 - m_LocalRotation: {x: -0.19549859, y: -0.000000031247453, z: 0.00000004070294, w: 0.980704} - m_LocalPosition: {x: -1.7673688e-10, y: 2.3283064e-10, z: 0.003021467} + m_LocalRotation: {x: 0.1954988, y: -0.000000015615756, z: 0.000000006675654, w: -0.98070395} + m_LocalPosition: {x: -1.384743e-10, y: 2.3283064e-10, z: 0.0030214665} m_LocalScale: {x: 1.0000001, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -1438,8 +1438,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6316072838432425663} serializedVersion: 2 - m_LocalRotation: {x: -0.2505717, y: -0.0000000460091, z: 0.00000005172026, w: 0.96809804} - m_LocalPosition: {x: 1.709376e-10, y: 9.3132246e-10, z: 0.004176514} + m_LocalRotation: {x: -0.25057188, y: -0.000000018169837, z: 0.000000026922532, w: 0.968098} + m_LocalPosition: {x: 2.010461e-10, y: 0, z: 0.0041765124} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -1469,8 +1469,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6989243030111056437} serializedVersion: 2 - m_LocalRotation: {x: 0.70235085, y: -0.00000014901161, z: 0.000000040978193, w: 0.7118309} - m_LocalPosition: {x: 0, y: 0, z: 0.0019033394} + m_LocalRotation: {x: 0.702351, y: 0.000000089406974, z: -0.0000000074505815, w: 0.7118309} + m_LocalPosition: {x: 0, y: -7.2759576e-11, z: 0.0019033398} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -1606,8 +1606,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7045146692761223360} serializedVersion: 2 - m_LocalRotation: {x: -0.2783754, y: 0.000000111489335, z: -0.00000010702245, w: 0.9604724} - m_LocalPosition: {x: 3.3442643e-10, y: 2.3283064e-10, z: 0.0029819133} + m_LocalRotation: {x: 0.2783753, y: 0.000000016930706, z: -0.00000002319431, w: -0.96047246} + m_LocalPosition: {x: 1.8927215e-10, y: 4.656613e-10, z: 0.0029819133} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -1742,8 +1742,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7120345591145567988} serializedVersion: 2 - m_LocalRotation: {x: 0.6516009, y: -0, z: 0.0000000372529, w: 0.75856197} - m_LocalPosition: {x: 1.1641532e-10, y: -1.7462298e-10, z: 0.003004014} + m_LocalRotation: {x: 0.65160143, y: 0.000000059604645, z: -0.000000014901161, w: 0.75856155} + m_LocalPosition: {x: 0, y: -2.3283064e-10, z: 0.003004016} m_LocalScale: {x: 1, y: 1.0000001, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -1775,7 +1775,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7446482324527034130} serializedVersion: 2 - m_LocalRotation: {x: -0.22205508, y: -0.7431151, z: -0.29594862, w: 0.5575715} + m_LocalRotation: {x: 0.22205523, y: 0.743115, z: 0.2959487, w: -0.5575715} m_LocalPosition: {x: -0.00024003958, y: 0.0020915146, z: -0.0014802816} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1808,8 +1808,8 @@ MonoBehaviour: _phalangesLength: 0 side: 0 target: {fileID: 6594209482403568318} - targetToBoneFemur: {x: -0.075963154, y: 0.7030146, z: 0.70301455, w: -0.07596326} - targetToBoneTibia: {x: 0.5739335, y: 0.41303802, z: 0.41303807, w: 0.57393354} + targetToBoneFemur: {x: -0.07596316, y: 0.7030147, z: 0.7030147, w: -0.07596332} + targetToBoneTibia: {x: 0.5739335, y: 0.41303802, z: 0.413038, w: 0.57393354} --- !u!1 &7711405578978141862 GameObject: m_ObjectHideFlags: 0 @@ -1834,8 +1834,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7711405578978141862} serializedVersion: 2 - m_LocalRotation: {x: -0.27830046, y: 0.0000000015411512, z: -0.000000014116679, w: 0.96049416} - m_LocalPosition: {x: 3.3623582e-10, y: 0, z: 0.0042412234} + m_LocalRotation: {x: -0.27830085, y: -0.000000050483486, z: 0.000000035454306, w: 0.960494} + m_LocalPosition: {x: -1.3067558e-10, y: 0.0000000013969836, z: 0.0042412225} m_LocalScale: {x: 1, y: 0.9999999, z: 0.9999999} m_ConstrainProportionsScale: 0 m_Children: [] @@ -1866,7 +1866,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8096372255630545175} serializedVersion: 2 - m_LocalRotation: {x: 0.17347476, y: -0.7509783, z: -0.21754616, w: -0.598842} + m_LocalRotation: {x: 0.17347448, y: -0.75097847, z: -0.21754584, w: -0.5988421} m_LocalPosition: {x: 0.0008435269, y: 0.0020915149, z: -0.0013045785} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1893,14 +1893,14 @@ MonoBehaviour: _tarsus: {fileID: 8773790806045806296} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0024082726 - _tibiaLength: 0.0041765156 + _femurLength: 0.0024082721 + _tibiaLength: 0.0041765124 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 1136115525120555845} - targetToBoneFemur: {x: 0.6612268, y: -0.25055802, z: -0.25055796, w: 0.66122675} - targetToBoneTibia: {x: 0.58079433, y: -0.40333354, z: -0.40333337, w: 0.5807947} + targetToBoneFemur: {x: 0.661227, y: -0.25055784, z: -0.250558, w: 0.6612268} + targetToBoneTibia: {x: 0.58079445, y: -0.4033335, z: -0.4033334, w: 0.5807946} --- !u!1 &8337622648895462336 GameObject: m_ObjectHideFlags: 0 @@ -2006,8 +2006,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8471587059027499795} serializedVersion: 2 - m_LocalRotation: {x: 0.8119702, y: 0.00000020861626, z: 0.000000029802322, w: 0.583699} - m_LocalPosition: {x: -1.4551915e-10, y: 0, z: 0.0024082721} + m_LocalRotation: {x: 0.81197035, y: -0.000000029802322, z: -0.000000014901161, w: 0.58369875} + m_LocalPosition: {x: 2.910383e-11, y: 1.1641532e-10, z: 0.0024082721} m_LocalScale: {x: 0.9999998, y: 1, z: 1.0000001} m_ConstrainProportionsScale: 0 m_Children: @@ -2039,7 +2039,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8679495084672713308} serializedVersion: 2 - m_LocalRotation: {x: -0.13913096, y: -0.48328662, z: -0.07811364, w: 0.86079895} + m_LocalRotation: {x: 0.13913104, y: 0.48328662, z: 0.07811371, w: -0.86079895} m_LocalPosition: {x: -0.00058102724, y: 0.0022176215, z: -0.0009999603} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -2066,14 +2066,14 @@ MonoBehaviour: _tarsus: {fileID: 5848079605461954508} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0019033394 - _tibiaLength: 0.0029819133 + _femurLength: 0.0019033398 + _tibiaLength: 0.0029819137 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 1817326604091929521} - targetToBoneFemur: {x: -0.5444652, y: 0.45117378, z: 0.45117375, w: -0.5444651} - targetToBoneTibia: {x: -0.42917117, y: -0.5619719, z: -0.5619716, w: -0.4291713} + targetToBoneFemur: {x: -0.54446524, y: 0.45117378, z: 0.45117372, w: -0.54446524} + targetToBoneTibia: {x: -0.42917106, y: -0.5619717, z: -0.56197166, w: -0.42917117} --- !u!1001 &268813082562621446 PrefabInstance: m_ObjectHideFlags: 0 @@ -2084,111 +2084,111 @@ PrefabInstance: m_Modifications: - target: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: -0.028299756 + value: -0.028299745 objectReference: {fileID: 0} - target: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.68439233 + value: 0.6843926 objectReference: {fileID: 0} - target: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.7112683 + value: 0.71126825 objectReference: {fileID: 0} - target: {fileID: 1029475354681230652, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: 0.15780868 + value: 0.1578088 objectReference: {fileID: 0} - target: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.707769 + value: 0.70776916 objectReference: {fileID: 0} - target: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.38709393 + value: 0.38709408 objectReference: {fileID: 0} - target: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: -0.17679389 + value: -0.17679405 objectReference: {fileID: 0} - target: {fileID: 1263868701012706272, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.5638841 + value: -0.5638837 objectReference: {fileID: 0} - target: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.6106675 + value: 0.6106674 objectReference: {fileID: 0} - target: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.25755313 + value: 0.25755337 objectReference: {fileID: 0} - target: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.55356663 + value: 0.5535664 objectReference: {fileID: 0} - target: {fileID: 2249169860784842631, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.5042972 + value: -0.5042975 objectReference: {fileID: 0} - target: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.7585109 + value: 0.7585108 objectReference: {fileID: 0} - target: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.5723845 + value: 0.5723844 objectReference: {fileID: 0} - target: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: -0.008787027 + value: -0.008787205 objectReference: {fileID: 0} - target: {fileID: 2503027901005024184, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.31138423 + value: -0.3113845 objectReference: {fileID: 0} - target: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.32845983 + value: -0.3284599 objectReference: {fileID: 0} - target: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.8921967 + value: -0.89219666 objectReference: {fileID: 0} - target: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.29728103 + value: -0.297281 objectReference: {fileID: 0} - target: {fileID: 3345149696190515415, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.08788225 + value: 0.0878823 objectReference: {fileID: 0} - target: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.47019994 + value: -0.4701999 objectReference: {fileID: 0} - target: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.13349949 + value: -0.13349968 objectReference: {fileID: 0} - target: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.792171 + value: -0.79217106 objectReference: {fileID: 0} - target: {fileID: 4017047771140248673, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.3654518 + value: 0.3654518 objectReference: {fileID: 0} - target: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.032780852 + value: 0.03278097 objectReference: {fileID: 0} - target: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: -0.044934776 + value: -0.044934567 objectReference: {fileID: 0} - target: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.83270484 + value: 0.8327048 objectReference: {fileID: 0} - target: {fileID: 5947375183838201775, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z @@ -2196,35 +2196,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.854021 + value: 0.85402125 objectReference: {fileID: 0} - target: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: -0.32501414 + value: -0.325014 objectReference: {fileID: 0} - target: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.22636889 + value: 0.22636907 objectReference: {fileID: 0} - target: {fileID: 6010885476494126672, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: 0.33729973 + value: 0.33729908 objectReference: {fileID: 0} - target: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: -0.51127905 + value: 0.511279 objectReference: {fileID: 0} - target: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: 0.8116234 + value: -0.8116235 objectReference: {fileID: 0} - target: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.25970218 + value: -0.25970206 objectReference: {fileID: 0} - target: {fileID: 6169236790697830088, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.111426696 + value: 0.11142668 objectReference: {fileID: 0} - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalPosition.x @@ -2240,7 +2240,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x @@ -2248,7 +2248,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z @@ -2260,7 +2260,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalEulerAnglesHint.y - value: 0 + value: 180 objectReference: {fileID: 0} - target: {fileID: 7118996518471498578, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalEulerAnglesHint.z @@ -2268,35 +2268,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.8169423 + value: 0.81694233 objectReference: {fileID: 0} - target: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: -0.4357495 + value: -0.4357496 objectReference: {fileID: 0} - target: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: 0.14708066 + value: 0.14708078 objectReference: {fileID: 0} - target: {fileID: 7288162652962434593, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.34798706 + value: -0.3479869 objectReference: {fileID: 0} - target: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.5855815 + value: 0.5855814 objectReference: {fileID: 0} - target: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: -0.46928173 + value: -0.46928164 objectReference: {fileID: 0} - target: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: -0.6377774 + value: -0.63777745 objectReference: {fileID: 0} - target: {fileID: 7340154801456536036, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: -0.17351954 + value: -0.17351955 objectReference: {fileID: 0} - target: {fileID: 7602095073321034216, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_Name @@ -2304,19 +2304,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.w - value: 0.28808337 + value: 0.28808334 objectReference: {fileID: 0} - target: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.x - value: -0.54234666 + value: -0.5423469 objectReference: {fileID: 0} - target: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.y - value: -0.50765383 + value: -0.5076537 objectReference: {fileID: 0} - target: {fileID: 8763461396776475436, guid: c5354e27a3702dfa6838172d55d2ea6f, type: 3} propertyPath: m_LocalRotation.z - value: 0.60428125 + value: 0.6042811 objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] diff --git a/Samples/Prefabs/LowPolyAntRigged.prefab b/Samples/Prefabs/LowPolyAntRigged.prefab index 4f2eecd..a01628f 100644 --- a/Samples/Prefabs/LowPolyAntRigged.prefab +++ b/Samples/Prefabs/LowPolyAntRigged.prefab @@ -22,7 +22,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.x @@ -30,7 +30,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.z @@ -42,7 +42,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalEulerAnglesHint.y - value: 0 + value: 180 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalEulerAnglesHint.z diff --git a/Samples/Prefabs/LowPolyAnt_old.prefab b/Samples/Prefabs/LowPolyAnt_old.prefab index 3ec3c82..03e0aa3 100644 --- a/Samples/Prefabs/LowPolyAnt_old.prefab +++ b/Samples/Prefabs/LowPolyAnt_old.prefab @@ -192,7 +192,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 590550628866556317} serializedVersion: 2 - m_LocalRotation: {x: 0.47970197, y: -0.42020383, z: 0.28107202, w: 0.7171564} + m_LocalRotation: {x: 0.4919353, y: -0.41531968, z: 0.28823984, w: 0.7088209} m_LocalPosition: {x: -0.00034144553, y: 0.002941784, z: -0.0003939495} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -219,14 +219,14 @@ MonoBehaviour: _tarsus: {fileID: 8247032405819563791} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0009741967 + _femurLength: 0.0009741969 _tibiaLength: 0.0019033399 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 4557280867763525384} - targetToBoneFemur: {x: 0.5951803, y: -0.38178593, z: -0.3817859, w: 0.59518033} - targetToBoneTibia: {x: 0.54446507, y: -0.45117378, z: -0.45117372, w: 0.5444651} + targetToBoneFemur: {x: 0.5951802, y: -0.38178596, z: -0.38178605, w: 0.5951803} + targetToBoneTibia: {x: 0.5444651, y: -0.45117378, z: -0.45117372, w: 0.54446524} --- !u!1 &801023433461010370 GameObject: m_ObjectHideFlags: 0 @@ -742,8 +742,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3090401224450952824} serializedVersion: 2 - m_LocalRotation: {x: 0.46372008, y: -0.4263186, z: 0.2717077, w: 0.72759265} - m_LocalPosition: {x: -0.0014014725, y: 0, z: 0.00020006666} + m_LocalRotation: {x: 0.47970194, y: -0.42020372, z: 0.2810719, w: 0.7171565} + m_LocalPosition: {x: -0.0012997866, y: 0, z: 0.00014308427} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -1144,7 +1144,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4542578395883903081} serializedVersion: 2 - m_LocalRotation: {x: 0.098898955, y: 0.7100854, z: -0.101828225, w: 0.6896585} + m_LocalRotation: {x: 0.098898865, y: 0.7100854, z: -0.10182815, w: 0.6896585} m_LocalPosition: {x: 0.006899408, y: 0, z: -0.0016887018} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1218,8 +1218,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4875690898188437905} serializedVersion: 2 - m_LocalRotation: {x: -0.022121402, y: 0.000000027179832, z: 0.00000001355345, w: 0.9997553} - m_LocalPosition: {x: -1.4848664e-10, y: -7.304474e-11, z: 0.0019033398} + m_LocalRotation: {x: -0.01715672, y: 0.00000006036721, z: -0.00000010379024, w: 0.9998529} + m_LocalPosition: {x: 2.0771995e-11, y: 1.8055825e-10, z: 0.0019033395} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -1273,10 +1273,8 @@ MonoBehaviour: nanoBrain: {fileID: 0} havingFood: name: - clusterPrefab: {fileID: 0} parent: rid: -2 - trace: 0 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -1288,6 +1286,7 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 0 + trace: 0 _receivers: [] references: version: 2 @@ -1319,7 +1318,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4962958793569902001} serializedVersion: 2 - m_LocalRotation: {x: -0.6314459, y: 0.3031451, z: 0.6501487, w: 0.2944246} + m_LocalRotation: {x: -0.631446, y: 0.303145, z: 0.6501488, w: 0.29442447} m_LocalPosition: {x: -0.00024003958, y: 0.0020915146, z: -0.0014802816} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1346,14 +1345,14 @@ MonoBehaviour: _tarsus: {fileID: 7143708260603782485} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0024082721 - _tibiaLength: 0.009540485 + _femurLength: 0.0024082726 + _tibiaLength: 0.009540486 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 8915532165699174383} - targetToBoneFemur: {x: -0.075960286, y: 0.70301497, z: 0.70301497, w: -0.07596032} - targetToBoneTibia: {x: 0.5307571, y: 0.08887554, z: -0.83587766, w: -0.1081977} + targetToBoneFemur: {x: -0.70301497, y: -0.07596016, z: -0.075960286, w: -0.703015} + targetToBoneTibia: {x: 0.53075707, y: 0.088875525, z: -0.8358775, w: -0.108197704} --- !u!1 &5000988579550260823 GameObject: m_ObjectHideFlags: 0 @@ -1378,8 +1377,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5000988579550260823} serializedVersion: 2 - m_LocalRotation: {x: -0.07015571, y: -0.0000000049110245, z: 0.000000020597344, w: 0.9975361} - m_LocalPosition: {x: -8.4513574e-10, y: 9.313226e-10, z: 0.009540481} + m_LocalRotation: {x: -0.07015581, y: 0.00000007702464, z: -0.000000047979437, w: 0.99753606} + m_LocalPosition: {x: 0.0000000010517482, y: -4.656613e-10, z: 0.009540486} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -1409,8 +1408,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5028329744804170079} serializedVersion: 2 - m_LocalRotation: {x: -0.000000029802322, y: 0.000000059604645, z: -0.00000011920929, w: 1} - m_LocalPosition: {x: -8.731149e-11, y: -5.820766e-11, z: 0.0009741969} + m_LocalRotation: {x: 0.00000008940697, y: -0.000000029802322, z: 0.000000044703484, w: 1} + m_LocalPosition: {x: 5.820766e-11, y: 1.7462298e-10, z: 0.0009741969} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -1517,6 +1516,29 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 62f6712fb1e4fb40285b0bb5008716dc, type: 3} m_Name: m_EditorClassIdentifier: + receptor: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + trace: 0 + _receivers: [] + insect: {fileID: 0} + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } --- !u!1 &6049855982455691338 GameObject: m_ObjectHideFlags: 0 @@ -1662,12 +1684,10 @@ MonoBehaviour: touchLeft: {fileID: 3447676861061705183} touchRight: {fileID: 4656736088368465949} nanoBrain: {fileID: 0} - targetDirection: + beat: name: - clusterPrefab: {fileID: 0} parent: rid: -2 - trace: 0 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -1679,13 +1699,12 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 0 + trace: 0 _receivers: [] - hasFood: + pheromoneSteering: name: - clusterPrefab: {fileID: 0} parent: rid: -2 - trace: 0 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -1697,13 +1716,12 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 0 + trace: 0 _receivers: [] foodReceptor: name: - clusterPrefab: {fileID: 0} parent: rid: -2 - trace: 0 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -1715,13 +1733,12 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 0 + trace: 0 _receivers: [] homeReceptor: name: - clusterPrefab: {fileID: 0} parent: rid: -2 - trace: 0 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -1733,6 +1750,41 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 curveMax: 0 + trace: 0 + _receivers: [] + targetDirection: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + trace: 0 + _receivers: [] + hasFood: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + trace: 0 _receivers: [] linearVelocity: {x: 0, y: 0, z: 0} angularVelocity: {x: 0, y: 0, z: 0} @@ -2389,8 +2441,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8962071163487025447} serializedVersion: 2 - m_LocalRotation: {x: 0.97509295, y: -0, z: -0.000000089406974, w: 0.22179665} - m_LocalPosition: {x: -3.092282e-10, y: 5.820766e-11, z: 0.0024082721} + m_LocalRotation: {x: 0.975093, y: -0.000000074505806, z: -0.00000014901161, w: 0.22179647} + m_LocalPosition: {x: 2.582965e-10, y: 0, z: 0.0024082726} m_LocalScale: {x: 0.9999998, y: 1, z: 1.0000001} m_ConstrainProportionsScale: 0 m_Children: @@ -2442,6 +2494,29 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 62f6712fb1e4fb40285b0bb5008716dc, type: 3} m_Name: m_EditorClassIdentifier: + receptor: + name: + parent: + rid: -2 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _curvePreset: 0 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curveMax: 0 + trace: 0 + _receivers: [] + insect: {fileID: 0} + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } --- !u!135 &261149453807160883 SphereCollider: m_ObjectHideFlags: 0 @@ -2576,35 +2651,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: -7142874668923041899, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w - value: 0.55765265 + value: 0.31620914 objectReference: {fileID: 0} - target: {fileID: -7142874668923041899, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.x - value: 0.6142037 + value: -0.46020567 objectReference: {fileID: 0} - target: {fileID: -7142874668923041899, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.y - value: 0.3162089 + value: -0.5576527 objectReference: {fileID: 0} - target: {fileID: -7142874668923041899, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.z - value: 0.46020567 + value: 0.6142035 objectReference: {fileID: 0} - target: {fileID: -6650749816151890519, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w - value: -0.19484976 + value: -0.18781082 objectReference: {fileID: 0} - target: {fileID: -6650749816151890519, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.x - value: -0.54128045 + value: -0.5549577 objectReference: {fileID: 0} - target: {fileID: -6650749816151890519, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.y - value: 0.7928144 + value: 0.78569645 objectReference: {fileID: 0} - target: {fileID: -6650749816151890519, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.z - value: 0.20123237 + value: 0.19857006 objectReference: {fileID: 0} - target: {fileID: -5320003922327391511, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w @@ -2640,19 +2715,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: -3243133469712725800, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w - value: 0.8071078 + value: 0.41213766 objectReference: {fileID: 0} - target: {fileID: -3243133469712725800, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.x - value: -0.31629673 + value: 0.28049234 objectReference: {fileID: 0} - target: {fileID: -3243133469712725800, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.y - value: -0.41213745 + value: 0.80710787 objectReference: {fileID: 0} - target: {fileID: -3243133469712725800, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.z - value: -0.28049242 + value: -0.31629655 objectReference: {fileID: 0} - target: {fileID: 919132149155446097, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_Name @@ -2660,19 +2735,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3520953768647703153, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w - value: 0.9926133 + value: 0.9926134 objectReference: {fileID: 0} - target: {fileID: 3520953768647703153, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.x - value: -0.000000111758716 + value: 0.00000012293457 objectReference: {fileID: 0} - target: {fileID: 3520953768647703153, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.y - value: -0.12132138 + value: -0.12132094 objectReference: {fileID: 0} - target: {fileID: 3520953768647703153, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.z - value: 0.00000005960465 + value: -0.000000029802319 objectReference: {fileID: 0} - target: {fileID: 4019509778734078742, guid: 0de805ada00d79cef8575c1c8977d331, type: 3} propertyPath: m_LocalRotation.w From 09a75aa22eea0b005ec07c8d603cc10ec3bbf6fb Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Wed, 6 May 2026 17:39:56 +0200 Subject: [PATCH 35/38] Multi smell works --- NanoBrain/Editor/ClusterEditor.cs | 52 ++-- NanoBrain/Editor/ClusterViewer.cs | 63 +++-- NanoBrain/Runtime/Scripts/Core/Cluster.cs | 308 ++++++++-------------- NanoBrain/Runtime/Scripts/Core/Neuron.cs | 21 +- NanoBrain/Runtime/Scripts/Core/Nucleus.cs | 9 - Runtime/Scripts/Ant.cs | 105 ++++---- Runtime/Scripts/Odorant.cs | 6 + Samples/Brain/Foraging.asset | 178 ++++++++++--- Samples/Brain/Foraging.asset.meta | 2 +- Samples/Brain/Pheromone.asset | 75 ++++++ Samples/Brain/Pheromone.asset.meta | 8 + Samples/Prefabs/LowPolyAnt Variant.prefab | 243 ++++++++--------- 12 files changed, 569 insertions(+), 501 deletions(-) create mode 100644 Samples/Brain/Pheromone.asset create mode 100644 Samples/Brain/Pheromone.asset.meta diff --git a/NanoBrain/Editor/ClusterEditor.cs b/NanoBrain/Editor/ClusterEditor.cs index b67650c..67764da 100644 --- a/NanoBrain/Editor/ClusterEditor.cs +++ b/NanoBrain/Editor/ClusterEditor.cs @@ -165,25 +165,10 @@ namespace NanoBrain { GUILayout.Label(nucleusType, headerStyle); // Nucleus name - //Cluster cluster = this.currentPrefabNucleus as Cluster; - Cluster cluster = this.currentNucleus as Cluster; - if (cluster != null) { - EditorGUILayout.BeginHorizontal(); - if (GUILayout.Button(this.currentNucleus.parent.name)) - OnClusterClick(cluster); - EditorGUI.BeginDisabledGroup(true); - EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); - EditorGUI.EndDisabledGroup(); - if (GUILayout.Button("Reimport")) - ReimportCluster(cluster); - EditorGUILayout.EndHorizontal(); - } - else { - string newName = EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); - if (newName != this.currentNucleus.name) { - this.currentNucleus.name = newName; - anythingChanged = true; - } + string newName = EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); + if (newName != this.currentNucleus.name) { + this.currentNucleus.name = newName; + anythingChanged = true; } // Current output value @@ -202,7 +187,7 @@ namespace NanoBrain { if (this.currentNucleus is MemoryCell memory) MemoryCellInspector(memory, ref anythingChanged); // Cluster - else if (cluster != null) + else if (this.currentNucleus is Cluster cluster) ClusterInspector(cluster, ref anythingChanged); // Other else @@ -277,8 +262,8 @@ namespace NanoBrain { if (breakOnWake && this.currentNucleus is Neuron currentNeuron) { if (currentNeuron.isSleeping == false) Debug.Break(); - trace = EditorGUILayout.Toggle("Trace", trace); - currentNeuron.trace = trace; + // trace = EditorGUILayout.Toggle("Trace", trace); + // currentNeuron.trace = trace; } } @@ -304,8 +289,6 @@ namespace NanoBrain { Nucleus[] array = null; int elementIx = -1; - //if (this.currentPrefabNucleus is Neuron prefabNeuron && prefabNeuron.synapses.Count > 0) { - // Synapse[] synapses = prefabNeuron.synapses.ToArray(); if (this.currentNucleus is Neuron currentNeuron && currentNeuron.synapses.Count > 0) { Synapse[] synapses = currentNeuron.synapses.ToArray(); foreach (Synapse synapse in synapses) { @@ -345,19 +328,19 @@ namespace NanoBrain { else { EditorGUILayout.BeginHorizontal(); - if (synapse.neuron.parent.prefab != this.currentNucleus.parent.prefab) { + if (synapse.neuron.parent != this.currentNucleus.parent) { // If it is a different cluster GUIStyle labelStyle = new(GUI.skin.label); float labelWidth = 200; - if (synapse.neuron.parent.prefab != null) { - labelWidth = labelStyle.CalcSize(new GUIContent($"{synapse.neuron.parent.prefab.name}.")).x; - GUILayout.Label($"{synapse.neuron.parent.prefab.name}", GUILayout.Width(labelWidth)); + if (synapse.neuron.parent != null) { + labelWidth = labelStyle.CalcSize(new GUIContent($"{synapse.neuron.parent.name}.")).x; + GUILayout.Label($"{synapse.neuron.parent.name}", GUILayout.Width(labelWidth)); } - string[] options = synapse.neuron.parent.prefab.cluster.nuclei.Select(n => n.name).ToArray(); + string[] options = synapse.neuron.parent.nuclei.Select(n => n.name).ToArray(); int selectedIndex = System.Array.IndexOf(options, synapse.neuron.name); int newIndex = EditorGUILayout.Popup(selectedIndex, options); if (newIndex != selectedIndex) { - Neuron newNeuron = synapse.neuron.parent.prefab.cluster.nuclei[newIndex] as Neuron; + Neuron newNeuron = synapse.neuron.parent.nuclei[newIndex] as Neuron; ChangeSynapse(synapse, newNeuron); } } @@ -437,7 +420,7 @@ namespace NanoBrain { } protected virtual void AddNeuronInput(Nucleus nucleus) { - Neuron newNeuron = new (this.currentCluster, "New Neuron"); + Neuron newNeuron = new(this.currentCluster, "New Neuron"); //Neuron newNeuroid = new(this.prefab.cluster, "New neuron"); newNeuron.AddReceiver(nucleus); this.currentNucleus = newNeuron; @@ -453,7 +436,7 @@ namespace NanoBrain { ClusterPickerWindow.ShowPicker(brain => OnClusterPicked(nucleus, brain), "Select Cluster"); } private void OnClusterPicked(Nucleus nucleus, ClusterPrefab selectedPrefab) { - Cluster subclusterInstance = new(selectedPrefab, this.prefab); + Cluster subclusterInstance = new(selectedPrefab, this.currentCluster); subclusterInstance.defaultOutput.AddReceiver(nucleus); } @@ -557,11 +540,6 @@ namespace NanoBrain { AddInput(selectedType, this.currentNucleus); } return connecting; - // if (selectedType == Nucleus.Type.None) - // return false; - - // AddInput(selectedType, this.currentNucleus); - // return true; } protected virtual void ChangeSynapse(Synapse synapse, Neuron newNucleus) { diff --git a/NanoBrain/Editor/ClusterViewer.cs b/NanoBrain/Editor/ClusterViewer.cs index 86ae2a4..1127e5c 100644 --- a/NanoBrain/Editor/ClusterViewer.cs +++ b/NanoBrain/Editor/ClusterViewer.cs @@ -108,7 +108,7 @@ namespace NanoBrain { this.gameObject = gameObject; if (this.currentCluster == null) return; - + if (Application.isPlaying == false) this.serializedBrain = new SerializedObject(this.currentCluster.prefab); this.selectedOutput = this.currentCluster.outputs[0]; @@ -488,14 +488,15 @@ namespace NanoBrain { maxValue = 1; float brightness = siblingNeuron.outputMagnitude / maxValue; color = new Color(brightness, brightness, brightness, 1f); - } DrawNucleus(siblingNeuron, position, size, color); + } + DrawNucleus(siblingNeuron, position, size, color); GUIStyle style = new(EditorStyles.label) { alignment = TextAnchor.UpperCenter, normal = { textColor = Color.white }, fontStyle = FontStyle.Bold, }; Vector3 labelPos = position - Vector3.down * (size + 5); // below neuron - string name = $"{sibling.baseName}.{nucleus.name}"; + string name = $"{sibling.baseName}\n{nucleus.name}"; Handles.Label(labelPos, name, style); row++; } @@ -505,7 +506,7 @@ namespace NanoBrain { protected void DrawOutputs(Vector2 parentPos, float size) { if (this.currentCluster == null) return; - + // Determine the maximum value in this layer // This is used to 'scale' the output value colors of the nuclei float maxValue = 0; @@ -612,18 +613,12 @@ namespace NanoBrain { if (nucleus.parent != null && currentNucleus != null && nucleus.parent != currentNucleus.parent && nucleus.parent is Cluster parentCluster1) { // This neuron is part of another cluster parentCluster1.name ??= ""; - string baseName = ""; int colonPos = parentCluster1.name.IndexOf(":"); + string baseName; if (colonPos > 0 && colonPos < parentCluster1.name.Length - 2) - baseName = parentCluster1.name[..colonPos] + "."; + baseName = parentCluster1.name[..colonPos] + "\n"; else - baseName = parentCluster1.name + "."; - // if (colonPos > 0 && colonPos < parentCluster1.name.Length - 2) { - // // if it is an array, we should not show the :0 of the first element - // //baseName = baseName[..colonPos]; - // Handles.Label(labelPos, baseName + nucleus.name, style); - // } - // else + baseName = parentCluster1.name + "\n"; Handles.Label(labelPos, baseName + nucleus.name, style); } else { @@ -858,22 +853,34 @@ namespace NanoBrain { void OnSceneGUI(SceneView sceneView) { if (this.gameObject != null) { - // if (this.currentNucleus is IReceptor receptor) { - // foreach (Nucleus nucleus in receptor.nucleiArray) { - // if (nucleus is Neuron neuron) { - // Vector3 worldVector = this.gameObject.transform.TransformVector(neuron.outputValue); - // Handles.color = Color.yellow; - // Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); - // } - // } - // } - // else { - if (this.currentNucleus is Neuron currentNeuron) { - Vector3 worldVector = this.gameObject.transform.TransformVector(currentNeuron.outputValue); - Handles.color = Color.yellow; - Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); + + Handles.color = Color.yellow; + if (this.selectedSynapseNeuron != null) { + foreach (Cluster sibling in this.selectedSynapseNeuron.parent.siblingClusters) { + Neuron siblingNeuron = sibling.GetNucleus(this.selectedSynapseNeuron.name) as Neuron; + Vector3 worldVector = this.gameObject.transform.TransformVector(siblingNeuron.outputValue); + Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); + } + // if (this.currentNucleus is Cluster cluster) { + // foreach (Cluster sibling in cluster.siblingClusters) { + + // } + // } + // // if (this.currentNucleus is IReceptor receptor) { + // // foreach (Nucleus nucleus in receptor.nucleiArray) { + // // if (nucleus is Neuron neuron) { + // // Vector3 worldVector = this.gameObject.transform.TransformVector(neuron.outputValue); + // // Handles.color = Color.yellow; + // // Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); + // // } + // // } + } + else { + if (this.currentNucleus is Neuron currentNeuron) { + Vector3 worldVector = this.gameObject.transform.TransformVector(currentNeuron.outputValue); + Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); + } } - // } } } diff --git a/NanoBrain/Runtime/Scripts/Core/Cluster.cs b/NanoBrain/Runtime/Scripts/Core/Cluster.cs index 973c692..329fd3a 100644 --- a/NanoBrain/Runtime/Scripts/Core/Cluster.cs +++ b/NanoBrain/Runtime/Scripts/Core/Cluster.cs @@ -111,13 +111,13 @@ namespace NanoBrain { Neuron synapseNeuron = prefabSynapse.neuron; if (synapseNeuron.parent.prefab != null && synapseNeuron.parent.prefab != this.prefab) { // Neuron is in another cluster, find the cloned cluster first - ClusterPrefab prefabCluster = synapseNeuron.parent.prefab; + Cluster prefabCluster = synapseNeuron.parent; Cluster clonedCluster = this.nuclei.Find(n => n.name == prefabCluster.name) as Cluster; if (clonedCluster == null) continue; // Now find the neuron in that cloned cluster - int neuronIx = GetNucleusIndex(prefabCluster.cluster.nuclei, prefabSynapse.neuron.name); + int neuronIx = GetNucleusIndex(prefabCluster.nuclei, prefabSynapse.neuron.name); if (neuronIx < 0) // Could not find the neuron in the prefab cluster continue; @@ -140,28 +140,6 @@ namespace NanoBrain { // Debug.Log($"Add synapse {clonedSender.name} -> {clonedNeuron.name}"); } } - - // // Copy the receivers, which will also create the synapses - // foreach (Nucleus receiver in prefabNeuron.receivers.ToArray()) { - // int ix = GetNucleusIndex(prefabNuclei, receiver); - // if (ix < 0) - // continue; - - // if (clonedNuclei[ix] is not Nucleus clonedReceiver) - // continue; - - // // Find the synapse for the weight - // float weight = 1; - // foreach (Synapse synapse in receiver.synapses) { - // // Find the weight for this synapse - // if (synapse.neuron == prefabNucleus) { - // weight = synapse.weight; - // break; - // } - // } - - // clonedNeuron.AddReceiver(clonedReceiver, weight); - // } } if (Application.isPlaying) { @@ -191,135 +169,43 @@ namespace NanoBrain { // Ensure that all neurons are computed to initialize bias foreach (Nucleus clonedNucleus in clonedNuclei) { - clonedNucleus.UpdateStateIsolated(); + if (clonedNucleus is not Cluster) + clonedNucleus.UpdateStateIsolated(); } } - /* - for (int nucleusIx = 0; nucleusIx < clonedNuclei.Length; nucleusIx++) { - Nucleus prefabNucleus = prefabNuclei[nucleusIx]; - if (prefabNucleus is not Cluster prefabCluster) - continue; - - if (prefabCluster.instanceCount <= 1) - 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.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; - } - } } - /* - // Collect the subclusters - List subClusters = new(); - foreach (Nucleus nucleus in prefabNuclei) { - foreach (Synapse synapse in nucleus.synapses) { - Nucleus synapseNucleus = synapse.neuron; - Cluster subCluster = synapseNucleus.parent; - if (subCluster is null || - synapseNucleus.clusterPrefab == this.clusterPrefab) { + // private void CloneSynapses(Neuron prefabNeuron, Neuron clonedNeuron) { + // foreach (Synapse prefabSynapse in prefabNeuron.synapses) { + // Neuron synapseNeuron = prefabSynapse.neuron; + // if (synapseNeuron.parent.prefab != null && synapseNeuron.parent.prefab != this.prefab) { + // // Neuron is in another cluster, find the cloned cluster first + // ClusterPrefab prefabCluster = synapseNeuron.parent.prefab; + // Cluster clonedCluster = this.nuclei.Find(n => n.name == prefabCluster.name) as Cluster; + // if (clonedCluster == null) + // continue; - continue; - } - // if (synapseNucleus is not Cluster subCluster) - // continue; - if (subClusters.Contains(subCluster)) - continue; - subClusters.Add(subCluster); - } - } - // Create the subcluster instances - foreach (Cluster subCluster in subClusters) { - for (int ix = 0; ix < subCluster.instanceCount; ix++) { - // create the new instance - Cluster clusterInstance = new(subCluster.prefab); - // connect it - foreach ((Neuron sender, Nucleus receiver) in subCluster.CollectConnections()) { - int receiverIx = GetNucleusIndex(prefabNuclei, receiver); - if (receiverIx < 0) - continue; + // // Now find the neuron in that cloned cluster + // int neuronIx = GetNucleusIndex(prefabCluster.cluster.nuclei, prefabSynapse.neuron.name); + // if (neuronIx < 0) + // // Could not find the neuron in the prefab cluster + // continue; + // if (clonedCluster.nuclei[neuronIx] is not Neuron clonedSender) + // // Could not find the neuron in the cloned cluster + // continue; - if (clonedNuclei[receiverIx] is not Nucleus clonedReceiver) - continue; + // clonedSender.AddReceiver(clonedNeuron, prefabSynapse.weight); + // //Debug.Log($"Add synapse {clonedCluster.name}.{clonedSender.name} -> {clonedNeuron.name} [{clonedSender.receivers.Count}]"); + // } + // else { + // Neuron clonedSender = this.nuclei.Find(n => n.name == prefabSynapse.neuron.name) as Neuron; + // // Copy the receivers which will also create the synapse + // clonedSender.AddReceiver(clonedNeuron, prefabSynapse.weight); + // // Debug.Log($"Add synapse {clonedSender.name} -> {clonedNeuron.name}"); + // } + // } - // Find the synapse for the weight - float weight = 1; - foreach (Synapse synapse in receiver.synapses) { - // Find the weight for this synapse - if (synapse.neuron == sender) { - weight = synapse.weight; - break; - } - } - - if (clusterInstance.GetNucleus(sender.name) is not Neuron clonedSender) - continue; - - clonedSender.AddReceiver(clonedReceiver, weight); - } - } - } - */ - - // foreach (Nucleus nucleus in this.clusterNuclei) { - // if (nucleus is Cluster clonedSubCluster) - // RestoreAllExternalReceivers(clonedSubCluster, this.prefab, this); - // } - } - - private void CloneSynapses(Neuron prefabNeuron, Neuron clonedNeuron) { - foreach (Synapse prefabSynapse in prefabNeuron.synapses) { - Neuron synapseNeuron = prefabSynapse.neuron; - if (synapseNeuron.parent.prefab != null && synapseNeuron.parent.prefab != this.prefab) { - // Neuron is in another cluster, find the cloned cluster first - ClusterPrefab prefabCluster = synapseNeuron.parent.prefab; - Cluster clonedCluster = this.nuclei.Find(n => n.name == prefabCluster.name) as Cluster; - if (clonedCluster == null) - continue; - - // Now find the neuron in that cloned cluster - int neuronIx = GetNucleusIndex(prefabCluster.cluster.nuclei, prefabSynapse.neuron.name); - if (neuronIx < 0) - // Could not find the neuron in the prefab cluster - continue; - if (clonedCluster.nuclei[neuronIx] is not Neuron clonedSender) - // Could not find the neuron in the cloned cluster - continue; - - clonedSender.AddReceiver(clonedNeuron, prefabSynapse.weight); - //Debug.Log($"Add synapse {clonedCluster.name}.{clonedSender.name} -> {clonedNeuron.name} [{clonedSender.receivers.Count}]"); - } - else { - Neuron clonedSender = this.nuclei.Find(n => n.name == prefabSynapse.neuron.name) as Neuron; - // Copy the receivers which will also create the synapse - clonedSender.AddReceiver(clonedNeuron, prefabSynapse.weight); - // Debug.Log($"Add synapse {clonedSender.name} -> {clonedNeuron.name}"); - } - } - - } + // } /// /// Sort the nuclei in a correct evaluation order @@ -537,43 +423,43 @@ namespace NanoBrain { } } - public virtual Cluster GetThingCluster() { - Cluster selectedCluster = SelectCluster(); - return selectedCluster; - } - public virtual Cluster GetThingCluster(int thingId, string thingName = null) { - if (thingClusters.TryGetValue(thingId, out Cluster cluster)) - return cluster; + // public virtual Cluster GetThingCluster() { + // Cluster selectedCluster = SelectCluster(); + // return selectedCluster; + // } + // public virtual Cluster GetThingCluster(int thingId, string thingName = null) { + // if (thingClusters.TryGetValue(thingId, out Cluster cluster)) + // return cluster; - Cluster selectedCluster = SelectCluster(); - selectedCluster.name = baseName + ": " + thingName; - thingClusters[thingId] = selectedCluster; - return selectedCluster; - } + // Cluster selectedCluster = SelectCluster(); + // selectedCluster.name = baseName + ": " + thingName; + // thingClusters[thingId] = selectedCluster; + // return selectedCluster; + // } - private Cluster SelectCluster() { - if (this.siblingClusters == null) - return this; + // private Cluster SelectCluster() { + // if (this.siblingClusters == null) + // return this; - // Find a sleeping cluster - // foreach (Cluster cluster in this.siblingClusters) { - // if (cluster.defaultOutput.isSleeping) { - // RemoveThingCluster(cluster); - // return cluster; - // } - // } + // // Find a sleeping cluster + // // foreach (Cluster cluster in this.siblingClusters) { + // // if (cluster.defaultOutput.isSleeping) { + // // RemoveThingCluster(cluster); + // // return cluster; + // // } + // // } - // Find longest unused cluster - // Note this uses the default output... - Cluster unusedCluster = this.siblingClusters[0]; - for (int ix = 1; ix < this.siblingClusters.Length; ix++) { - if (this.siblingClusters[ix].defaultOutput.lastUpdate < unusedCluster.defaultOutput.lastUpdate) - unusedCluster = this.siblingClusters[ix]; - } + // // Find longest unused cluster + // // Note this uses the default output... + // Cluster unusedCluster = this.siblingClusters[0]; + // for (int ix = 1; ix < this.siblingClusters.Length; ix++) { + // if (this.siblingClusters[ix].defaultOutput.lastUpdate < unusedCluster.defaultOutput.lastUpdate) + // unusedCluster = this.siblingClusters[ix]; + // } - RemoveThingCluster(unusedCluster); - return unusedCluster; - } + // RemoveThingCluster(unusedCluster); + // return unusedCluster; + // } private void RemoveThingCluster(Cluster cluster) { List keysToRemove = new(); @@ -756,8 +642,8 @@ namespace NanoBrain { else { string nucleusName0 = nucleusName + ": 0"; foreach (Nucleus nucleus in this.nuclei) { - if (nucleus is Cluster) { //IReceptor receptor) { - if (nucleus.name == nucleusName | nucleus.name == nucleusName0) + if (nucleus is Cluster) { + if (nucleus.name == nucleusName || nucleus.name == nucleusName0) return nucleus; } else if (nucleus.name == nucleusName) @@ -775,6 +661,51 @@ namespace NanoBrain { return null; } + public Neuron GetNeuron(int thingId, string neuronName, string thingName = null) { + if (this.siblingClusters == null || this.siblingClusters.Length <= 1) + return this.GetNeuron(neuronName); + + // See if we are already using a cluster for thingId + if (thingClusters.TryGetValue(thingId, out Cluster cluster)) + return cluster.GetNeuron(neuronName); + + // Find the cluster with the lowest value neuron + Neuron lowestNeuron = null; + foreach (Cluster sibling in this.siblingClusters) { + Neuron neuron = sibling.GetNeuron(neuronName); + if (lowestNeuron == null || neuron.outputMagnitude < lowestNeuron.outputMagnitude) + lowestNeuron = neuron; + } + Cluster selectedCluster = lowestNeuron.parent; + RemoveThingCluster(selectedCluster); + selectedCluster.name = baseName + ": " + thingName; + thingClusters[thingId] = selectedCluster; + return lowestNeuron; + /* + // Find a sleeping cluster + // foreach (Cluster cluster in this.siblingClusters) { + // if (cluster.defaultOutput.isSleeping) { + // RemoveThingCluster(cluster); + // return cluster; + // } + // } + + // Find longest unused cluster + // Note this uses the default output... + Cluster unusedCluster = this.siblingClusters[0]; + for (int ix = 1; ix < this.siblingClusters.Length; ix++) { + if (this.siblingClusters[ix].defaultOutput.lastUpdate < unusedCluster.defaultOutput.lastUpdate) + unusedCluster = this.siblingClusters[ix]; + } + + RemoveThingCluster(unusedCluster); + //return unusedCluster; + + Cluster cluster = GetThingCluster(thingId, thingName); + Neuron neuron = cluster?.GetNeuron(neuronName); + return neuron; + */ + } public bool DeleteNucleus(Nucleus nucleus) { if (this.nuclei.Contains(nucleus) == false) { // Try to find the nucleus by name @@ -883,27 +814,19 @@ namespace NanoBrain { } List computeOrder = this.computeOrders[startNucleus]; - //if (startNucleus.trace) - // Debug.Log($"Update from {startNucleus.name}"); foreach (Nucleus nucleus in computeOrder) { if (nucleus is not Cluster) { nucleus.UpdateStateIsolated(); - //if (startNucleus.trace && nucleus is Neuron neuron) - // Debug.Log($" {nucleus.name}"); if (nucleus is Neuron neuron) { foreach (Nucleus receiver in neuron.receivers) { if (receiver.parent != this) { - Debug.Log($" External: {receiver.parent.name}.{receiver.name}"); + //Debug.Log($" External: {receiver.parent.name}.{receiver.name}"); receiver.parent.UpdateFromNucleus(receiver); } } } } } - - // continue in parent - //this.parent?.UpdateFromNucleus(this); - UpdateNuclei(); } @@ -911,6 +834,7 @@ namespace NanoBrain { throw new Exception("Cluster should not be updated!"); } + // Don't think this does anything anymore... public override void UpdateNuclei() { foreach (Nucleus nucleus in this.nuclei) nucleus.UpdateNuclei(); @@ -921,9 +845,9 @@ namespace NanoBrain { public void Refresh() { // This should not be needed, but somehow somewhere the parent is changed... foreach (Nucleus nucleus in this.nuclei) { - if (nucleus is not Neuron neuron) - continue; - neuron.parent = this; + // if (nucleus is not Neuron neuron) + // continue; + nucleus.parent = this; } RefreshOutputs(); RefreshComputeOrders(); diff --git a/NanoBrain/Runtime/Scripts/Core/Neuron.cs b/NanoBrain/Runtime/Scripts/Core/Neuron.cs index 43b6507..4869615 100644 --- a/NanoBrain/Runtime/Scripts/Core/Neuron.cs +++ b/NanoBrain/Runtime/Scripts/Core/Neuron.cs @@ -276,16 +276,11 @@ namespace NanoBrain { public float outputSqrMagnitude => _outputValue.sqrMagnitude; #endif - public bool isFiring { - get { - //SleepCheck(); - return this.outputMagnitude > 0.5f; - } - } + public bool isFiring => this.outputMagnitude > 0.5f; public Action WhenFiring; public bool persistOutput = false; - public virtual bool isSleeping => persistOutput ? false : (Time.time - this.lastUpdate > this.timeToSleep); + public virtual bool isSleeping => !persistOutput && (Time.time - this.lastUpdate > this.timeToSleep); public void SleepCheck() { if (this.isSleeping) { #if UNITY_MATHEMATICS @@ -299,9 +294,9 @@ namespace NanoBrain { /// /// Toggle for printing debugging trace data /// - public bool trace = false; + //public bool trace = false; - [NonSerialized] + //[NonSerialized] public float lastUpdate = 0; public readonly float timeToSleep = 1f; @@ -624,7 +619,13 @@ namespace NanoBrain { #endregion Receivers - public override void ProcessStimulus(Vector3 inputValue) { + /// + /// Process an external stimulus + /// + /// The value of the stimulus + /// The id of the thing causing the stimulus + /// The name of the thing causing the stimulus + public virtual void ProcessStimulus(Vector3 inputValue) { this.lastUpdate = Time.time; this.bias = inputValue; this.parent?.UpdateFromNucleus(this); diff --git a/NanoBrain/Runtime/Scripts/Core/Nucleus.cs b/NanoBrain/Runtime/Scripts/Core/Nucleus.cs index 5c91a4a..594fd57 100644 --- a/NanoBrain/Runtime/Scripts/Core/Nucleus.cs +++ b/NanoBrain/Runtime/Scripts/Core/Nucleus.cs @@ -142,15 +142,6 @@ public abstract class Nucleus { // this.parent.UpdateFromNucleus(this); // } - /// - /// Process an external stimulus - /// - /// The value of the stimulus - /// The id of the thing causing the stimulus - /// The name of the thing causing the stimulus - public virtual void ProcessStimulus(Vector3 inputValue) { //, int thingId = 0, string thingName = "") { - } - #endregion Update } diff --git a/Runtime/Scripts/Ant.cs b/Runtime/Scripts/Ant.cs index ec2eb22..c4c1265 100644 --- a/Runtime/Scripts/Ant.cs +++ b/Runtime/Scripts/Ant.cs @@ -42,10 +42,10 @@ namespace CreatureControl { /// like placing pheromones public Neuron beat; - public Neuron pheromoneSteering; public Neuron foodReceptor; public Neuron homeReceptor; - public Neuron foodSmell; + public Cluster foodReceptors; + public Cluster homeReceptors; // brain output public Neuron targetDirection; @@ -71,10 +71,11 @@ namespace CreatureControl { touchRight.receptor = brain.GetNucleus("Hit Right") as Neuron; this.foodReceptor = brain.GetNucleus("Food Receptor") as Neuron; this.homeReceptor = brain.GetNucleus("Home Receptor") as Neuron; - this.pheromoneSteering = brain.GetNucleus("Pheromone Steering") as Neuron; + this.foodReceptors = brain.GetNucleus("Food Receptors") as Cluster; + this.homeReceptors = brain.GetNucleus("Home Receptors") as Cluster; //--- brain outputs - this.targetDirection = brain.GetNucleus("Output") as Neuron; + this.targetDirection = brain.GetNucleus("Movement") as Neuron; this.hasFood = brain.GetNucleus("Having Food") as Neuron; } } @@ -106,18 +107,23 @@ namespace CreatureControl { #region Update + private int foodPheromoneIx = 0; void PlaceFoodPheromone() { if (foodPheromonePrefab == null) return; GameObject pheromoneObj = Instantiate(foodPheromonePrefab); + pheromoneObj.name = $"To Food {foodPheromoneIx++}"; pheromoneObj.transform.position = this.model.position; } + + private int homePheromoneIx = 0; void PlaceHomePheromone() { if (homePheromonePrefab == null) return; GameObject pheromoneObj = Instantiate(homePheromonePrefab); + pheromoneObj.name = $"To Home {homePheromoneIx++}"; pheromoneObj.transform.position = this.model.position; } @@ -163,9 +169,13 @@ namespace CreatureControl { // Set random direction to simulate noisy smells perception // which will result in a bit of random walking when no clear // smells are received - float randomAngle = Random.Range(-smellAngle/4, smellAngle/4); - Vector3 randomDirection = Quaternion.AngleAxis(randomAngle, Vector3.up) * Vector3.forward; + float randomAngle = Random.Range(-smellAngle, smellAngle); + Vector3 randomDirection = Quaternion.AngleAxis(randomAngle, Vector3.up) * Vector3.forward * 0.01f; foodReceptor?.SetBias(randomDirection); + randomAngle = Random.Range(-smellAngle, smellAngle); + randomDirection = Quaternion.AngleAxis(randomAngle, Vector3.up) * Vector3.forward * 0.01f; + homeReceptor?.SetBias(randomDirection); + yield return _waitForSeconds3; } } @@ -174,61 +184,50 @@ namespace CreatureControl { Collider[] colliders = Physics.OverlapSphere(this.transform.position, smellRadius); foreach (Collider collider in colliders) { SmellPheromones(collider); - SmellFood(collider); - SmellHome(collider); } } void SmellPheromones(Collider thing) { - Pheromone pheromone = thing.GetComponentInParent(); - if (pheromone == null) - return; - - Vector3 smellDirection = this.transform.InverseTransformPoint(pheromone.transform.position); + Vector3 smellDirection = this.transform.InverseTransformPoint(thing.transform.position); float distance = smellDirection.magnitude; float angle = Vector3.Angle(Vector3.forward, smellDirection); + if (angle < smellAngle && smellDirection.magnitude > 0.01) { - float intensity = pheromone.StrengthAt(distance); - Vector3 smell = smellDirection.normalized * intensity; - switch (pheromone.type) { - case Pheromone.Type.Food: - foodReceptor?.ProcessStimulus(smell); - break; - case Pheromone.Type.Home: - homeReceptor?.ProcessStimulus(smell); - break; + // float intensity = pheromone.StrengthAt(distance); + // Vector3 smell = smellDirection.normalized * intensity; + Vector3 smell = Vector3.zero; + + int id = thing.GetInstanceID(); + Neuron receptor = null; + + Pheromone pheromone = thing.GetComponentInParent(); + if (pheromone != null) { + // multiply by distance to compensate for strong and weak smells + smell = pheromone.StrengthAt(smellDirection) * distance / 10; + switch (pheromone.type) { + case Pheromone.Type.Food: + receptor = foodReceptors?.GetNeuron(id, "Output", pheromone.name); + //Debug.DrawRay(this.transform.position, this.transform.rotation * smell, Color.magenta); + break; + case Pheromone.Type.Home: + receptor = homeReceptors?.GetNeuron(id, "Output", pheromone.name); + //Debug.DrawRay(this.transform.position, this.transform.rotation * smell, Color.cyan); + break; + } } - // Debug.DrawLine(this.transform.position, pheromone.transform.position, Color.magenta); - } - } - - void SmellFood(Collider thing) { - Food food = thing.GetComponentInParent(); - if (food == null) - return; - - Vector3 smellDirection = this.transform.InverseTransformPoint(food.transform.position); - float distance = smellDirection.magnitude; - float angle = Vector3.Angle(Vector3.forward, smellDirection); - if (angle < smellAngle && distance > 0.01) { - float intensity = food.StrengthAt(distance); - foodReceptor?.ProcessStimulus(smellDirection.normalized * intensity); - //Debug.DrawLine(this.transform.position, food.transform.position, Color.red); - } - } - - void SmellHome(Collider thing) { - AntsNest nest = thing.GetComponentInParent(); - if (nest == null) - return; - - Vector3 smellDirection = this.transform.InverseTransformPoint(nest.transform.position); - float distance = smellDirection.magnitude; - float angle = Vector3.Angle(Vector3.forward, smellDirection); - if (angle < smellAngle && distance > 0.01) { - float intensity = nest.StrengthAt(distance); - homeReceptor?.ProcessStimulus(smellDirection.normalized * intensity); - //Debug.DrawLine(this.transform.position, nest.transform.position, Color.red); + Food food = thing.GetComponentInParent(); + if (food != null) { + receptor = foodReceptors?.GetNeuron(id, "Output", food.name); + smell = food.StrengthAt(smellDirection) * distance / 10; + //Debug.DrawRay(this.transform.position, this.transform.rotation * smell, Color.magenta); + } + AntsNest home = thing.GetComponentInParent(); + if (home != null) { + receptor = homeReceptors?.GetNeuron(id, "Output", home.name); + smell = home.StrengthAt(smellDirection) * distance / 10; + //Debug.DrawRay(this.transform.position, this.transform.rotation * smell, Color.cyan); + } + receptor?.ProcessStimulus(smell); } } diff --git a/Runtime/Scripts/Odorant.cs b/Runtime/Scripts/Odorant.cs index 0046e4f..97573b9 100644 --- a/Runtime/Scripts/Odorant.cs +++ b/Runtime/Scripts/Odorant.cs @@ -12,6 +12,12 @@ namespace CreatureControl { float intensity = this.strength / (4.0f * Mathf.PI * distance * distance); return intensity; } + public Vector3 StrengthAt(Vector3 localPosition) { + float magnitude = localPosition.magnitude; + float intensity = StrengthAt(magnitude); + Vector3 intensity3 = localPosition.normalized * intensity; + return intensity3; + } } } \ No newline at end of file diff --git a/Samples/Brain/Foraging.asset b/Samples/Brain/Foraging.asset index eb473f0..519d1b3 100644 --- a/Samples/Brain/Foraging.asset +++ b/Samples/Brain/Foraging.asset @@ -33,6 +33,8 @@ MonoBehaviour: - rid: 4201949834634854857 - rid: 4201949834634854858 - rid: 4201949854258954578 + - rid: 4201949854258954866 + - rid: 4201949854258955200 references: version: 2 RefIds: @@ -41,20 +43,20 @@ MonoBehaviour: - rid: 4201949831649034325 type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} data: - name: Output + name: Movement parent: - rid: 4201949854258954746 + rid: 4201949861964939451 bias: {x: 0, y: 0, z: 1} _synapses: - neuron: rid: 4201949831649034327 - weight: 1 + weight: 4 - neuron: rid: 4201949834634854855 - weight: 1 + weight: 0.8 - neuron: rid: 4201949834634854857 - weight: 1 + weight: 0.8 combinator: 0 _curvePreset: 0 curve: @@ -83,14 +85,14 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 persistOutput: 0 - trace: 0 + lastUpdate: 0 _receivers: [] - rid: 4201949831649034327 type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} data: name: Collision parent: - rid: 4201949854258954746 + rid: 4201949861964939451 bias: {x: 0, y: 0, z: 0} _synapses: - neuron: @@ -127,7 +129,7 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 persistOutput: 0 - trace: 0 + lastUpdate: 0 _receivers: - rid: 4201949831649034325 - rid: 4201949834634854801 @@ -136,7 +138,7 @@ MonoBehaviour: data: name: Hit Left parent: - rid: 4201949854258954746 + rid: 4201949861964939451 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -167,7 +169,7 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 persistOutput: 0 - trace: 0 + lastUpdate: 0 _receivers: - rid: 4201949831649034327 - rid: 4201949831649034329 @@ -175,7 +177,7 @@ MonoBehaviour: data: name: Hit Right parent: - rid: 4201949854258954746 + rid: 4201949861964939451 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -206,7 +208,7 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 persistOutput: 0 - trace: 0 + lastUpdate: 0 _receivers: - rid: 4201949831649034327 - rid: 4201949834634854702 @@ -214,7 +216,7 @@ MonoBehaviour: data: name: Beat parent: - rid: 4201949854258954746 + rid: 4201949861964939451 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -245,7 +247,7 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 persistOutput: 0 - trace: 0 + lastUpdate: 0 _receivers: - rid: 4201949834634854704 - rid: 4201949854258954578 @@ -254,7 +256,7 @@ MonoBehaviour: data: name: Home Pheromones parent: - rid: 4201949854258954746 + rid: 4201949861964939451 bias: {x: 1, y: 1, z: 1} _synapses: - neuron: @@ -291,16 +293,19 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 persistOutput: 0 - trace: 0 + lastUpdate: 0 _receivers: [] - rid: 4201949834634854727 type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} data: name: Food Receptor parent: - rid: 4201949854258954746 + rid: 4201949861964939451 bias: {x: 0, y: 0, z: 0} - _synapses: [] + _synapses: + - neuron: + rid: 4201949854258954867 + weight: 1 combinator: 0 _curvePreset: 0 curve: @@ -329,7 +334,7 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 persistOutput: 0 - trace: 0 + lastUpdate: 0 _receivers: - rid: 4201949834634854857 - rid: 4201949834634854801 @@ -337,7 +342,7 @@ MonoBehaviour: data: name: Mouth parent: - rid: 4201949854258954746 + rid: 4201949861964939451 bias: {x: 0, y: 0, z: 0} _synapses: - neuron: @@ -371,14 +376,14 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 persistOutput: 0 - trace: 0 + lastUpdate: 0 _receivers: [] - rid: 4201949834634854833 type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} data: name: Having Food parent: - rid: 4201949854258954746 + rid: 4201949861964939451 bias: {x: 0, y: 0, z: 0} _synapses: [] combinator: 0 @@ -409,7 +414,7 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 persistOutput: 1 - trace: 0 + lastUpdate: 0 _receivers: - rid: 4201949834634854855 - rid: 4201949834634854858 @@ -419,7 +424,7 @@ MonoBehaviour: data: name: Home Smell parent: - rid: 4201949854258954746 + rid: 4201949861964939451 bias: {x: 1, y: 1, z: 1} _synapses: - neuron: @@ -456,7 +461,7 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 persistOutput: 0 - trace: 0 + lastUpdate: 0 _receivers: - rid: 4201949831649034325 - rid: 4201949834634854856 @@ -464,9 +469,12 @@ MonoBehaviour: data: name: Home Receptor parent: - rid: 4201949854258954746 + rid: 4201949861964939451 bias: {x: 0, y: 0, z: 0} - _synapses: [] + _synapses: + - neuron: + rid: 4201949854258955201 + weight: 1 combinator: 0 _curvePreset: 0 curve: @@ -495,7 +503,7 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 persistOutput: 0 - trace: 0 + lastUpdate: 0 _receivers: - rid: 4201949834634854855 - rid: 4201949834634854857 @@ -503,7 +511,7 @@ MonoBehaviour: data: name: Food Smell parent: - rid: 4201949854258954746 + rid: 4201949861964939451 bias: {x: 1, y: 1, z: 1} _synapses: - neuron: @@ -540,7 +548,7 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 persistOutput: 0 - trace: 0 + lastUpdate: 0 _receivers: - rid: 4201949831649034325 - rid: 4201949834634854858 @@ -548,7 +556,7 @@ MonoBehaviour: data: name: Not having Food parent: - rid: 4201949854258954746 + rid: 4201949861964939451 bias: {x: 1, y: 1, z: 1} _synapses: - neuron: @@ -582,7 +590,7 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 persistOutput: 1 - trace: 0 + lastUpdate: 0 _receivers: - rid: 4201949834634854857 - rid: 4201949834634854704 @@ -591,7 +599,7 @@ MonoBehaviour: data: name: Food Pheromones parent: - rid: 4201949854258954746 + rid: 4201949861964939451 bias: {x: 1, y: 1, z: 1} _synapses: - neuron: @@ -628,9 +636,107 @@ MonoBehaviour: m_RotationOrder: 4 curveMax: 1 persistOutput: 0 - trace: 0 + lastUpdate: 0 _receivers: [] - - rid: 4201949854258954746 + - rid: 4201949854258954866 + type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Food Receptors + parent: + rid: 4201949861964939451 + prefab: {fileID: 11400000, guid: 13516cb1b506d662db7775f7cd16dbca, type: 2} + instanceCount: 6 + nuclei: + - rid: 4201949854258954867 + - rid: 4201949854258954867 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Output + parent: + rid: 4201949854258954866 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + persistOutput: 0 + lastUpdate: 0 + _receivers: + - rid: 4201949834634854727 + - rid: 4201949854258955200 + type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Home Receptors + parent: + rid: 4201949861964939451 + prefab: {fileID: 11400000, guid: 13516cb1b506d662db7775f7cd16dbca, type: 2} + instanceCount: 6 + nuclei: + - rid: 4201949854258955201 + - rid: 4201949854258955201 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Output + parent: + rid: 4201949854258955200 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + persistOutput: 0 + lastUpdate: 0 + _receivers: + - rid: 4201949834634854856 + - rid: 4201949861964939451 type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} data: name: Foraging @@ -653,3 +759,5 @@ MonoBehaviour: - rid: 4201949834634854857 - rid: 4201949834634854858 - rid: 4201949854258954578 + - rid: 4201949854258954866 + - rid: 4201949854258955200 diff --git a/Samples/Brain/Foraging.asset.meta b/Samples/Brain/Foraging.asset.meta index 551433b..ebe1a03 100644 --- a/Samples/Brain/Foraging.asset.meta +++ b/Samples/Brain/Foraging.asset.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c8e4b0990eb7dbbc4bee34addd9cd2b8 +guid: 17e54c217d4c2a8daa851222f0591dd2 NativeFormatImporter: externalObjects: {} mainObjectFileID: 11400000 diff --git a/Samples/Brain/Pheromone.asset b/Samples/Brain/Pheromone.asset new file mode 100644 index 0000000..753afdc --- /dev/null +++ b/Samples/Brain/Pheromone.asset @@ -0,0 +1,75 @@ +%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: Pheromone + m_EditorClassIdentifier: + cluster: + name: + parent: + rid: -2 + prefab: {fileID: 11400000} + instanceCount: 1 + nuclei: + - rid: 4201949854258954854 + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } + - rid: 4201949854258954854 + type: {class: Neuron, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: Output + parent: + rid: 4201949854258954855 + bias: {x: 0, y: 0, z: 0} + _synapses: [] + combinator: 0 + _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 + persistOutput: 0 + trace: 0 + _receivers: [] + - rid: 4201949854258954855 + type: {class: Cluster, ns: NanoBrain, asm: Assembly-CSharp} + data: + name: + parent: + rid: -2 + prefab: {fileID: 11400000} + instanceCount: 1 + nuclei: + - rid: 4201949854258954854 diff --git a/Samples/Brain/Pheromone.asset.meta b/Samples/Brain/Pheromone.asset.meta new file mode 100644 index 0000000..a5ec799 --- /dev/null +++ b/Samples/Brain/Pheromone.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 13516cb1b506d662db7775f7cd16dbca +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Prefabs/LowPolyAnt Variant.prefab b/Samples/Prefabs/LowPolyAnt Variant.prefab index 56af8da..ad17fb4 100644 --- a/Samples/Prefabs/LowPolyAnt Variant.prefab +++ b/Samples/Prefabs/LowPolyAnt Variant.prefab @@ -25,7 +25,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 143286242955637876} serializedVersion: 2 - m_LocalRotation: {x: -0.22205506, y: -0.7431153, z: -0.29594883, w: 0.55757105} + m_LocalRotation: {x: -0.22205536, y: -0.74311525, z: -0.2959492, w: 0.55757093} m_LocalPosition: {x: -0.00024003958, y: 0.0020915146, z: -0.0014802816} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -52,14 +52,14 @@ MonoBehaviour: _tarsus: {fileID: 8196205064751031824} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0024082733 - _tibiaLength: 0.0041295574 + _femurLength: 0.0024082724 + _tibiaLength: 0.0041295583 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 6415599125966866927} - targetToBoneFemur: {x: 0.0759626, y: -0.70301473, z: -0.70301485, w: 0.075962685} - targetToBoneTibia: {x: -0.5739337, y: -0.41303778, z: -0.41303787, w: -0.5739338} + targetToBoneFemur: {x: 0.075962596, y: -0.70301473, z: -0.7030147, w: 0.07596261} + targetToBoneTibia: {x: -0.5739338, y: -0.41303772, z: -0.41303757, w: -0.57393384} --- !u!1 &705568938082032721 GameObject: m_ObjectHideFlags: 0 @@ -86,8 +86,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 705568938082032721} serializedVersion: 2 - m_LocalRotation: {x: -0.03981568, y: 0.9599673, z: -0.18536556, w: -0.20619665} - m_LocalPosition: {x: -0.0025763502, y: 0, z: -0.007210666} + m_LocalRotation: {x: -0.039815743, y: 0.95996726, z: -0.18536565, w: -0.20619684} + m_LocalPosition: {x: -0.0025763516, y: 0, z: -0.007210664} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -160,8 +160,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 771417713020922740} serializedVersion: 2 - m_LocalRotation: {x: 0.50033474, y: -0.000000014901159, z: -0.0000000037252899, w: 0.86583203} - m_LocalPosition: {x: 0, y: 1.4551915e-11, z: 0.0019033401} + m_LocalRotation: {x: 0.500335, y: -0, z: -0.000000012107192, w: 0.86583185} + m_LocalPosition: {x: 0, y: 0, z: 0.0019033398} m_LocalScale: {x: 0.99999994, y: 1, z: 0.99999994} m_ConstrainProportionsScale: 0 m_Children: @@ -194,8 +194,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 854478626558788248} serializedVersion: 2 - m_LocalRotation: {x: 0.13480826, y: 0.7633578, z: -0.16905655, w: 0.60871303} - m_LocalPosition: {x: 0.0052212873, y: 0, z: -0.0023041023} + m_LocalRotation: {x: 0.1348082, y: 0.7633578, z: -0.1690565, w: 0.6087131} + m_LocalPosition: {x: 0.005221286, y: 0, z: -0.002304102} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -302,8 +302,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1083078033105624184} serializedVersion: 2 - m_LocalRotation: {x: 0.7023513, y: 0.000000029802322, z: -0.000000052154064, w: 0.7118305} - m_LocalPosition: {x: 1.1641532e-10, y: -2.910383e-11, z: 0.0019033394} + m_LocalRotation: {x: 0.7023515, y: -0.00000014901161, z: 0.000000048428774, w: 0.7118304} + m_LocalPosition: {x: 2.910383e-10, y: -8.731149e-11, z: 0.0019033398} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -506,8 +506,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2032809585173054758} serializedVersion: 2 - m_LocalRotation: {x: 0.6516017, y: -0.000000059604645, z: 0.000000022351742, w: 0.7585614} - m_LocalPosition: {x: -1.1641532e-10, y: -5.820766e-11, z: 0.0030040154} + m_LocalRotation: {x: 0.6516016, y: 0.00000008940697, z: -0.000000052154064, w: 0.7585614} + m_LocalPosition: {x: -2.3283064e-10, y: -1.1641532e-10, z: 0.003004015} m_LocalScale: {x: 1, y: 1.0000001, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -538,8 +538,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2174179322558643890} serializedVersion: 2 - m_LocalRotation: {x: 0.5662592, y: 0.000000014901161, z: -0.0000000037252903, w: 0.8242272} - m_LocalPosition: {x: 0, y: -1.7462298e-10, z: 0.0030040164} + m_LocalRotation: {x: 0.56625944, y: 0.000000029802322, z: 0.000000007450581, w: 0.82422715} + m_LocalPosition: {x: -1.1641532e-10, y: -3.4924597e-10, z: 0.0030040166} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -639,8 +639,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2247055388988280205} serializedVersion: 2 - m_LocalRotation: {x: -0.25057173, y: -0.00000005535319, z: 0.000000071577944, w: 0.96809804} - m_LocalPosition: {x: -2.9282865e-10, y: 0, z: 0.004176515} + m_LocalRotation: {x: -0.25057185, y: -0.0000000567234, z: 0.000000032103785, w: 0.96809804} + m_LocalPosition: {x: -4.916112e-11, y: 0, z: 0.0041765124} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -672,8 +672,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2344423464168616931} serializedVersion: 2 - m_LocalRotation: {x: 0.28778726, y: -0.46212685, z: 0.16157518, w: 0.82311046} - m_LocalPosition: {x: -0.0029576193, y: 0, z: 0.00044939894} + m_LocalRotation: {x: 0.28778717, y: -0.4621268, z: 0.16157508, w: 0.82311046} + m_LocalPosition: {x: -0.0029576183, y: 0, z: 0.00044939917} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -746,8 +746,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2503148901578430105} serializedVersion: 2 - m_LocalRotation: {x: 0.8119707, y: -0.00000011920929, z: 0.000000014901161, w: 0.5836983} - m_LocalPosition: {x: 2.910383e-11, y: -2.3283064e-10, z: 0.002408273} + m_LocalRotation: {x: 0.811971, y: 0.00000008940697, z: -0.00000008940697, w: 0.5836978} + m_LocalPosition: {x: -1.7462298e-10, y: -2.3283064e-10, z: 0.0024082724} m_LocalScale: {x: 0.9999998, y: 1, z: 1.0000001} m_ConstrainProportionsScale: 0 m_Children: @@ -778,8 +778,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2882239523612217299} serializedVersion: 2 - m_LocalRotation: {x: -0.19549885, y: 0.000000002172962, z: 0.0000000057906107, w: 0.9807039} - m_LocalPosition: {x: -2.7544242e-10, y: 6.9849193e-10, z: 0.0030214665} + m_LocalRotation: {x: -0.1954989, y: -0.000000038309114, z: 0.000000027783733, w: 0.98070395} + m_LocalPosition: {x: 1.91438e-11, y: 0, z: 0.0030214656} m_LocalScale: {x: 1.0000001, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -809,8 +809,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3374865219866590095} serializedVersion: 2 - m_LocalRotation: {x: -0.24540225, y: -0.000000010576111, z: 0.000000011730633, w: 0.9694213} - m_LocalPosition: {x: 1.1680018e-10, y: 6.9849193e-10, z: 0.0041061183} + m_LocalRotation: {x: -0.24540237, y: -0.000000019989661, z: 0.000000018695667, w: 0.9694214} + m_LocalPosition: {x: 1.9036872e-10, y: 0, z: 0.0041061183} m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 0.9999999} m_ConstrainProportionsScale: 0 m_Children: [] @@ -842,8 +842,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3392280556579772079} serializedVersion: 2 - m_LocalRotation: {x: 0.16025314, y: -0.7708367, z: 0.21358094, w: 0.5783709} - m_LocalPosition: {x: -0.0035855495, y: 0, z: -0.0024545891} + m_LocalRotation: {x: 0.16025315, y: -0.7708368, z: 0.21358101, w: 0.5783708} + m_LocalPosition: {x: -0.0035855481, y: 0, z: -0.0024545894} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -917,7 +917,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3800556883426211010} serializedVersion: 2 - m_LocalRotation: {x: -0.055727538, y: 0.1424893, z: 0.00803545, w: 0.9881937} + m_LocalRotation: {x: -0.05572754, y: 0.14248934, z: 0.008035455, w: 0.98819363} m_LocalPosition: {x: 0.0011845141, y: 0.0022176225, z: -0.0008242579} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -944,14 +944,14 @@ MonoBehaviour: _tarsus: {fileID: 615395507866503330} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0019033402 - _tibiaLength: 0.0030214665 + _femurLength: 0.0019033398 + _tibiaLength: 0.0030214654 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 5961476926804711974} - targetToBoneFemur: {x: 0.3940539, y: -0.58712995, z: -0.58713037, w: 0.39405394} - targetToBoneTibia: {x: -0.1659759, y: -0.6873515, z: -0.68735147, w: -0.1659759} + targetToBoneFemur: {x: 0.3940539, y: -0.58713, z: -0.58713037, w: 0.39405394} + targetToBoneTibia: {x: -0.16597603, y: -0.6873516, z: -0.6873514, w: -0.1659759} --- !u!1 &3918606941992177650 GameObject: m_ObjectHideFlags: 0 @@ -977,7 +977,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3918606941992177650} serializedVersion: 2 - m_LocalRotation: {x: -0.13913122, y: -0.48328668, z: -0.07811372, w: 0.86079895} + m_LocalRotation: {x: -0.1391313, y: -0.48328656, z: -0.078113794, w: 0.860799} m_LocalPosition: {x: -0.00058102724, y: 0.0022176215, z: -0.0009999603} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1004,14 +1004,14 @@ MonoBehaviour: _tarsus: {fileID: 8056997594033936271} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0019033395 - _tibiaLength: 0.0029819135 + _femurLength: 0.0019033398 + _tibiaLength: 0.0029819137 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 5535986122466163059} - targetToBoneFemur: {x: 0.54446495, y: -0.4511739, z: -0.4511739, w: 0.54446507} - targetToBoneTibia: {x: 0.42917126, y: 0.5619716, z: 0.56197155, w: 0.4291714} + targetToBoneFemur: {x: 0.54446507, y: -0.45117387, z: -0.45117393, w: 0.544465} + targetToBoneTibia: {x: 0.42917144, y: 0.56197166, z: 0.5619715, w: 0.42917144} --- !u!1 &4040189390208258658 GameObject: m_ObjectHideFlags: 0 @@ -1038,8 +1038,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4040189390208258658} serializedVersion: 2 - m_LocalRotation: {x: 0.0773633, y: 0.9162942, z: -0.21589425, w: 0.32834378} - m_LocalPosition: {x: 0.004090543, y: 0, z: -0.006165691} + m_LocalRotation: {x: 0.07736324, y: 0.9162942, z: -0.21589403, w: 0.3283439} + m_LocalPosition: {x: 0.0040905434, y: 0, z: -0.0061656903} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -1324,8 +1324,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4789320418346547653} serializedVersion: 2 - m_LocalRotation: {x: 0.26484576, y: 0.13751145, z: -0.038188547, w: 0.95367134} - m_LocalPosition: {x: 0.002225488, y: 0, z: 0.00271038} + m_LocalRotation: {x: 0.264846, y: 0.13751146, z: -0.0381886, w: 0.9536713} + m_LocalPosition: {x: 0.0022254875, y: 0, z: 0.002710377} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -1503,8 +1503,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5872439506191515607} serializedVersion: 2 - m_LocalRotation: {x: 0.6839642, y: 0.00000011920929, z: -0.000000014901161, w: 0.7295157} - m_LocalPosition: {x: -2.0372681e-10, y: 2.910383e-11, z: 0.0024082721} + m_LocalRotation: {x: 0.6839639, y: -0, z: -0.000000014901161, w: 0.7295159} + m_LocalPosition: {x: 5.820766e-11, y: 8.731149e-11, z: 0.0024082721} m_LocalScale: {x: 1, y: 1.0000001, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -1536,7 +1536,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5934342576853380286} serializedVersion: 2 - m_LocalRotation: {x: 0.034137037, y: 0.9646966, z: 0.15892807, w: -0.20721248} + m_LocalRotation: {x: 0.034137055, y: 0.9646966, z: 0.15892811, w: -0.20721269} m_LocalPosition: {x: -0.00033019992, y: 0.002194208, z: -0.0022233187} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1563,14 +1563,14 @@ MonoBehaviour: _tarsus: {fileID: 8105911159671643989} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0030040168 - _tibiaLength: 0.004106119 + _femurLength: 0.003004017 + _tibiaLength: 0.0041061183 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 8439091168374640007} - targetToBoneFemur: {x: -0.4297835, y: 0.56150347, z: 0.5615035, w: -0.42978358} - targetToBoneTibia: {x: -0.6955418, y: 0.12736529, z: 0.12736529, w: -0.6955415} + targetToBoneFemur: {x: -0.42978352, y: 0.5615036, z: 0.5615035, w: -0.42978352} + targetToBoneTibia: {x: -0.6955417, y: 0.1273652, z: 0.1273651, w: -0.6955417} --- !u!1 &6065556596967559351 GameObject: m_ObjectHideFlags: 0 @@ -1595,8 +1595,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6065556596967559351} serializedVersion: 2 - m_LocalRotation: {x: -0.2783754, y: -0.000000037985085, z: 0.000000022928376, w: 0.96047235} - m_LocalPosition: {x: 1.2023199e-10, y: 0, z: 0.0029819133} + m_LocalRotation: {x: -0.27837572, y: 0.000000033831125, z: -0.00000006138512, w: 0.96047235} + m_LocalPosition: {x: 1.734421e-11, y: 4.656613e-10, z: 0.0029819135} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -1627,7 +1627,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6293298600777026745} serializedVersion: 2 - m_LocalRotation: {x: -0.065785386, y: 0.92331046, z: 0.18358438, w: 0.33085796} + m_LocalRotation: {x: -0.065785415, y: 0.92331034, z: 0.18358444, w: 0.33085802} m_LocalPosition: {x: 0.0009336879, y: 0.0024799206, z: -0.0023264561} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1660,8 +1660,8 @@ MonoBehaviour: _phalangesLength: 0 side: 0 target: {fileID: 7871660662594056517} - targetToBoneFemur: {x: 0.68627703, y: -0.17036355, z: -0.1703638, w: 0.6862772} - targetToBoneTibia: {x: 0.6842575, y: -0.17830335, z: -0.17830299, w: 0.6842574} + targetToBoneFemur: {x: 0.68627715, y: -0.1703635, z: -0.17036393, w: 0.6862773} + targetToBoneTibia: {x: 0.68425757, y: -0.17830308, z: -0.17830327, w: 0.68425703} --- !u!1 &7202005123023226514 GameObject: m_ObjectHideFlags: 0 @@ -1873,7 +1873,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7731414149959408473} serializedVersion: 2 - m_LocalRotation: {x: -0.17347457, y: 0.75097865, z: 0.2175461, w: 0.5988417} + m_LocalRotation: {x: -0.17347425, y: 0.75097877, z: 0.21754575, w: 0.5988418} m_LocalPosition: {x: 0.0008435269, y: 0.0020915149, z: -0.0013045785} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1900,14 +1900,14 @@ MonoBehaviour: _tarsus: {fileID: 7805495626236998544} _phalanges: {fileID: 0} _end: {fileID: 0} - _femurLength: 0.0024082721 - _tibiaLength: 0.004176515 + _femurLength: 0.0024082724 + _tibiaLength: 0.004176512 _tarsusLength: 0 _phalangesLength: 0 side: 0 target: {fileID: 5250359002763488712} - targetToBoneFemur: {x: 0.66122675, y: -0.25055832, z: -0.25055823, w: 0.66122663} - targetToBoneTibia: {x: 0.5807946, y: -0.40333316, z: -0.40333334, w: 0.58079493} + targetToBoneFemur: {x: 0.6612268, y: -0.25055817, z: -0.2505583, w: 0.6612265} + targetToBoneTibia: {x: 0.5807945, y: -0.40333316, z: -0.40333313, w: 0.58079475} --- !u!1 &7870208251778510133 GameObject: m_ObjectHideFlags: 0 @@ -2037,8 +2037,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8102965106138119688} serializedVersion: 2 - m_LocalRotation: {x: -0.2783009, y: 0.000000037683723, z: -0.000000053537306, w: 0.960494} - m_LocalPosition: {x: 9.294565e-12, y: 0, z: 0.0042412234} + m_LocalRotation: {x: -0.278301, y: -0.0000000993223, z: 0.000000084176655, w: 0.960494} + m_LocalPosition: {x: -2.2376767e-10, y: 0.0000000018626449, z: 0.0042412234} m_LocalScale: {x: 1, y: 0.9999999, z: 0.9999999} m_ConstrainProportionsScale: 0 m_Children: [] @@ -2068,8 +2068,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8620845555170327592} serializedVersion: 2 - m_LocalRotation: {x: -0.29382303, y: 0.000000115436556, z: -0.0000000994468, w: 0.9558599} - m_LocalPosition: {x: 3.151205e-10, y: 0, z: 0.0041295574} + m_LocalRotation: {x: -0.29382306, y: -0.000000100343954, z: 0.00000013887743, w: 0.95585984} + m_LocalPosition: {x: 1.65906e-10, y: 9.313226e-10, z: 0.0041295574} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -2089,15 +2089,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 878733956556189420, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.x - value: -0.4692818 + value: -0.46928197 objectReference: {fileID: 0} - target: {fileID: 878733956556189420, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.y - value: -0.63777685 + value: -0.6377769 objectReference: {fileID: 0} - target: {fileID: 878733956556189420, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.z - value: -0.17352022 + value: -0.17352007 objectReference: {fileID: 0} - target: {fileID: 921079959415626025, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.w @@ -2105,31 +2105,31 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 921079959415626025, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.x - value: -0.43574923 + value: -0.43574932 objectReference: {fileID: 0} - target: {fileID: 921079959415626025, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.y - value: 0.14708138 + value: 0.1470814 objectReference: {fileID: 0} - target: {fileID: 921079959415626025, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.z - value: -0.34798685 + value: -0.34798694 objectReference: {fileID: 0} - target: {fileID: 1185156659557624868, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.w - value: 0.28808329 + value: 0.28808293 objectReference: {fileID: 0} - target: {fileID: 1185156659557624868, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.x - value: -0.5423464 + value: -0.5423462 objectReference: {fileID: 0} - target: {fileID: 1185156659557624868, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.y - value: -0.5076532 + value: -0.5076529 objectReference: {fileID: 0} - target: {fileID: 1185156659557624868, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.z - value: 0.604282 + value: 0.6042826 objectReference: {fileID: 0} - target: {fileID: 3207777328726177782, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalPosition.x @@ -2173,31 +2173,31 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4217164170368883032, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.w - value: 0.8540212 + value: 0.85402143 objectReference: {fileID: 0} - target: {fileID: 4217164170368883032, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.x - value: -0.3250143 + value: -0.32501405 objectReference: {fileID: 0} - target: {fileID: 4217164170368883032, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.y - value: 0.22636859 + value: 0.22636862 objectReference: {fileID: 0} - target: {fileID: 4217164170368883032, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.z - value: 0.3372994 + value: 0.33729875 objectReference: {fileID: 0} - target: {fileID: 4280044992070512807, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.w - value: 0.03278106 + value: 0.032781146 objectReference: {fileID: 0} - target: {fileID: 4280044992070512807, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.x - value: -0.044934656 + value: -0.04493456 objectReference: {fileID: 0} - target: {fileID: 4280044992070512807, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.y - value: 0.8327048 + value: 0.83270484 objectReference: {fileID: 0} - target: {fileID: 4280044992070512807, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.z @@ -2205,7 +2205,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4355293283798979008, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.w - value: -0.5112789 + value: -0.5112788 objectReference: {fileID: 0} - target: {fileID: 4355293283798979008, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.x @@ -2213,11 +2213,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4355293283798979008, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.y - value: 0.2597021 + value: 0.25970212 objectReference: {fileID: 0} - target: {fileID: 4355293283798979008, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.z - value: -0.1114271 + value: -0.11142698 objectReference: {fileID: 0} - target: {fileID: 5152346580398522335, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.w @@ -2233,23 +2233,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5152346580398522335, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.z - value: -0.087881684 + value: -0.08788167 objectReference: {fileID: 0} - target: {fileID: 5426871202115288240, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.w - value: 0.75851035 + value: 0.7585102 objectReference: {fileID: 0} - target: {fileID: 5426871202115288240, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.x - value: 0.57238495 + value: 0.5723851 objectReference: {fileID: 0} - target: {fileID: 5426871202115288240, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.y - value: -0.008788292 + value: -0.008788249 objectReference: {fileID: 0} - target: {fileID: 5426871202115288240, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.z - value: -0.3113845 + value: -0.31138477 objectReference: {fileID: 0} - target: {fileID: 5498987105763849279, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_Name @@ -2257,23 +2257,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6797057378463114089, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.w - value: 0.4702007 + value: 0.47020072 objectReference: {fileID: 0} - target: {fileID: 6797057378463114089, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.x - value: 0.13349886 + value: 0.1334991 objectReference: {fileID: 0} - target: {fileID: 6797057378463114089, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.y - value: 0.79217046 + value: 0.7921703 objectReference: {fileID: 0} - target: {fileID: 6797057378463114089, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.z - value: -0.3654522 + value: -0.3654527 objectReference: {fileID: 0} - target: {fileID: 7468650878180815412, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.w - value: -0.028299622 + value: -0.028299695 objectReference: {fileID: 0} - target: {fileID: 7468650878180815412, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.x @@ -2281,19 +2281,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7468650878180815412, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.y - value: 0.71126777 + value: 0.7112677 objectReference: {fileID: 0} - target: {fileID: 7468650878180815412, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.z - value: 0.15780832 + value: 0.15780841 objectReference: {fileID: 0} - target: {fileID: 8564223698435002511, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.w - value: 0.6106671 + value: 0.61066705 objectReference: {fileID: 0} - target: {fileID: 8564223698435002511, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.x - value: 0.2575532 + value: 0.25755325 objectReference: {fileID: 0} - target: {fileID: 8564223698435002511, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.y @@ -2305,19 +2305,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8675830525085349096, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.w - value: 0.70776933 + value: 0.70776963 objectReference: {fileID: 0} - target: {fileID: 8675830525085349096, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.x - value: 0.38709378 + value: 0.38709393 objectReference: {fileID: 0} - target: {fileID: 8675830525085349096, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.y - value: -0.17679322 + value: -0.17679343 objectReference: {fileID: 0} - target: {fileID: 8675830525085349096, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} propertyPath: m_LocalRotation.z - value: -0.563884 + value: -0.56388354 objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] @@ -2574,24 +2574,6 @@ MonoBehaviour: persistOutput: 0 trace: 0 _receivers: [] - pheromoneSteering: - name: - parent: - rid: -2 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _curvePreset: 0 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - curveMax: 0 - persistOutput: 0 - trace: 0 - _receivers: [] foodReceptor: name: parent: @@ -2628,24 +2610,13 @@ MonoBehaviour: persistOutput: 0 trace: 0 _receivers: [] - foodSmell: + pheromoneReceptors: name: parent: rid: -2 - bias: {x: 0, y: 0, z: 0} - _synapses: [] - combinator: 0 - _curvePreset: 0 - curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - curveMax: 0 - persistOutput: 0 - trace: 0 - _receivers: [] + prefab: {fileID: 0} + instanceCount: 0 + nuclei: [] targetDirection: name: parent: @@ -2701,7 +2672,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 92f34a5e4027a1dc39efd8ce63cf6aba, type: 3} m_Name: m_EditorClassIdentifier: - brainPrefab: {fileID: 11400000, guid: c8e4b0990eb7dbbc4bee34addd9cd2b8, type: 2} + brainPrefab: {fileID: 11400000, guid: 17e54c217d4c2a8daa851222f0591dd2, type: 2} --- !u!4 &5208545581280796884 stripped Transform: m_CorrespondingSourceObject: {fileID: 4280044992070512807, guid: 4dff5bed1fdfdda6cb1a398623e62f76, type: 3} From 6c30009564c727a5d4b9fdafd797c2383a34f85f Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Wed, 6 May 2026 17:51:14 +0200 Subject: [PATCH 36/38] Improvements --- NanoBrain/Runtime/Scripts/Core/Cluster.cs | 10 ++--- NanoBrain/Runtime/Scripts/Core/Neuron.cs | 49 +++++++++-------------- Runtime/Scripts/Ant.cs | 2 - 3 files changed, 25 insertions(+), 36 deletions(-) diff --git a/NanoBrain/Runtime/Scripts/Core/Cluster.cs b/NanoBrain/Runtime/Scripts/Core/Cluster.cs index 329fd3a..be51790 100644 --- a/NanoBrain/Runtime/Scripts/Core/Cluster.cs +++ b/NanoBrain/Runtime/Scripts/Core/Cluster.cs @@ -827,7 +827,7 @@ namespace NanoBrain { } } } - UpdateNuclei(); + //UpdateNuclei(); } public override void UpdateStateIsolated() { @@ -835,10 +835,10 @@ namespace NanoBrain { } // Don't think this does anything anymore... - public override void UpdateNuclei() { - foreach (Nucleus nucleus in this.nuclei) - nucleus.UpdateNuclei(); - } + // public override void UpdateNuclei() { + // foreach (Nucleus nucleus in this.nuclei) + // nucleus.UpdateNuclei(); + // } #endregion Update diff --git a/NanoBrain/Runtime/Scripts/Core/Neuron.cs b/NanoBrain/Runtime/Scripts/Core/Neuron.cs index 4869615..59a4640 100644 --- a/NanoBrain/Runtime/Scripts/Core/Neuron.cs +++ b/NanoBrain/Runtime/Scripts/Core/Neuron.cs @@ -117,8 +117,6 @@ namespace NanoBrain { Sum, /// Multiply the weighted values Product, - /// Take the maximum of all the weighted values - Max, } /// /// The type of combinator used for this Neuron @@ -377,20 +375,14 @@ namespace NanoBrain { } public override void UpdateStateIsolated() { - CheckSleepingSynapses(); var result = Combinator(); - this.outputValue = Activator(result); + this.outputValue = ApplyActivator(result); this.lastUpdate = Time.time; - // Debug.Log($"Update Neuron {this.name}"); } protected void CheckSleepingSynapses() { - foreach (Synapse synapse in this.synapses) { + foreach (Synapse synapse in this.synapses) synapse.neuron.SleepCheck(); - // if (synapse.isSleeping) { - // synapse.neuron.outputValue = Vector3.zero; - // } - } } #region Combinator @@ -400,42 +392,27 @@ namespace NanoBrain { protected Func Combinator => combinator switch { CombinatorType.Sum => CombinatorSum, CombinatorType.Product => CombinatorProduct, - CombinatorType.Max => CombinatorMax, _ => CombinatorSum }; public float3 CombinatorSum() { float3 sum = this.bias; - foreach (Synapse synapse in this.synapses) + foreach (Synapse synapse in this.synapses) { + synapse.neuron.SleepCheck(); sum += synapse.weight * synapse.neuron.outputValue; + } return sum; } public float3 CombinatorProduct() { float3 product = this.bias; foreach (Synapse synapse in this.synapses) { + synapse.neuron.SleepCheck(); product *= synapse.weight * synapse.neuron.outputValue; } return product; } - public float3 CombinatorMax() { - float3 max = this.bias; - float maxLength = length(max); - - //Applying the weight factors - foreach (Synapse synapse in this.synapses) { - float3 input = synapse.weight * synapse.neuron.outputValue; - - float inputLength = length(input); - if (inputLength > maxLength) { - max = input; - maxLength = inputLength; - } - } - return max; - } - #else protected Func Combinator => combinator switch { @@ -484,6 +461,20 @@ namespace NanoBrain { #if UNITY_MATHEMATICS + // This does not allocate memory and seems faster than the solution below + float3 ApplyActivator(float3 x) { + switch (curvePreset) { + case ActivationType.Linear: return ActivatorLinear(x); + case ActivationType.Sqrt: return ActivatorSqrt(x); + case ActivationType.Power: return ActivatorPower(x); + case ActivationType.Reciprocal: return ActivatorReciprocal(x); + case ActivationType.Tanh: return ActivatorTanh(x); + case ActivationType.Binary: return ActivatorBinary(x); + case ActivationType.Normalized: return ActivatorNormalized(x); + default: return ActivatorCustom(x); + } + } + public Func Activator => this.curvePreset switch { ActivationType.Linear => ActivatorLinear, ActivationType.Sqrt => ActivatorSqrt, diff --git a/Runtime/Scripts/Ant.cs b/Runtime/Scripts/Ant.cs index c4c1265..166c62c 100644 --- a/Runtime/Scripts/Ant.cs +++ b/Runtime/Scripts/Ant.cs @@ -193,8 +193,6 @@ namespace CreatureControl { float angle = Vector3.Angle(Vector3.forward, smellDirection); if (angle < smellAngle && smellDirection.magnitude > 0.01) { - // float intensity = pheromone.StrengthAt(distance); - // Vector3 smell = smellDirection.normalized * intensity; Vector3 smell = Vector3.zero; int id = thing.GetInstanceID(); From 4363079d43cb47b469fd2c7de60bbe25e541558c Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Thu, 7 May 2026 15:25:20 +0200 Subject: [PATCH 37/38] Squashed 'NanoBrain/' changes from 7ef8e42..ec3b1d4 ec3b1d4 Completed cluster documentation 348fee3 Update .gitea/workflows/copy_documentation.yml 911e52f Update .gitea/workflows/copy_documentation.yml d472790 Update .gitea/workflows/copy_documentation.yml b87f40f Trying to get the workflow running...10 2b0db4f Trying to get the workflow running...9 927fd6d Trying to get the workflow running...8 176f399 Trying to get the workflow running...7 3c841c7 Trying to get the workflow running...6 5c798c2 Trying to get the workflow running...5 30b25a1 Trying to get the workflow running...4 5edf019 Trying to get the workflow running...3 587cf82 Trying to get the workflow running...2 a1d3aa7 Trying to get the workflow running...1 97ec277 Removed LinearAlgebra, first setup webserver copy workflow 5827396 Fixed documentation links ce19335 Added Documentation da370bb Improvements 32b5885 Multi smell works 33ea14b Single smell works a651ec6 Add neuron property drawer baa7def Pheromones WIP 551b4d9 Improve ant walking speed 7187f61 Ant is walking again c78722a Make it work again 2ff550c Removed clusterPrefab property 2ef67fe Cleanup and fix connect neuron a9a0072 Merge commit 'dd326823a8256f3ddb808e071d98c4aede72e410' 22ee17c Insect rig improvements b6a3bc1 Added insect body parts 517e738 Merge commit '4ae9a15fc61f386b96ce0f7b440780f562d7dc68' 033ddf4 Merge commit '05fd588f9bc41d84113d410a2ca992f1a2ee66e0' ef700c0 Merge commit '3f8716794ad9d685cfb9ed9dd230eb31cd8df10f' 7d5e157 Added NanoBrain namespace f138201 Merge commit '611055cdcd58b01f2f19991ad35eb8fe8e573ebb' 1c4d361 Merge commit '9fcbaa5bf84f91680d24b56dbf114bcb97de4aee' 0f83945 Added NanoBrain subtree 6f398ad Merge commit '8e87e4ea77308b51c3691bdad96e7f9707952821' as 'NanoBrain' 587f104 Move out non-subtree NanoBrain fc581a0 cleanup & documentation 837c5ce WIP Physics based walking 63486d1 The ant does it ant things! ce8e476 Added sample assets... 88d5eb5 Placing home pheromones 481829c Ensure model follows target in editor 018c99d Any walks e709ea4 Steps to get it working c1dcc83 Initial Ant setup af2fa77 Merge commit '04ca8dda0793476a59fc06f1958453730a99c105' as 'NanoBrain' 04ca8dd Squashed 'NanoBrain/' content from commit b3423b9 d9ba98d WIP: Initial scripts 2219e98 Initial commit git-subtree-dir: NanoBrain git-subtree-split: ec3b1d46ab2b9f332a8ae63589b09c3fb6fb1b1a --- .gitea/workflows/copy_documentation.yml | 34 + doxygen.meta => Documentation.meta | 0 Documentation/DoxyWarnLogfile.txt | 106 + .../DoxyWarnLogfile.txt.meta | 0 {doxygen => Documentation}/Doxyfile | 0 {doxygen => Documentation}/Doxyfile.meta | 0 {doxygen => Documentation}/DoxygenLayout.xml | 0 .../DoxygenLayout.xml.meta | 0 Documentation/Installation.md | 14 + Documentation/Installation.md.meta | 7 + Documentation/ToC.md | 5 + Documentation/ToC.md.meta | 7 + {doxygen => Documentation}/custom_doxygen.css | 0 .../custom_doxygen.css.meta | 0 LinearAlgebra.meta => Documentation/html.meta | 2 +- .../html}/PasserLifeLogoRight1_300.png | Bin .../html/PasserLifeLogoRight1_300.png.meta | 117 + Documentation/html/annotated.html | 95 + Documentation/html/annotated.html.meta | 7 + Documentation/html/bc_s.png | Bin 0 -> 636 bytes Documentation/html/bc_s.png.meta | 117 + Documentation/html/bc_sd.png | Bin 0 -> 583 bytes Documentation/html/bc_sd.png.meta | 117 + .../class_nano_brain_1_1_brain-members.html | 93 + ...ass_nano_brain_1_1_brain-members.html.meta | 7 + .../html/class_nano_brain_1_1_brain.html | 175 + .../html/class_nano_brain_1_1_brain.html.meta | 7 + .../class_nano_brain_1_1_cluster-members.html | 124 + ...s_nano_brain_1_1_cluster-members.html.meta | 7 + .../html/class_nano_brain_1_1_cluster.html | 987 +++++ .../class_nano_brain_1_1_cluster.html.meta | 7 + .../html/class_nano_brain_1_1_cluster.png | Bin 0 -> 565 bytes .../class_nano_brain_1_1_cluster.png.meta | 117 + ...nano_brain_1_1_cluster_prefab-members.html | 94 + ...brain_1_1_cluster_prefab-members.html.meta | 7 + .../class_nano_brain_1_1_cluster_prefab.html | 145 + ...ss_nano_brain_1_1_cluster_prefab.html.meta | 7 + ...ss_nano_brain_1_1_memory_cell-members.html | 155 + ...no_brain_1_1_memory_cell-members.html.meta | 7 + .../class_nano_brain_1_1_memory_cell.html | 687 ++++ ...class_nano_brain_1_1_memory_cell.html.meta | 7 + .../html/class_nano_brain_1_1_memory_cell.png | Bin 0 -> 942 bytes .../class_nano_brain_1_1_memory_cell.png.meta | 117 + .../class_nano_brain_1_1_neuron-members.html | 153 + ...ss_nano_brain_1_1_neuron-members.html.meta | 7 + .../html/class_nano_brain_1_1_neuron.html | 708 ++++ .../class_nano_brain_1_1_neuron.html.meta | 7 + .../html/class_nano_brain_1_1_neuron.png | Bin 0 -> 953 bytes .../html/class_nano_brain_1_1_neuron.png.meta | 117 + .../class_nano_brain_1_1_nucleus-members.html | 96 + ...s_nano_brain_1_1_nucleus-members.html.meta | 7 + .../html/class_nano_brain_1_1_nucleus.html | 251 ++ .../class_nano_brain_1_1_nucleus.html.meta | 7 + .../html/class_nano_brain_1_1_nucleus.png | Bin 0 -> 1319 bytes .../class_nano_brain_1_1_nucleus.png.meta | 117 + .../class_nano_brain_1_1_synapse-members.html | 94 + ...s_nano_brain_1_1_synapse-members.html.meta | 7 + .../html/class_nano_brain_1_1_synapse.html | 159 + .../class_nano_brain_1_1_synapse.html.meta | 7 + Documentation/html/classes.html | 101 + Documentation/html/classes.html.meta | 7 + Documentation/html/closed.png | Bin 0 -> 125 bytes Documentation/html/closed.png.meta | 117 + Documentation/html/custom_doxygen.css | 12 + .../html/custom_doxygen.css.meta | 3 +- .../dir_14eca4e58e6d71e3a9859288c1bd2735.html | 87 + ...14eca4e58e6d71e3a9859288c1bd2735.html.meta | 7 + .../dir_4f6666a8f2ab10bc970eb7559668f031.html | 93 + ...4f6666a8f2ab10bc970eb7559668f031.html.meta | 7 + .../dir_961f031cbd4067daa41f3038afdffb61.html | 87 + ...961f031cbd4067daa41f3038afdffb61.html.meta | 7 + .../dir_d52cd4d528148a4237c9bd37fdf6f7e8.html | 95 + ...d52cd4d528148a4237c9bd37fdf6f7e8.html.meta | 7 + .../dir_ff8b04b97203665bfd386b445c7d0b7c.html | 87 + ...ff8b04b97203665bfd386b445c7d0b7c.html.meta | 7 + Documentation/html/doc.svg | 12 + Documentation/html/doc.svg.meta | 53 + Documentation/html/docd.svg | 12 + Documentation/html/docd.svg.meta | 53 + Documentation/html/doxygen.css | 1685 ++++++++ Documentation/html/doxygen.css.meta | 7 + Documentation/html/doxygen.svg | 28 + Documentation/html/doxygen.svg.meta | 53 + Documentation/html/dynsections.js | 192 + Documentation/html/dynsections.js.meta | 7 + Documentation/html/folderclosed.svg | 11 + Documentation/html/folderclosed.svg.meta | 53 + Documentation/html/folderclosedd.svg | 11 + Documentation/html/folderclosedd.svg.meta | 53 + Documentation/html/folderopen.svg | 17 + Documentation/html/folderopen.svg.meta | 53 + Documentation/html/folderopend.svg | 12 + Documentation/html/folderopend.svg.meta | 53 + Documentation/html/functions.html | 192 + Documentation/html/functions.html.meta | 7 + Documentation/html/functions_enum.html | 85 + Documentation/html/functions_enum.html.meta | 7 + Documentation/html/functions_func.html | 145 + Documentation/html/functions_func.html.meta | 7 + Documentation/html/functions_prop.html | 88 + Documentation/html/functions_prop.html.meta | 7 + Documentation/html/functions_vars.html | 96 + Documentation/html/functions_vars.html.meta | 7 + Documentation/html/hierarchy.html | 94 + Documentation/html/hierarchy.html.meta | 7 + Documentation/html/index.html | 89 + Documentation/html/index.html.meta | 7 + Documentation/html/jquery.js | 34 + Documentation/html/jquery.js.meta | 7 + ...nano_brain-unitypackage_2_r_e_a_d_m_e.html | 85 + ...brain-unitypackage_2_r_e_a_d_m_e.html.meta | 7 + Documentation/html/md__installation.html | 91 + Documentation/html/md__installation.html.meta | 7 + Documentation/html/menu.js | 136 + Documentation/html/menu.js.meta | 7 + Documentation/html/menudata.js | 63 + Documentation/html/menudata.js.meta | 7 + Documentation/html/minus.svg | 8 + Documentation/html/minus.svg.meta | 53 + Documentation/html/minusd.svg | 8 + Documentation/html/minusd.svg.meta | 53 + Documentation/html/namespace_nano_brain.html | 115 + .../html/namespace_nano_brain.html.meta | 7 + Documentation/html/nav_f.png | Bin 0 -> 134 bytes Documentation/html/nav_f.png.meta | 117 + Documentation/html/nav_fd.png | Bin 0 -> 135 bytes Documentation/html/nav_fd.png.meta | 117 + Documentation/html/nav_g.png | Bin 0 -> 95 bytes Documentation/html/nav_g.png.meta | 117 + Documentation/html/nav_h.png | Bin 0 -> 87 bytes Documentation/html/nav_h.png.meta | 117 + Documentation/html/nav_hd.png | Bin 0 -> 99 bytes Documentation/html/nav_hd.png.meta | 117 + Documentation/html/open.png | Bin 0 -> 115 bytes Documentation/html/open.png.meta | 117 + Documentation/html/pages.html | 89 + Documentation/html/pages.html.meta | 7 + Documentation/html/plus.svg | 9 + Documentation/html/plus.svg.meta | 53 + Documentation/html/plusd.svg | 9 + Documentation/html/plusd.svg.meta | 53 + .../src.meta => Documentation/html/rtf.meta | 2 +- .../html/rtf/PasserLifeLogoRight1_300.png | Bin 0 -> 10323 bytes .../rtf/PasserLifeLogoRight1_300.png.meta | 117 + .../html/rtf/class_nano_brain_1_1_cluster.png | Bin 0 -> 565 bytes .../rtf/class_nano_brain_1_1_cluster.png.meta | 117 + .../rtf/class_nano_brain_1_1_memory_cell.png | Bin 0 -> 942 bytes .../class_nano_brain_1_1_memory_cell.png.meta | 117 + .../html/rtf/class_nano_brain_1_1_neuron.png | Bin 0 -> 953 bytes .../rtf/class_nano_brain_1_1_neuron.png.meta | 117 + .../html/rtf/class_nano_brain_1_1_nucleus.png | Bin 0 -> 1319 bytes .../rtf/class_nano_brain_1_1_nucleus.png.meta | 117 + Documentation/html/rtf/refman.rtf | 3631 +++++++++++++++++ Documentation/html/rtf/refman.rtf.meta | 7 + .../html/search.meta | 2 +- Documentation/html/search/all_0.js | 4 + Documentation/html/search/all_0.js.meta | 7 + Documentation/html/search/all_1.js | 6 + Documentation/html/search/all_1.js.meta | 7 + Documentation/html/search/all_10.js | 8 + Documentation/html/search/all_10.js.meta | 7 + Documentation/html/search/all_11.js | 4 + Documentation/html/search/all_11.js.meta | 7 + Documentation/html/search/all_2.js | 8 + Documentation/html/search/all_2.js.meta | 7 + Documentation/html/search/all_3.js | 11 + Documentation/html/search/all_3.js.meta | 7 + Documentation/html/search/all_4.js | 5 + Documentation/html/search/all_4.js.meta | 7 + Documentation/html/search/all_5.js | 4 + Documentation/html/search/all_5.js.meta | 7 + Documentation/html/search/all_6.js | 7 + Documentation/html/search/all_6.js.meta | 7 + Documentation/html/search/all_7.js | 6 + Documentation/html/search/all_7.js.meta | 7 + Documentation/html/search/all_8.js | 4 + Documentation/html/search/all_8.js.meta | 7 + Documentation/html/search/all_9.js | 4 + Documentation/html/search/all_9.js.meta | 7 + Documentation/html/search/all_a.js | 9 + Documentation/html/search/all_a.js.meta | 7 + Documentation/html/search/all_b.js | 5 + Documentation/html/search/all_b.js.meta | 7 + Documentation/html/search/all_c.js | 8 + Documentation/html/search/all_c.js.meta | 7 + Documentation/html/search/all_d.js | 8 + Documentation/html/search/all_d.js.meta | 7 + Documentation/html/search/all_e.js | 9 + Documentation/html/search/all_e.js.meta | 7 + Documentation/html/search/all_f.js | 7 + Documentation/html/search/all_f.js.meta | 7 + Documentation/html/search/classes_0.js | 4 + Documentation/html/search/classes_0.js.meta | 7 + Documentation/html/search/classes_1.js | 5 + Documentation/html/search/classes_1.js.meta | 7 + Documentation/html/search/classes_2.js | 4 + Documentation/html/search/classes_2.js.meta | 7 + Documentation/html/search/classes_3.js | 5 + Documentation/html/search/classes_3.js.meta | 7 + Documentation/html/search/classes_4.js | 4 + Documentation/html/search/classes_4.js.meta | 7 + Documentation/html/search/close.svg | 18 + Documentation/html/search/close.svg.meta | 53 + Documentation/html/search/enums_0.js | 4 + Documentation/html/search/enums_0.js.meta | 7 + Documentation/html/search/enums_1.js | 4 + Documentation/html/search/enums_1.js.meta | 7 + Documentation/html/search/enums_2.js | 4 + Documentation/html/search/enums_2.js.meta | 7 + Documentation/html/search/enumvalues_0.js | 4 + .../html/search/enumvalues_0.js.meta | 7 + Documentation/html/search/enumvalues_1.js | 4 + .../html/search/enumvalues_1.js.meta | 7 + Documentation/html/search/functions_0.js | 5 + Documentation/html/search/functions_0.js.meta | 7 + Documentation/html/search/functions_1.js | 6 + Documentation/html/search/functions_1.js.meta | 7 + Documentation/html/search/functions_2.js | 4 + Documentation/html/search/functions_2.js.meta | 7 + Documentation/html/search/functions_3.js | 7 + Documentation/html/search/functions_3.js.meta | 7 + Documentation/html/search/functions_4.js | 4 + Documentation/html/search/functions_4.js.meta | 7 + Documentation/html/search/functions_5.js | 4 + Documentation/html/search/functions_5.js.meta | 7 + Documentation/html/search/functions_6.js | 8 + Documentation/html/search/functions_6.js.meta | 7 + Documentation/html/search/functions_7.js | 6 + Documentation/html/search/functions_7.js.meta | 7 + Documentation/html/search/functions_8.js | 4 + Documentation/html/search/functions_8.js.meta | 7 + Documentation/html/search/functions_9.js | 7 + Documentation/html/search/functions_9.js.meta | 7 + Documentation/html/search/mag.svg | 24 + Documentation/html/search/mag.svg.meta | 53 + Documentation/html/search/mag_d.svg | 24 + Documentation/html/search/mag_d.svg.meta | 53 + Documentation/html/search/mag_sel.svg | 31 + Documentation/html/search/mag_sel.svg.meta | 53 + Documentation/html/search/mag_seld.svg | 31 + Documentation/html/search/mag_seld.svg.meta | 53 + Documentation/html/search/namespaces_0.js | 4 + .../html/search/namespaces_0.js.meta | 7 + Documentation/html/search/pages_0.js | 4 + Documentation/html/search/pages_0.js.meta | 7 + Documentation/html/search/pages_1.js | 4 + Documentation/html/search/pages_1.js.meta | 7 + Documentation/html/search/pages_2.js | 4 + Documentation/html/search/pages_2.js.meta | 7 + Documentation/html/search/pages_3.js | 5 + Documentation/html/search/pages_3.js.meta | 7 + Documentation/html/search/pages_4.js | 4 + Documentation/html/search/pages_4.js.meta | 7 + Documentation/html/search/pages_5.js | 4 + Documentation/html/search/pages_5.js.meta | 7 + Documentation/html/search/properties_0.js | 5 + .../html/search/properties_0.js.meta | 7 + Documentation/html/search/properties_1.js | 4 + .../html/search/properties_1.js.meta | 7 + Documentation/html/search/properties_2.js | 4 + .../html/search/properties_2.js.meta | 7 + Documentation/html/search/properties_3.js | 4 + .../html/search/properties_3.js.meta | 7 + Documentation/html/search/properties_4.js | 4 + .../html/search/properties_4.js.meta | 7 + Documentation/html/search/search.css | 291 ++ Documentation/html/search/search.css.meta | 7 + Documentation/html/search/search.js | 840 ++++ Documentation/html/search/search.js.meta | 7 + Documentation/html/search/searchdata.js | 39 + Documentation/html/search/searchdata.js.meta | 7 + Documentation/html/search/variables_0.js | 4 + Documentation/html/search/variables_0.js.meta | 7 + Documentation/html/search/variables_1.js | 5 + Documentation/html/search/variables_1.js.meta | 7 + Documentation/html/search/variables_2.js | 4 + Documentation/html/search/variables_2.js.meta | 7 + Documentation/html/search/variables_3.js | 5 + Documentation/html/search/variables_3.js.meta | 7 + Documentation/html/search/variables_4.js | 4 + Documentation/html/search/variables_4.js.meta | 7 + Documentation/html/search/variables_5.js | 6 + Documentation/html/search/variables_5.js.meta | 7 + Documentation/html/search/variables_6.js | 5 + Documentation/html/search/variables_6.js.meta | 7 + Documentation/html/search/variables_7.js | 4 + Documentation/html/search/variables_7.js.meta | 7 + Documentation/html/search/variables_8.js | 4 + Documentation/html/search/variables_8.js.meta | 7 + Documentation/html/splitbar.png | Bin 0 -> 282 bytes Documentation/html/splitbar.png.meta | 117 + Documentation/html/splitbard.png | Bin 0 -> 265 bytes Documentation/html/splitbard.png.meta | 117 + Documentation/html/sync_off.png | Bin 0 -> 824 bytes Documentation/html/sync_off.png.meta | 117 + Documentation/html/sync_on.png | Bin 0 -> 820 bytes Documentation/html/sync_on.png.meta | 117 + Documentation/html/tab_a.png | Bin 0 -> 120 bytes Documentation/html/tab_a.png.meta | 117 + Documentation/html/tab_ad.png | Bin 0 -> 117 bytes Documentation/html/tab_ad.png.meta | 117 + Documentation/html/tab_b.png | Bin 0 -> 149 bytes Documentation/html/tab_b.png.meta | 117 + Documentation/html/tab_bd.png | Bin 0 -> 135 bytes Documentation/html/tab_bd.png.meta | 117 + Documentation/html/tab_h.png | Bin 0 -> 147 bytes Documentation/html/tab_h.png.meta | 117 + Documentation/html/tab_hd.png | Bin 0 -> 142 bytes Documentation/html/tab_hd.png.meta | 117 + Documentation/html/tab_s.png | Bin 0 -> 166 bytes Documentation/html/tab_s.png.meta | 117 + Documentation/html/tab_sd.png | Bin 0 -> 151 bytes Documentation/html/tab_sd.png.meta | 117 + Documentation/html/tabs.css | 1 + Documentation/html/tabs.css.meta | 7 + {doxygen => Documentation}/images.meta | 0 .../images/PasserLifeLogoRight1_300.png | Bin 0 -> 10323 bytes .../images/PasserLifeLogoRight1_300.png.meta | 0 Editor/BrainPickerWindow.cs.meta | 11 +- Editor/Brain_Editor.cs.meta | 11 +- Editor/ClusterEditor.cs | 216 +- Editor/ClusterEditor.cs.meta | 11 +- Editor/ClusterViewer.cs | 92 +- Editor/ClusterViewer.cs.meta | 11 +- Editor/ConfigurationChecker.cs.meta | 11 +- Editor/Neuron_Drawer.cs | 83 + Editor/Neuron_Drawer.cs.meta | 11 + README.md | 3 + README.md.meta | 7 + Runtime/LinearAlgebra/.editorconfig | 19 - .../.gitea/workflows/unit_tests.yaml | 37 - Runtime/LinearAlgebra/.gitignore | 5 - .../LinearAlgebra/LinearAlgebra-csharp.sln | 30 - Runtime/LinearAlgebra/src/Angle.cs | 341 -- Runtime/LinearAlgebra/src/Decomposition.cs | 287 -- Runtime/LinearAlgebra/src/Direction.cs | 261 -- Runtime/LinearAlgebra/src/Float.cs | 41 - .../LinearAlgebra/src/LinearAlgebra.csproj | 14 - Runtime/LinearAlgebra/src/Matrix.cs | 689 ---- Runtime/LinearAlgebra/src/Quat32.cs | 87 - Runtime/LinearAlgebra/src/Quaternion.cs | 582 --- Runtime/LinearAlgebra/src/Spherical.cs | 279 -- Runtime/LinearAlgebra/src/SwingTwist.cs | 136 - Runtime/LinearAlgebra/src/Vector2Float.cs | 479 --- Runtime/LinearAlgebra/src/Vector2Int.cs | 185 - Runtime/LinearAlgebra/src/Vector3Float.cs | 402 -- Runtime/LinearAlgebra/src/Vector3Int.cs | 273 -- Runtime/LinearAlgebra/src/float16.cs | 322 -- Runtime/LinearAlgebra/test/AngleTest.cs | 501 --- Runtime/LinearAlgebra/test/DirectionTest.cs | 226 - .../test/LinearAlgebra_Test.csproj | 19 - Runtime/LinearAlgebra/test/QuaternionTest.cs | 185 - Runtime/LinearAlgebra/test/SphericalTest.cs | 271 -- Runtime/LinearAlgebra/test/SwingTwistTest.cs | 131 - .../LinearAlgebra/test/Vector2FloatTest.cs | 364 -- Runtime/LinearAlgebra/test/Vector2IntTest.cs | 270 -- .../LinearAlgebra/test/Vector3FloatTest.cs | 581 --- Runtime/LinearAlgebra/test/Vector3IntTest.cs | 349 -- Runtime/Scripts/Brain.cs | 2 +- Runtime/Scripts/Brain.cs.meta | 11 +- Runtime/Scripts/Core/Cluster.cs | 844 ++-- Runtime/Scripts/Core/Cluster.cs.meta | 11 +- Runtime/Scripts/Core/MemoryCell.cs | 2 +- Runtime/Scripts/Core/MemoryCell.cs.meta | 11 +- Runtime/Scripts/Core/Neuron.cs | 241 +- Runtime/Scripts/Core/Neuron.cs.meta | 11 +- Runtime/Scripts/Core/Nucleus.cs | 131 +- Runtime/Scripts/Core/Nucleus.cs.meta | 11 +- Runtime/Scripts/Core/Synapse.cs.meta | 11 +- .../ScriptableObjects/ClusterPrefab.cs | 218 +- doxygen/DoxyWarnLogfile.txt | 230 -- 371 files changed, 19707 insertions(+), 8453 deletions(-) create mode 100644 .gitea/workflows/copy_documentation.yml rename doxygen.meta => Documentation.meta (100%) create mode 100644 Documentation/DoxyWarnLogfile.txt rename {doxygen => Documentation}/DoxyWarnLogfile.txt.meta (100%) rename {doxygen => Documentation}/Doxyfile (100%) rename {doxygen => Documentation}/Doxyfile.meta (100%) rename {doxygen => Documentation}/DoxygenLayout.xml (100%) rename {doxygen => Documentation}/DoxygenLayout.xml.meta (100%) create mode 100644 Documentation/Installation.md create mode 100644 Documentation/Installation.md.meta create mode 100644 Documentation/ToC.md create mode 100644 Documentation/ToC.md.meta rename {doxygen => Documentation}/custom_doxygen.css (100%) rename {doxygen => Documentation}/custom_doxygen.css.meta (100%) rename LinearAlgebra.meta => Documentation/html.meta (77%) rename {doxygen/images => Documentation/html}/PasserLifeLogoRight1_300.png (100%) create mode 100644 Documentation/html/PasserLifeLogoRight1_300.png.meta create mode 100644 Documentation/html/annotated.html create mode 100644 Documentation/html/annotated.html.meta create mode 100644 Documentation/html/bc_s.png create mode 100644 Documentation/html/bc_s.png.meta create mode 100644 Documentation/html/bc_sd.png create mode 100644 Documentation/html/bc_sd.png.meta create mode 100644 Documentation/html/class_nano_brain_1_1_brain-members.html create mode 100644 Documentation/html/class_nano_brain_1_1_brain-members.html.meta create mode 100644 Documentation/html/class_nano_brain_1_1_brain.html create mode 100644 Documentation/html/class_nano_brain_1_1_brain.html.meta create mode 100644 Documentation/html/class_nano_brain_1_1_cluster-members.html create mode 100644 Documentation/html/class_nano_brain_1_1_cluster-members.html.meta create mode 100644 Documentation/html/class_nano_brain_1_1_cluster.html create mode 100644 Documentation/html/class_nano_brain_1_1_cluster.html.meta create mode 100644 Documentation/html/class_nano_brain_1_1_cluster.png create mode 100644 Documentation/html/class_nano_brain_1_1_cluster.png.meta create mode 100644 Documentation/html/class_nano_brain_1_1_cluster_prefab-members.html create mode 100644 Documentation/html/class_nano_brain_1_1_cluster_prefab-members.html.meta create mode 100644 Documentation/html/class_nano_brain_1_1_cluster_prefab.html create mode 100644 Documentation/html/class_nano_brain_1_1_cluster_prefab.html.meta create mode 100644 Documentation/html/class_nano_brain_1_1_memory_cell-members.html create mode 100644 Documentation/html/class_nano_brain_1_1_memory_cell-members.html.meta create mode 100644 Documentation/html/class_nano_brain_1_1_memory_cell.html create mode 100644 Documentation/html/class_nano_brain_1_1_memory_cell.html.meta create mode 100644 Documentation/html/class_nano_brain_1_1_memory_cell.png create mode 100644 Documentation/html/class_nano_brain_1_1_memory_cell.png.meta create mode 100644 Documentation/html/class_nano_brain_1_1_neuron-members.html create mode 100644 Documentation/html/class_nano_brain_1_1_neuron-members.html.meta create mode 100644 Documentation/html/class_nano_brain_1_1_neuron.html create mode 100644 Documentation/html/class_nano_brain_1_1_neuron.html.meta create mode 100644 Documentation/html/class_nano_brain_1_1_neuron.png create mode 100644 Documentation/html/class_nano_brain_1_1_neuron.png.meta create mode 100644 Documentation/html/class_nano_brain_1_1_nucleus-members.html create mode 100644 Documentation/html/class_nano_brain_1_1_nucleus-members.html.meta create mode 100644 Documentation/html/class_nano_brain_1_1_nucleus.html create mode 100644 Documentation/html/class_nano_brain_1_1_nucleus.html.meta create mode 100644 Documentation/html/class_nano_brain_1_1_nucleus.png create mode 100644 Documentation/html/class_nano_brain_1_1_nucleus.png.meta create mode 100644 Documentation/html/class_nano_brain_1_1_synapse-members.html create mode 100644 Documentation/html/class_nano_brain_1_1_synapse-members.html.meta create mode 100644 Documentation/html/class_nano_brain_1_1_synapse.html create mode 100644 Documentation/html/class_nano_brain_1_1_synapse.html.meta create mode 100644 Documentation/html/classes.html create mode 100644 Documentation/html/classes.html.meta create mode 100644 Documentation/html/closed.png create mode 100644 Documentation/html/closed.png.meta create mode 100644 Documentation/html/custom_doxygen.css rename Runtime/LinearAlgebra.meta => Documentation/html/custom_doxygen.css.meta (67%) create mode 100644 Documentation/html/dir_14eca4e58e6d71e3a9859288c1bd2735.html create mode 100644 Documentation/html/dir_14eca4e58e6d71e3a9859288c1bd2735.html.meta create mode 100644 Documentation/html/dir_4f6666a8f2ab10bc970eb7559668f031.html create mode 100644 Documentation/html/dir_4f6666a8f2ab10bc970eb7559668f031.html.meta create mode 100644 Documentation/html/dir_961f031cbd4067daa41f3038afdffb61.html create mode 100644 Documentation/html/dir_961f031cbd4067daa41f3038afdffb61.html.meta create mode 100644 Documentation/html/dir_d52cd4d528148a4237c9bd37fdf6f7e8.html create mode 100644 Documentation/html/dir_d52cd4d528148a4237c9bd37fdf6f7e8.html.meta create mode 100644 Documentation/html/dir_ff8b04b97203665bfd386b445c7d0b7c.html create mode 100644 Documentation/html/dir_ff8b04b97203665bfd386b445c7d0b7c.html.meta create mode 100644 Documentation/html/doc.svg create mode 100644 Documentation/html/doc.svg.meta create mode 100644 Documentation/html/docd.svg create mode 100644 Documentation/html/docd.svg.meta create mode 100644 Documentation/html/doxygen.css create mode 100644 Documentation/html/doxygen.css.meta create mode 100644 Documentation/html/doxygen.svg create mode 100644 Documentation/html/doxygen.svg.meta create mode 100644 Documentation/html/dynsections.js create mode 100644 Documentation/html/dynsections.js.meta create mode 100644 Documentation/html/folderclosed.svg create mode 100644 Documentation/html/folderclosed.svg.meta create mode 100644 Documentation/html/folderclosedd.svg create mode 100644 Documentation/html/folderclosedd.svg.meta create mode 100644 Documentation/html/folderopen.svg create mode 100644 Documentation/html/folderopen.svg.meta create mode 100644 Documentation/html/folderopend.svg create mode 100644 Documentation/html/folderopend.svg.meta create mode 100644 Documentation/html/functions.html create mode 100644 Documentation/html/functions.html.meta create mode 100644 Documentation/html/functions_enum.html create mode 100644 Documentation/html/functions_enum.html.meta create mode 100644 Documentation/html/functions_func.html create mode 100644 Documentation/html/functions_func.html.meta create mode 100644 Documentation/html/functions_prop.html create mode 100644 Documentation/html/functions_prop.html.meta create mode 100644 Documentation/html/functions_vars.html create mode 100644 Documentation/html/functions_vars.html.meta create mode 100644 Documentation/html/hierarchy.html create mode 100644 Documentation/html/hierarchy.html.meta create mode 100644 Documentation/html/index.html create mode 100644 Documentation/html/index.html.meta create mode 100644 Documentation/html/jquery.js create mode 100644 Documentation/html/jquery.js.meta create mode 100644 Documentation/html/md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html create mode 100644 Documentation/html/md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html.meta create mode 100644 Documentation/html/md__installation.html create mode 100644 Documentation/html/md__installation.html.meta create mode 100644 Documentation/html/menu.js create mode 100644 Documentation/html/menu.js.meta create mode 100644 Documentation/html/menudata.js create mode 100644 Documentation/html/menudata.js.meta create mode 100644 Documentation/html/minus.svg create mode 100644 Documentation/html/minus.svg.meta create mode 100644 Documentation/html/minusd.svg create mode 100644 Documentation/html/minusd.svg.meta create mode 100644 Documentation/html/namespace_nano_brain.html create mode 100644 Documentation/html/namespace_nano_brain.html.meta create mode 100644 Documentation/html/nav_f.png create mode 100644 Documentation/html/nav_f.png.meta create mode 100644 Documentation/html/nav_fd.png create mode 100644 Documentation/html/nav_fd.png.meta create mode 100644 Documentation/html/nav_g.png create mode 100644 Documentation/html/nav_g.png.meta create mode 100644 Documentation/html/nav_h.png create mode 100644 Documentation/html/nav_h.png.meta create mode 100644 Documentation/html/nav_hd.png create mode 100644 Documentation/html/nav_hd.png.meta create mode 100644 Documentation/html/open.png create mode 100644 Documentation/html/open.png.meta create mode 100644 Documentation/html/pages.html create mode 100644 Documentation/html/pages.html.meta create mode 100644 Documentation/html/plus.svg create mode 100644 Documentation/html/plus.svg.meta create mode 100644 Documentation/html/plusd.svg create mode 100644 Documentation/html/plusd.svg.meta rename LinearAlgebra/src.meta => Documentation/html/rtf.meta (77%) create mode 100644 Documentation/html/rtf/PasserLifeLogoRight1_300.png create mode 100644 Documentation/html/rtf/PasserLifeLogoRight1_300.png.meta create mode 100644 Documentation/html/rtf/class_nano_brain_1_1_cluster.png create mode 100644 Documentation/html/rtf/class_nano_brain_1_1_cluster.png.meta create mode 100644 Documentation/html/rtf/class_nano_brain_1_1_memory_cell.png create mode 100644 Documentation/html/rtf/class_nano_brain_1_1_memory_cell.png.meta create mode 100644 Documentation/html/rtf/class_nano_brain_1_1_neuron.png create mode 100644 Documentation/html/rtf/class_nano_brain_1_1_neuron.png.meta create mode 100644 Documentation/html/rtf/class_nano_brain_1_1_nucleus.png create mode 100644 Documentation/html/rtf/class_nano_brain_1_1_nucleus.png.meta create mode 100644 Documentation/html/rtf/refman.rtf create mode 100644 Documentation/html/rtf/refman.rtf.meta rename LinearAlgebra/test.meta => Documentation/html/search.meta (77%) create mode 100644 Documentation/html/search/all_0.js create mode 100644 Documentation/html/search/all_0.js.meta create mode 100644 Documentation/html/search/all_1.js create mode 100644 Documentation/html/search/all_1.js.meta create mode 100644 Documentation/html/search/all_10.js create mode 100644 Documentation/html/search/all_10.js.meta create mode 100644 Documentation/html/search/all_11.js create mode 100644 Documentation/html/search/all_11.js.meta create mode 100644 Documentation/html/search/all_2.js create mode 100644 Documentation/html/search/all_2.js.meta create mode 100644 Documentation/html/search/all_3.js create mode 100644 Documentation/html/search/all_3.js.meta create mode 100644 Documentation/html/search/all_4.js create mode 100644 Documentation/html/search/all_4.js.meta create mode 100644 Documentation/html/search/all_5.js create mode 100644 Documentation/html/search/all_5.js.meta create mode 100644 Documentation/html/search/all_6.js create mode 100644 Documentation/html/search/all_6.js.meta create mode 100644 Documentation/html/search/all_7.js create mode 100644 Documentation/html/search/all_7.js.meta create mode 100644 Documentation/html/search/all_8.js create mode 100644 Documentation/html/search/all_8.js.meta create mode 100644 Documentation/html/search/all_9.js create mode 100644 Documentation/html/search/all_9.js.meta create mode 100644 Documentation/html/search/all_a.js create mode 100644 Documentation/html/search/all_a.js.meta create mode 100644 Documentation/html/search/all_b.js create mode 100644 Documentation/html/search/all_b.js.meta create mode 100644 Documentation/html/search/all_c.js create mode 100644 Documentation/html/search/all_c.js.meta create mode 100644 Documentation/html/search/all_d.js create mode 100644 Documentation/html/search/all_d.js.meta create mode 100644 Documentation/html/search/all_e.js create mode 100644 Documentation/html/search/all_e.js.meta create mode 100644 Documentation/html/search/all_f.js create mode 100644 Documentation/html/search/all_f.js.meta create mode 100644 Documentation/html/search/classes_0.js create mode 100644 Documentation/html/search/classes_0.js.meta create mode 100644 Documentation/html/search/classes_1.js create mode 100644 Documentation/html/search/classes_1.js.meta create mode 100644 Documentation/html/search/classes_2.js create mode 100644 Documentation/html/search/classes_2.js.meta create mode 100644 Documentation/html/search/classes_3.js create mode 100644 Documentation/html/search/classes_3.js.meta create mode 100644 Documentation/html/search/classes_4.js create mode 100644 Documentation/html/search/classes_4.js.meta create mode 100644 Documentation/html/search/close.svg create mode 100644 Documentation/html/search/close.svg.meta create mode 100644 Documentation/html/search/enums_0.js create mode 100644 Documentation/html/search/enums_0.js.meta create mode 100644 Documentation/html/search/enums_1.js create mode 100644 Documentation/html/search/enums_1.js.meta create mode 100644 Documentation/html/search/enums_2.js create mode 100644 Documentation/html/search/enums_2.js.meta create mode 100644 Documentation/html/search/enumvalues_0.js create mode 100644 Documentation/html/search/enumvalues_0.js.meta create mode 100644 Documentation/html/search/enumvalues_1.js create mode 100644 Documentation/html/search/enumvalues_1.js.meta create mode 100644 Documentation/html/search/functions_0.js create mode 100644 Documentation/html/search/functions_0.js.meta create mode 100644 Documentation/html/search/functions_1.js create mode 100644 Documentation/html/search/functions_1.js.meta create mode 100644 Documentation/html/search/functions_2.js create mode 100644 Documentation/html/search/functions_2.js.meta create mode 100644 Documentation/html/search/functions_3.js create mode 100644 Documentation/html/search/functions_3.js.meta create mode 100644 Documentation/html/search/functions_4.js create mode 100644 Documentation/html/search/functions_4.js.meta create mode 100644 Documentation/html/search/functions_5.js create mode 100644 Documentation/html/search/functions_5.js.meta create mode 100644 Documentation/html/search/functions_6.js create mode 100644 Documentation/html/search/functions_6.js.meta create mode 100644 Documentation/html/search/functions_7.js create mode 100644 Documentation/html/search/functions_7.js.meta create mode 100644 Documentation/html/search/functions_8.js create mode 100644 Documentation/html/search/functions_8.js.meta create mode 100644 Documentation/html/search/functions_9.js create mode 100644 Documentation/html/search/functions_9.js.meta create mode 100644 Documentation/html/search/mag.svg create mode 100644 Documentation/html/search/mag.svg.meta create mode 100644 Documentation/html/search/mag_d.svg create mode 100644 Documentation/html/search/mag_d.svg.meta create mode 100644 Documentation/html/search/mag_sel.svg create mode 100644 Documentation/html/search/mag_sel.svg.meta create mode 100644 Documentation/html/search/mag_seld.svg create mode 100644 Documentation/html/search/mag_seld.svg.meta create mode 100644 Documentation/html/search/namespaces_0.js create mode 100644 Documentation/html/search/namespaces_0.js.meta create mode 100644 Documentation/html/search/pages_0.js create mode 100644 Documentation/html/search/pages_0.js.meta create mode 100644 Documentation/html/search/pages_1.js create mode 100644 Documentation/html/search/pages_1.js.meta create mode 100644 Documentation/html/search/pages_2.js create mode 100644 Documentation/html/search/pages_2.js.meta create mode 100644 Documentation/html/search/pages_3.js create mode 100644 Documentation/html/search/pages_3.js.meta create mode 100644 Documentation/html/search/pages_4.js create mode 100644 Documentation/html/search/pages_4.js.meta create mode 100644 Documentation/html/search/pages_5.js create mode 100644 Documentation/html/search/pages_5.js.meta create mode 100644 Documentation/html/search/properties_0.js create mode 100644 Documentation/html/search/properties_0.js.meta create mode 100644 Documentation/html/search/properties_1.js create mode 100644 Documentation/html/search/properties_1.js.meta create mode 100644 Documentation/html/search/properties_2.js create mode 100644 Documentation/html/search/properties_2.js.meta create mode 100644 Documentation/html/search/properties_3.js create mode 100644 Documentation/html/search/properties_3.js.meta create mode 100644 Documentation/html/search/properties_4.js create mode 100644 Documentation/html/search/properties_4.js.meta create mode 100644 Documentation/html/search/search.css create mode 100644 Documentation/html/search/search.css.meta create mode 100644 Documentation/html/search/search.js create mode 100644 Documentation/html/search/search.js.meta create mode 100644 Documentation/html/search/searchdata.js create mode 100644 Documentation/html/search/searchdata.js.meta create mode 100644 Documentation/html/search/variables_0.js create mode 100644 Documentation/html/search/variables_0.js.meta create mode 100644 Documentation/html/search/variables_1.js create mode 100644 Documentation/html/search/variables_1.js.meta create mode 100644 Documentation/html/search/variables_2.js create mode 100644 Documentation/html/search/variables_2.js.meta create mode 100644 Documentation/html/search/variables_3.js create mode 100644 Documentation/html/search/variables_3.js.meta create mode 100644 Documentation/html/search/variables_4.js create mode 100644 Documentation/html/search/variables_4.js.meta create mode 100644 Documentation/html/search/variables_5.js create mode 100644 Documentation/html/search/variables_5.js.meta create mode 100644 Documentation/html/search/variables_6.js create mode 100644 Documentation/html/search/variables_6.js.meta create mode 100644 Documentation/html/search/variables_7.js create mode 100644 Documentation/html/search/variables_7.js.meta create mode 100644 Documentation/html/search/variables_8.js create mode 100644 Documentation/html/search/variables_8.js.meta create mode 100644 Documentation/html/splitbar.png create mode 100644 Documentation/html/splitbar.png.meta create mode 100644 Documentation/html/splitbard.png create mode 100644 Documentation/html/splitbard.png.meta create mode 100644 Documentation/html/sync_off.png create mode 100644 Documentation/html/sync_off.png.meta create mode 100644 Documentation/html/sync_on.png create mode 100644 Documentation/html/sync_on.png.meta create mode 100644 Documentation/html/tab_a.png create mode 100644 Documentation/html/tab_a.png.meta create mode 100644 Documentation/html/tab_ad.png create mode 100644 Documentation/html/tab_ad.png.meta create mode 100644 Documentation/html/tab_b.png create mode 100644 Documentation/html/tab_b.png.meta create mode 100644 Documentation/html/tab_bd.png create mode 100644 Documentation/html/tab_bd.png.meta create mode 100644 Documentation/html/tab_h.png create mode 100644 Documentation/html/tab_h.png.meta create mode 100644 Documentation/html/tab_hd.png create mode 100644 Documentation/html/tab_hd.png.meta create mode 100644 Documentation/html/tab_s.png create mode 100644 Documentation/html/tab_s.png.meta create mode 100644 Documentation/html/tab_sd.png create mode 100644 Documentation/html/tab_sd.png.meta create mode 100644 Documentation/html/tabs.css create mode 100644 Documentation/html/tabs.css.meta rename {doxygen => Documentation}/images.meta (100%) create mode 100644 Documentation/images/PasserLifeLogoRight1_300.png rename {doxygen => Documentation}/images/PasserLifeLogoRight1_300.png.meta (100%) create mode 100644 Editor/Neuron_Drawer.cs create mode 100644 Editor/Neuron_Drawer.cs.meta create mode 100644 README.md create mode 100644 README.md.meta delete mode 100644 Runtime/LinearAlgebra/.editorconfig delete mode 100644 Runtime/LinearAlgebra/.gitea/workflows/unit_tests.yaml delete mode 100644 Runtime/LinearAlgebra/.gitignore delete mode 100644 Runtime/LinearAlgebra/LinearAlgebra-csharp.sln delete mode 100644 Runtime/LinearAlgebra/src/Angle.cs delete mode 100644 Runtime/LinearAlgebra/src/Decomposition.cs delete mode 100644 Runtime/LinearAlgebra/src/Direction.cs delete mode 100644 Runtime/LinearAlgebra/src/Float.cs delete mode 100644 Runtime/LinearAlgebra/src/LinearAlgebra.csproj delete mode 100644 Runtime/LinearAlgebra/src/Matrix.cs delete mode 100644 Runtime/LinearAlgebra/src/Quat32.cs delete mode 100644 Runtime/LinearAlgebra/src/Quaternion.cs delete mode 100644 Runtime/LinearAlgebra/src/Spherical.cs delete mode 100644 Runtime/LinearAlgebra/src/SwingTwist.cs delete mode 100644 Runtime/LinearAlgebra/src/Vector2Float.cs delete mode 100644 Runtime/LinearAlgebra/src/Vector2Int.cs delete mode 100644 Runtime/LinearAlgebra/src/Vector3Float.cs delete mode 100644 Runtime/LinearAlgebra/src/Vector3Int.cs delete mode 100644 Runtime/LinearAlgebra/src/float16.cs delete mode 100644 Runtime/LinearAlgebra/test/AngleTest.cs delete mode 100644 Runtime/LinearAlgebra/test/DirectionTest.cs delete mode 100644 Runtime/LinearAlgebra/test/LinearAlgebra_Test.csproj delete mode 100644 Runtime/LinearAlgebra/test/QuaternionTest.cs delete mode 100644 Runtime/LinearAlgebra/test/SphericalTest.cs delete mode 100644 Runtime/LinearAlgebra/test/SwingTwistTest.cs delete mode 100644 Runtime/LinearAlgebra/test/Vector2FloatTest.cs delete mode 100644 Runtime/LinearAlgebra/test/Vector2IntTest.cs delete mode 100644 Runtime/LinearAlgebra/test/Vector3FloatTest.cs delete mode 100644 Runtime/LinearAlgebra/test/Vector3IntTest.cs delete mode 100644 doxygen/DoxyWarnLogfile.txt diff --git a/.gitea/workflows/copy_documentation.yml b/.gitea/workflows/copy_documentation.yml new file mode 100644 index 0000000..74f14f6 --- /dev/null +++ b/.gitea/workflows/copy_documentation.yml @@ -0,0 +1,34 @@ +name: Copy Documentation to webserver + +on: + push: + branches: + - '**' + pull_request: + branches: + - '**' + +jobs: + copy-documentation: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Install Dependencies + run: | + apt-get update + apt-get install -y rsync # Install required packages + + - name: Ensure destination exists + run: | + mkdir -p /web/nanobrain + chown -R $USER:$USER /web/nanobrain + + - name: Copy html folder + run: | + rsync -av --delete Documentation/html/ /web/nanobrain 2>&1 + echo $HOSTNAME + ps aux | head + find / -path '*/web/nanobrain/*' diff --git a/doxygen.meta b/Documentation.meta similarity index 100% rename from doxygen.meta rename to Documentation.meta diff --git a/Documentation/DoxyWarnLogfile.txt b/Documentation/DoxyWarnLogfile.txt new file mode 100644 index 0000000..e0dc472 --- /dev/null +++ b/Documentation/DoxyWarnLogfile.txt @@ -0,0 +1,106 @@ +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs:84: warning: Member EnsureInitialization() (function) of class NanoBrain.ClusterPrefab is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs:96: warning: Member GarbageCollection() (function) of class NanoBrain.ClusterPrefab is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs:12: warning: Member cluster (variable) of class NanoBrain.ClusterPrefab is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/MemoryCell.cs:16: warning: Member MemoryCell(Cluster parent, string name) (function) of class NanoBrain.MemoryCell is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/MemoryCell.cs:28: warning: Member ShallowCloneTo(Cluster newParent) (function) of class NanoBrain.MemoryCell is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/MemoryCell.cs:45: warning: Member UpdateStateIsolated() (function) of class NanoBrain.MemoryCell is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:151: warning: Member GenerateCurve() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:282: warning: Member SleepCheck() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:398: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:425: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:407: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:432: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:441: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:588: warning: Member AddReceiver(Nucleus receiverToAdd, float weight=1) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:597: warning: Member RemoveReceiver(Nucleus receiverToRemove) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:333: warning: Member Delete(Nucleus nucleus) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/MemoryCell.cs:18: warning: Member staticMemory (variable) of class NanoBrain.MemoryCell is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:140: warning: Member _curvePreset (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:148: warning: Member curve (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:149: warning: Member curveMax (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:278: warning: Member WhenFiring (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:280: warning: Member persistOutput (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:299: warning: Member timeToSleep (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:324: warning: Member CloneFields(Neuron clone) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:383: warning: Member CheckSleepingSynapses() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:489: warning: Member ActivatorLinear(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:546: warning: Member ActivatorLinear(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:493: warning: Member ActivatorSqrt(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:550: warning: Member ActivatorSqrt(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:498: warning: Member ActivatorPower(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:555: warning: Member ActivatorPower(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:503: warning: Member ActivatorReciprocal(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:560: warning: Member ActivatorReciprocal(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:512: warning: Member ActivatorTanh(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:517: warning: Member ActivatorBinary(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:523: warning: Member ActivatorNormalized(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:530: warning: Member ActivatorCustom(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:569: warning: Member ActivatorCustom(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:250: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:264: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/MemoryCell.cs:19: warning: Member isSleeping (property) of class NanoBrain.MemoryCell is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:141: warning: Member curvePreset (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:251: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:265: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:259: warning: Member outputMagnitude (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:260: warning: Member outputSqrMagnitude (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:277: warning: Member isFiring (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:392: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:418: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:478: warning: Member Activator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:538: warning: Member Activator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:583: warning: Member receivers (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:616: warning: argument 'thingId' of command @param is not found in the argument list of NanoBrain.Neuron::ProcessStimulus(Vector3 inputValue) +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:616: warning: argument 'thingName' of command @param is not found in the argument list of NanoBrain.Neuron::ProcessStimulus(Vector3 inputValue) +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:151: warning: Member GenerateCurve() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:282: warning: Member SleepCheck() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:377: warning: Member UpdateStateIsolated() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:398: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:407: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:425: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:432: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:441: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:588: warning: Member AddReceiver(Nucleus receiverToAdd, float weight=1) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:597: warning: Member RemoveReceiver(Nucleus receiverToRemove) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:333: warning: Member Delete(Nucleus nucleus) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:140: warning: Member _curvePreset (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:148: warning: Member curve (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:149: warning: Member curveMax (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:278: warning: Member WhenFiring (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:280: warning: Member persistOutput (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:299: warning: Member timeToSleep (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:324: warning: Member CloneFields(Neuron clone) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:383: warning: Member CheckSleepingSynapses() (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:489: warning: Member ActivatorLinear(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:493: warning: Member ActivatorSqrt(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:498: warning: Member ActivatorPower(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:503: warning: Member ActivatorReciprocal(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:512: warning: Member ActivatorTanh(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:517: warning: Member ActivatorBinary(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:523: warning: Member ActivatorNormalized(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:530: warning: Member ActivatorCustom(float3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:546: warning: Member ActivatorLinear(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:550: warning: Member ActivatorSqrt(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:555: warning: Member ActivatorPower(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:560: warning: Member ActivatorReciprocal(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:569: warning: Member ActivatorCustom(Vector3 input) (function) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:250: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:264: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:141: warning: Member curvePreset (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:251: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:259: warning: Member outputMagnitude (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:260: warning: Member outputSqrMagnitude (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:265: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:277: warning: Member isFiring (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:281: warning: Member isSleeping (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:392: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:418: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:478: warning: Member Activator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:538: warning: Member Activator (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:583: warning: Member receivers (property) of class NanoBrain.Neuron is not documented. +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:302: warning: argument 'parent' of command @param is not found in the argument list of NanoBrain.Neuron::ShallowCloneTo(Cluster newParent) +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:302: warning: The following parameter of NanoBrain.Neuron.ShallowCloneTo(Cluster newParent) is not documented: + parameter 'newParent' +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:616: warning: argument 'thingId' of command @param is not found in the argument list of NanoBrain.Neuron::ProcessStimulus(Vector3 inputValue) +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:616: warning: argument 'thingName' of command @param is not found in the argument list of NanoBrain.Neuron::ProcessStimulus(Vector3 inputValue) +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Synapse.cs:32: warning: Member isSleeping (property) of class NanoBrain.Synapse is not documented. diff --git a/doxygen/DoxyWarnLogfile.txt.meta b/Documentation/DoxyWarnLogfile.txt.meta similarity index 100% rename from doxygen/DoxyWarnLogfile.txt.meta rename to Documentation/DoxyWarnLogfile.txt.meta diff --git a/doxygen/Doxyfile b/Documentation/Doxyfile similarity index 100% rename from doxygen/Doxyfile rename to Documentation/Doxyfile diff --git a/doxygen/Doxyfile.meta b/Documentation/Doxyfile.meta similarity index 100% rename from doxygen/Doxyfile.meta rename to Documentation/Doxyfile.meta diff --git a/doxygen/DoxygenLayout.xml b/Documentation/DoxygenLayout.xml similarity index 100% rename from doxygen/DoxygenLayout.xml rename to Documentation/DoxygenLayout.xml diff --git a/doxygen/DoxygenLayout.xml.meta b/Documentation/DoxygenLayout.xml.meta similarity index 100% rename from doxygen/DoxygenLayout.xml.meta rename to Documentation/DoxygenLayout.xml.meta diff --git a/Documentation/Installation.md b/Documentation/Installation.md new file mode 100644 index 0000000..c89f3d1 --- /dev/null +++ b/Documentation/Installation.md @@ -0,0 +1,14 @@ +Package Installation +==================== + +You can import the NanoBrain Ant package in Unity directly with the Package Manager git package importer. + +See Unity: [Installing from a Git URL](https://docs.unity3d.com/Manual/upm-ui-giturl.html) + +Use the link from 'Clone with HTTP' (for example: https://git.passer.life/CreatureControl/Ant.git) In this way you can always retrieve the latest version by pressing the Update button in the Package Manager. + +Optionally, you can use a tag to retrieve a specific version. For example: https://git.passer.life/CreatureControl/Ant.git#0.1.0. This will give you a stable version which does not change. Updating can be done by retrieving the package with a link to a new release. + +Samples Installation +-------------------- +In the Unity Package manager, select the NanoBrain Ant package and look for the `Samples` tab in the details pane on the right. There you can import the `Models`. \ No newline at end of file diff --git a/Documentation/Installation.md.meta b/Documentation/Installation.md.meta new file mode 100644 index 0000000..2e15366 --- /dev/null +++ b/Documentation/Installation.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e27e748d8b619ce38b068b30c1117989 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/ToC.md b/Documentation/ToC.md new file mode 100644 index 0000000..527bac5 --- /dev/null +++ b/Documentation/ToC.md @@ -0,0 +1,5 @@ +\mainpage + +Table of Contents +----------------- +- [Installation](Installation.md) diff --git a/Documentation/ToC.md.meta b/Documentation/ToC.md.meta new file mode 100644 index 0000000..878ff22 --- /dev/null +++ b/Documentation/ToC.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e08bd11eb9f534ac18df9a9c3c93d151 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/doxygen/custom_doxygen.css b/Documentation/custom_doxygen.css similarity index 100% rename from doxygen/custom_doxygen.css rename to Documentation/custom_doxygen.css diff --git a/doxygen/custom_doxygen.css.meta b/Documentation/custom_doxygen.css.meta similarity index 100% rename from doxygen/custom_doxygen.css.meta rename to Documentation/custom_doxygen.css.meta diff --git a/LinearAlgebra.meta b/Documentation/html.meta similarity index 77% rename from LinearAlgebra.meta rename to Documentation/html.meta index d18b73b..9a5d394 100644 --- a/LinearAlgebra.meta +++ b/Documentation/html.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a4c7dfe43bdf504e29c5c97919d7a1c0 +guid: c38c04e6e8570a9bdb3f50169d7a2691 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/doxygen/images/PasserLifeLogoRight1_300.png b/Documentation/html/PasserLifeLogoRight1_300.png similarity index 100% rename from doxygen/images/PasserLifeLogoRight1_300.png rename to Documentation/html/PasserLifeLogoRight1_300.png diff --git a/Documentation/html/PasserLifeLogoRight1_300.png.meta b/Documentation/html/PasserLifeLogoRight1_300.png.meta new file mode 100644 index 0000000..44b1805 --- /dev/null +++ b/Documentation/html/PasserLifeLogoRight1_300.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 02ece4d43b8f3df958ad4f1703bbb927 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/annotated.html b/Documentation/html/annotated.html new file mode 100644 index 0000000..a7d0e0e --- /dev/null +++ b/Documentation/html/annotated.html @@ -0,0 +1,95 @@ + + + + + + + +Nano Brain for Unity: Class List + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 12]
+ + + + + + + + +
 NNanoBrainThe Nanobrain namespace
 CBrainThe NanoBrain Unity Componnent
 CClusterA Cluster combines a collection of Nuclei to implement reusable behaviour
 CClusterPrefabThe Unity ScriptableObject to implement re-usable Cluster Prefabs
 CMemoryCellA MemoryCell stored its value for one update
 CNeuronA neuron is a basic Nucleus
 CNucleusA Nucleus is a basic element in a brain cluster
 CSynapseA Synapse connects the ouput of a Neuron to another Neuron
+
+
+ + + + diff --git a/Documentation/html/annotated.html.meta b/Documentation/html/annotated.html.meta new file mode 100644 index 0000000..8b2df70 --- /dev/null +++ b/Documentation/html/annotated.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1ed8b017b4a8dbbca941f6581073f398 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/bc_s.png b/Documentation/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..927cda712c3f305c64b69f199b085b316d52a7e2 GIT binary patch literal 636 zcmV-?0)zdDP) zhGLps(4y24e9uVA;^{Q&@! zF^NRtx>BiRrBW$7o6SxDfHKlucG?qDUv)K{`gW(i`$19*- zuP^hf48wd21Ok6B_w@Vy3lXT*YU{5&a=BbvDwS#h)X{f=6#euBzQ8II!s05<)Z*=)XsgMJ{zVi5o+(+jfW*A;h!6bc0Z zpe%!O-!~eKXT#xehvf5l0HEv(3Z=pJ4-j}ya=F}k@s>iNci};u znN;}n{$jECBubslW|ze)D9pg)@d)|$XfzTRn2E(=OW>hSr*q?eo?`J}wGWw0W|?>K zQ!8;NcE{uK$JN?LA`v0p#wT|)8qFmZsi{diE$k^AqW0T(f`iFq@`3_Vsgy++4%-X& zJ_OFGKPwy#r*Jqs{u9SoJOTj9NHUo`b2^<09PZw9Iu*}Ob%;izdpO)V7M}wEZ2Dg; WajUwc_EAUx0000)a>zbcc`(S%_d_XmUZ_BtCorRdjN;yvFA*3R5Okw&;6?-| zC@#dLQDUOF8;DC$@INzlO!qr9^>M0->T^#0ryf9VG#co1I;hv{kR%E5c-#UsP1_8I z!_8zeQ8Z119jK~$+-kLEQngyW0^midRQlz1yUX+W{14;pCkn*+Iur^; zlF8)5#bWW&Qc$T>#Cn?-d_ez)!{NBjqW=Zua#^fyvf>UhchXt#aa+K%P5-eh%QyJL z8~XPR!??&6i$#+x`PuDuH>1%gWag32=XZI^)@Fmj;GUVY7wF_$uh%pB{r*KkE|-Ii zca;CLuIo2NEM+no02aH$R__)Hg|A$1N$GSNfW0RuK+|?Hn|l z&G+qg` + + + + + + +Nano Brain for Unity: Member List + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
NanoBrain.Brain Member List
+
+
+ +

This is the complete list of members for NanoBrain.Brain, including all inherited members.

+ + + + +
brainNanoBrain.Brain
brainPrefabNanoBrain.Brain
UpdateWeight(Cluster brain, string name, float weight)NanoBrain.Brainstatic
+ + + + diff --git a/Documentation/html/class_nano_brain_1_1_brain-members.html.meta b/Documentation/html/class_nano_brain_1_1_brain-members.html.meta new file mode 100644 index 0000000..d38ca95 --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_brain-members.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8071cad6602a92ea19518fd77d9740d8 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/class_nano_brain_1_1_brain.html b/Documentation/html/class_nano_brain_1_1_brain.html new file mode 100644 index 0000000..0e343da --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_brain.html @@ -0,0 +1,175 @@ + + + + + + + +Nano Brain for Unity: NanoBrain.Brain Class Reference + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
NanoBrain.Brain Class Reference
+
+
+

Description

+

The NanoBrain Unity Componnent.

+

This implements the top-level NanoBrain Cluster
+

+
+

Inherits MonoBehaviour.

+ + + + + +

+Static Public Member Functions

static void UpdateWeight (Cluster brain, string name, float weight)
 Update the weight for all Synapses coming from the Neuron with the given name.
 
+ + + + +

+Public Attributes

+ClusterPrefab brainPrefab
 The Cluster prefab from which the cluster is created.
 
+ + + + +

+Properties

+Cluster brain [get]
 The cluster isntance.
 
+

Member Function Documentation

+ +

◆ UpdateWeight()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void NanoBrain.Brain.UpdateWeight (Cluster brain,
string name,
float weight 
)
+
+static
+
+ +

Update the weight for all Synapses coming from the Neuron with the given name.

+
Parameters
+ + + + +
brainThe cluster in which the synapses are updated
nameThe name of the Neuron for which the weights are updated
weightThe new Synapse weight
+
+
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Brain.cs
  • +
+
+ + + + diff --git a/Documentation/html/class_nano_brain_1_1_brain.html.meta b/Documentation/html/class_nano_brain_1_1_brain.html.meta new file mode 100644 index 0000000..0d9d3db --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_brain.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 82b2d108fb097c36b83582ed8d34c407 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/class_nano_brain_1_1_cluster-members.html b/Documentation/html/class_nano_brain_1_1_cluster-members.html new file mode 100644 index 0000000..f5b4d74 --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_cluster-members.html @@ -0,0 +1,124 @@ + + + + + + + +Nano Brain for Unity: Member List + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
NanoBrain.Cluster Member List
+
+
+ +

This is the complete list of members for NanoBrain.Cluster, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
_outputsNanoBrain.Clusterprotected
AddInstance()NanoBrain.Cluster
AddInstance(ClusterPrefab prefab)NanoBrain.Cluster
baseNameNanoBrain.Cluster
Cluster(ClusterPrefab prefab, Cluster parent)NanoBrain.Cluster
Cluster(ClusterPrefab prefab, ClusterPrefab parent=null)NanoBrain.Cluster
CollectReceivers(bool removeDuplicates=false)NanoBrain.Clustervirtual
CollectSynapsesTo(Cluster otherCluster)NanoBrain.Cluster
computeOrdersNanoBrain.Cluster
defaultOutputNanoBrain.Cluster
DeleteNucleus(Nucleus nucleus)NanoBrain.Cluster
GetNeuron(string neuronName)NanoBrain.Cluster
GetNeuron(int thingId, string neuronName, string thingName=null)NanoBrain.Cluster
GetNucleus(string nucleusName)NanoBrain.Cluster
GetNucleusIndex(List< Nucleus > nuclei, Nucleus nucleus)NanoBrain.Clusterstatic
GetNucleusIndex(List< Nucleus > nuclei, string nucleusName)NanoBrain.Clusterstatic
instanceCountNanoBrain.Cluster
instancesNanoBrain.Cluster
nameNanoBrain.Nucleus
nucleiNanoBrain.Cluster
outputsNanoBrain.Cluster
parentNanoBrain.Nucleus
prefabNanoBrain.Cluster
Refresh()NanoBrain.Cluster
RefreshComputeOrders()NanoBrain.Cluster
RefreshOutputs()NanoBrain.Cluster
RemoveInstance()NanoBrain.Cluster
ShallowCloneTo(Cluster parent)NanoBrain.Cluster
thingClustersNanoBrain.Cluster
TryGetNucleus(string nucleusName, out Nucleus foundNucleus)NanoBrain.Cluster
Type enum nameNanoBrain.Nucleus
UpdateFromNucleus(Nucleus startNucleus)NanoBrain.Cluster
UpdateNuclei()NanoBrain.Nucleusvirtual
UpdateStateIsolated()NanoBrain.Cluster
+ + + + diff --git a/Documentation/html/class_nano_brain_1_1_cluster-members.html.meta b/Documentation/html/class_nano_brain_1_1_cluster-members.html.meta new file mode 100644 index 0000000..39a0cfa --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_cluster-members.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c7c7546d58e3a816b99fba6c9d216a58 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/class_nano_brain_1_1_cluster.html b/Documentation/html/class_nano_brain_1_1_cluster.html new file mode 100644 index 0000000..f2503ab --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_cluster.html @@ -0,0 +1,987 @@ + + + + + + + +Nano Brain for Unity: NanoBrain.Cluster Class Reference + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+ +
+

Description

+

A Cluster combines a collection of Nuclei to implement reusable behaviour.

+

A Cluster is an instantiation of a ClusterPrefab. Clusters can be nested inside other clusters.

+
+Inheritance diagram for NanoBrain.Cluster:
+
+
+ + +NanoBrain.Nucleus + +
+ + + + + +

+Public Types

enum  Type { None +, Neuron +, MemoryCell +, Cluster + }
 Function to clone a nucleus to a Cluster prefab. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Cluster (ClusterPrefab prefab, Cluster parent)
 Instantiate a new copy of a ClusterPrefab in the given parent.
 
 Cluster (ClusterPrefab prefab, ClusterPrefab parent=null)
 Add a new cluster to a ClusterPrefab.
 
override Nucleus ShallowCloneTo (Cluster parent)
 Toggle for printing debugging trace data.
 
void AddInstance ()
 Increase the number of instances in an multi-cluster.
 
void AddInstance (ClusterPrefab prefab)
 Create an new instance in a multi-cluster.
 
+void RemoveInstance ()
 Decrease the number of instance in a multi-cluster.
 
+void RefreshComputeOrders ()
 Refresh the order in which neurons should be computed.
 
+void RefreshOutputs ()
 Reset the list of outputs such that they will be re-determined.
 
bool TryGetNucleus (string nucleusName, out Nucleus foundNucleus)
 Try to find a nucleus in this cluster.
 
Nucleus GetNucleus (string nucleusName)
 Get a nucleus in this cluster.
 
Neuron GetNeuron (string neuronName)
 Get a neuron in this cluster.
 
Neuron GetNeuron (int thingId, string neuronName, string thingName=null)
 Get a neuron in an instance of a multi-cluster.
 
bool DeleteNucleus (Nucleus nucleus)
 Delete a nucleus from this clsuter.
 
virtual List< NucleusCollectReceivers (bool removeDuplicates=false)
 Collect all receiving nuclei of signals from this cluster.
 
List< SynapseCollectSynapsesTo (Cluster otherCluster)
 Collect all connections to receivers of signals from this cluster.
 
void UpdateFromNucleus (Nucleus startNucleus)
 Update the state of the nucleus and all nuclei receiving from it.
 
override void UpdateStateIsolated ()
 Update the state without updating other Nuclei.
 
void Refresh ()
 Recalculate derived properties.
 
virtual void UpdateNuclei ()
 Update the state and recursively all Nuclei receiving data from this Nucleus.
 
+ + + + + + + +

+Static Public Member Functions

static int GetNucleusIndex (List< Nucleus > nuclei, Nucleus nucleus)
 Get the index of a nucleus in a list of nuclei.
 
static int GetNucleusIndex (List< Nucleus > nuclei, string nucleusName)
 Get the index of a nucleus with the given name in a list of nuclei.
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

ClusterPrefab prefab
 The prefab used to create this cluster.
 
Cluster[] instances
 All cluster instance of a multi-cluster.
 
int instanceCount = 1
 The number of cluster instances in a multi-cluster.
 
Dictionary< int, ClusterthingClusters = new()
 The mapping from things to cluster instances.
 
+List< Nucleusnuclei = new()
 All nuclei in this cluster.
 
+string name
 The name of the Nucleus.
 
Cluster parent
 The cluster prefab in which the nucleus is located.
 
+ + + + +

+Protected Attributes

List< Neuron_outputs = null
 The neurons without outgoing connections.
 
+ + + + + + + + + + + + + +

+Properties

+string baseName [get]
 The base name of the cluster. I don't think this is actively used at this moment.
 
+Dictionary< Nucleus, List< Nucleus > > computeOrders [get]
 This gives the order in which nuclei should be computed when a nucleus is updated.
 
+virtual Neuron defaultOutput [get]
 The first nucleus in a cluster is the default output.
 
List< Neuronoutputs [get]
 The neurons without outgoing connections.
 
+

Member Enumeration Documentation

+ +

◆ Type

+ +
+
+ + + + + +
+ + + + +
enum NanoBrain.Nucleus.Type
+
+inherited
+
+ +

Function to clone a nucleus to a Cluster prefab.

+
Parameters
+ + +
prefab
+
+
+
Returns
+

The types of Nucleus

+ +
+
+

Constructor & Destructor Documentation

+ +

◆ Cluster() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
NanoBrain.Cluster.Cluster (ClusterPrefab prefab,
Cluster parent 
)
+
+ +

Instantiate a new copy of a ClusterPrefab in the given parent.

+
Parameters
+ + + +
prefabThe prefab to use
parentThe cluster in which this new cluster will be placed
+
+
+ +
+
+ +

◆ Cluster() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
NanoBrain.Cluster.Cluster (ClusterPrefab prefab,
ClusterPrefab parent = null 
)
+
+ +

Add a new cluster to a ClusterPrefab.

+
Parameters
+ + + +
prefabThe prefab to copy
parentThe prefab in which the new copy is placed
+
+
+ +
+
+

Member Function Documentation

+ +

◆ ShallowCloneTo()

+ +
+
+ + + + + + + + +
override Nucleus NanoBrain.Cluster.ShallowCloneTo (Cluster parent)
+
+ +

Toggle for printing debugging trace data.

+

Function to make a partial clone of this nucleus

+
Parameters
+ + +
parentThe cluster in which the cloned nucleus should be placed
+
+
+
Returns
+ +
+
+ +

◆ GetNucleusIndex() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static int NanoBrain.Cluster.GetNucleusIndex (List< Nucleusnuclei,
Nucleus nucleus 
)
+
+static
+
+ +

Get the index of a nucleus in a list of nuclei.

+
Parameters
+ + + +
nucleiThe list of nuclei to search
nucleusThe nucleus to find
+
+
+
Returns
The index of the nucleus in the list or -1 when it has not been found
+ +
+
+ +

◆ GetNucleusIndex() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static int NanoBrain.Cluster.GetNucleusIndex (List< Nucleusnuclei,
string nucleusName 
)
+
+static
+
+ +

Get the index of a nucleus with the given name in a list of nuclei.

+
Parameters
+ + + +
nucleiThe list of nuclei to search
nucleusNameThe name of the nucleus to find
+
+
+
Returns
The index of the nucleus in the list or -1 when it has not been found
+ +
+
+ +

◆ AddInstance() [1/2]

+ +
+
+ + + + + + + +
void NanoBrain.Cluster.AddInstance ()
+
+ +

Increase the number of instances in an multi-cluster.

+

/remark Note this does not create the instances. This is only intended to be used for prefabs.

+ +
+
+ +

◆ AddInstance() [2/2]

+ +
+
+ + + + + + + + +
void NanoBrain.Cluster.AddInstance (ClusterPrefab prefab)
+
+ +

Create an new instance in a multi-cluster.

+
Parameters
+ + +
prefabThe prefab to use to create the new instance
+
+
+

/remark This does not change the instanceCount. It should only be used at runtime.

+ +
+
+ +

◆ TryGetNucleus()

+ +
+
+ + + + + + + + + + + + + + + + + + +
bool NanoBrain.Cluster.TryGetNucleus (string nucleusName,
out Nucleus foundNucleus 
)
+
+ +

Try to find a nucleus in this cluster.

+
Parameters
+ + + +
nucleusNameThe name of the nucleus to find
foundNucleusThe found nucleus or null if it is not found
+
+
+
Returns
True when the nucleus is found, false otherwise
+ +
+
+ +

◆ GetNucleus()

+ +
+
+ + + + + + + + +
Nucleus NanoBrain.Cluster.GetNucleus (string nucleusName)
+
+ +

Get a nucleus in this cluster.

+
Parameters
+ + +
nucleusNameThe name of the nucleus to find
+
+
+
Returns
The found nucleus or null when it is not found
+ +
+
+ +

◆ GetNeuron() [1/2]

+ +
+
+ + + + + + + + +
Neuron NanoBrain.Cluster.GetNeuron (string neuronName)
+
+ +

Get a neuron in this cluster.

+
Parameters
+ + +
neuronNameThe name of the neuron to find
+
+
+
Returns
The found neuron or null when it is not found
+ +
+
+ +

◆ GetNeuron() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Neuron NanoBrain.Cluster.GetNeuron (int thingId,
string neuronName,
string thingName = null 
)
+
+ +

Get a neuron in an instance of a multi-cluster.

+
Parameters
+ + + + +
thingIdThe id of the thing mapped to the cluster instance
neuronNameThe name of the neuron to find
thingNameThe name of the thing mapped to the cluster instance
+
+
+
Returns
The found neuron or null when it is not found
+

The cluster instance mapped to the thing will be neuron.parent if a neuron is found.

+ +
+
+ +

◆ DeleteNucleus()

+ +
+
+ + + + + + + + +
bool NanoBrain.Cluster.DeleteNucleus (Nucleus nucleus)
+
+ +

Delete a nucleus from this clsuter.

+
Parameters
+ + +
nucleusThe nucleus to delete
+
+
+
Returns
True if a nucleus was deleted, false if the nucleus could not be found
+ +
+
+ +

◆ CollectReceivers()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual List< Nucleus > NanoBrain.Cluster.CollectReceivers (bool removeDuplicates = false)
+
+virtual
+
+ +

Collect all receiving nuclei of signals from this cluster.

+
Parameters
+ + +
removeDuplicatesEnsure that a receiver is only listed once in the result
+
+
+
Returns
The list of receivers
+ +
+
+ +

◆ CollectSynapsesTo()

+ +
+
+ + + + + + + + +
List< Synapse > NanoBrain.Cluster.CollectSynapsesTo (Cluster otherCluster)
+
+ +

Collect all connections to receivers of signals from this cluster.

+
Returns
A list of pairs of the sending neuron in this cluster and the matching receiving nucleus
+

Collect all synapses of senders in another cluster of signals to this cluster

+
Parameters
+ + +
otherClusterThe other cluster with sending neurons
+
+
+
Returns
A list of synapses to the neurons in the other clusters
+ +
+
+ +

◆ UpdateFromNucleus()

+ +
+
+ + + + + + + + +
void NanoBrain.Cluster.UpdateFromNucleus (Nucleus startNucleus)
+
+ +

Update the state of the nucleus and all nuclei receiving from it.

+
Parameters
+ + +
startNucleusThe nucleus to start updating
+
+
+ +
+
+ +

◆ UpdateStateIsolated()

+ +
+
+ + + + + + + +
override void NanoBrain.Cluster.UpdateStateIsolated ()
+
+ +

Update the state without updating other Nuclei.

+ +
+
+ +

◆ Refresh()

+ +
+
+ + + + + + + +
void NanoBrain.Cluster.Refresh ()
+
+ +

Recalculate derived properties.

+

This can be used to recalculate derived properties after the set of nuclei has been changed

+ +
+
+ +

◆ UpdateNuclei()

+ +
+
+ + + + + +
+ + + + + + + +
virtual void NanoBrain.Nucleus.UpdateNuclei ()
+
+virtualinherited
+
+ +

Update the state and recursively all Nuclei receiving data from this Nucleus.

+ +

Reimplemented in NanoBrain.MemoryCell.

+ +
+
+

Member Data Documentation

+ +

◆ prefab

+ +
+
+ + + + +
ClusterPrefab NanoBrain.Cluster.prefab
+
+ +

The prefab used to create this cluster.

+

Cluster should always be created from prefabs

+ +
+
+ +

◆ instances

+ +
+
+ + + + +
Cluster [] NanoBrain.Cluster.instances
+
+ +

All cluster instance of a multi-cluster.

+

A cluster is a multi-cluster when there is more than one instance. The actual instances are only created at runtime. The value instanceCount determines how many instances will be present at runtime.

+ +
+
+ +

◆ instanceCount

+ +
+
+ + + + +
int NanoBrain.Cluster.instanceCount = 1
+
+ +

The number of cluster instances in a multi-cluster.

+

A cluster is a multi-clsuter when there is more than one instance.

+ +
+
+ +

◆ thingClusters

+ +
+
+ + + + +
Dictionary<int, Cluster> NanoBrain.Cluster.thingClusters = new()
+
+ +

The mapping from things to cluster instances.

+

In a multi-cluster each instance can be used for a thing. Cluster instance may also not (yet) be mapped to a thing.

+ +
+
+ +

◆ _outputs

+ +
+
+ + + + + +
+ + + + +
List<Neuron> NanoBrain.Cluster._outputs = null
+
+protected
+
+ +

The neurons without outgoing connections.

+

These neurons can potentially be connected to neurons in other clusters

+ +
+
+ +

◆ parent

+ +
+
+ + + + + +
+ + + + +
Cluster NanoBrain.Nucleus.parent
+
+inherited
+
+ +

The cluster prefab in which the nucleus is located.

+

The cluster instance in which the nucleus is located

+ +
+
+

Property Documentation

+ +

◆ outputs

+ +
+
+ + + + + +
+ + + + +
List<Neuron> NanoBrain.Cluster.outputs
+
+get
+
+ +

The neurons without outgoing connections.

+

These neurons can potentially be connected to neurons in other clusters

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Cluster.cs
  • +
+
+ + + + diff --git a/Documentation/html/class_nano_brain_1_1_cluster.html.meta b/Documentation/html/class_nano_brain_1_1_cluster.html.meta new file mode 100644 index 0000000..e84b307 --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_cluster.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d883df8710f53b84da21f41d7c2eac46 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/class_nano_brain_1_1_cluster.png b/Documentation/html/class_nano_brain_1_1_cluster.png new file mode 100644 index 0000000000000000000000000000000000000000..b808c356735d4a1a08bccaced3bd8305eefcb6db GIT binary patch literal 565 zcmV-50?Pe~P)W7Dir#LVva2S`&=)l0h|NsB9NT2)w000SeQchC<|NsC0|NsC0Hv*f~0005N zNkl5s`%)O+<81 z-+&I{PDG>?UOys|m!5Cd?*b}xa@wMA!fe;Sg-%{cDav!6gOyo*`MNh-b&~7HFly9t zT%zkE4~4NU?6x{vt?y1N!*JFz&Xh%K|3Luru7uF5-ptvX3Uq31}&x0Eb1_UQV^Lt*UEnyt>(XnD28>$6sI#zb1; zqx&U#sKUO@%Fc6*<|w`L)#DnScPSFTL(j|+t?GG&9%^}o9!~OKXxZVaRo*Lj@9?SL z)mb+W6;o6-y{`qA9qu1eW@ZaHnwj~aeij`<2qyXiG1g?^ + + + + + + +Nano Brain for Unity: Member List + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
NanoBrain.ClusterPrefab Member List
+
+
+ +

This is the complete list of members for NanoBrain.ClusterPrefab, including all inherited members.

+ + + + + +
cluster (defined in NanoBrain.ClusterPrefab)NanoBrain.ClusterPrefab
EnsureInitialization() (defined in NanoBrain.ClusterPrefab)NanoBrain.ClusterPrefab
GarbageCollection() (defined in NanoBrain.ClusterPrefab)NanoBrain.ClusterPrefab
GetNucleus(string nucleusName)NanoBrain.ClusterPrefab
+ + + + diff --git a/Documentation/html/class_nano_brain_1_1_cluster_prefab-members.html.meta b/Documentation/html/class_nano_brain_1_1_cluster_prefab-members.html.meta new file mode 100644 index 0000000..22eca56 --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_cluster_prefab-members.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d62eadc52c471f7a6895cb870994bece +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/class_nano_brain_1_1_cluster_prefab.html b/Documentation/html/class_nano_brain_1_1_cluster_prefab.html new file mode 100644 index 0000000..a532610 --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_cluster_prefab.html @@ -0,0 +1,145 @@ + + + + + + + +Nano Brain for Unity: NanoBrain.ClusterPrefab Class Reference + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
NanoBrain.ClusterPrefab Class Reference
+
+
+

Description

+

The Unity ScriptableObject to implement re-usable Cluster Prefabs.

+
+

Inherits ScriptableObject.

+ + + + + + + + + +

+Public Member Functions

Nucleus GetNucleus (string nucleusName)
 Retrieve a nucleus in this cluster.
 
+void EnsureInitialization ()
 
+void GarbageCollection ()
 
+ + + +

+Public Attributes

+Cluster cluster
 
+

Member Function Documentation

+ +

◆ GetNucleus()

+ +
+
+ + + + + + + + +
Nucleus NanoBrain.ClusterPrefab.GetNucleus (string nucleusName)
+
+ +

Retrieve a nucleus in this cluster.

+
Parameters
+ + +
nucleusNameThe name of the nucleus
+
+
+
Returns
The Nucleus with the given name or null if no such Nucleus could be found
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs
  • +
+
+ + + + diff --git a/Documentation/html/class_nano_brain_1_1_cluster_prefab.html.meta b/Documentation/html/class_nano_brain_1_1_cluster_prefab.html.meta new file mode 100644 index 0000000..5e321e4 --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_cluster_prefab.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ae719a769b822db4ca83831d25c49276 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/class_nano_brain_1_1_memory_cell-members.html b/Documentation/html/class_nano_brain_1_1_memory_cell-members.html new file mode 100644 index 0000000..b030598 --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_memory_cell-members.html @@ -0,0 +1,155 @@ + + + + + + + +Nano Brain for Unity: Member List + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
NanoBrain.MemoryCell Member List
+
+
+ +

This is the complete list of members for NanoBrain.MemoryCell, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
_curvePreset (defined in NanoBrain.Neuron)NanoBrain.Neuron
_outputValue (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
_outputValue (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivationType enum nameNanoBrain.Neuron
Activator (defined in NanoBrain.Neuron)NanoBrain.Neuron
Activator (defined in NanoBrain.Neuron)NanoBrain.Neuron
ActivatorBinary(float3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorCustom(float3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorCustom(Vector3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorLinear(float3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorLinear(Vector3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorNormalized(float3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorPower(float3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorPower(Vector3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorReciprocal(float3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorReciprocal(Vector3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorSqrt(float3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorSqrt(Vector3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorTanh(float3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
AddReceiver(Nucleus receiverToAdd, float weight=1) (defined in NanoBrain.Neuron)NanoBrain.Neuronvirtual
AddSynapse(Neuron sendingNucleus, float weight=1)NanoBrain.Neuron
biasNanoBrain.Neuron
CheckSleepingSynapses() (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
CloneFields(Neuron clone) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotectedvirtual
combinatorNanoBrain.Neuron
Combinator (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
Combinator (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
CombinatorMax() (defined in NanoBrain.Neuron)NanoBrain.Neuron
CombinatorProduct() (defined in NanoBrain.Neuron)NanoBrain.Neuron
CombinatorProduct() (defined in NanoBrain.Neuron)NanoBrain.Neuron
CombinatorSum() (defined in NanoBrain.Neuron)NanoBrain.Neuron
CombinatorSum() (defined in NanoBrain.Neuron)NanoBrain.Neuron
CombinatorType enum nameNanoBrain.Neuron
curve (defined in NanoBrain.Neuron)NanoBrain.Neuron
curveMax (defined in NanoBrain.Neuron)NanoBrain.Neuron
curvePreset (defined in NanoBrain.Neuron)NanoBrain.Neuron
Delete(Nucleus nucleus) (defined in NanoBrain.Neuron)NanoBrain.Neuronstatic
GenerateCurve() (defined in NanoBrain.Neuron)NanoBrain.Neuron
GetSynapse(Nucleus sender)NanoBrain.Neuron
isFiring (defined in NanoBrain.Neuron)NanoBrain.Neuron
isSleeping (defined in NanoBrain.MemoryCell)NanoBrain.MemoryCell
lastUpdateNanoBrain.Neuron
MemoryCell(Cluster parent, string name) (defined in NanoBrain.MemoryCell)NanoBrain.MemoryCell
nameNanoBrain.Nucleus
Neuron(Cluster parent, string name)NanoBrain.Neuron
outputMagnitude (defined in NanoBrain.Neuron)NanoBrain.Neuron
outputSqrMagnitude (defined in NanoBrain.Neuron)NanoBrain.Neuron
outputValue (defined in NanoBrain.Neuron)NanoBrain.Neuron
outputValue (defined in NanoBrain.Neuron)NanoBrain.Neuron
parentNanoBrain.Nucleus
persistOutput (defined in NanoBrain.Neuron)NanoBrain.Neuron
ProcessStimulus(Vector3 inputValue)NanoBrain.Neuronvirtual
receivers (defined in NanoBrain.Neuron)NanoBrain.Neuron
RemoveReceiver(Nucleus receiverToRemove) (defined in NanoBrain.Neuron)NanoBrain.Neuronvirtual
RemoveSynapse(Nucleus sendingNucleus)NanoBrain.Neuron
SetBias(Vector3 inputValue)NanoBrain.Neuronvirtual
ShallowCloneTo(Cluster newParent) (defined in NanoBrain.MemoryCell)NanoBrain.MemoryCell
SleepCheck() (defined in NanoBrain.Neuron)NanoBrain.Neuron
staticMemory (defined in NanoBrain.MemoryCell)NanoBrain.MemoryCell
synapsesNanoBrain.Neuron
timeToSleep (defined in NanoBrain.Neuron)NanoBrain.Neuron
Type enum nameNanoBrain.Nucleus
UpdateNuclei()NanoBrain.MemoryCellvirtual
UpdateStateIsolated() (defined in NanoBrain.MemoryCell)NanoBrain.MemoryCell
WhenFiring (defined in NanoBrain.Neuron)NanoBrain.Neuron
+ + + + diff --git a/Documentation/html/class_nano_brain_1_1_memory_cell-members.html.meta b/Documentation/html/class_nano_brain_1_1_memory_cell-members.html.meta new file mode 100644 index 0000000..3e7465c --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_memory_cell-members.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d9a689a3c38bd27d28e94b7fe1865ffd +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/class_nano_brain_1_1_memory_cell.html b/Documentation/html/class_nano_brain_1_1_memory_cell.html new file mode 100644 index 0000000..41baf4a --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_memory_cell.html @@ -0,0 +1,687 @@ + + + + + + + +Nano Brain for Unity: NanoBrain.MemoryCell Class Reference + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+ +
+

Description

+

A MemoryCell stored its value for one update.

+

When the input for a Memory Cell changes, it will output the previous value
+

+
+Inheritance diagram for NanoBrain.MemoryCell:
+
+
+ + +NanoBrain.Neuron +NanoBrain.Nucleus + +
+ + + + + + + + + + + +

+Public Types

enum  CombinatorType { Sum +, Product + }
 The type of combinators. More...
 
enum  ActivationType {
+  Linear +, Power +, Sqrt +, Reciprocal +,
+  Tanh +, Binary +, Normalized +, Custom +
+ }
 The type of.
 
enum  Type { None +, Neuron +, MemoryCell +, Cluster + }
 Function to clone a nucleus to a Cluster prefab. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

MemoryCell (Cluster parent, string name)
 
+override Nucleus ShallowCloneTo (Cluster newParent)
 
+override void UpdateStateIsolated ()
 
override void UpdateNuclei ()
 Update the state and recursively all Nuclei receiving data from this Nucleus.
 
Synapse AddSynapse (Neuron sendingNucleus, float weight=1)
 Add a new synapse to this nuclues.
 
Synapse GetSynapse (Nucleus sender)
 Find a synapse.
 
void RemoveSynapse (Nucleus sendingNucleus)
 Remove a synapse from a Nucleus.
 
virtual void SetBias (Vector3 inputValue)
 Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus.
 
+AnimationCurve GenerateCurve ()
 
+void SleepCheck ()
 
+float3 CombinatorSum ()
 
+Vector3 CombinatorSum ()
 
+float3 CombinatorProduct ()
 
+Vector3 CombinatorProduct ()
 
+Vector3 CombinatorMax ()
 
+virtual void AddReceiver (Nucleus receiverToAdd, float weight=1)
 
+virtual void RemoveReceiver (Nucleus receiverToRemove)
 
virtual void ProcessStimulus (Vector3 inputValue)
 Process an external stimulus.
 
+ + + +

+Static Public Member Functions

+static void Delete (Nucleus nucleus)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+bool staticMemory = false
 
Vector3 bias = Vector3.zero
 Create a new Neuron in a Cluster Prefab.
 
+CombinatorType combinator = CombinatorType.Sum
 The type of combinator used for this Neuron.
 
+ActivationType _curvePreset
 
+AnimationCurve curve
 
+float curveMax = 1.0f
 
+Action WhenFiring
 
+bool persistOutput = false
 
+float lastUpdate = 0
 Toggle for printing debugging trace data.
 
+readonly float timeToSleep = 1f
 
+string name
 The name of the Nucleus.
 
Cluster parent
 The cluster prefab in which the nucleus is located.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Member Functions

+virtual void CloneFields (Neuron clone)
 
+void CheckSleepingSynapses ()
 
+float3 ActivatorLinear (float3 input)
 
+Vector3 ActivatorLinear (Vector3 input)
 
+float3 ActivatorSqrt (float3 input)
 
+Vector3 ActivatorSqrt (Vector3 input)
 
+float3 ActivatorPower (float3 input)
 
+Vector3 ActivatorPower (Vector3 input)
 
+float3 ActivatorReciprocal (float3 input)
 
+Vector3 ActivatorReciprocal (Vector3 input)
 
+float3 ActivatorTanh (float3 input)
 
+float3 ActivatorBinary (float3 input)
 
+float3 ActivatorNormalized (float3 input)
 
+float3 ActivatorCustom (float3 input)
 
+Vector3 ActivatorCustom (Vector3 input)
 
+ + + + + +

+Protected Attributes

+float3 _outputValue
 
+Vector3 _outputValue
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override bool isSleeping [get]
 
+List< Synapsesynapses [get]
 The synapses of the nucleus.
 
+ActivationType curvePreset [get, set]
 
+virtual float3 outputValue [get, set]
 
+virtual Vector3 outputValue [get, set]
 
+float outputMagnitude [get]
 
+float outputSqrMagnitude [get]
 
+bool isFiring [get]
 
+Func< float3 > Combinator [get]
 
+Func< Vector3 > Combinator [get]
 
+Func< float3, float3 > Activator [get]
 
+Func< Vector3, Vector3 > Activator [get]
 
+virtual List< Nucleusreceivers [get, set]
 
+

Member Enumeration Documentation

+ +

◆ CombinatorType

+ +
+
+ + + + + +
+ + + + +
enum NanoBrain.Neuron.CombinatorType
+
+inherited
+
+ +

The type of combinators.

+

A combinator combines the weighted values of the synapses to a single value

+ + + +
Enumerator
Sum 

Add the weighted values together.

+
Product 

Multiply the weighted values.

+
+ +
+
+ +

◆ Type

+ +
+
+ + + + + +
+ + + + +
enum NanoBrain.Nucleus.Type
+
+inherited
+
+ +

Function to clone a nucleus to a Cluster prefab.

+
Parameters
+ + +
prefab
+
+
+
Returns
+

The types of Nucleus

+ +
+
+

Member Function Documentation

+ +

◆ UpdateNuclei()

+ +
+
+ + + + + +
+ + + + + + + +
override void NanoBrain.MemoryCell.UpdateNuclei ()
+
+virtual
+
+ +

Update the state and recursively all Nuclei receiving data from this Nucleus.

+ +

Reimplemented from NanoBrain.Nucleus.

+ +
+
+ +

◆ AddSynapse()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Synapse NanoBrain.Neuron.AddSynapse (Neuron sendingNucleus,
float weight = 1 
)
+
+inherited
+
+ +

Add a new synapse to this nuclues.

+
Parameters
+ + + +
sendingNucleusThe nucleus from which the signals may originate
weightThe weight applied to the input. Default value = 1
+
+
+
Returns
The created Synapse
+

This will add a new input to this nucleus with the given weight.

+ +
+
+ +

◆ GetSynapse()

+ +
+
+ + + + + +
+ + + + + + + + +
Synapse NanoBrain.Neuron.GetSynapse (Nucleus sender)
+
+inherited
+
+ +

Find a synapse.

+
Parameters
+ + +
senderThe sender of the input to the Synapse
+
+
+
Returns
The found Synapse or null when the sender has no synapse to this nucleus.
+ +
+
+ +

◆ RemoveSynapse()

+ +
+
+ + + + + +
+ + + + + + + + +
void NanoBrain.Neuron.RemoveSynapse (Nucleus sendingNucleus)
+
+inherited
+
+ +

Remove a synapse from a Nucleus.

+
Parameters
+ + +
sendingNucleusRemote the synapse connecting to this Nucleus
+
+
+ +
+
+ +

◆ SetBias()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void NanoBrain.Neuron.SetBias (Vector3 inputValue)
+
+virtualinherited
+
+ +

Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus.

+
Parameters
+ + +
inputValue
+
+
+ +
+
+ +

◆ ProcessStimulus()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void NanoBrain.Neuron.ProcessStimulus (Vector3 inputValue)
+
+virtualinherited
+
+ +

Process an external stimulus.

+
Parameters
+ + + + +
inputValueThe value of the stimulus
thingIdThe id of the thing causing the stimulus
thingNameThe name of the thing causing the stimulus
+
+
+ +
+
+

Member Data Documentation

+ +

◆ bias

+ +
+
+ + + + + +
+ + + + +
Vector3 NanoBrain.Neuron.bias = Vector3.zero
+
+inherited
+
+ +

Create a new Neuron in a Cluster Prefab.

+
Parameters
+ + + +
prefabThe Cluster Preafb in which the new Neuron should be created
nameThe name of the new Neuron
+
+
+

The bias

+

The bias which a value which is always added to the combined value of the neuron It does not have a synapse and therefore no weight of source nucleus

+ +
+
+ +

◆ parent

+ +
+
+ + + + + +
+ + + + +
Cluster NanoBrain.Nucleus.parent
+
+inherited
+
+ +

The cluster prefab in which the nucleus is located.

+

The cluster instance in which the nucleus is located

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/MemoryCell.cs
  • +
+
+ + + + diff --git a/Documentation/html/class_nano_brain_1_1_memory_cell.html.meta b/Documentation/html/class_nano_brain_1_1_memory_cell.html.meta new file mode 100644 index 0000000..2f17bed --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_memory_cell.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ffd30c6234d869c9d94518fcb20604bb +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/class_nano_brain_1_1_memory_cell.png b/Documentation/html/class_nano_brain_1_1_memory_cell.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc1c667be7fd56b171e9058be92a24081656b7c GIT binary patch literal 942 zcmeAS@N?(olHy`uVBq!ia0vp^6M(pbgBeKL%TB5RQqloFA+G=b{|7Q(y?WK&-oD(z zK(jz%`k5C84jcfAZ}yn~2Pnr`666=m0OW&#In(Sb3=GVco-U3d6^w7^zCQO_frn+f z>#9Hh{A+}S4&0d&w$^T;a=4F>hMBP5+xR0AkNp%TJ+a#%;28zNXIh$eO-k{$uvaO~ zeBJ#c)M?TxpVpukK`#t{D*fYLC^Fk)Xa6tLBeAFB=Uu-v&HCjJJKxVCXFOLWaXr2L zb%m7ou3OWxH~+YmdCehc>QT8%H`(`A^Izq>xOt)U7wt2x9-C6Pu6)1UC)xkfm93|3 zqZU@%vM*G7$nI^X7Q?~2`lG@U>oexRKHWIK{8{e8O&`UoJQ|KJOXY8$Avi_62#hf&+2fZjX zv7VBbi6P-3k@(|(u2z9VehM8OZ<@I~J0f;W=;&}2+?A)jd&_@U zm+9N)WxwASKl?+)897&tyVITelkdJ{&lQ}=8GC4EK$ho{CGLN@c4hxOEi(Id(Q>~P zDJL3#=AKsYTKX)C1C(Z}NbXVn-#n$kz3u8FGuKu&|g2ZMKE%EA; zuQa94#cXc(>Obl9A~@{U*MHjf#&8+@o+hk g + + + + + + +Nano Brain for Unity: Member List + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
NanoBrain.Neuron Member List
+
+
+ +

This is the complete list of members for NanoBrain.Neuron, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
_curvePreset (defined in NanoBrain.Neuron)NanoBrain.Neuron
_outputValue (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
_outputValue (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivationType enum nameNanoBrain.Neuron
Activator (defined in NanoBrain.Neuron)NanoBrain.Neuron
Activator (defined in NanoBrain.Neuron)NanoBrain.Neuron
ActivatorBinary(float3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorCustom(float3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorCustom(Vector3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorLinear(float3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorLinear(Vector3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorNormalized(float3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorPower(float3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorPower(Vector3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorReciprocal(float3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorReciprocal(Vector3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorSqrt(float3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorSqrt(Vector3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
ActivatorTanh(float3 input) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
AddReceiver(Nucleus receiverToAdd, float weight=1) (defined in NanoBrain.Neuron)NanoBrain.Neuronvirtual
AddSynapse(Neuron sendingNucleus, float weight=1)NanoBrain.Neuron
biasNanoBrain.Neuron
CheckSleepingSynapses() (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
CloneFields(Neuron clone) (defined in NanoBrain.Neuron)NanoBrain.Neuronprotectedvirtual
Combinator (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
Combinator (defined in NanoBrain.Neuron)NanoBrain.Neuronprotected
combinatorNanoBrain.Neuron
CombinatorMax() (defined in NanoBrain.Neuron)NanoBrain.Neuron
CombinatorProduct() (defined in NanoBrain.Neuron)NanoBrain.Neuron
CombinatorProduct() (defined in NanoBrain.Neuron)NanoBrain.Neuron
CombinatorSum() (defined in NanoBrain.Neuron)NanoBrain.Neuron
CombinatorSum() (defined in NanoBrain.Neuron)NanoBrain.Neuron
CombinatorType enum nameNanoBrain.Neuron
curve (defined in NanoBrain.Neuron)NanoBrain.Neuron
curveMax (defined in NanoBrain.Neuron)NanoBrain.Neuron
curvePreset (defined in NanoBrain.Neuron)NanoBrain.Neuron
Delete(Nucleus nucleus) (defined in NanoBrain.Neuron)NanoBrain.Neuronstatic
GenerateCurve() (defined in NanoBrain.Neuron)NanoBrain.Neuron
GetSynapse(Nucleus sender)NanoBrain.Neuron
isFiring (defined in NanoBrain.Neuron)NanoBrain.Neuron
isSleeping (defined in NanoBrain.Neuron)NanoBrain.Neuron
lastUpdateNanoBrain.Neuron
nameNanoBrain.Nucleus
Neuron(Cluster parent, string name)NanoBrain.Neuron
outputMagnitude (defined in NanoBrain.Neuron)NanoBrain.Neuron
outputSqrMagnitude (defined in NanoBrain.Neuron)NanoBrain.Neuron
outputValue (defined in NanoBrain.Neuron)NanoBrain.Neuron
outputValue (defined in NanoBrain.Neuron)NanoBrain.Neuron
parentNanoBrain.Nucleus
persistOutput (defined in NanoBrain.Neuron)NanoBrain.Neuron
ProcessStimulus(Vector3 inputValue)NanoBrain.Neuronvirtual
receivers (defined in NanoBrain.Neuron)NanoBrain.Neuron
RemoveReceiver(Nucleus receiverToRemove) (defined in NanoBrain.Neuron)NanoBrain.Neuronvirtual
RemoveSynapse(Nucleus sendingNucleus)NanoBrain.Neuron
SetBias(Vector3 inputValue)NanoBrain.Neuronvirtual
ShallowCloneTo(Cluster newParent)NanoBrain.Neuron
SleepCheck() (defined in NanoBrain.Neuron)NanoBrain.Neuron
synapsesNanoBrain.Neuron
timeToSleep (defined in NanoBrain.Neuron)NanoBrain.Neuron
Type enum nameNanoBrain.Nucleus
UpdateNuclei()NanoBrain.Nucleusvirtual
UpdateStateIsolated() (defined in NanoBrain.Neuron)NanoBrain.Neuron
WhenFiring (defined in NanoBrain.Neuron)NanoBrain.Neuron
+ + + + diff --git a/Documentation/html/class_nano_brain_1_1_neuron-members.html.meta b/Documentation/html/class_nano_brain_1_1_neuron-members.html.meta new file mode 100644 index 0000000..49e8daa --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_neuron-members.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a111018414f6d529ebcd4b286ab52dfa +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/class_nano_brain_1_1_neuron.html b/Documentation/html/class_nano_brain_1_1_neuron.html new file mode 100644 index 0000000..90365be --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_neuron.html @@ -0,0 +1,708 @@ + + + + + + + +Nano Brain for Unity: NanoBrain.Neuron Class Reference + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+ +
+

Description

+

A neuron is a basic Nucleus.

+
+Inheritance diagram for NanoBrain.Neuron:
+
+
+ + +NanoBrain.Nucleus +NanoBrain.MemoryCell + +
+ + + + + + + + + + + +

+Public Types

enum  CombinatorType { Sum +, Product + }
 The type of combinators. More...
 
enum  ActivationType {
+  Linear +, Power +, Sqrt +, Reciprocal +,
+  Tanh +, Binary +, Normalized +, Custom +
+ }
 The type of.
 
enum  Type { None +, Neuron +, MemoryCell +, Cluster + }
 Function to clone a nucleus to a Cluster prefab. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Neuron (Cluster parent, string name)
 Create a new Neuron in a Cluster instance.
 
Synapse AddSynapse (Neuron sendingNucleus, float weight=1)
 Add a new synapse to this nuclues.
 
Synapse GetSynapse (Nucleus sender)
 Find a synapse.
 
void RemoveSynapse (Nucleus sendingNucleus)
 Remove a synapse from a Nucleus.
 
virtual void SetBias (Vector3 inputValue)
 Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus.
 
+AnimationCurve GenerateCurve ()
 
+void SleepCheck ()
 
override Nucleus ShallowCloneTo (Cluster newParent)
 Toggle for printing debugging trace data.
 
+override void UpdateStateIsolated ()
 
+float3 CombinatorSum ()
 
+float3 CombinatorProduct ()
 
+Vector3 CombinatorSum ()
 
+Vector3 CombinatorProduct ()
 
+Vector3 CombinatorMax ()
 
+virtual void AddReceiver (Nucleus receiverToAdd, float weight=1)
 
+virtual void RemoveReceiver (Nucleus receiverToRemove)
 
virtual void ProcessStimulus (Vector3 inputValue)
 Process an external stimulus.
 
virtual void UpdateNuclei ()
 Update the state and recursively all Nuclei receiving data from this Nucleus.
 
+ + + +

+Static Public Member Functions

+static void Delete (Nucleus nucleus)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

Vector3 bias = Vector3.zero
 Create a new Neuron in a Cluster Prefab.
 
+CombinatorType combinator = CombinatorType.Sum
 The type of combinator used for this Neuron.
 
+ActivationType _curvePreset
 
+AnimationCurve curve
 
+float curveMax = 1.0f
 
+Action WhenFiring
 
+bool persistOutput = false
 
+float lastUpdate = 0
 Toggle for printing debugging trace data.
 
+readonly float timeToSleep = 1f
 
+string name
 The name of the Nucleus.
 
Cluster parent
 The cluster prefab in which the nucleus is located.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Member Functions

+virtual void CloneFields (Neuron clone)
 
+void CheckSleepingSynapses ()
 
+float3 ActivatorLinear (float3 input)
 
+float3 ActivatorSqrt (float3 input)
 
+float3 ActivatorPower (float3 input)
 
+float3 ActivatorReciprocal (float3 input)
 
+float3 ActivatorTanh (float3 input)
 
+float3 ActivatorBinary (float3 input)
 
+float3 ActivatorNormalized (float3 input)
 
+float3 ActivatorCustom (float3 input)
 
+Vector3 ActivatorLinear (Vector3 input)
 
+Vector3 ActivatorSqrt (Vector3 input)
 
+Vector3 ActivatorPower (Vector3 input)
 
+Vector3 ActivatorReciprocal (Vector3 input)
 
+Vector3 ActivatorCustom (Vector3 input)
 
+ + + + + +

+Protected Attributes

+float3 _outputValue
 
+Vector3 _outputValue
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+List< Synapsesynapses [get]
 The synapses of the nucleus.
 
+ActivationType curvePreset [get, set]
 
+virtual float3 outputValue [get, set]
 
+float outputMagnitude [get]
 
+float outputSqrMagnitude [get]
 
+virtual Vector3 outputValue [get, set]
 
+bool isFiring [get]
 
+virtual bool isSleeping [get]
 
+Func< float3 > Combinator [get]
 
+Func< Vector3 > Combinator [get]
 
+Func< float3, float3 > Activator [get]
 
+Func< Vector3, Vector3 > Activator [get]
 
+virtual List< Nucleusreceivers [get, set]
 
+

Member Enumeration Documentation

+ +

◆ CombinatorType

+ +
+
+ +

The type of combinators.

+

A combinator combines the weighted values of the synapses to a single value

+ + + +
Enumerator
Sum 

Add the weighted values together.

+
Product 

Multiply the weighted values.

+
+ +
+
+ +

◆ Type

+ +
+
+ + + + + +
+ + + + +
enum NanoBrain.Nucleus.Type
+
+inherited
+
+ +

Function to clone a nucleus to a Cluster prefab.

+
Parameters
+ + +
prefab
+
+
+
Returns
+

The types of Nucleus

+ +
+
+

Constructor & Destructor Documentation

+ +

◆ Neuron()

+ +
+
+ + + + + + + + + + + + + + + + + + +
NanoBrain.Neuron.Neuron (Cluster parent,
string name 
)
+
+ +

Create a new Neuron in a Cluster instance.

+
Parameters
+ + + +
parentThe parent cluster in which the new Neuron should be created
nameThe name of the new Neuron
+
+
+ +
+
+

Member Function Documentation

+ +

◆ AddSynapse()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Synapse NanoBrain.Neuron.AddSynapse (Neuron sendingNucleus,
float weight = 1 
)
+
+ +

Add a new synapse to this nuclues.

+
Parameters
+ + + +
sendingNucleusThe nucleus from which the signals may originate
weightThe weight applied to the input. Default value = 1
+
+
+
Returns
The created Synapse
+

This will add a new input to this nucleus with the given weight.

+ +
+
+ +

◆ GetSynapse()

+ +
+
+ + + + + + + + +
Synapse NanoBrain.Neuron.GetSynapse (Nucleus sender)
+
+ +

Find a synapse.

+
Parameters
+ + +
senderThe sender of the input to the Synapse
+
+
+
Returns
The found Synapse or null when the sender has no synapse to this nucleus.
+ +
+
+ +

◆ RemoveSynapse()

+ +
+
+ + + + + + + + +
void NanoBrain.Neuron.RemoveSynapse (Nucleus sendingNucleus)
+
+ +

Remove a synapse from a Nucleus.

+
Parameters
+ + +
sendingNucleusRemote the synapse connecting to this Nucleus
+
+
+ +
+
+ +

◆ SetBias()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void NanoBrain.Neuron.SetBias (Vector3 inputValue)
+
+virtual
+
+ +

Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus.

+
Parameters
+ + +
inputValue
+
+
+ +
+
+ +

◆ ShallowCloneTo()

+ +
+
+ + + + + + + + +
override Nucleus NanoBrain.Neuron.ShallowCloneTo (Cluster newParent)
+
+ +

Toggle for printing debugging trace data.

+

Function to make a partial clone of this nucleus

+
Parameters
+ + +
parentThe cluster in which the cloned nucleus should be placed
+
+
+
Returns
+ +
+
+ +

◆ ProcessStimulus()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void NanoBrain.Neuron.ProcessStimulus (Vector3 inputValue)
+
+virtual
+
+ +

Process an external stimulus.

+
Parameters
+ + + + +
inputValueThe value of the stimulus
thingIdThe id of the thing causing the stimulus
thingNameThe name of the thing causing the stimulus
+
+
+ +
+
+ +

◆ UpdateNuclei()

+ +
+
+ + + + + +
+ + + + + + + +
virtual void NanoBrain.Nucleus.UpdateNuclei ()
+
+virtualinherited
+
+ +

Update the state and recursively all Nuclei receiving data from this Nucleus.

+ +

Reimplemented in NanoBrain.MemoryCell.

+ +
+
+

Member Data Documentation

+ +

◆ bias

+ +
+
+ + + + +
Vector3 NanoBrain.Neuron.bias = Vector3.zero
+
+ +

Create a new Neuron in a Cluster Prefab.

+
Parameters
+ + + +
prefabThe Cluster Preafb in which the new Neuron should be created
nameThe name of the new Neuron
+
+
+

The bias

+

The bias which a value which is always added to the combined value of the neuron It does not have a synapse and therefore no weight of source nucleus

+ +
+
+ +

◆ parent

+ +
+
+ + + + + +
+ + + + +
Cluster NanoBrain.Nucleus.parent
+
+inherited
+
+ +

The cluster prefab in which the nucleus is located.

+

The cluster instance in which the nucleus is located

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs
  • +
+
+ + + + diff --git a/Documentation/html/class_nano_brain_1_1_neuron.html.meta b/Documentation/html/class_nano_brain_1_1_neuron.html.meta new file mode 100644 index 0000000..7b0bc5a --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_neuron.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7871287615b5cde18932faa30404d970 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/class_nano_brain_1_1_neuron.png b/Documentation/html/class_nano_brain_1_1_neuron.png new file mode 100644 index 0000000000000000000000000000000000000000..49d8eae20f4c1c61710006a6ea11a02db094e6f7 GIT binary patch literal 953 zcmeAS@N?(olHy`uVBq!ia0vp^6M(pbgBeKL%TB5RQqloFA+G=b{|7Q(y?WK&-oD(z zK(jz%`k5C84jcfAZ}yn~2Pnr`666=m0OW&#In(Sb3=GUJo-U3d6^w7^zV3Uiz|+$1 z*!Ab1e~pmPfje{7ZHro{9PT5vd)rSYwZGjG$#*<#vBKouqV_AhCWRcX*5yME{Iu_lzo1n6%}IgG%PfMvqIEI7O0sq&XS(En;RUyOif}e52&W zJO}mjaW1zRe`+!_MDwvQOq1bY(6JO?h$vEE*zm-GA>m{r!+}Z6j18*nObp)03Vzi$ zI&mbbD|U3eQDzqs-1x*nNom?Mhwb^Tv-p}jUR=CYwy)zv5ch&7F-&{Ur9JQN(AgTb z@bv5{S@XZy9!-8Kzdrlp(*>FTR1zbe`Zs_>=6uer>1!kZsVsEs_K-a-cj+qop5^VY znqEY1UCh2J=%P~4@m=7c=|3OMJ*`7*MNa>z|4bK3o=PihO*K}?{V%lQ^#pllU#mCM z9iC3%NniGIq0q&%%Z&A8_8zY~?drn+|FrfLI zCgiw9f7nyIhHHw9_k!y?=Y3)}^YptSI)_o!KS-`GMA$7qIrH;NUdhK;}<}PqReVS7HLuy5T&@Ubhao^%{2dzj~ z6NlDk3*#AAF3~IFGnw?o;cc*Q!!Fk=m8-(PE{tLLy8Dmw0>gC95WR2Ht_GWd6VH(p z~Jq|I4REzls-Z7k?hlym#M;zxU@svcN4tjbjq#m+U{;Oo@yA SQ^W+!WDK6JelF{r5}E+ER;Vuk literal 0 HcmV?d00001 diff --git a/Documentation/html/class_nano_brain_1_1_neuron.png.meta b/Documentation/html/class_nano_brain_1_1_neuron.png.meta new file mode 100644 index 0000000..f98c5d4 --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_neuron.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: b1154d0738a8e2c8db9ccdfc6cf0ea22 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/class_nano_brain_1_1_nucleus-members.html b/Documentation/html/class_nano_brain_1_1_nucleus-members.html new file mode 100644 index 0000000..5a6ac49 --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_nucleus-members.html @@ -0,0 +1,96 @@ + + + + + + + +Nano Brain for Unity: Member List + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
NanoBrain.Nucleus Member List
+
+
+ +

This is the complete list of members for NanoBrain.Nucleus, including all inherited members.

+ + + + + + + +
nameNanoBrain.Nucleus
parentNanoBrain.Nucleus
ShallowCloneTo(Cluster parent)NanoBrain.Nucleus
Type enum nameNanoBrain.Nucleus
UpdateNuclei()NanoBrain.Nucleusvirtual
UpdateStateIsolated()NanoBrain.Nucleus
+ + + + diff --git a/Documentation/html/class_nano_brain_1_1_nucleus-members.html.meta b/Documentation/html/class_nano_brain_1_1_nucleus-members.html.meta new file mode 100644 index 0000000..be2fda4 --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_nucleus-members.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 10ed020f41822a80c9d9e1126c67c937 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/class_nano_brain_1_1_nucleus.html b/Documentation/html/class_nano_brain_1_1_nucleus.html new file mode 100644 index 0000000..f289aeb --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_nucleus.html @@ -0,0 +1,251 @@ + + + + + + + +Nano Brain for Unity: NanoBrain.Nucleus Class Reference + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
NanoBrain.Nucleus Class Referenceabstract
+
+
+

Description

+

A Nucleus is a basic element in a brain cluster.

+
+Inheritance diagram for NanoBrain.Nucleus:
+
+
+ + +NanoBrain.Cluster +NanoBrain.Neuron +NanoBrain.MemoryCell + +
+ + + + + +

+Public Types

enum  Type { None +, Neuron +, MemoryCell +, Cluster + }
 Function to clone a nucleus to a Cluster prefab. More...
 
+ + + + + + + + + + +

+Public Member Functions

Nucleus ShallowCloneTo (Cluster parent)
 Toggle for printing debugging trace data.
 
+void UpdateStateIsolated ()
 Update the state without updating other Nuclei.
 
virtual void UpdateNuclei ()
 Update the state and recursively all Nuclei receiving data from this Nucleus.
 
+ + + + + + + +

+Public Attributes

+string name
 The name of the Nucleus.
 
Cluster parent
 The cluster prefab in which the nucleus is located.
 
+

Member Enumeration Documentation

+ +

◆ Type

+ +
+
+ + + + +
enum NanoBrain.Nucleus.Type
+
+ +

Function to clone a nucleus to a Cluster prefab.

+
Parameters
+ + +
prefab
+
+
+
Returns
+

The types of Nucleus

+ +
+
+

Member Function Documentation

+ +

◆ ShallowCloneTo()

+ +
+
+ + + + + +
+ + + + + + + + +
Nucleus NanoBrain.Nucleus.ShallowCloneTo (Cluster parent)
+
+abstract
+
+ +

Toggle for printing debugging trace data.

+

Function to make a partial clone of this nucleus

+
Parameters
+ + +
parentThe cluster in which the cloned nucleus should be placed
+
+
+
Returns
+ +
+
+ +

◆ UpdateNuclei()

+ +
+
+ + + + + +
+ + + + + + + +
virtual void NanoBrain.Nucleus.UpdateNuclei ()
+
+virtual
+
+ +

Update the state and recursively all Nuclei receiving data from this Nucleus.

+ +

Reimplemented in NanoBrain.MemoryCell.

+ +
+
+

Member Data Documentation

+ +

◆ parent

+ +
+
+ + + + +
Cluster NanoBrain.Nucleus.parent
+
+ +

The cluster prefab in which the nucleus is located.

+

The cluster instance in which the nucleus is located

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Nucleus.cs
  • +
+
+ + + + diff --git a/Documentation/html/class_nano_brain_1_1_nucleus.html.meta b/Documentation/html/class_nano_brain_1_1_nucleus.html.meta new file mode 100644 index 0000000..27af6b5 --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_nucleus.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 26e7ab58944014c90ac92694c09f8d9d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/class_nano_brain_1_1_nucleus.png b/Documentation/html/class_nano_brain_1_1_nucleus.png new file mode 100644 index 0000000000000000000000000000000000000000..1433a13eac26a3335d2b43c8a474867ff3b418b3 GIT binary patch literal 1319 zcmbW1Yfw{17=}-zGA_%1xMf=yCHo2cKF&9JcFQ*Dw*_6tW<)buq)x^orQDNTLYU-83R4E zJdf9(R&AfiNHI~@AC&Nk>mK(z_a)h>*6drrJL^fO@0*Wi^Mj*-g9AlIC6O}07P_Q1 zAK|p+DksI+{Hc+y`IB|M&krE?N;d;(?6MXs6U2b!F<6v=Gr1e(zM7_)uubunbn$r4 zm^VqRyMgGNbX_-+Rvj5Z<%(CazeO_W-ff0Q$gT05+7VfV^R9-IS^;~!5#jTT%u7a} zwz|s49Bao~XxGDh43Bb<1Z6-4;db%T6786L5iszkf1cqY?3Itt0nPmGU-n?KyZmp8 z+!66=ndW$BA$ZA;?5c$A5n45ZOSp(!Tux<%L<8XkB|@g$ zJ%LKsjF(w-j% z*os{)>c5sefG^b-G}1~mv6aTl2N(NK|JnA(`DYuXsJ^GAebS#$Ai4wt>xSO7gvcJf(cW1WA0}(lfu&;O`$c~ ziGbD;1)*Wli#hHS@|Ki=FtxdirE$4Cq#YKVN~7zp{vJE1^C_O1cR}Lg1`^5bYTsXt z9mAinm`|Ge=_2y2GSKW6!+g0a)oZ-{`HSjoE zT?u0supft6nxZet7>M{P*4c1VON&7DVM+mlDGv>by($!I5~Xp+#g + + + + + + +Nano Brain for Unity: Member List + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
NanoBrain.Synapse Member List
+
+
+ +

This is the complete list of members for NanoBrain.Synapse, including all inherited members.

+ + + + + +
isSleeping (defined in NanoBrain.Synapse)NanoBrain.Synapse
neuronNanoBrain.Synapse
Synapse(Neuron nucleus, float weight=1.0f)NanoBrain.Synapse
weightNanoBrain.Synapse
+ + + + diff --git a/Documentation/html/class_nano_brain_1_1_synapse-members.html.meta b/Documentation/html/class_nano_brain_1_1_synapse-members.html.meta new file mode 100644 index 0000000..4c3ebae --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_synapse-members.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1a5ad1f0608e9cbf7a7fea9e76378a74 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/class_nano_brain_1_1_synapse.html b/Documentation/html/class_nano_brain_1_1_synapse.html new file mode 100644 index 0000000..c093760 --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_synapse.html @@ -0,0 +1,159 @@ + + + + + + + +Nano Brain for Unity: NanoBrain.Synapse Class Reference + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
NanoBrain.Synapse Class Reference
+
+
+

Description

+

A Synapse connects the ouput of a Neuron to another Neuron.

+
+ + + + +

+Public Member Functions

 Synapse (Neuron nucleus, float weight=1.0f)
 Create a new Synapse.
 
+ + + + + + + +

+Public Attributes

+Neuron neuron
 The neuron from which input is received.
 
+float weight
 The weight value to apply to the Neuron input.
 
+ + + +

+Properties

+bool isSleeping [get]
 
+

Constructor & Destructor Documentation

+ +

◆ Synapse()

+ +
+
+ + + + + + + + + + + + + + + + + + +
NanoBrain.Synapse.Synapse (Neuron nucleus,
float weight = 1::0f 
)
+
+ +

Create a new Synapse.

+
Parameters
+ + + +
nucleusThe neuron from which input is received
weightThe weight value to apply to the Neuron input
+
+
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Synapse.cs
  • +
+
+ + + + diff --git a/Documentation/html/class_nano_brain_1_1_synapse.html.meta b/Documentation/html/class_nano_brain_1_1_synapse.html.meta new file mode 100644 index 0000000..e5a15fc --- /dev/null +++ b/Documentation/html/class_nano_brain_1_1_synapse.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e96ea75afe3a7411fa97ecf8af019fb8 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/classes.html b/Documentation/html/classes.html new file mode 100644 index 0000000..7a712c5 --- /dev/null +++ b/Documentation/html/classes.html @@ -0,0 +1,101 @@ + + + + + + + +Nano Brain for Unity: Class Index + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+ + + + + diff --git a/Documentation/html/classes.html.meta b/Documentation/html/classes.html.meta new file mode 100644 index 0000000..0f269a7 --- /dev/null +++ b/Documentation/html/classes.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d0955c9f105c1b5d999da492a82677a6 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/closed.png b/Documentation/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..7d8dac4b99d7c9ec982fb64d88cd5e05552fc4f3 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VE}kxqAr*{o=U(JwP~dQhfA>a& zFIIv@D^*ygJl^iB8-s`8W=<7u2VYk92{MeKcR#;gy6Zw*mbL58(_+8MtPTiwHDoiM X?-t>Yju$8dn#bVj>gTe~DWM4fTjnFZ literal 0 HcmV?d00001 diff --git a/Documentation/html/closed.png.meta b/Documentation/html/closed.png.meta new file mode 100644 index 0000000..af7f54c --- /dev/null +++ b/Documentation/html/closed.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 8f359a9b1001b62e48b929d9ec9d02c4 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/custom_doxygen.css b/Documentation/html/custom_doxygen.css new file mode 100644 index 0000000..b921a4d --- /dev/null +++ b/Documentation/html/custom_doxygen.css @@ -0,0 +1,12 @@ +/* Custom PasserVR CSS for DoxyGen */ + +a { + color: #e77505; +} +.contents a:visited { + color: #e77505; +} + +a:hover { + color: #10659C; +} \ No newline at end of file diff --git a/Runtime/LinearAlgebra.meta b/Documentation/html/custom_doxygen.css.meta similarity index 67% rename from Runtime/LinearAlgebra.meta rename to Documentation/html/custom_doxygen.css.meta index c54c1af..5b9c005 100644 --- a/Runtime/LinearAlgebra.meta +++ b/Documentation/html/custom_doxygen.css.meta @@ -1,6 +1,5 @@ fileFormatVersion: 2 -guid: d98555a675e8e5e879de17db950b55fe -folderAsset: yes +guid: 12575efb4c194b50d8661fc04f025564 DefaultImporter: externalObjects: {} userData: diff --git a/Documentation/html/dir_14eca4e58e6d71e3a9859288c1bd2735.html b/Documentation/html/dir_14eca4e58e6d71e3a9859288c1bd2735.html new file mode 100644 index 0000000..e81d864 --- /dev/null +++ b/Documentation/html/dir_14eca4e58e6d71e3a9859288c1bd2735.html @@ -0,0 +1,87 @@ + + + + + + + +Nano Brain for Unity: /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Editor Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
Editor Directory Reference
+
+
+
+ + + + diff --git a/Documentation/html/dir_14eca4e58e6d71e3a9859288c1bd2735.html.meta b/Documentation/html/dir_14eca4e58e6d71e3a9859288c1bd2735.html.meta new file mode 100644 index 0000000..6697847 --- /dev/null +++ b/Documentation/html/dir_14eca4e58e6d71e3a9859288c1bd2735.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2691d82d648861377a94054f9d58deb1 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/dir_4f6666a8f2ab10bc970eb7559668f031.html b/Documentation/html/dir_4f6666a8f2ab10bc970eb7559668f031.html new file mode 100644 index 0000000..ee9e8da --- /dev/null +++ b/Documentation/html/dir_4f6666a8f2ab10bc970eb7559668f031.html @@ -0,0 +1,93 @@ + + + + + + + +Nano Brain for Unity: /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
Runtime Directory Reference
+
+
+ + + + +

+Directories

 Scripts
 
+
+ + + + diff --git a/Documentation/html/dir_4f6666a8f2ab10bc970eb7559668f031.html.meta b/Documentation/html/dir_4f6666a8f2ab10bc970eb7559668f031.html.meta new file mode 100644 index 0000000..cdcc5ac --- /dev/null +++ b/Documentation/html/dir_4f6666a8f2ab10bc970eb7559668f031.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 98b39284631945f34ba2f654c3a875ce +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/dir_961f031cbd4067daa41f3038afdffb61.html b/Documentation/html/dir_961f031cbd4067daa41f3038afdffb61.html new file mode 100644 index 0000000..2f32784 --- /dev/null +++ b/Documentation/html/dir_961f031cbd4067daa41f3038afdffb61.html @@ -0,0 +1,87 @@ + + + + + + + +Nano Brain for Unity: /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ScriptableObjects Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
ScriptableObjects Directory Reference
+
+
+
+ + + + diff --git a/Documentation/html/dir_961f031cbd4067daa41f3038afdffb61.html.meta b/Documentation/html/dir_961f031cbd4067daa41f3038afdffb61.html.meta new file mode 100644 index 0000000..8e7a5a3 --- /dev/null +++ b/Documentation/html/dir_961f031cbd4067daa41f3038afdffb61.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2926169196b4c7646a8f05ad7b23018c +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/dir_d52cd4d528148a4237c9bd37fdf6f7e8.html b/Documentation/html/dir_d52cd4d528148a4237c9bd37fdf6f7e8.html new file mode 100644 index 0000000..2b53de7 --- /dev/null +++ b/Documentation/html/dir_d52cd4d528148a4237c9bd37fdf6f7e8.html @@ -0,0 +1,95 @@ + + + + + + + +Nano Brain for Unity: /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
Scripts Directory Reference
+
+
+ + + + + + +

+Directories

 Core
 
 ScriptableObjects
 
+
+ + + + diff --git a/Documentation/html/dir_d52cd4d528148a4237c9bd37fdf6f7e8.html.meta b/Documentation/html/dir_d52cd4d528148a4237c9bd37fdf6f7e8.html.meta new file mode 100644 index 0000000..df076b2 --- /dev/null +++ b/Documentation/html/dir_d52cd4d528148a4237c9bd37fdf6f7e8.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4063181f562fec3d785401cba8562c79 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/dir_ff8b04b97203665bfd386b445c7d0b7c.html b/Documentation/html/dir_ff8b04b97203665bfd386b445c7d0b7c.html new file mode 100644 index 0000000..90a09b4 --- /dev/null +++ b/Documentation/html/dir_ff8b04b97203665bfd386b445c7d0b7c.html @@ -0,0 +1,87 @@ + + + + + + + +Nano Brain for Unity: /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
Core Directory Reference
+
+
+
+ + + + diff --git a/Documentation/html/dir_ff8b04b97203665bfd386b445c7d0b7c.html.meta b/Documentation/html/dir_ff8b04b97203665bfd386b445c7d0b7c.html.meta new file mode 100644 index 0000000..3b6154a --- /dev/null +++ b/Documentation/html/dir_ff8b04b97203665bfd386b445c7d0b7c.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5dca77ad1f394fe7181cc332b1ac0fa6 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/doc.svg b/Documentation/html/doc.svg new file mode 100644 index 0000000..f2b6a64 --- /dev/null +++ b/Documentation/html/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/Documentation/html/doc.svg.meta b/Documentation/html/doc.svg.meta new file mode 100644 index 0000000..87da073 --- /dev/null +++ b/Documentation/html/doc.svg.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 0605b0f6e3ad2fbcab684f5fb334e917 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0} + svgType: 3 + texturedSpriteMeshType: 0 + svgPixelsPerUnit: 100 + gradientResolution: 64 + alignment: 0 + customPivot: {x: 0, y: 0} + generatePhysicsShape: 0 + viewportOptions: 0 + preserveViewport: 0 + advancedMode: 0 + tessellationMode: 1 + predefinedResolutionIndex: 1 + targetResolution: 1080 + resolutionMultiplier: 1 + stepDistance: 10 + samplingStepDistance: 100 + maxCordDeviationEnabled: 0 + maxCordDeviation: 1 + maxTangentAngleEnabled: 0 + maxTangentAngle: 5 + keepTextureAspectRatio: 1 + textureSize: 256 + textureWidth: 256 + textureHeight: 256 + wrapMode: 0 + filterMode: 1 + sampleCount: 4 + preserveSVGImageAspect: 0 + useSVGPixelsPerUnit: 0 + spriteData: + TessellationDetail: 0 + SpriteName: + SpritePivot: {x: 0, y: 0} + SpriteAlignment: 0 + SpriteBorder: {x: 0, y: 0, z: 0, w: 0} + SpriteRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + SpriteID: + PhysicsOutlines: [] diff --git a/Documentation/html/docd.svg b/Documentation/html/docd.svg new file mode 100644 index 0000000..a467461 --- /dev/null +++ b/Documentation/html/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/Documentation/html/docd.svg.meta b/Documentation/html/docd.svg.meta new file mode 100644 index 0000000..0e047fa --- /dev/null +++ b/Documentation/html/docd.svg.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 835932448a49d591fa409c846511dcbc +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0} + svgType: 3 + texturedSpriteMeshType: 0 + svgPixelsPerUnit: 100 + gradientResolution: 64 + alignment: 0 + customPivot: {x: 0, y: 0} + generatePhysicsShape: 0 + viewportOptions: 0 + preserveViewport: 0 + advancedMode: 0 + tessellationMode: 1 + predefinedResolutionIndex: 1 + targetResolution: 1080 + resolutionMultiplier: 1 + stepDistance: 10 + samplingStepDistance: 100 + maxCordDeviationEnabled: 0 + maxCordDeviation: 1 + maxTangentAngleEnabled: 0 + maxTangentAngle: 5 + keepTextureAspectRatio: 1 + textureSize: 256 + textureWidth: 256 + textureHeight: 256 + wrapMode: 0 + filterMode: 1 + sampleCount: 4 + preserveSVGImageAspect: 0 + useSVGPixelsPerUnit: 0 + spriteData: + TessellationDetail: 0 + SpriteName: + SpritePivot: {x: 0, y: 0} + SpriteAlignment: 0 + SpriteBorder: {x: 0, y: 0, z: 0, w: 0} + SpriteRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + SpriteID: + PhysicsOutlines: [] diff --git a/Documentation/html/doxygen.css b/Documentation/html/doxygen.css new file mode 100644 index 0000000..7964918 --- /dev/null +++ b/Documentation/html/doxygen.css @@ -0,0 +1,1685 @@ +/* The standard CSS for doxygen 1.9.8*/ + +body { + background-color: white; + color: black; +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: Roboto,sans-serif; + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: Roboto,sans-serif; + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid #969696; + color: #414141; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: white; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: white; +} + +.classindex dl.odd { + background-color: #F8F8F8; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #4D4D4D; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #5D5D5D; +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #5D5D5D; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #5D5D5D; +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #CACACA; + background-color: #FBFBFB; + color: black; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: black; + background-color: #FBFBFB; + border: 1px solid #CACACA; +} + +div.line { + font-family: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid #00FF00; + color: black; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: #5D5D5D; + background-color: #D8D8D8; +} + +span.lineno a:hover { + color: #5D5D5D; + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: 104px; +} + +.compoundTemplParams { + color: #5D5D5D; + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000; +} + +span.keywordtype { + color: #604020; +} + +span.keywordflow { + color: #E08000; +} + +span.comment { + color: #800000; +} + +span.preprocessor { + color: #806020; +} + +span.stringliteral { + color: #002080; +} + +span.charliteral { + color: #008080; +} + +span.xmlcdata { + color: black; +} + +span.vhdldigit { + color: #FF00FF; +} + +span.vhdlchar { + color: #000000; +} + +span.vhdlkeyword { + color: #700070; +} + +span.vhdllogic { + color: #FF0000; +} + +blockquote { + background-color: #F7F7F7; + border-left: 2px solid #A7A7A7; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #343434; +} + +th.dirtab { + background-color: #444444; + color: #FFFFFF; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #636363; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9F9F9; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #E1E1E1; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #5D5D5D; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #B2B2B2; + border-left: 1px solid #B2B2B2; + border-right: 1px solid #B2B2B2; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E5E5E5; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #5D5D5D; + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #B2B2B2; + border-left: 1px solid #B2B2B2; + border-right: 1px solid #B2B2B2; + padding: 6px 0px 6px 0px; + color: #282828; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #E2E2E2; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #B2B2B2; + border-left: 1px solid #B2B2B2; + border-right: 1px solid #B2B2B2; + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: white; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #858585; + border-top:1px solid #6D6D6D; + border-left:1px solid #6D6D6D; + border-right:1px solid #CACACA; + border-bottom:1px solid #CACACA; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #A7A7A7; + border-bottom: 1px solid #A7A7A7; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: #F8F8F8; +} + +.directory tr.even { + padding-left: 6px; + background-color: white; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #4D4D4D; +} + +.arrow { + color: #A7A7A7; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial,Helvetica; + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #858585; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.svg'); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.svg'); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.svg'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #303030; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #343434; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #444444; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid #B2B2B2; + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #B2B2B2; + border-bottom: 1px solid #B2B2B2; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #B2B2B2; +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E5E5E5; + font-size: 90%; + color: #282828; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #B2B2B2; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#2D2D2D; + border:solid 1px #C8C8C8; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color: #424242; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #2D2D2D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: white; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: #303030; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9F9F9; + margin: 0px; + border-bottom: 1px solid #CACACA; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: Tahoma,Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: Tahoma,Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% Tahoma,Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #6D6D6D; + background-color: white; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#3D3D3D; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F5F5F5; + border: 1px solid #DCDCDC; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: url("data:image/svg+xml;utf8,&%238595;") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,'DejaVu Sans',Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 Verdana,'DejaVu Sans',Geneva,sans-serif; + color: #5D5D5D; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: black; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: #5D5D5D; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: Roboto,sans-serif; + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: white; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: gray; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: white; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: gray; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: gray; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: gray; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: gray; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: gray; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #343434; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #444444; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + diff --git a/Documentation/html/doxygen.css.meta b/Documentation/html/doxygen.css.meta new file mode 100644 index 0000000..7795306 --- /dev/null +++ b/Documentation/html/doxygen.css.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 247df139d59e2166c877cf6642d9815c +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/doxygen.svg b/Documentation/html/doxygen.svg new file mode 100644 index 0000000..61d44aa --- /dev/null +++ b/Documentation/html/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Documentation/html/doxygen.svg.meta b/Documentation/html/doxygen.svg.meta new file mode 100644 index 0000000..d759875 --- /dev/null +++ b/Documentation/html/doxygen.svg.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 207e0d8a44ba97950b3f8bcde74a84dd +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0} + svgType: 3 + texturedSpriteMeshType: 0 + svgPixelsPerUnit: 100 + gradientResolution: 64 + alignment: 0 + customPivot: {x: 0, y: 0} + generatePhysicsShape: 0 + viewportOptions: 0 + preserveViewport: 0 + advancedMode: 0 + tessellationMode: 1 + predefinedResolutionIndex: 1 + targetResolution: 1080 + resolutionMultiplier: 1 + stepDistance: 10 + samplingStepDistance: 100 + maxCordDeviationEnabled: 0 + maxCordDeviation: 1 + maxTangentAngleEnabled: 0 + maxTangentAngle: 5 + keepTextureAspectRatio: 1 + textureSize: 256 + textureWidth: 256 + textureHeight: 256 + wrapMode: 0 + filterMode: 1 + sampleCount: 4 + preserveSVGImageAspect: 0 + useSVGPixelsPerUnit: 0 + spriteData: + TessellationDetail: 0 + SpriteName: + SpritePivot: {x: 0, y: 0} + SpriteAlignment: 0 + SpriteBorder: {x: 0, y: 0, z: 0, w: 0} + SpriteRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + SpriteID: + PhysicsOutlines: [] diff --git a/Documentation/html/dynsections.js b/Documentation/html/dynsections.js new file mode 100644 index 0000000..ee3f142 --- /dev/null +++ b/Documentation/html/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/Documentation/html/dynsections.js.meta b/Documentation/html/dynsections.js.meta new file mode 100644 index 0000000..669884d --- /dev/null +++ b/Documentation/html/dynsections.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 220af82fcb6183668ba400d72fa73f5e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/folderclosed.svg b/Documentation/html/folderclosed.svg new file mode 100644 index 0000000..f2a498c --- /dev/null +++ b/Documentation/html/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/Documentation/html/folderclosed.svg.meta b/Documentation/html/folderclosed.svg.meta new file mode 100644 index 0000000..cccef68 --- /dev/null +++ b/Documentation/html/folderclosed.svg.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: ed852fa6ace29dcc3aee5f3b5c63fadc +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0} + svgType: 3 + texturedSpriteMeshType: 0 + svgPixelsPerUnit: 100 + gradientResolution: 64 + alignment: 0 + customPivot: {x: 0, y: 0} + generatePhysicsShape: 0 + viewportOptions: 0 + preserveViewport: 0 + advancedMode: 0 + tessellationMode: 1 + predefinedResolutionIndex: 1 + targetResolution: 1080 + resolutionMultiplier: 1 + stepDistance: 10 + samplingStepDistance: 100 + maxCordDeviationEnabled: 0 + maxCordDeviation: 1 + maxTangentAngleEnabled: 0 + maxTangentAngle: 5 + keepTextureAspectRatio: 1 + textureSize: 256 + textureWidth: 256 + textureHeight: 256 + wrapMode: 0 + filterMode: 1 + sampleCount: 4 + preserveSVGImageAspect: 0 + useSVGPixelsPerUnit: 0 + spriteData: + TessellationDetail: 0 + SpriteName: + SpritePivot: {x: 0, y: 0} + SpriteAlignment: 0 + SpriteBorder: {x: 0, y: 0, z: 0, w: 0} + SpriteRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + SpriteID: + PhysicsOutlines: [] diff --git a/Documentation/html/folderclosedd.svg b/Documentation/html/folderclosedd.svg new file mode 100644 index 0000000..0bd469b --- /dev/null +++ b/Documentation/html/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/Documentation/html/folderclosedd.svg.meta b/Documentation/html/folderclosedd.svg.meta new file mode 100644 index 0000000..223ac14 --- /dev/null +++ b/Documentation/html/folderclosedd.svg.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 603b3653e1469c03294155c230618f89 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0} + svgType: 3 + texturedSpriteMeshType: 0 + svgPixelsPerUnit: 100 + gradientResolution: 64 + alignment: 0 + customPivot: {x: 0, y: 0} + generatePhysicsShape: 0 + viewportOptions: 0 + preserveViewport: 0 + advancedMode: 0 + tessellationMode: 1 + predefinedResolutionIndex: 1 + targetResolution: 1080 + resolutionMultiplier: 1 + stepDistance: 10 + samplingStepDistance: 100 + maxCordDeviationEnabled: 0 + maxCordDeviation: 1 + maxTangentAngleEnabled: 0 + maxTangentAngle: 5 + keepTextureAspectRatio: 1 + textureSize: 256 + textureWidth: 256 + textureHeight: 256 + wrapMode: 0 + filterMode: 1 + sampleCount: 4 + preserveSVGImageAspect: 0 + useSVGPixelsPerUnit: 0 + spriteData: + TessellationDetail: 0 + SpriteName: + SpritePivot: {x: 0, y: 0} + SpriteAlignment: 0 + SpriteBorder: {x: 0, y: 0, z: 0, w: 0} + SpriteRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + SpriteID: + PhysicsOutlines: [] diff --git a/Documentation/html/folderopen.svg b/Documentation/html/folderopen.svg new file mode 100644 index 0000000..3552d18 --- /dev/null +++ b/Documentation/html/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/Documentation/html/folderopen.svg.meta b/Documentation/html/folderopen.svg.meta new file mode 100644 index 0000000..70999eb --- /dev/null +++ b/Documentation/html/folderopen.svg.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 99d7b20b61619bbc7bc7acf43433ad71 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0} + svgType: 3 + texturedSpriteMeshType: 0 + svgPixelsPerUnit: 100 + gradientResolution: 64 + alignment: 0 + customPivot: {x: 0, y: 0} + generatePhysicsShape: 0 + viewportOptions: 0 + preserveViewport: 0 + advancedMode: 0 + tessellationMode: 1 + predefinedResolutionIndex: 1 + targetResolution: 1080 + resolutionMultiplier: 1 + stepDistance: 10 + samplingStepDistance: 100 + maxCordDeviationEnabled: 0 + maxCordDeviation: 1 + maxTangentAngleEnabled: 0 + maxTangentAngle: 5 + keepTextureAspectRatio: 1 + textureSize: 256 + textureWidth: 256 + textureHeight: 256 + wrapMode: 0 + filterMode: 1 + sampleCount: 4 + preserveSVGImageAspect: 0 + useSVGPixelsPerUnit: 0 + spriteData: + TessellationDetail: 0 + SpriteName: + SpritePivot: {x: 0, y: 0} + SpriteAlignment: 0 + SpriteBorder: {x: 0, y: 0, z: 0, w: 0} + SpriteRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + SpriteID: + PhysicsOutlines: [] diff --git a/Documentation/html/folderopend.svg b/Documentation/html/folderopend.svg new file mode 100644 index 0000000..7f59273 --- /dev/null +++ b/Documentation/html/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/Documentation/html/folderopend.svg.meta b/Documentation/html/folderopend.svg.meta new file mode 100644 index 0000000..4519174 --- /dev/null +++ b/Documentation/html/folderopend.svg.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 49346fcfab3fcfff6b70fc3e72079452 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0} + svgType: 3 + texturedSpriteMeshType: 0 + svgPixelsPerUnit: 100 + gradientResolution: 64 + alignment: 0 + customPivot: {x: 0, y: 0} + generatePhysicsShape: 0 + viewportOptions: 0 + preserveViewport: 0 + advancedMode: 0 + tessellationMode: 1 + predefinedResolutionIndex: 1 + targetResolution: 1080 + resolutionMultiplier: 1 + stepDistance: 10 + samplingStepDistance: 100 + maxCordDeviationEnabled: 0 + maxCordDeviation: 1 + maxTangentAngleEnabled: 0 + maxTangentAngle: 5 + keepTextureAspectRatio: 1 + textureSize: 256 + textureWidth: 256 + textureHeight: 256 + wrapMode: 0 + filterMode: 1 + sampleCount: 4 + preserveSVGImageAspect: 0 + useSVGPixelsPerUnit: 0 + spriteData: + TessellationDetail: 0 + SpriteName: + SpritePivot: {x: 0, y: 0} + SpriteAlignment: 0 + SpriteBorder: {x: 0, y: 0, z: 0, w: 0} + SpriteRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + SpriteID: + PhysicsOutlines: [] diff --git a/Documentation/html/functions.html b/Documentation/html/functions.html new file mode 100644 index 0000000..286e8fd --- /dev/null +++ b/Documentation/html/functions.html @@ -0,0 +1,192 @@ + + + + + + + +Nano Brain for Unity: Class Members + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- _ -

+ + +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- g -

+ + +

- i -

+ + +

- l -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- w -

+
+ + + + diff --git a/Documentation/html/functions.html.meta b/Documentation/html/functions.html.meta new file mode 100644 index 0000000..cc77049 --- /dev/null +++ b/Documentation/html/functions.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9fd7deb6d1234937ead79f8ee90ef568 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/functions_enum.html b/Documentation/html/functions_enum.html new file mode 100644 index 0000000..103f15e --- /dev/null +++ b/Documentation/html/functions_enum.html @@ -0,0 +1,85 @@ + + + + + + + +Nano Brain for Unity: Class Members - Enumerations + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented enums with links to the class documentation for each member:
+
+ + + + diff --git a/Documentation/html/functions_enum.html.meta b/Documentation/html/functions_enum.html.meta new file mode 100644 index 0000000..087b18b --- /dev/null +++ b/Documentation/html/functions_enum.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9174d5685198b8457a89eb77e1ddc9e0 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/functions_func.html b/Documentation/html/functions_func.html new file mode 100644 index 0000000..cc97471 --- /dev/null +++ b/Documentation/html/functions_func.html @@ -0,0 +1,145 @@ + + + + + + + +Nano Brain for Unity: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented functions with links to the class documentation for each member:
+ +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- g -

+ + +

- n -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+
+ + + + diff --git a/Documentation/html/functions_func.html.meta b/Documentation/html/functions_func.html.meta new file mode 100644 index 0000000..3fc61e9 --- /dev/null +++ b/Documentation/html/functions_func.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b5635926d38de5a61b800a9e6bc4c310 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/functions_prop.html b/Documentation/html/functions_prop.html new file mode 100644 index 0000000..6007cfa --- /dev/null +++ b/Documentation/html/functions_prop.html @@ -0,0 +1,88 @@ + + + + + + + +Nano Brain for Unity: Class Members - Properties + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented properties with links to the class documentation for each member:
+
+ + + + diff --git a/Documentation/html/functions_prop.html.meta b/Documentation/html/functions_prop.html.meta new file mode 100644 index 0000000..4cfade3 --- /dev/null +++ b/Documentation/html/functions_prop.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 42580dac37333d6589c5fdfb92ee56c5 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/functions_vars.html b/Documentation/html/functions_vars.html new file mode 100644 index 0000000..00d4803 --- /dev/null +++ b/Documentation/html/functions_vars.html @@ -0,0 +1,96 @@ + + + + + + + +Nano Brain for Unity: Class Members - Variables + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented variables with links to the class documentation for each member:
+
+ + + + diff --git a/Documentation/html/functions_vars.html.meta b/Documentation/html/functions_vars.html.meta new file mode 100644 index 0000000..addd230 --- /dev/null +++ b/Documentation/html/functions_vars.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 429b2d216a8555dd884eb2892854c4be +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/hierarchy.html b/Documentation/html/hierarchy.html new file mode 100644 index 0000000..c450a54 --- /dev/null +++ b/Documentation/html/hierarchy.html @@ -0,0 +1,94 @@ + + + + + + + +Nano Brain for Unity: Class Hierarchy + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 123]
+ + + + + + + +
 CNanoBrain.BrainThe NanoBrain Unity Componnent
 CNanoBrain.ClusterPrefabThe Unity ScriptableObject to implement re-usable Cluster Prefabs
 CNanoBrain.NucleusA Nucleus is a basic element in a brain cluster
 CNanoBrain.ClusterA Cluster combines a collection of Nuclei to implement reusable behaviour
 CNanoBrain.NeuronA neuron is a basic Nucleus
 CNanoBrain.MemoryCellA MemoryCell stored its value for one update
 CNanoBrain.SynapseA Synapse connects the ouput of a Neuron to another Neuron
+
+
+ + + + diff --git a/Documentation/html/hierarchy.html.meta b/Documentation/html/hierarchy.html.meta new file mode 100644 index 0000000..d72a89d --- /dev/null +++ b/Documentation/html/hierarchy.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 65ad0dc620f273b18838bfcd08da2155 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/index.html b/Documentation/html/index.html new file mode 100644 index 0000000..36f8aae --- /dev/null +++ b/Documentation/html/index.html @@ -0,0 +1,89 @@ + + + + + + + +Nano Brain for Unity: Nano Brain for Unity + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Nano Brain for Unity
+
+
+

+Table of Contents

+ +
+
+ + + + diff --git a/Documentation/html/index.html.meta b/Documentation/html/index.html.meta new file mode 100644 index 0000000..1ea5663 --- /dev/null +++ b/Documentation/html/index.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e1fcaffbcd8a71d15bd82fd16ed5c4dd +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/jquery.js b/Documentation/html/jquery.js new file mode 100644 index 0000000..1dffb65 --- /dev/null +++ b/Documentation/html/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/Documentation/html/jquery.js.meta b/Documentation/html/jquery.js.meta new file mode 100644 index 0000000..6713e5e --- /dev/null +++ b/Documentation/html/jquery.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3cf478a6753c2c79aa8479224333fdae +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html b/Documentation/html/md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html new file mode 100644 index 0000000..ae3ab5f --- /dev/null +++ b/Documentation/html/md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html @@ -0,0 +1,85 @@ + + + + + + + +Nano Brain for Unity: NanoBrain + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
NanoBrain
+
+
+

Documentation is found in the Documentation folder

+
+
+ + + + diff --git a/Documentation/html/md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html.meta b/Documentation/html/md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html.meta new file mode 100644 index 0000000..f619db0 --- /dev/null +++ b/Documentation/html/md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c4ad8bc30919b3fb1aabdf1b8cc7ccd7 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/md__installation.html b/Documentation/html/md__installation.html new file mode 100644 index 0000000..59fa488 --- /dev/null +++ b/Documentation/html/md__installation.html @@ -0,0 +1,91 @@ + + + + + + + +Nano Brain for Unity: Package Installation + + + + + + + + + + +
+
+ + + + + + + +
+
Nano Brain for Unity v0.1 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Package Installation
+
+
+

You can import the NanoBrain Ant package in Unity directly with the Package Manager git package importer.

+

See Unity: Installing from a Git URL

+

Use the link from 'Clone with HTTP' (for example: https://git.passer.life/CreatureControl/Ant.git) In this way you can always retrieve the latest version by pressing the Update button in the Package Manager.

+

Optionally, you can use a tag to retrieve a specific version. For example: https://git.passer.life/CreatureControl/Ant.git#0.1.0. This will give you a stable version which does not change. Updating can be done by retrieving the package with a link to a new release.

+

+Samples Installation

+

In the Unity Package manager, select the NanoBrain Ant package and look for the Samples tab in the details pane on the right. There you can import the Models.

+
+
+ + + + diff --git a/Documentation/html/md__installation.html.meta b/Documentation/html/md__installation.html.meta new file mode 100644 index 0000000..28c8bfd --- /dev/null +++ b/Documentation/html/md__installation.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 96db3f6a19212db6ab7a2028cdbba6af +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/menu.js b/Documentation/html/menu.js new file mode 100644 index 0000000..b0b2693 --- /dev/null +++ b/Documentation/html/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
    '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
 '+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/Documentation/html/menu.js.meta b/Documentation/html/menu.js.meta new file mode 100644 index 0000000..1514579 --- /dev/null +++ b/Documentation/html/menu.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bf0867ab9943f2b3e8ff363a54e3630b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/menudata.js b/Documentation/html/menudata.js new file mode 100644 index 0000000..18b2c82 --- /dev/null +++ b/Documentation/html/menudata.js @@ -0,0 +1,63 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"hierarchy.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"_",url:"functions.html#index__5F"}, +{text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions.html#index_b"}, +{text:"c",url:"functions.html#index_c"}, +{text:"d",url:"functions.html#index_d"}, +{text:"g",url:"functions.html#index_g"}, +{text:"i",url:"functions.html#index_i"}, +{text:"l",url:"functions.html#index_l"}, +{text:"n",url:"functions.html#index_n"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"u",url:"functions.html#index_u"}, +{text:"w",url:"functions.html#index_w"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"a",url:"functions_func.html#index_a"}, +{text:"c",url:"functions_func.html#index_c"}, +{text:"d",url:"functions_func.html#index_d"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"n",url:"functions_func.html#index_n"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"t",url:"functions_func.html#index_t"}, +{text:"u",url:"functions_func.html#index_u"}]}, +{text:"Variables",url:"functions_vars.html"}, +{text:"Enumerations",url:"functions_enum.html"}, +{text:"Properties",url:"functions_prop.html"}]}]}]} diff --git a/Documentation/html/menudata.js.meta b/Documentation/html/menudata.js.meta new file mode 100644 index 0000000..546f19c --- /dev/null +++ b/Documentation/html/menudata.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0e1094ebc41608cfd9e63a04a94b6614 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/minus.svg b/Documentation/html/minus.svg new file mode 100644 index 0000000..f70d0c1 --- /dev/null +++ b/Documentation/html/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/Documentation/html/minus.svg.meta b/Documentation/html/minus.svg.meta new file mode 100644 index 0000000..cf6b7d8 --- /dev/null +++ b/Documentation/html/minus.svg.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 75bf6d7b0e663a84fac3d2314389b976 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0} + svgType: 3 + texturedSpriteMeshType: 0 + svgPixelsPerUnit: 100 + gradientResolution: 64 + alignment: 0 + customPivot: {x: 0, y: 0} + generatePhysicsShape: 0 + viewportOptions: 0 + preserveViewport: 0 + advancedMode: 0 + tessellationMode: 1 + predefinedResolutionIndex: 1 + targetResolution: 1080 + resolutionMultiplier: 1 + stepDistance: 10 + samplingStepDistance: 100 + maxCordDeviationEnabled: 0 + maxCordDeviation: 1 + maxTangentAngleEnabled: 0 + maxTangentAngle: 5 + keepTextureAspectRatio: 1 + textureSize: 256 + textureWidth: 256 + textureHeight: 256 + wrapMode: 0 + filterMode: 1 + sampleCount: 4 + preserveSVGImageAspect: 0 + useSVGPixelsPerUnit: 0 + spriteData: + TessellationDetail: 0 + SpriteName: + SpritePivot: {x: 0, y: 0} + SpriteAlignment: 0 + SpriteBorder: {x: 0, y: 0, z: 0, w: 0} + SpriteRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + SpriteID: + PhysicsOutlines: [] diff --git a/Documentation/html/minusd.svg b/Documentation/html/minusd.svg new file mode 100644 index 0000000..5f8e879 --- /dev/null +++ b/Documentation/html/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/Documentation/html/minusd.svg.meta b/Documentation/html/minusd.svg.meta new file mode 100644 index 0000000..96e3406 --- /dev/null +++ b/Documentation/html/minusd.svg.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 3dbd79767a52054368fa2ee4614c305f +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0} + svgType: 3 + texturedSpriteMeshType: 0 + svgPixelsPerUnit: 100 + gradientResolution: 64 + alignment: 0 + customPivot: {x: 0, y: 0} + generatePhysicsShape: 0 + viewportOptions: 0 + preserveViewport: 0 + advancedMode: 0 + tessellationMode: 1 + predefinedResolutionIndex: 1 + targetResolution: 1080 + resolutionMultiplier: 1 + stepDistance: 10 + samplingStepDistance: 100 + maxCordDeviationEnabled: 0 + maxCordDeviation: 1 + maxTangentAngleEnabled: 0 + maxTangentAngle: 5 + keepTextureAspectRatio: 1 + textureSize: 256 + textureWidth: 256 + textureHeight: 256 + wrapMode: 0 + filterMode: 1 + sampleCount: 4 + preserveSVGImageAspect: 0 + useSVGPixelsPerUnit: 0 + spriteData: + TessellationDetail: 0 + SpriteName: + SpritePivot: {x: 0, y: 0} + SpriteAlignment: 0 + SpriteBorder: {x: 0, y: 0, z: 0, w: 0} + SpriteRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + SpriteID: + PhysicsOutlines: [] diff --git a/Documentation/html/namespace_nano_brain.html b/Documentation/html/namespace_nano_brain.html new file mode 100644 index 0000000..306984e --- /dev/null +++ b/Documentation/html/namespace_nano_brain.html @@ -0,0 +1,115 @@ + + + + + + + +Nano Brain for Unity: NanoBrain Namespace Reference + + + + + + + + + + +
    +
    + + + + + + + +
    +
    Nano Brain for Unity v0.1 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    NanoBrain Namespace Reference
    +
    +
    + +

    The Nanobrain namespace. +More...

    + + + + + + + + + + + + + + + + + + + + + + + +

    +Classes

    class  Brain
     The NanoBrain Unity Componnent. More...
     
    class  Cluster
     A Cluster combines a collection of Nuclei to implement reusable behaviour. More...
     
    class  ClusterPrefab
     The Unity ScriptableObject to implement re-usable Cluster Prefabs. More...
     
    class  MemoryCell
     A MemoryCell stored its value for one update. More...
     
    class  Neuron
     A neuron is a basic Nucleus. More...
     
    class  Nucleus
     A Nucleus is a basic element in a brain cluster. More...
     
    class  Synapse
     A Synapse connects the ouput of a Neuron to another Neuron. More...
     
    +

    Detailed Description

    +

    The Nanobrain namespace.

    +
    + + + + diff --git a/Documentation/html/namespace_nano_brain.html.meta b/Documentation/html/namespace_nano_brain.html.meta new file mode 100644 index 0000000..9bad344 --- /dev/null +++ b/Documentation/html/namespace_nano_brain.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f68497d4c4a5c3b879fe70ded6330a14 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/nav_f.png b/Documentation/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..4154a8db441b3570d40140335851930793452362 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQof!pjv*C{Z|`p8Wl-c{KH%`o zm(f$9@nB|r(a)-d@(;P9zwwovd$`wp{Z<8IMWuvuoXI=|qQpk!Djy3`s%;4$j=d#Wzp$P!ry)04y literal 0 HcmV?d00001 diff --git a/Documentation/html/nav_f.png.meta b/Documentation/html/nav_f.png.meta new file mode 100644 index 0000000..3c3f483 --- /dev/null +++ b/Documentation/html/nav_f.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 6013d16c3bdfa9fa080c73d709fac4d3 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/nav_fd.png b/Documentation/html/nav_fd.png new file mode 100644 index 0000000000000000000000000000000000000000..93a398f52094bb192dcf6a6384a22425228a4a09 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQhuH;jv*C{Z||PwJz&7Y6fh^I zXyfO?N4k6dSA|-JgV4Ur8rI_#S-jjDT*SZ$_NhROmYPeOcZmb--^jZ|- jhwhG=XX)R!*8hy_5@zMe4_);ZXflJRtDnm{r-UW|s!A_g literal 0 HcmV?d00001 diff --git a/Documentation/html/nav_fd.png.meta b/Documentation/html/nav_fd.png.meta new file mode 100644 index 0000000..7fa3ffa --- /dev/null +++ b/Documentation/html/nav_fd.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: e3c36f216bc29fa69a6dd09a7bcd561f +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/nav_g.png b/Documentation/html/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!K1|%O$WD@{VR-P`7Ar*{o?>cfFFyLT0aMAuZ zm;BuePI{^*Esr<4ihtoOnEm1%yWgf&Ol9|K&oR^&|C<_i^l|IeerBO$-VV7b(_aBi OVeoYIb6Mw<&;$S#HzpMT literal 0 HcmV?d00001 diff --git a/Documentation/html/open.png.meta b/Documentation/html/open.png.meta new file mode 100644 index 0000000..be4a11e --- /dev/null +++ b/Documentation/html/open.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 9b7bd513a402d4bb4b85a0cb8c342719 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/pages.html b/Documentation/html/pages.html new file mode 100644 index 0000000..affa86d --- /dev/null +++ b/Documentation/html/pages.html @@ -0,0 +1,89 @@ + + + + + + + +Nano Brain for Unity: Related Pages + + + + + + + + + + +
    +
    + + + + + + + +
    +
    Nano Brain for Unity v0.1 +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Related Pages
    +
    +
    +
    Here is a list of all related documentation pages:
    +
    + + + + diff --git a/Documentation/html/pages.html.meta b/Documentation/html/pages.html.meta new file mode 100644 index 0000000..21c9815 --- /dev/null +++ b/Documentation/html/pages.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 47c19c987956ac714b828cc714830776 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/plus.svg b/Documentation/html/plus.svg new file mode 100644 index 0000000..0752016 --- /dev/null +++ b/Documentation/html/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Documentation/html/plus.svg.meta b/Documentation/html/plus.svg.meta new file mode 100644 index 0000000..22ee471 --- /dev/null +++ b/Documentation/html/plus.svg.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: d844f994d6b39894ba2ec7e9fa881913 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0} + svgType: 3 + texturedSpriteMeshType: 0 + svgPixelsPerUnit: 100 + gradientResolution: 64 + alignment: 0 + customPivot: {x: 0, y: 0} + generatePhysicsShape: 0 + viewportOptions: 0 + preserveViewport: 0 + advancedMode: 0 + tessellationMode: 1 + predefinedResolutionIndex: 1 + targetResolution: 1080 + resolutionMultiplier: 1 + stepDistance: 10 + samplingStepDistance: 100 + maxCordDeviationEnabled: 0 + maxCordDeviation: 1 + maxTangentAngleEnabled: 0 + maxTangentAngle: 5 + keepTextureAspectRatio: 1 + textureSize: 256 + textureWidth: 256 + textureHeight: 256 + wrapMode: 0 + filterMode: 1 + sampleCount: 4 + preserveSVGImageAspect: 0 + useSVGPixelsPerUnit: 0 + spriteData: + TessellationDetail: 0 + SpriteName: + SpritePivot: {x: 0, y: 0} + SpriteAlignment: 0 + SpriteBorder: {x: 0, y: 0, z: 0, w: 0} + SpriteRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + SpriteID: + PhysicsOutlines: [] diff --git a/Documentation/html/plusd.svg b/Documentation/html/plusd.svg new file mode 100644 index 0000000..0c65bfe --- /dev/null +++ b/Documentation/html/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Documentation/html/plusd.svg.meta b/Documentation/html/plusd.svg.meta new file mode 100644 index 0000000..2b5b68f --- /dev/null +++ b/Documentation/html/plusd.svg.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: c39199281580bc2899dcddbfdf6f4b64 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0} + svgType: 3 + texturedSpriteMeshType: 0 + svgPixelsPerUnit: 100 + gradientResolution: 64 + alignment: 0 + customPivot: {x: 0, y: 0} + generatePhysicsShape: 0 + viewportOptions: 0 + preserveViewport: 0 + advancedMode: 0 + tessellationMode: 1 + predefinedResolutionIndex: 1 + targetResolution: 1080 + resolutionMultiplier: 1 + stepDistance: 10 + samplingStepDistance: 100 + maxCordDeviationEnabled: 0 + maxCordDeviation: 1 + maxTangentAngleEnabled: 0 + maxTangentAngle: 5 + keepTextureAspectRatio: 1 + textureSize: 256 + textureWidth: 256 + textureHeight: 256 + wrapMode: 0 + filterMode: 1 + sampleCount: 4 + preserveSVGImageAspect: 0 + useSVGPixelsPerUnit: 0 + spriteData: + TessellationDetail: 0 + SpriteName: + SpritePivot: {x: 0, y: 0} + SpriteAlignment: 0 + SpriteBorder: {x: 0, y: 0, z: 0, w: 0} + SpriteRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + SpriteID: + PhysicsOutlines: [] diff --git a/LinearAlgebra/src.meta b/Documentation/html/rtf.meta similarity index 77% rename from LinearAlgebra/src.meta rename to Documentation/html/rtf.meta index 6476da7..a910639 100644 --- a/LinearAlgebra/src.meta +++ b/Documentation/html/rtf.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 6a602cec2c4009925b1d19ed36a98c6a +guid: ee75eac0aaf5df6d9a3fb53c126f9b22 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Documentation/html/rtf/PasserLifeLogoRight1_300.png b/Documentation/html/rtf/PasserLifeLogoRight1_300.png new file mode 100644 index 0000000000000000000000000000000000000000..7480553ab1bdec3bbcef46bae92a68325334b6f3 GIT binary patch literal 10323 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 F{|DE2^oRfe literal 0 HcmV?d00001 diff --git a/Documentation/html/rtf/PasserLifeLogoRight1_300.png.meta b/Documentation/html/rtf/PasserLifeLogoRight1_300.png.meta new file mode 100644 index 0000000..c781544 --- /dev/null +++ b/Documentation/html/rtf/PasserLifeLogoRight1_300.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 281d3313137887d66b781aa9219f6768 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/rtf/class_nano_brain_1_1_cluster.png b/Documentation/html/rtf/class_nano_brain_1_1_cluster.png new file mode 100644 index 0000000000000000000000000000000000000000..b808c356735d4a1a08bccaced3bd8305eefcb6db GIT binary patch literal 565 zcmV-50?Pe~P)W7Dir#LVva2S`&=)l0h|NsB9NT2)w000SeQchC<|NsC0|NsC0Hv*f~0005N zNkl5s`%)O+<81 z-+&I{PDG>?UOys|m!5Cd?*b}xa@wMA!fe;Sg-%{cDav!6gOyo*`MNh-b&~7HFly9t zT%zkE4~4NU?6x{vt?y1N!*JFz&Xh%K|3Luru7uF5-ptvX3Uq31}&x0Eb1_UQV^Lt*UEnyt>(XnD28>$6sI#zb1; zqx&U#sKUO@%Fc6*<|w`L)#DnScPSFTL(j|+t?GG&9%^}o9!~OKXxZVaRo*Lj@9?SL z)mb+W6;o6-y{`qA9qu1eW@ZaHnwj~aeij`<2qyXiG1g?^#9Hh{A+}S4&0d&w$^T;a=4F>hMBP5+xR0AkNp%TJ+a#%;28zNXIh$eO-k{$uvaO~ zeBJ#c)M?TxpVpukK`#t{D*fYLC^Fk)Xa6tLBeAFB=Uu-v&HCjJJKxVCXFOLWaXr2L zb%m7ou3OWxH~+YmdCehc>QT8%H`(`A^Izq>xOt)U7wt2x9-C6Pu6)1UC)xkfm93|3 zqZU@%vM*G7$nI^X7Q?~2`lG@U>oexRKHWIK{8{e8O&`UoJQ|KJOXY8$Avi_62#hf&+2fZjX zv7VBbi6P-3k@(|(u2z9VehM8OZ<@I~J0f;W=;&}2+?A)jd&_@U zm+9N)WxwASKl?+)897&tyVITelkdJ{&lQ}=8GC4EK$ho{CGLN@c4hxOEi(Id(Q>~P zDJL3#=AKsYTKX)C1C(Z}NbXVn-#n$kz3u8FGuKu&|g2ZMKE%EA; zuQa94#cXc(>Obl9A~@{U*MHjf#&8+@o+hk g<#vBKouqV_AhCWRcX*5yME{Iu_lzo1n6%}IgG%PfMvqIEI7O0sq&XS(En;RUyOif}e52&W zJO}mjaW1zRe`+!_MDwvQOq1bY(6JO?h$vEE*zm-GA>m{r!+}Z6j18*nObp)03Vzi$ zI&mbbD|U3eQDzqs-1x*nNom?Mhwb^Tv-p}jUR=CYwy)zv5ch&7F-&{Ur9JQN(AgTb z@bv5{S@XZy9!-8Kzdrlp(*>FTR1zbe`Zs_>=6uer>1!kZsVsEs_K-a-cj+qop5^VY znqEY1UCh2J=%P~4@m=7c=|3OMJ*`7*MNa>z|4bK3o=PihO*K}?{V%lQ^#pllU#mCM z9iC3%NniGIq0q&%%Z&A8_8zY~?drn+|FrfLI zCgiw9f7nyIhHHw9_k!y?=Y3)}^YptSI)_o!KS-`GMA$7qIrH;NUdhK;}<}PqReVS7HLuy5T&@Ubhao^%{2dzj~ z6NlDk3*#AAF3~IFGnw?o;cc*Q!!Fk=m8-(PE{tLLy8Dmw0>gC95WR2Ht_GWd6VH(p z~Jq|I4REzls-Z7k?hlym#M;zxU@svcN4tjbjq#m+U{;Oo@yA SQ^W+!WDK6JelF{r5}E+ER;Vuk literal 0 HcmV?d00001 diff --git a/Documentation/html/rtf/class_nano_brain_1_1_neuron.png.meta b/Documentation/html/rtf/class_nano_brain_1_1_neuron.png.meta new file mode 100644 index 0000000..623b8ce --- /dev/null +++ b/Documentation/html/rtf/class_nano_brain_1_1_neuron.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: f659ccb7654b41d42b8c154b615b9ff8 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/rtf/class_nano_brain_1_1_nucleus.png b/Documentation/html/rtf/class_nano_brain_1_1_nucleus.png new file mode 100644 index 0000000000000000000000000000000000000000..1433a13eac26a3335d2b43c8a474867ff3b418b3 GIT binary patch literal 1319 zcmbW1Yfw{17=}-zGA_%1xMf=yCHo2cKF&9JcFQ*Dw*_6tW<)buq)x^orQDNTLYU-83R4E zJdf9(R&AfiNHI~@AC&Nk>mK(z_a)h>*6drrJL^fO@0*Wi^Mj*-g9AlIC6O}07P_Q1 zAK|p+DksI+{Hc+y`IB|M&krE?N;d;(?6MXs6U2b!F<6v=Gr1e(zM7_)uubunbn$r4 zm^VqRyMgGNbX_-+Rvj5Z<%(CazeO_W-ff0Q$gT05+7VfV^R9-IS^;~!5#jTT%u7a} zwz|s49Bao~XxGDh43Bb<1Z6-4;db%T6786L5iszkf1cqY?3Itt0nPmGU-n?KyZmp8 z+!66=ndW$BA$ZA;?5c$A5n45ZOSp(!Tux<%L<8XkB|@g$ zJ%LKsjF(w-j% z*os{)>c5sefG^b-G}1~mv6aTl2N(NK|JnA(`DYuXsJ^GAebS#$Ai4wt>xSO7gvcJf(cW1WA0}(lfu&;O`$c~ ziGbD;1)*Wli#hHS@|Ki=FtxdirE$4Cq#YKVN~7zp{vJE1^C_O1cR}Lg1`^5bYTsXt z9mAinm`|Ge=_2y2GSKW6!+g0a)oZ-{`HSjoE zT?u0supft6nxZet7>M{P*4c1VON&7DVM+mlDGv>by($!I5~Xp+#g {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABF" }{}}{\fldrslt {\cs37\ul\cf2 CollectReceivers}}} + (bool removeDuplicates=false)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Collect all receiving nuclei of signals from this cluster. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}} + > {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABG" }{}}{\fldrslt {\cs37\ul\cf2 CollectSynapsesTo}}} + ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + otherCluster)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Collect all connections to receivers of signals from this cluster. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABH" }{}}{\fldrslt {\cs37\ul\cf2 UpdateFromNucleus}}} + ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + startNucleus)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Update the state of the nucleus and all nuclei receiving from it. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +override void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABI" }{}}{\fldrslt {\cs37\ul\cf2 UpdateStateIsolated}}} + ()\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Update the state without updating other Nuclei. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABJ" }{}}{\fldrslt {\cs37\ul\cf2 Refresh}}} + ()\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Recalculate derived properties. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +virtual void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABK" }{}}{\fldrslt {\cs37\ul\cf2 UpdateNuclei}}} + ()\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Update the state and recursively all Nuclei receiving data from this Nucleus. }{ +}\par +}\par} +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Static Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +static int {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABL" }{}}{\fldrslt {\cs37\ul\cf2 GetNucleusIndex}}} + (List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + > {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABM" }{}}{\fldrslt {\cs37\ul\cf2 nuclei}}} +, {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + nucleus)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Get the index of a nucleus in a list of nuclei. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +static int {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABN" }{}}{\fldrslt {\cs37\ul\cf2 GetNucleusIndex}}} + (List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + > {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABM" }{}}{\fldrslt {\cs37\ul\cf2 nuclei}}} +, string nucleusName)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Get the index of a nucleus with the given name in a list of nuclei. }{ +}\par +}\par} +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}} + {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAR" }{}}{\fldrslt {\cs37\ul\cf2 prefab}}} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The prefab used to create this cluster. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} +[] {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABO" }{}}{\fldrslt {\cs37\ul\cf2 instances}}} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +All cluster instance of a multi-cluster. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +int {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABP" }{}}{\fldrslt {\cs37\ul\cf2 instanceCount}}} + = 1\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The number of cluster instances in a multi-cluster. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Dictionary< int, {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + > {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABQ" }{}}{\fldrslt {\cs37\ul\cf2 thingClusters}}} + = new()\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The mapping from things to cluster instances. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + > {\b nuclei} = new(){\bkmkstart AAAAAAAABM} +{\bkmkend AAAAAAAABM} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +All nuclei in this cluster. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +string {\b name}{\bkmkstart AAAAAAAABR} +{\bkmkend AAAAAAAABR} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The name of the Nucleus. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The cluster prefab in which the nucleus is located. }{ +}\par +}\par} +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Protected Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} + > {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABS" }{}}{\fldrslt {\cs37\ul\cf2 _outputs}}} + = null\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The neurons without outgoing connections. }{ +}\par +}\par} +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Properties\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +string {\b baseName}{\f2 [get]}{\bkmkstart AAAAAAAABT} +{\bkmkend AAAAAAAABT} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The base name of the cluster. I don't think this is actively used at this moment. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Dictionary< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} +, List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + > > {\b computeOrders}{\f2 [get]}{\bkmkstart AAAAAAAABU} +{\bkmkend AAAAAAAABU} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +This gives the order in which nuclei should be computed when a nucleus is updated. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +virtual {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} + {\b defaultOutput}{\f2 [get]}{\bkmkstart AAAAAAAABV} +{\bkmkend AAAAAAAABV} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The first nucleus in a cluster is the default output. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} + > {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABW" }{}}{\fldrslt {\cs37\ul\cf2 outputs}}} +{\f2 [get]}\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The neurons without outgoing connections. }{ +}\par +}\par} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Enumeration Documentation\par +\pard\plain +{\xe \v Type\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:Type} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAP" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Nucleus.Type}}} +{\f2 [inherited]}}} +\par +{\bkmkstart AAAAAAAAAP} +{\bkmkend AAAAAAAAAP} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Function to clone a nucleus to a Cluster prefab. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i prefab} \cell }{\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +\par +}}The types of Nucleus \par +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Constructor & Destructor Documentation\par +\pard\plain +{\xe \v Cluster\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:Cluster} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +NanoBrain.Cluster.Cluster ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}} + {\i prefab}, {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + {\i parent})}} +\par +{\bkmkstart AAAAAAAAAQ} +{\bkmkend AAAAAAAAAQ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Instantiate a new copy of a ClusterPrefab in the given parent. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i prefab} \cell }{The prefab to use\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i parent} \cell }{The cluster in which this new cluster will be placed\cell } +{\row } +} +}} +{\xe \v Cluster\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:Cluster} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +NanoBrain.Cluster.Cluster ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}} + {\i prefab}, {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}} + {\i parent} = {\f2 null})}} +\par +{\bkmkstart AAAAAAAAAT} +{\bkmkend AAAAAAAAAT} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Add a new cluster to a ClusterPrefab. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i prefab} \cell }{The prefab to copy\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i parent} \cell }{The prefab in which the new copy is placed\cell } +{\row } +} +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Function Documentation\par +\pard\plain +{\xe \v ShallowCloneTo\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:ShallowCloneTo} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +override {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + NanoBrain.Cluster.ShallowCloneTo ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + {\i parent})}} +\par +{\bkmkstart AAAAAAAAAU} +{\bkmkend AAAAAAAAAU} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Toggle for printing debugging trace data. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Function to make a partial clone of this nucleus\par +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i parent} \cell }{The cluster in which the cloned nucleus should be placed\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +\par +}}}} +{\xe \v GetNucleusIndex\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:GetNucleusIndex} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +static int NanoBrain.Cluster.GetNucleusIndex (List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + > {\i nuclei}, {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + {\i nucleus}){\f2 [static]}}} +\par +{\bkmkstart AAAAAAAABL} +{\bkmkend AAAAAAAABL} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Get the index of a nucleus in a list of nuclei. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i nuclei} \cell }{The list of nuclei to search\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i nucleus} \cell }{The nucleus to find\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +The index of the nucleus in the list or -1 when it has not been found\par +}}}} +{\xe \v GetNucleusIndex\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:GetNucleusIndex} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +static int NanoBrain.Cluster.GetNucleusIndex (List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + > {\i nuclei}, string {\i nucleusName}){\f2 [static]}}} +\par +{\bkmkstart AAAAAAAABN} +{\bkmkend AAAAAAAABN} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Get the index of a nucleus with the given name in a list of nuclei. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i nuclei} \cell }{The list of nuclei to search\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i nucleusName} \cell }{The name of the nucleus to find\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +The index of the nucleus in the list or -1 when it has not been found\par +}}}} +{\xe \v AddInstance\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:AddInstance} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +void NanoBrain.Cluster.AddInstance ()}} +\par +{\bkmkstart AAAAAAAAAV} +{\bkmkend AAAAAAAAAV} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Increase the number of instances in an multi-cluster. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +/remark Note this does not create the instances. This is only intended to be used for prefabs. \par +}} +{\xe \v AddInstance\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:AddInstance} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +void NanoBrain.Cluster.AddInstance ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}} + {\i prefab})}} +\par +{\bkmkstart AAAAAAAAAW} +{\bkmkend AAAAAAAAAW} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Create an new instance in a multi-cluster. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i prefab} \cell }{The prefab to use to create the new instance\cell } +{\row } +} +/remark This does not change the instanceCount. It should only be used at runtime. \par +}} +{\xe \v TryGetNucleus\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:TryGetNucleus} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +bool NanoBrain.Cluster.TryGetNucleus (string {\i nucleusName}, out {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + {\i foundNucleus})}} +\par +{\bkmkstart AAAAAAAABA} +{\bkmkend AAAAAAAABA} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Try to find a nucleus in this cluster. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i nucleusName} \cell }{The name of the nucleus to find\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i foundNucleus} \cell }{The found nucleus or null if it is not found\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +True when the nucleus is found, false otherwise\par +}}}} +{\xe \v GetNucleus\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:GetNucleus} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + NanoBrain.Cluster.GetNucleus (string {\i nucleusName})}} +\par +{\bkmkstart AAAAAAAABB} +{\bkmkend AAAAAAAABB} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Get a nucleus in this cluster. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i nucleusName} \cell }{The name of the nucleus to find\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +The found nucleus or null when it is not found\par +}}}} +{\xe \v GetNeuron\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:GetNeuron} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} + NanoBrain.Cluster.GetNeuron (string {\i neuronName})}} +\par +{\bkmkstart AAAAAAAABC} +{\bkmkend AAAAAAAABC} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Get a neuron in this cluster. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i neuronName} \cell }{The name of the neuron to find\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +The found neuron or null when it is not found\par +}}}} +{\xe \v GetNeuron\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:GetNeuron} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} + NanoBrain.Cluster.GetNeuron (int {\i thingId}, string {\i neuronName}, string {\i thingName} = {\f2 null})}} +\par +{\bkmkstart AAAAAAAABD} +{\bkmkend AAAAAAAABD} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Get a neuron in an instance of a multi-cluster. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i thingId} \cell }{The id of the thing mapped to the cluster instance\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i neuronName} \cell }{The name of the neuron to find\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i thingName} \cell }{The name of the thing mapped to the cluster instance\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +The found neuron or null when it is not found\par +}}The cluster instance mapped to the thing will be neuron.parent if a neuron is found. \par +}} +{\xe \v DeleteNucleus\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:DeleteNucleus} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +bool NanoBrain.Cluster.DeleteNucleus ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + {\i nucleus})}} +\par +{\bkmkstart AAAAAAAABE} +{\bkmkend AAAAAAAABE} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Delete a nucleus from this clsuter. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i nucleus} \cell }{The nucleus to delete\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +True if a nucleus was deleted, false if the nucleus could not be found\par +}}}} +{\xe \v CollectReceivers\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:CollectReceivers} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +virtual List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + > NanoBrain.Cluster.CollectReceivers (bool {\i removeDuplicates} = {\f2 false}){\f2 [virtual]}}} +\par +{\bkmkstart AAAAAAAABF} +{\bkmkend AAAAAAAABF} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Collect all receiving nuclei of signals from this cluster. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i removeDuplicates} \cell }{Ensure that a receiver is only listed once in the result\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +The list of receivers\par +}}}} +{\xe \v CollectSynapsesTo\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:CollectSynapsesTo} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}} + > NanoBrain.Cluster.CollectSynapsesTo ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + {\i otherCluster})}} +\par +{\bkmkstart AAAAAAAABG} +{\bkmkend AAAAAAAABG} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Collect all connections to receivers of signals from this cluster. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +\par +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +A list of pairs of the sending neuron in this cluster and the matching receiving nucleus\par +}}Collect all synapses of senders in another cluster of signals to this cluster\par +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i otherCluster} \cell }{The other cluster with sending neurons\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +A list of synapses to the neurons in the other clusters\par +}}}} +{\xe \v UpdateFromNucleus\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:UpdateFromNucleus} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +void NanoBrain.Cluster.UpdateFromNucleus ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + {\i startNucleus})}} +\par +{\bkmkstart AAAAAAAABH} +{\bkmkend AAAAAAAABH} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Update the state of the nucleus and all nuclei receiving from it. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i startNucleus} \cell }{The nucleus to start updating\cell } +{\row } +} +}} +{\xe \v UpdateStateIsolated\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:UpdateStateIsolated} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +override void NanoBrain.Cluster.UpdateStateIsolated ()}} +\par +{\bkmkstart AAAAAAAABI} +{\bkmkend AAAAAAAABI} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Update the state without updating other Nuclei. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +\par +}} +{\xe \v Refresh\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:Refresh} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +void NanoBrain.Cluster.Refresh ()}} +\par +{\bkmkstart AAAAAAAABJ} +{\bkmkend AAAAAAAABJ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Recalculate derived properties. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +This can be used to recalculate derived properties after the set of nuclei has been changed \par +}} +{\xe \v UpdateNuclei\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:UpdateNuclei} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +virtual void NanoBrain.Nucleus.UpdateNuclei (){\f2 [virtual]}, {\f2 [inherited]}}} +\par +{\bkmkstart AAAAAAAABK} +{\bkmkend AAAAAAAABK} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Update the state and recursively all Nuclei receiving data from this Nucleus. }}\par +{ +Reimplemented in {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABX" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.MemoryCell}}} +.}\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Data Documentation\par +\pard\plain +{\xe \v prefab\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:prefab} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}} + NanoBrain.Cluster.prefab}} +\par +{\bkmkstart AAAAAAAAAR} +{\bkmkend AAAAAAAAAR} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The prefab used to create this cluster. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Cluster should always be created from prefabs \par +}} +{\xe \v instances\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:instances} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + [] NanoBrain.Cluster.instances}} +\par +{\bkmkstart AAAAAAAABO} +{\bkmkend AAAAAAAABO} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +All cluster instance of a multi-cluster. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +A cluster is a multi-cluster when there is more than one instance. The actual instances are only created at runtime. The value instanceCount determines how many instances will be present at runtime. \par +}} +{\xe \v instanceCount\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:instanceCount} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +int NanoBrain.Cluster.instanceCount = 1}} +\par +{\bkmkstart AAAAAAAABP} +{\bkmkend AAAAAAAABP} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The number of cluster instances in a multi-cluster. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +A cluster is a multi-clsuter when there is more than one instance. \par +}} +{\xe \v thingClusters\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:thingClusters} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +Dictionary NanoBrain.Cluster.thingClusters = new()}} +\par +{\bkmkstart AAAAAAAABQ} +{\bkmkend AAAAAAAABQ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The mapping from things to cluster instances. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +In a multi-cluster each instance can be used for a thing. Cluster instance may also not (yet) be mapped to a thing. \par +}} +{\xe \v _outputs\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:_outputs} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +List<{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} +> NanoBrain.Cluster._outputs = null{\f2 [protected]}}} +\par +{\bkmkstart AAAAAAAABS} +{\bkmkend AAAAAAAABS} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The neurons without outgoing connections. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +These neurons can potentially be connected to neurons in other clusters \par +}} +{\xe \v parent\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:parent} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + NanoBrain.Nucleus.parent{\f2 [inherited]}}} +\par +{\bkmkstart AAAAAAAAAS} +{\bkmkend AAAAAAAAAS} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The cluster prefab in which the nucleus is located. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The cluster instance in which the nucleus is located \par +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Property Documentation\par +\pard\plain +{\xe \v outputs\:NanoBrain.Cluster} +{\xe \v NanoBrain.Cluster\:outputs} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +List<{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} +> NanoBrain.Cluster.outputs{\f2 [get]}}} +\par +{\bkmkstart AAAAAAAABW} +{\bkmkend AAAAAAAABW} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The neurons without outgoing connections. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +These neurons can potentially be connected to neurons in other clusters \par +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Cluster.cs\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +NanoBrain.ClusterPrefab Class Reference\par \pard\plain +{\tc\tcl2 \v NanoBrain.ClusterPrefab} +{\xe \v NanoBrain.ClusterPrefab} +{\bkmkstart AAAAAAAAAH} +{\bkmkend AAAAAAAAAH} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Description\par +\pard\plain +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The Unity ScriptableObject to implement re-usable Cluster Prefabs. \par +}} +\par +{ +Inherits ScriptableObject.}\par +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABY" }{}}{\fldrslt {\cs37\ul\cf2 GetNucleus}}} + (string nucleusName)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Retrieve a nucleus in this cluster. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +void {\b EnsureInitialization} (){\bkmkstart AAAAAAAABZ} +{\bkmkend AAAAAAAABZ} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +void {\b GarbageCollection} (){\bkmkstart AAAAAAAACA} +{\bkmkend AAAAAAAACA} +\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + {\b cluster}{\bkmkstart AAAAAAAACB} +{\bkmkend AAAAAAAACB} +\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Function Documentation\par +\pard\plain +{\xe \v GetNucleus\:NanoBrain.ClusterPrefab} +{\xe \v NanoBrain.ClusterPrefab\:GetNucleus} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + NanoBrain.ClusterPrefab.GetNucleus (string {\i nucleusName})}} +\par +{\bkmkstart AAAAAAAABY} +{\bkmkend AAAAAAAABY} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Retrieve a nucleus in this cluster. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i nucleusName} \cell }{The name of the nucleus\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +The Nucleus with the given name or null if no such Nucleus could be found\par +}}}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +NanoBrain.MemoryCell Class Reference\par \pard\plain +{\tc\tcl2 \v NanoBrain.MemoryCell} +{\xe \v NanoBrain.MemoryCell} +{\bkmkstart AAAAAAAAAI} +{\bkmkend AAAAAAAAAI} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Description\par +\pard\plain +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +A MemoryCell stored its value for one update. \par +} + +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +When the input for a Memory Cell changes, it will output the previous value \par + \par +}} +Inheritance diagram for NanoBrain.MemoryCell:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "class_nano_brain_1_1_memory_cell.png" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Types\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACC" }{}}{\fldrslt {\cs37\ul\cf2 CombinatorType}}} + \{ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACD" }{}}{\fldrslt {\cs37\ul\cf2 Sum}}} + +, {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACE" }{}}{\fldrslt {\cs37\ul\cf2 Product}}} + + \}\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The type of combinators. }}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACF" }{}}{\fldrslt {\cs37\ul\cf2 ActivationType}}} + \{ {\b Linear} +, {\b Power} +, {\b Sqrt} +, {\b Reciprocal} +, {\b Tanh} +, {\b Binary} +, {\b Normalized} +, {\b Custom} + \}{\bkmkstart AAAAAAAACF} +{\bkmkend AAAAAAAACF} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The type of. }}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAP" }{}}{\fldrslt {\cs37\ul\cf2 Type}}} + \{ {\b None} +, {\b Neuron} +, {\b MemoryCell} +, {\b Cluster} + \}\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Function to clone a nucleus to a Cluster prefab. }}\par} +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +{\b MemoryCell} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}} +, string {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABR" }{}}{\fldrslt {\cs37\ul\cf2 name}}} +){\bkmkstart AAAAAAAACG} +{\bkmkend AAAAAAAACG} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +override {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + {\b ShallowCloneTo} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + newParent){\bkmkstart AAAAAAAACH} +{\bkmkend AAAAAAAACH} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +override void {\b UpdateStateIsolated} (){\bkmkstart AAAAAAAACI} +{\bkmkend AAAAAAAACI} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +override void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABX" }{}}{\fldrslt {\cs37\ul\cf2 UpdateNuclei}}} + ()\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Update the state and recursively all Nuclei receiving data from this Nucleus. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}} + {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACJ" }{}}{\fldrslt {\cs37\ul\cf2 AddSynapse}}} + ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} + sendingNucleus, float weight=1)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Add a new synapse to this nuclues. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}} + {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACK" }{}}{\fldrslt {\cs37\ul\cf2 GetSynapse}}} + ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + sender)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Find a synapse. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACL" }{}}{\fldrslt {\cs37\ul\cf2 RemoveSynapse}}} + ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + sendingNucleus)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Remove a synapse from a Nucleus. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +virtual void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACM" }{}}{\fldrslt {\cs37\ul\cf2 SetBias}}} + (Vector3 inputValue)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +AnimationCurve {\b GenerateCurve} (){\bkmkstart AAAAAAAACN} +{\bkmkend AAAAAAAACN} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +void {\b SleepCheck} (){\bkmkstart AAAAAAAACO} +{\bkmkend AAAAAAAACO} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b CombinatorSum} (){\bkmkstart AAAAAAAACP} +{\bkmkend AAAAAAAACP} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b CombinatorSum} (){\bkmkstart AAAAAAAACQ} +{\bkmkend AAAAAAAACQ} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b CombinatorProduct} (){\bkmkstart AAAAAAAACR} +{\bkmkend AAAAAAAACR} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b CombinatorProduct} (){\bkmkstart AAAAAAAACS} +{\bkmkend AAAAAAAACS} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b CombinatorMax} (){\bkmkstart AAAAAAAACT} +{\bkmkend AAAAAAAACT} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +virtual void {\b AddReceiver} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + receiverToAdd, float weight=1){\bkmkstart AAAAAAAACU} +{\bkmkend AAAAAAAACU} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +virtual void {\b RemoveReceiver} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + receiverToRemove){\bkmkstart AAAAAAAACV} +{\bkmkend AAAAAAAACV} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +virtual void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACW" }{}}{\fldrslt {\cs37\ul\cf2 ProcessStimulus}}} + (Vector3 inputValue)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Process an external stimulus. }{ +}\par +}\par} +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Static Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +static void {\b Delete} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + nucleus){\bkmkstart AAAAAAAACX} +{\bkmkend AAAAAAAACX} +\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +bool {\b staticMemory} = false{\bkmkstart AAAAAAAACY} +{\bkmkend AAAAAAAACY} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Vector3 {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACZ" }{}}{\fldrslt {\cs37\ul\cf2 bias}}} + = Vector3.zero\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Create a new Neuron in a Cluster Prefab. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACC" }{}}{\fldrslt {\cs37\ul\cf2 CombinatorType}}} + {\b combinator} = {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACD" }{}}{\fldrslt {\cs37\ul\cf2 CombinatorType.Sum}}} +{\bkmkstart AAAAAAAADA} +{\bkmkend AAAAAAAADA} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The type of combinator used for this Neuron. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACF" }{}}{\fldrslt {\cs37\ul\cf2 ActivationType}}} + {\b _curvePreset}{\bkmkstart AAAAAAAADB} +{\bkmkend AAAAAAAADB} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +AnimationCurve {\b curve}{\bkmkstart AAAAAAAADC} +{\bkmkend AAAAAAAADC} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float {\b curveMax} = 1.0f{\bkmkstart AAAAAAAADD} +{\bkmkend AAAAAAAADD} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Action {\b WhenFiring}{\bkmkstart AAAAAAAADE} +{\bkmkend AAAAAAAADE} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +bool {\b persistOutput} = false{\bkmkstart AAAAAAAADF} +{\bkmkend AAAAAAAADF} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float {\b lastUpdate} = 0{\bkmkstart AAAAAAAADG} +{\bkmkend AAAAAAAADG} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Toggle for printing debugging trace data. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +readonly float {\b timeToSleep} = 1f{\bkmkstart AAAAAAAADH} +{\bkmkend AAAAAAAADH} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +string {\b name}{\bkmkstart AAAAAAAABR} +{\bkmkend AAAAAAAABR} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The name of the Nucleus. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The cluster prefab in which the nucleus is located. }{ +}\par +}\par} +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Protected Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +virtual void {\b CloneFields} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} + clone){\bkmkstart AAAAAAAADI} +{\bkmkend AAAAAAAADI} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +void {\b CheckSleepingSynapses} (){\bkmkstart AAAAAAAADJ} +{\bkmkend AAAAAAAADJ} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b ActivatorLinear} (float3 input){\bkmkstart AAAAAAAADK} +{\bkmkend AAAAAAAADK} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b ActivatorLinear} (Vector3 input){\bkmkstart AAAAAAAADL} +{\bkmkend AAAAAAAADL} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b ActivatorSqrt} (float3 input){\bkmkstart AAAAAAAADM} +{\bkmkend AAAAAAAADM} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b ActivatorSqrt} (Vector3 input){\bkmkstart AAAAAAAADN} +{\bkmkend AAAAAAAADN} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b ActivatorPower} (float3 input){\bkmkstart AAAAAAAADO} +{\bkmkend AAAAAAAADO} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b ActivatorPower} (Vector3 input){\bkmkstart AAAAAAAADP} +{\bkmkend AAAAAAAADP} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b ActivatorReciprocal} (float3 input){\bkmkstart AAAAAAAADQ} +{\bkmkend AAAAAAAADQ} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b ActivatorReciprocal} (Vector3 input){\bkmkstart AAAAAAAADR} +{\bkmkend AAAAAAAADR} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b ActivatorTanh} (float3 input){\bkmkstart AAAAAAAADS} +{\bkmkend AAAAAAAADS} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b ActivatorBinary} (float3 input){\bkmkstart AAAAAAAADT} +{\bkmkend AAAAAAAADT} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b ActivatorNormalized} (float3 input){\bkmkstart AAAAAAAADU} +{\bkmkend AAAAAAAADU} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b ActivatorCustom} (float3 input){\bkmkstart AAAAAAAADV} +{\bkmkend AAAAAAAADV} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b ActivatorCustom} (Vector3 input){\bkmkstart AAAAAAAADW} +{\bkmkend AAAAAAAADW} +\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Protected Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b _outputValue}{\bkmkstart AAAAAAAADX} +{\bkmkend AAAAAAAADX} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b _outputValue}{\bkmkstart AAAAAAAADY} +{\bkmkend AAAAAAAADY} +\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Properties\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +override bool {\b isSleeping}{\f2 [get]}{\bkmkstart AAAAAAAADZ} +{\bkmkend AAAAAAAADZ} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}} + > {\b synapses}{\f2 [get]}{\bkmkstart AAAAAAAAEA} +{\bkmkend AAAAAAAAEA} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The synapses of the nucleus. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACF" }{}}{\fldrslt {\cs37\ul\cf2 ActivationType}}} + {\b curvePreset}{\f2 [get, set]}{\bkmkstart AAAAAAAAEB} +{\bkmkend AAAAAAAAEB} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +virtual float3 {\b outputValue}{\f2 [get, set]}{\bkmkstart AAAAAAAAEC} +{\bkmkend AAAAAAAAEC} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +virtual Vector3 {\b outputValue}{\f2 [get, set]}{\bkmkstart AAAAAAAAED} +{\bkmkend AAAAAAAAED} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float {\b outputMagnitude}{\f2 [get]}{\bkmkstart AAAAAAAAEE} +{\bkmkend AAAAAAAAEE} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float {\b outputSqrMagnitude}{\f2 [get]}{\bkmkstart AAAAAAAAEF} +{\bkmkend AAAAAAAAEF} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +bool {\b isFiring}{\f2 [get]}{\bkmkstart AAAAAAAAEG} +{\bkmkend AAAAAAAAEG} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Func< float3 > {\b Combinator}{\f2 [get]}{\bkmkstart AAAAAAAAEH} +{\bkmkend AAAAAAAAEH} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Func< Vector3 > {\b Combinator}{\f2 [get]}{\bkmkstart AAAAAAAAEI} +{\bkmkend AAAAAAAAEI} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Func< float3, float3 > {\b Activator}{\f2 [get]}{\bkmkstart AAAAAAAAEJ} +{\bkmkend AAAAAAAAEJ} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Func< Vector3, Vector3 > {\b Activator}{\f2 [get]}{\bkmkstart AAAAAAAAEK} +{\bkmkend AAAAAAAAEK} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +virtual List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + > {\b receivers}{\f2 [get, set]}{\bkmkstart AAAAAAAAEL} +{\bkmkend AAAAAAAAEL} +\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Enumeration Documentation\par +\pard\plain +{\xe \v CombinatorType\:NanoBrain.MemoryCell} +{\xe \v NanoBrain.MemoryCell\:CombinatorType} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACC" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Neuron.CombinatorType}}} +{\f2 [inherited]}}} +\par +{\bkmkstart AAAAAAAACC} +{\bkmkend AAAAAAAACC} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The type of combinators. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +A combinator combines the weighted values of the synapses to a single value \par +}{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Enumerator:\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{\xe \v Sum\:NanoBrain.MemoryCell} +{\xe \v NanoBrain.MemoryCell\:Sum} +{\qr Sum{\bkmkstart AAAAAAAACD} +{\bkmkend AAAAAAAACD} +\cell }{{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Add the weighted values together. \par +}\cell }{\row } +{\xe \v Product\:NanoBrain.MemoryCell} +{\xe \v NanoBrain.MemoryCell\:Product} +{\qr Product{\bkmkstart AAAAAAAACE} +{\bkmkend AAAAAAAACE} +\cell }{{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Multiply the weighted values. \par +}\cell }{\row } +} +} +{\xe \v Type\:NanoBrain.MemoryCell} +{\xe \v NanoBrain.MemoryCell\:Type} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAP" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Nucleus.Type}}} +{\f2 [inherited]}}} +\par +{\bkmkstart AAAAAAAAAP} +{\bkmkend AAAAAAAAAP} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Function to clone a nucleus to a Cluster prefab. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i prefab} \cell }{\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +\par +}}The types of Nucleus \par +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Function Documentation\par +\pard\plain +{\xe \v UpdateNuclei\:NanoBrain.MemoryCell} +{\xe \v NanoBrain.MemoryCell\:UpdateNuclei} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +override void NanoBrain.MemoryCell.UpdateNuclei (){\f2 [virtual]}}} +\par +{\bkmkstart AAAAAAAABX} +{\bkmkend AAAAAAAABX} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Update the state and recursively all Nuclei receiving data from this Nucleus. }}\par +{ +Reimplemented from {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABK" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Nucleus}}} +.}\par +} +{\xe \v AddSynapse\:NanoBrain.MemoryCell} +{\xe \v NanoBrain.MemoryCell\:AddSynapse} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}} + NanoBrain.Neuron.AddSynapse ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} + {\i sendingNucleus}, float {\i weight} = {\f2 1}){\f2 [inherited]}}} +\par +{\bkmkstart AAAAAAAACJ} +{\bkmkend AAAAAAAACJ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Add a new synapse to this nuclues. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i sendingNucleus} \cell }{The nucleus from which the signals may originate\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i weight} \cell }{The weight applied to the input. Default value = 1\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +The created Synapse\par +}}This will add a new input to this nucleus with the given weight. \par +}} +{\xe \v GetSynapse\:NanoBrain.MemoryCell} +{\xe \v NanoBrain.MemoryCell\:GetSynapse} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}} + NanoBrain.Neuron.GetSynapse ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + {\i sender}){\f2 [inherited]}}} +\par +{\bkmkstart AAAAAAAACK} +{\bkmkend AAAAAAAACK} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Find a synapse. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i sender} \cell }{The sender of the input to the Synapse\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +The found Synapse or null when the sender has no synapse to this nucleus.\par +}}}} +{\xe \v RemoveSynapse\:NanoBrain.MemoryCell} +{\xe \v NanoBrain.MemoryCell\:RemoveSynapse} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +void NanoBrain.Neuron.RemoveSynapse ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + {\i sendingNucleus}){\f2 [inherited]}}} +\par +{\bkmkstart AAAAAAAACL} +{\bkmkend AAAAAAAACL} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Remove a synapse from a Nucleus. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i sendingNucleus} \cell }{Remote the synapse connecting to this Nucleus\cell } +{\row } +} +}} +{\xe \v SetBias\:NanoBrain.MemoryCell} +{\xe \v NanoBrain.MemoryCell\:SetBias} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +virtual void NanoBrain.Neuron.SetBias (Vector3 {\i inputValue}){\f2 [virtual]}, {\f2 [inherited]}}} +\par +{\bkmkstart AAAAAAAACM} +{\bkmkend AAAAAAAACM} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i inputValue} \cell }{\cell } +{\row } +} +}} +{\xe \v ProcessStimulus\:NanoBrain.MemoryCell} +{\xe \v NanoBrain.MemoryCell\:ProcessStimulus} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +virtual void NanoBrain.Neuron.ProcessStimulus (Vector3 {\i inputValue}){\f2 [virtual]}, {\f2 [inherited]}}} +\par +{\bkmkstart AAAAAAAACW} +{\bkmkend AAAAAAAACW} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Process an external stimulus. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i inputValue} \cell }{The value of the stimulus\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i thingId} \cell }{The id of the thing causing the stimulus\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i thingName} \cell }{The name of the thing causing the stimulus\cell } +{\row } +} +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Data Documentation\par +\pard\plain +{\xe \v bias\:NanoBrain.MemoryCell} +{\xe \v NanoBrain.MemoryCell\:bias} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +Vector3 NanoBrain.Neuron.bias = Vector3.zero{\f2 [inherited]}}} +\par +{\bkmkstart AAAAAAAACZ} +{\bkmkend AAAAAAAACZ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Create a new Neuron in a Cluster Prefab. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i prefab} \cell }{The Cluster Preafb in which the new Neuron should be created\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i name} \cell }{The name of the new Neuron\cell } +{\row } +} +The bias\par +The bias which a value which is always added to the combined value of the neuron It does not have a synapse and therefore no weight of source nucleus \par +}} +{\xe \v parent\:NanoBrain.MemoryCell} +{\xe \v NanoBrain.MemoryCell\:parent} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + NanoBrain.Nucleus.parent{\f2 [inherited]}}} +\par +{\bkmkstart AAAAAAAAAS} +{\bkmkend AAAAAAAAAS} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The cluster prefab in which the nucleus is located. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The cluster instance in which the nucleus is located \par +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/MemoryCell.cs\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +NanoBrain.Neuron Class Reference\par \pard\plain +{\tc\tcl2 \v NanoBrain.Neuron} +{\xe \v NanoBrain.Neuron} +{\bkmkstart AAAAAAAAAJ} +{\bkmkend AAAAAAAAAJ} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Description\par +\pard\plain +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +A neuron is a basic Nucleus. \par +}} +Inheritance diagram for NanoBrain.Neuron:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "class_nano_brain_1_1_neuron.png" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Types\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACC" }{}}{\fldrslt {\cs37\ul\cf2 CombinatorType}}} + \{ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACD" }{}}{\fldrslt {\cs37\ul\cf2 Sum}}} + +, {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACE" }{}}{\fldrslt {\cs37\ul\cf2 Product}}} + + \}\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The type of combinators. }}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACF" }{}}{\fldrslt {\cs37\ul\cf2 ActivationType}}} + \{ {\b Linear} +, {\b Power} +, {\b Sqrt} +, {\b Reciprocal} +, {\b Tanh} +, {\b Binary} +, {\b Normalized} +, {\b Custom} + \}{\bkmkstart AAAAAAAACF} +{\bkmkend AAAAAAAACF} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The type of. }}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAP" }{}}{\fldrslt {\cs37\ul\cf2 Type}}} + \{ {\b None} +, {\b Neuron} +, {\b MemoryCell} +, {\b Cluster} + \}\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Function to clone a nucleus to a Cluster prefab. }}\par} +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAEM" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} + ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}} +, string {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABR" }{}}{\fldrslt {\cs37\ul\cf2 name}}} +)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Create a new Neuron in a Cluster instance. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}} + {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACJ" }{}}{\fldrslt {\cs37\ul\cf2 AddSynapse}}} + ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} + sendingNucleus, float weight=1)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Add a new synapse to this nuclues. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}} + {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACK" }{}}{\fldrslt {\cs37\ul\cf2 GetSynapse}}} + ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + sender)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Find a synapse. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACL" }{}}{\fldrslt {\cs37\ul\cf2 RemoveSynapse}}} + ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + sendingNucleus)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Remove a synapse from a Nucleus. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +virtual void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACM" }{}}{\fldrslt {\cs37\ul\cf2 SetBias}}} + (Vector3 inputValue)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +AnimationCurve {\b GenerateCurve} (){\bkmkstart AAAAAAAACN} +{\bkmkend AAAAAAAACN} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +void {\b SleepCheck} (){\bkmkstart AAAAAAAACO} +{\bkmkend AAAAAAAACO} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +override {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAEN" }{}}{\fldrslt {\cs37\ul\cf2 ShallowCloneTo}}} + ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + newParent)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Toggle for printing debugging trace data. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +override void {\b UpdateStateIsolated} (){\bkmkstart AAAAAAAAEO} +{\bkmkend AAAAAAAAEO} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b CombinatorSum} (){\bkmkstart AAAAAAAACP} +{\bkmkend AAAAAAAACP} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b CombinatorProduct} (){\bkmkstart AAAAAAAACR} +{\bkmkend AAAAAAAACR} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b CombinatorSum} (){\bkmkstart AAAAAAAACQ} +{\bkmkend AAAAAAAACQ} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b CombinatorProduct} (){\bkmkstart AAAAAAAACS} +{\bkmkend AAAAAAAACS} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b CombinatorMax} (){\bkmkstart AAAAAAAACT} +{\bkmkend AAAAAAAACT} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +virtual void {\b AddReceiver} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + receiverToAdd, float weight=1){\bkmkstart AAAAAAAACU} +{\bkmkend AAAAAAAACU} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +virtual void {\b RemoveReceiver} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + receiverToRemove){\bkmkstart AAAAAAAACV} +{\bkmkend AAAAAAAACV} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +virtual void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACW" }{}}{\fldrslt {\cs37\ul\cf2 ProcessStimulus}}} + (Vector3 inputValue)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Process an external stimulus. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +virtual void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABK" }{}}{\fldrslt {\cs37\ul\cf2 UpdateNuclei}}} + ()\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Update the state and recursively all Nuclei receiving data from this Nucleus. }{ +}\par +}\par} +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Static Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +static void {\b Delete} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + nucleus){\bkmkstart AAAAAAAACX} +{\bkmkend AAAAAAAACX} +\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Vector3 {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACZ" }{}}{\fldrslt {\cs37\ul\cf2 bias}}} + = Vector3.zero\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Create a new Neuron in a Cluster Prefab. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACC" }{}}{\fldrslt {\cs37\ul\cf2 CombinatorType}}} + {\b combinator} = {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACD" }{}}{\fldrslt {\cs37\ul\cf2 CombinatorType.Sum}}} +{\bkmkstart AAAAAAAADA} +{\bkmkend AAAAAAAADA} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The type of combinator used for this Neuron. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACF" }{}}{\fldrslt {\cs37\ul\cf2 ActivationType}}} + {\b _curvePreset}{\bkmkstart AAAAAAAADB} +{\bkmkend AAAAAAAADB} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +AnimationCurve {\b curve}{\bkmkstart AAAAAAAADC} +{\bkmkend AAAAAAAADC} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float {\b curveMax} = 1.0f{\bkmkstart AAAAAAAADD} +{\bkmkend AAAAAAAADD} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Action {\b WhenFiring}{\bkmkstart AAAAAAAADE} +{\bkmkend AAAAAAAADE} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +bool {\b persistOutput} = false{\bkmkstart AAAAAAAADF} +{\bkmkend AAAAAAAADF} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float {\b lastUpdate} = 0{\bkmkstart AAAAAAAADG} +{\bkmkend AAAAAAAADG} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Toggle for printing debugging trace data. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +readonly float {\b timeToSleep} = 1f{\bkmkstart AAAAAAAADH} +{\bkmkend AAAAAAAADH} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +string {\b name}{\bkmkstart AAAAAAAABR} +{\bkmkend AAAAAAAABR} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The name of the Nucleus. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The cluster prefab in which the nucleus is located. }{ +}\par +}\par} +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Protected Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +virtual void {\b CloneFields} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} + clone){\bkmkstart AAAAAAAADI} +{\bkmkend AAAAAAAADI} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +void {\b CheckSleepingSynapses} (){\bkmkstart AAAAAAAADJ} +{\bkmkend AAAAAAAADJ} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b ActivatorLinear} (float3 input){\bkmkstart AAAAAAAADK} +{\bkmkend AAAAAAAADK} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b ActivatorSqrt} (float3 input){\bkmkstart AAAAAAAADM} +{\bkmkend AAAAAAAADM} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b ActivatorPower} (float3 input){\bkmkstart AAAAAAAADO} +{\bkmkend AAAAAAAADO} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b ActivatorReciprocal} (float3 input){\bkmkstart AAAAAAAADQ} +{\bkmkend AAAAAAAADQ} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b ActivatorTanh} (float3 input){\bkmkstart AAAAAAAADS} +{\bkmkend AAAAAAAADS} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b ActivatorBinary} (float3 input){\bkmkstart AAAAAAAADT} +{\bkmkend AAAAAAAADT} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b ActivatorNormalized} (float3 input){\bkmkstart AAAAAAAADU} +{\bkmkend AAAAAAAADU} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b ActivatorCustom} (float3 input){\bkmkstart AAAAAAAADV} +{\bkmkend AAAAAAAADV} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b ActivatorLinear} (Vector3 input){\bkmkstart AAAAAAAADL} +{\bkmkend AAAAAAAADL} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b ActivatorSqrt} (Vector3 input){\bkmkstart AAAAAAAADN} +{\bkmkend AAAAAAAADN} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b ActivatorPower} (Vector3 input){\bkmkstart AAAAAAAADP} +{\bkmkend AAAAAAAADP} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b ActivatorReciprocal} (Vector3 input){\bkmkstart AAAAAAAADR} +{\bkmkend AAAAAAAADR} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b ActivatorCustom} (Vector3 input){\bkmkstart AAAAAAAADW} +{\bkmkend AAAAAAAADW} +\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Protected Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float3 {\b _outputValue}{\bkmkstart AAAAAAAADX} +{\bkmkend AAAAAAAADX} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Vector3 {\b _outputValue}{\bkmkstart AAAAAAAADY} +{\bkmkend AAAAAAAADY} +\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Properties\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}} + > {\b synapses}{\f2 [get]}{\bkmkstart AAAAAAAAEA} +{\bkmkend AAAAAAAAEA} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The synapses of the nucleus. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACF" }{}}{\fldrslt {\cs37\ul\cf2 ActivationType}}} + {\b curvePreset}{\f2 [get, set]}{\bkmkstart AAAAAAAAEB} +{\bkmkend AAAAAAAAEB} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +virtual float3 {\b outputValue}{\f2 [get, set]}{\bkmkstart AAAAAAAAEC} +{\bkmkend AAAAAAAAEC} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float {\b outputMagnitude}{\f2 [get]}{\bkmkstart AAAAAAAAEE} +{\bkmkend AAAAAAAAEE} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float {\b outputSqrMagnitude}{\f2 [get]}{\bkmkstart AAAAAAAAEF} +{\bkmkend AAAAAAAAEF} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +virtual Vector3 {\b outputValue}{\f2 [get, set]}{\bkmkstart AAAAAAAAED} +{\bkmkend AAAAAAAAED} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +bool {\b isFiring}{\f2 [get]}{\bkmkstart AAAAAAAAEG} +{\bkmkend AAAAAAAAEG} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +virtual bool {\b isSleeping}{\f2 [get]}{\bkmkstart AAAAAAAAEP} +{\bkmkend AAAAAAAAEP} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Func< float3 > {\b Combinator}{\f2 [get]}{\bkmkstart AAAAAAAAEH} +{\bkmkend AAAAAAAAEH} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Func< Vector3 > {\b Combinator}{\f2 [get]}{\bkmkstart AAAAAAAAEI} +{\bkmkend AAAAAAAAEI} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Func< float3, float3 > {\b Activator}{\f2 [get]}{\bkmkstart AAAAAAAAEJ} +{\bkmkend AAAAAAAAEJ} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +Func< Vector3, Vector3 > {\b Activator}{\f2 [get]}{\bkmkstart AAAAAAAAEK} +{\bkmkend AAAAAAAAEK} +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +virtual List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + > {\b receivers}{\f2 [get, set]}{\bkmkstart AAAAAAAAEL} +{\bkmkend AAAAAAAAEL} +\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Enumeration Documentation\par +\pard\plain +{\xe \v CombinatorType\:NanoBrain.Neuron} +{\xe \v NanoBrain.Neuron\:CombinatorType} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACC" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Neuron.CombinatorType}}} +}} +\par +{\bkmkstart AAAAAAAACC} +{\bkmkend AAAAAAAACC} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The type of combinators. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +A combinator combines the weighted values of the synapses to a single value \par +}{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Enumerator:\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{\xe \v Sum\:NanoBrain.Neuron} +{\xe \v NanoBrain.Neuron\:Sum} +{\qr Sum{\bkmkstart AAAAAAAACD} +{\bkmkend AAAAAAAACD} +\cell }{{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Add the weighted values together. \par +}\cell }{\row } +{\xe \v Product\:NanoBrain.Neuron} +{\xe \v NanoBrain.Neuron\:Product} +{\qr Product{\bkmkstart AAAAAAAACE} +{\bkmkend AAAAAAAACE} +\cell }{{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Multiply the weighted values. \par +}\cell }{\row } +} +} +{\xe \v Type\:NanoBrain.Neuron} +{\xe \v NanoBrain.Neuron\:Type} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAP" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Nucleus.Type}}} +{\f2 [inherited]}}} +\par +{\bkmkstart AAAAAAAAAP} +{\bkmkend AAAAAAAAAP} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Function to clone a nucleus to a Cluster prefab. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i prefab} \cell }{\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +\par +}}The types of Nucleus \par +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Constructor & Destructor Documentation\par +\pard\plain +{\xe \v Neuron\:NanoBrain.Neuron} +{\xe \v NanoBrain.Neuron\:Neuron} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +NanoBrain.Neuron.Neuron ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + {\i parent}, string {\i name})}} +\par +{\bkmkstart AAAAAAAAEM} +{\bkmkend AAAAAAAAEM} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Create a new Neuron in a Cluster instance. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i parent} \cell }{The parent cluster in which the new Neuron should be created\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i name} \cell }{The name of the new Neuron\cell } +{\row } +} +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Function Documentation\par +\pard\plain +{\xe \v AddSynapse\:NanoBrain.Neuron} +{\xe \v NanoBrain.Neuron\:AddSynapse} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}} + NanoBrain.Neuron.AddSynapse ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} + {\i sendingNucleus}, float {\i weight} = {\f2 1})}} +\par +{\bkmkstart AAAAAAAACJ} +{\bkmkend AAAAAAAACJ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Add a new synapse to this nuclues. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i sendingNucleus} \cell }{The nucleus from which the signals may originate\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i weight} \cell }{The weight applied to the input. Default value = 1\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +The created Synapse\par +}}This will add a new input to this nucleus with the given weight. \par +}} +{\xe \v GetSynapse\:NanoBrain.Neuron} +{\xe \v NanoBrain.Neuron\:GetSynapse} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}} + NanoBrain.Neuron.GetSynapse ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + {\i sender})}} +\par +{\bkmkstart AAAAAAAACK} +{\bkmkend AAAAAAAACK} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Find a synapse. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i sender} \cell }{The sender of the input to the Synapse\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +The found Synapse or null when the sender has no synapse to this nucleus.\par +}}}} +{\xe \v RemoveSynapse\:NanoBrain.Neuron} +{\xe \v NanoBrain.Neuron\:RemoveSynapse} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +void NanoBrain.Neuron.RemoveSynapse ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + {\i sendingNucleus})}} +\par +{\bkmkstart AAAAAAAACL} +{\bkmkend AAAAAAAACL} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Remove a synapse from a Nucleus. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i sendingNucleus} \cell }{Remote the synapse connecting to this Nucleus\cell } +{\row } +} +}} +{\xe \v SetBias\:NanoBrain.Neuron} +{\xe \v NanoBrain.Neuron\:SetBias} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +virtual void NanoBrain.Neuron.SetBias (Vector3 {\i inputValue}){\f2 [virtual]}}} +\par +{\bkmkstart AAAAAAAACM} +{\bkmkend AAAAAAAACM} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i inputValue} \cell }{\cell } +{\row } +} +}} +{\xe \v ShallowCloneTo\:NanoBrain.Neuron} +{\xe \v NanoBrain.Neuron\:ShallowCloneTo} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +override {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + NanoBrain.Neuron.ShallowCloneTo ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + {\i newParent})}} +\par +{\bkmkstart AAAAAAAAEN} +{\bkmkend AAAAAAAAEN} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Toggle for printing debugging trace data. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Function to make a partial clone of this nucleus\par +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i parent} \cell }{The cluster in which the cloned nucleus should be placed\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +\par +}}}} +{\xe \v ProcessStimulus\:NanoBrain.Neuron} +{\xe \v NanoBrain.Neuron\:ProcessStimulus} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +virtual void NanoBrain.Neuron.ProcessStimulus (Vector3 {\i inputValue}){\f2 [virtual]}}} +\par +{\bkmkstart AAAAAAAACW} +{\bkmkend AAAAAAAACW} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Process an external stimulus. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i inputValue} \cell }{The value of the stimulus\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i thingId} \cell }{The id of the thing causing the stimulus\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i thingName} \cell }{The name of the thing causing the stimulus\cell } +{\row } +} +}} +{\xe \v UpdateNuclei\:NanoBrain.Neuron} +{\xe \v NanoBrain.Neuron\:UpdateNuclei} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +virtual void NanoBrain.Nucleus.UpdateNuclei (){\f2 [virtual]}, {\f2 [inherited]}}} +\par +{\bkmkstart AAAAAAAABK} +{\bkmkend AAAAAAAABK} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Update the state and recursively all Nuclei receiving data from this Nucleus. }}\par +{ +Reimplemented in {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABX" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.MemoryCell}}} +.}\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Data Documentation\par +\pard\plain +{\xe \v bias\:NanoBrain.Neuron} +{\xe \v NanoBrain.Neuron\:bias} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +Vector3 NanoBrain.Neuron.bias = Vector3.zero}} +\par +{\bkmkstart AAAAAAAACZ} +{\bkmkend AAAAAAAACZ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Create a new Neuron in a Cluster Prefab. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i prefab} \cell }{The Cluster Preafb in which the new Neuron should be created\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i name} \cell }{The name of the new Neuron\cell } +{\row } +} +The bias\par +The bias which a value which is always added to the combined value of the neuron It does not have a synapse and therefore no weight of source nucleus \par +}} +{\xe \v parent\:NanoBrain.Neuron} +{\xe \v NanoBrain.Neuron\:parent} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + NanoBrain.Nucleus.parent{\f2 [inherited]}}} +\par +{\bkmkstart AAAAAAAAAS} +{\bkmkend AAAAAAAAAS} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The cluster prefab in which the nucleus is located. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The cluster instance in which the nucleus is located \par +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +NanoBrain.Nucleus Class Reference\par \pard\plain +{\tc\tcl2 \v NanoBrain.Nucleus} +{\xe \v NanoBrain.Nucleus} +{\bkmkstart AAAAAAAAAK} +{\bkmkend AAAAAAAAAK} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Description\par +\pard\plain +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +A Nucleus is a basic element in a brain cluster. \par +}} +Inheritance diagram for NanoBrain.Nucleus:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "class_nano_brain_1_1_nucleus.png" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Types\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAP" }{}}{\fldrslt {\cs37\ul\cf2 Type}}} + \{ {\b None} +, {\b Neuron} +, {\b MemoryCell} +, {\b Cluster} + \}\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Function to clone a nucleus to a Cluster prefab. }}\par} +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAEQ" }{}}{\fldrslt {\cs37\ul\cf2 ShallowCloneTo}}} + ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}} +)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Toggle for printing debugging trace data. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +void {\b UpdateStateIsolated} (){\bkmkstart AAAAAAAAER} +{\bkmkend AAAAAAAAER} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Update the state without updating other Nuclei. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +virtual void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABK" }{}}{\fldrslt {\cs37\ul\cf2 UpdateNuclei}}} + ()\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Update the state and recursively all Nuclei receiving data from this Nucleus. }{ +}\par +}\par} +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +string {\b name}{\bkmkstart AAAAAAAABR} +{\bkmkend AAAAAAAABR} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The name of the Nucleus. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The cluster prefab in which the nucleus is located. }{ +}\par +}\par} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Enumeration Documentation\par +\pard\plain +{\xe \v Type\:NanoBrain.Nucleus} +{\xe \v NanoBrain.Nucleus\:Type} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAP" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Nucleus.Type}}} +}} +\par +{\bkmkstart AAAAAAAAAP} +{\bkmkend AAAAAAAAAP} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Function to clone a nucleus to a Cluster prefab. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i prefab} \cell }{\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +\par +}}The types of Nucleus \par +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Function Documentation\par +\pard\plain +{\xe \v ShallowCloneTo\:NanoBrain.Nucleus} +{\xe \v NanoBrain.Nucleus\:ShallowCloneTo} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}} + NanoBrain.Nucleus.ShallowCloneTo ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + {\i parent}){\f2 [abstract]}}} +\par +{\bkmkstart AAAAAAAAEQ} +{\bkmkend AAAAAAAAEQ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Toggle for printing debugging trace data. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Function to make a partial clone of this nucleus\par +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i parent} \cell }{The cluster in which the cloned nucleus should be placed\cell } +{\row } +} +{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30 +\par +}}}} +{\xe \v UpdateNuclei\:NanoBrain.Nucleus} +{\xe \v NanoBrain.Nucleus\:UpdateNuclei} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +virtual void NanoBrain.Nucleus.UpdateNuclei (){\f2 [virtual]}}} +\par +{\bkmkstart AAAAAAAABK} +{\bkmkend AAAAAAAABK} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Update the state and recursively all Nuclei receiving data from this Nucleus. }}\par +{ +Reimplemented in {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABX" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.MemoryCell}}} +.}\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Data Documentation\par +\pard\plain +{\xe \v parent\:NanoBrain.Nucleus} +{\xe \v NanoBrain.Nucleus\:parent} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}} + NanoBrain.Nucleus.parent}} +\par +{\bkmkstart AAAAAAAAAS} +{\bkmkend AAAAAAAAAS} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The cluster prefab in which the nucleus is located. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The cluster instance in which the nucleus is located \par +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Nucleus.cs\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +NanoBrain.Synapse Class Reference\par \pard\plain +{\tc\tcl2 \v NanoBrain.Synapse} +{\xe \v NanoBrain.Synapse} +{\bkmkstart AAAAAAAAAL} +{\bkmkend AAAAAAAAAL} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Description\par +\pard\plain +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +A Synapse connects the ouput of a Neuron to another Neuron. \par +}} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAES" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}} + ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} + nucleus, float {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAET" }{}}{\fldrslt {\cs37\ul\cf2 weight}}} +=1.0f)\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Create a new Synapse. }{ +}\par +}\par} +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} + {\b neuron}{\bkmkstart AAAAAAAAEU} +{\bkmkend AAAAAAAAEU} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The neuron from which input is received. }{ +}\par +}\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +float {\b weight}{\bkmkstart AAAAAAAAET} +{\bkmkend AAAAAAAAET} +\par +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The weight value to apply to the Neuron input. }{ +}\par +}\par} +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Properties\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid + +bool {\b isSleeping}{\f2 [get]}{\bkmkstart AAAAAAAAEV} +{\bkmkend AAAAAAAAEV} +\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Constructor & Destructor Documentation\par +\pard\plain +{\xe \v Synapse\:NanoBrain.Synapse} +{\xe \v NanoBrain.Synapse\:Synapse} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +NanoBrain.Synapse.Synapse ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}} + {\i nucleus}, float {\i weight} = {\f2 1::0f})}} +\par +{\bkmkstart AAAAAAAAES} +{\bkmkend AAAAAAAAES} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +Create a new Synapse. }}\par +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{\par +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Parameters\par} +\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i nucleus} \cell }{The neuron from which input is received\cell } +{\row } +\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187 +\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748 +\pard \widctlpar\intbl\adjustright +{{\i weight} \cell }{The weight value to apply to the Neuron input\cell } +{\row } +} +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Synapse.cs\par +} +\pard\plain \sect\sbkpage +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid Index\par +\pard\plain +{\tc \v Index} +{\field\fldedit {\*\fldinst INDEX \\c2 \\*MERGEFORMAT}{\fldrslt INDEX}} +} diff --git a/Documentation/html/rtf/refman.rtf.meta b/Documentation/html/rtf/refman.rtf.meta new file mode 100644 index 0000000..0324b15 --- /dev/null +++ b/Documentation/html/rtf/refman.rtf.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f9796692d8cde808d97648616b2bb072 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/LinearAlgebra/test.meta b/Documentation/html/search.meta similarity index 77% rename from LinearAlgebra/test.meta rename to Documentation/html/search.meta index 7b069c9..d7cc1d3 100644 --- a/LinearAlgebra/test.meta +++ b/Documentation/html/search.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9b84f664459d02b90894e460de42c219 +guid: 7a30cca37cad05ccf90f9d9f0537d338 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Documentation/html/search/all_0.js b/Documentation/html/search/all_0.js new file mode 100644 index 0000000..2ed4933 --- /dev/null +++ b/Documentation/html/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['_5foutputs_0',['_outputs',['../class_nano_brain_1_1_cluster.html#a15c5159667fe22edfc4889a955a9d293',1,'NanoBrain::Cluster']]] +]; diff --git a/Documentation/html/search/all_0.js.meta b/Documentation/html/search/all_0.js.meta new file mode 100644 index 0000000..13499de --- /dev/null +++ b/Documentation/html/search/all_0.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ba986b9d8b6fa739083b315a103fcddc +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_1.js b/Documentation/html/search/all_1.js new file mode 100644 index 0000000..2ab825f --- /dev/null +++ b/Documentation/html/search/all_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['activationtype_0',['ActivationType',['../class_nano_brain_1_1_neuron.html#ae558c02b00c776805c7fead42cb94612',1,'NanoBrain::Neuron']]], + ['addinstance_1',['addinstance',['../class_nano_brain_1_1_cluster.html#a01b55195c2f5be58659d9b0a5c993a8a',1,'NanoBrain.Cluster.AddInstance()'],['../class_nano_brain_1_1_cluster.html#a1b60bd296f757257a640559b732ed241',1,'NanoBrain.Cluster.AddInstance(ClusterPrefab prefab)']]], + ['addsynapse_2',['AddSynapse',['../class_nano_brain_1_1_neuron.html#a524fdd9e25ebbcb5baca60a942d6eb80',1,'NanoBrain::Neuron']]] +]; diff --git a/Documentation/html/search/all_1.js.meta b/Documentation/html/search/all_1.js.meta new file mode 100644 index 0000000..a51b53f --- /dev/null +++ b/Documentation/html/search/all_1.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0c0ca40a74d21c4eca9027cd81dac16f +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_10.js b/Documentation/html/search/all_10.js new file mode 100644 index 0000000..ca67916 --- /dev/null +++ b/Documentation/html/search/all_10.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['unity_0',['Nano Brain for Unity',['../index.html',1,'']]], + ['updatefromnucleus_1',['UpdateFromNucleus',['../class_nano_brain_1_1_cluster.html#ab2e33a3a6642d31b5a927c7ee2db73ab',1,'NanoBrain::Cluster']]], + ['updatenuclei_2',['updatenuclei',['../class_nano_brain_1_1_memory_cell.html#a780592351f670461286b8cd00ec42ebd',1,'NanoBrain.MemoryCell.UpdateNuclei()'],['../class_nano_brain_1_1_nucleus.html#a31e93d392a4a861b55f3d87f0a7d6d59',1,'NanoBrain.Nucleus.UpdateNuclei()']]], + ['updatestateisolated_3',['updatestateisolated',['../class_nano_brain_1_1_cluster.html#ac40b182a3c5f32ec055d7fabbeaedbf3',1,'NanoBrain.Cluster.UpdateStateIsolated()'],['../class_nano_brain_1_1_nucleus.html#aaf267af9b5ad1b5f0247f04ed2934f97',1,'NanoBrain.Nucleus.UpdateStateIsolated()']]], + ['updateweight_4',['UpdateWeight',['../class_nano_brain_1_1_brain.html#a552d2f938f63f3c0f1997174d9098334',1,'NanoBrain::Brain']]] +]; diff --git a/Documentation/html/search/all_10.js.meta b/Documentation/html/search/all_10.js.meta new file mode 100644 index 0000000..0b97ef8 --- /dev/null +++ b/Documentation/html/search/all_10.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bdf36a00d9180ede4acc591a361c2f2b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_11.js b/Documentation/html/search/all_11.js new file mode 100644 index 0000000..a7ec48d --- /dev/null +++ b/Documentation/html/search/all_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['weight_0',['weight',['../class_nano_brain_1_1_synapse.html#ada805a6cfeb40773ed963d24c7e6a496',1,'NanoBrain::Synapse']]] +]; diff --git a/Documentation/html/search/all_11.js.meta b/Documentation/html/search/all_11.js.meta new file mode 100644 index 0000000..559edbe --- /dev/null +++ b/Documentation/html/search/all_11.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1086b93868dfe9a6d98e5656b04c8b14 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_2.js b/Documentation/html/search/all_2.js new file mode 100644 index 0000000..8d6d131 --- /dev/null +++ b/Documentation/html/search/all_2.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['basename_0',['baseName',['../class_nano_brain_1_1_cluster.html#ad81aed306939c26d22043ca3a0cd71c4',1,'NanoBrain::Cluster']]], + ['bias_1',['bias',['../class_nano_brain_1_1_neuron.html#a37d7161e2012e95bf5d4d620c0f5c7fa',1,'NanoBrain::Neuron']]], + ['brain_2',['brain',['../class_nano_brain_1_1_brain.html',1,'NanoBrain.Brain'],['../class_nano_brain_1_1_brain.html#a9c34c8cba2339f23b6406c45ab8490a8',1,'NanoBrain.Brain.brain']]], + ['brain_20for_20unity_3',['Nano Brain for Unity',['../index.html',1,'']]], + ['brainprefab_4',['brainPrefab',['../class_nano_brain_1_1_brain.html#a47162765076efc24b85d9b892e876648',1,'NanoBrain::Brain']]] +]; diff --git a/Documentation/html/search/all_2.js.meta b/Documentation/html/search/all_2.js.meta new file mode 100644 index 0000000..fa632c9 --- /dev/null +++ b/Documentation/html/search/all_2.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: cd879de91045339aa880e4b4ccb981d8 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_3.js b/Documentation/html/search/all_3.js new file mode 100644 index 0000000..671f393 --- /dev/null +++ b/Documentation/html/search/all_3.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['cluster_0',['cluster',['../class_nano_brain_1_1_cluster.html',1,'NanoBrain.Cluster'],['../class_nano_brain_1_1_cluster.html#a86341cf5cc0d67a146a48e9c833df7ec',1,'NanoBrain.Cluster.Cluster(ClusterPrefab prefab, Cluster parent)'],['../class_nano_brain_1_1_cluster.html#a3a22ce2493a4d154fd971214b7c484d2',1,'NanoBrain.Cluster.Cluster(ClusterPrefab prefab, ClusterPrefab parent=null)']]], + ['clusterprefab_1',['ClusterPrefab',['../class_nano_brain_1_1_cluster_prefab.html',1,'NanoBrain']]], + ['collectreceivers_2',['CollectReceivers',['../class_nano_brain_1_1_cluster.html#ab067c159f399e69bcc9d2211bc9aa3c5',1,'NanoBrain::Cluster']]], + ['collectsynapsesto_3',['CollectSynapsesTo',['../class_nano_brain_1_1_cluster.html#a8736cab5b8381dc5a175fd03031d308e',1,'NanoBrain::Cluster']]], + ['combinator_4',['combinator',['../class_nano_brain_1_1_neuron.html#aa63477670ae3a6d667f44b500a250c86',1,'NanoBrain::Neuron']]], + ['combinatortype_5',['CombinatorType',['../class_nano_brain_1_1_neuron.html#ad7745cc584fbc2659d77c3202ee6adfe',1,'NanoBrain::Neuron']]], + ['computeorders_6',['computeOrders',['../class_nano_brain_1_1_cluster.html#af3bb2af13fc7fcb15e7610d4c81cb395',1,'NanoBrain::Cluster']]], + ['contents_7',['Table of Contents',['../index.html#autotoc_md1',1,'']]] +]; diff --git a/Documentation/html/search/all_3.js.meta b/Documentation/html/search/all_3.js.meta new file mode 100644 index 0000000..e2bc2d9 --- /dev/null +++ b/Documentation/html/search/all_3.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b2d0258dc79d2fbe09297c0df75b8499 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_4.js b/Documentation/html/search/all_4.js new file mode 100644 index 0000000..44e0d45 --- /dev/null +++ b/Documentation/html/search/all_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['defaultoutput_0',['defaultOutput',['../class_nano_brain_1_1_cluster.html#ac2d36a78d001fde5c95bc48f32e0fcc7',1,'NanoBrain::Cluster']]], + ['deletenucleus_1',['DeleteNucleus',['../class_nano_brain_1_1_cluster.html#a6b5855021a2733df3c25ed67e8777509',1,'NanoBrain::Cluster']]] +]; diff --git a/Documentation/html/search/all_4.js.meta b/Documentation/html/search/all_4.js.meta new file mode 100644 index 0000000..0b8b8f6 --- /dev/null +++ b/Documentation/html/search/all_4.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 828cb31da42df7ca78086c04da629fc9 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_5.js b/Documentation/html/search/all_5.js new file mode 100644 index 0000000..ca40bee --- /dev/null +++ b/Documentation/html/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['for_20unity_0',['Nano Brain for Unity',['../index.html',1,'']]] +]; diff --git a/Documentation/html/search/all_5.js.meta b/Documentation/html/search/all_5.js.meta new file mode 100644 index 0000000..ca9501b --- /dev/null +++ b/Documentation/html/search/all_5.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 297cc839b2ab331c2b8d585b16c4c10e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_6.js b/Documentation/html/search/all_6.js new file mode 100644 index 0000000..ed9f385 --- /dev/null +++ b/Documentation/html/search/all_6.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['getneuron_0',['getneuron',['../class_nano_brain_1_1_cluster.html#a938f7cc08d8fee459e0203e3b6869e06',1,'NanoBrain.Cluster.GetNeuron(string neuronName)'],['../class_nano_brain_1_1_cluster.html#a696fcbdd1ae684a7b55963d8e673b22f',1,'NanoBrain.Cluster.GetNeuron(int thingId, string neuronName, string thingName=null)']]], + ['getnucleus_1',['getnucleus',['../class_nano_brain_1_1_cluster.html#a31a62471a88a8180963be74227fd68be',1,'NanoBrain.Cluster.GetNucleus()'],['../class_nano_brain_1_1_cluster_prefab.html#a49601bf5ea05b4f28974a5c0a1345286',1,'NanoBrain.ClusterPrefab.GetNucleus()']]], + ['getnucleusindex_2',['getnucleusindex',['../class_nano_brain_1_1_cluster.html#aec242a8433041ed22dde2375436016ce',1,'NanoBrain.Cluster.GetNucleusIndex(List< Nucleus > nuclei, Nucleus nucleus)'],['../class_nano_brain_1_1_cluster.html#ad9441d41aa6e2bfd3f9acf111dde1dd8',1,'NanoBrain.Cluster.GetNucleusIndex(List< Nucleus > nuclei, string nucleusName)']]], + ['getsynapse_3',['GetSynapse',['../class_nano_brain_1_1_neuron.html#a1f3c83acf569fa483101fd0ce11ec5fc',1,'NanoBrain::Neuron']]] +]; diff --git a/Documentation/html/search/all_6.js.meta b/Documentation/html/search/all_6.js.meta new file mode 100644 index 0000000..6284903 --- /dev/null +++ b/Documentation/html/search/all_6.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7a7b95515c5b7e94380b832d1e19540d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_7.js b/Documentation/html/search/all_7.js new file mode 100644 index 0000000..ce085f0 --- /dev/null +++ b/Documentation/html/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['installation_0',['installation',['../md__installation.html',1,'Package Installation'],['../md__installation.html#autotoc_md0',1,'Samples Installation']]], + ['instancecount_1',['instanceCount',['../class_nano_brain_1_1_cluster.html#a5786c4f1f8387b7cb814ed159ddef040',1,'NanoBrain::Cluster']]], + ['instances_2',['instances',['../class_nano_brain_1_1_cluster.html#a9a2eb00412fb5cb200564a1261f3f313',1,'NanoBrain::Cluster']]] +]; diff --git a/Documentation/html/search/all_7.js.meta b/Documentation/html/search/all_7.js.meta new file mode 100644 index 0000000..8a7eb03 --- /dev/null +++ b/Documentation/html/search/all_7.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1c0e9780695344c75be2feb603079d79 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_8.js b/Documentation/html/search/all_8.js new file mode 100644 index 0000000..d98bdd6 --- /dev/null +++ b/Documentation/html/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['lastupdate_0',['lastUpdate',['../class_nano_brain_1_1_neuron.html#ad8697d6cbd7a2656e89a818b4cc75e97',1,'NanoBrain::Neuron']]] +]; diff --git a/Documentation/html/search/all_8.js.meta b/Documentation/html/search/all_8.js.meta new file mode 100644 index 0000000..2b783f9 --- /dev/null +++ b/Documentation/html/search/all_8.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2e5f1605df294dd04bb885f1fd02c534 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_9.js b/Documentation/html/search/all_9.js new file mode 100644 index 0000000..e9694e2 --- /dev/null +++ b/Documentation/html/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['memorycell_0',['MemoryCell',['../class_nano_brain_1_1_memory_cell.html',1,'NanoBrain']]] +]; diff --git a/Documentation/html/search/all_9.js.meta b/Documentation/html/search/all_9.js.meta new file mode 100644 index 0000000..a7d0362 --- /dev/null +++ b/Documentation/html/search/all_9.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3b30dcc1da93725b6930bfe6e0c830cc +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_a.js b/Documentation/html/search/all_a.js new file mode 100644 index 0000000..e4e1a64 --- /dev/null +++ b/Documentation/html/search/all_a.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['name_0',['name',['../class_nano_brain_1_1_nucleus.html#a35070f04a3fe08ec329b0f043bff0be2',1,'NanoBrain::Nucleus']]], + ['nano_20brain_20for_20unity_1',['Nano Brain for Unity',['../index.html',1,'']]], + ['nanobrain_2',['nanobrain',['../namespace_nano_brain.html',1,'NanoBrain'],['../md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html',1,'NanoBrain']]], + ['neuron_3',['neuron',['../class_nano_brain_1_1_neuron.html',1,'NanoBrain.Neuron'],['../class_nano_brain_1_1_synapse.html#ac5d9cb95be7cbc11c3321a8c430e7e5f',1,'NanoBrain.Synapse.neuron'],['../class_nano_brain_1_1_neuron.html#a54a94ea928e9a54552692e7d1e84782e',1,'NanoBrain.Neuron.Neuron()']]], + ['nuclei_4',['nuclei',['../class_nano_brain_1_1_cluster.html#a73e3b7e7a0ae623d1ac55dd442ca9d68',1,'NanoBrain::Cluster']]], + ['nucleus_5',['Nucleus',['../class_nano_brain_1_1_nucleus.html',1,'NanoBrain']]] +]; diff --git a/Documentation/html/search/all_a.js.meta b/Documentation/html/search/all_a.js.meta new file mode 100644 index 0000000..423d056 --- /dev/null +++ b/Documentation/html/search/all_a.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6aed7a8be4271c433b22292831da1225 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_b.js b/Documentation/html/search/all_b.js new file mode 100644 index 0000000..4d9240d --- /dev/null +++ b/Documentation/html/search/all_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['of_20contents_0',['Table of Contents',['../index.html#autotoc_md1',1,'']]], + ['outputs_1',['outputs',['../class_nano_brain_1_1_cluster.html#a89d8b00304b04025ae0446421363aa1f',1,'NanoBrain::Cluster']]] +]; diff --git a/Documentation/html/search/all_b.js.meta b/Documentation/html/search/all_b.js.meta new file mode 100644 index 0000000..49c75a5 --- /dev/null +++ b/Documentation/html/search/all_b.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f1b15f4ddc0599be7b07d08f0931b17a +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_c.js b/Documentation/html/search/all_c.js new file mode 100644 index 0000000..cab5f69 --- /dev/null +++ b/Documentation/html/search/all_c.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['package_20installation_0',['Package Installation',['../md__installation.html',1,'']]], + ['parent_1',['parent',['../class_nano_brain_1_1_nucleus.html#a0750e4d9ab80ff06bd58ffebca9d8c6d',1,'NanoBrain::Nucleus']]], + ['prefab_2',['prefab',['../class_nano_brain_1_1_cluster.html#a9a4c212d5247090d59489d3bb3d04c3d',1,'NanoBrain::Cluster']]], + ['processstimulus_3',['ProcessStimulus',['../class_nano_brain_1_1_neuron.html#a30c28f0ede8d4cba4e2937cade0e79e0',1,'NanoBrain::Neuron']]], + ['product_4',['Product',['../class_nano_brain_1_1_neuron.html#ad7745cc584fbc2659d77c3202ee6adfeadeb10517653c255364175796ace3553f',1,'NanoBrain::Neuron']]] +]; diff --git a/Documentation/html/search/all_c.js.meta b/Documentation/html/search/all_c.js.meta new file mode 100644 index 0000000..0c65a6c --- /dev/null +++ b/Documentation/html/search/all_c.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f89ca4bd315f47af2aaaf696c03b7961 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_d.js b/Documentation/html/search/all_d.js new file mode 100644 index 0000000..5b39ccf --- /dev/null +++ b/Documentation/html/search/all_d.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['refresh_0',['Refresh',['../class_nano_brain_1_1_cluster.html#a40ad7f93121a3684699c92bcb03b1c74',1,'NanoBrain::Cluster']]], + ['refreshcomputeorders_1',['RefreshComputeOrders',['../class_nano_brain_1_1_cluster.html#acff74557b8c50f2355898855f1ab6073',1,'NanoBrain::Cluster']]], + ['refreshoutputs_2',['RefreshOutputs',['../class_nano_brain_1_1_cluster.html#a209d8f083a5bd82ce764ee5ac7e9f97e',1,'NanoBrain::Cluster']]], + ['removeinstance_3',['RemoveInstance',['../class_nano_brain_1_1_cluster.html#a5454e0c01870e1c2df93b33f43704210',1,'NanoBrain::Cluster']]], + ['removesynapse_4',['RemoveSynapse',['../class_nano_brain_1_1_neuron.html#a2ae2b960608803beabade55d2c830088',1,'NanoBrain::Neuron']]] +]; diff --git a/Documentation/html/search/all_d.js.meta b/Documentation/html/search/all_d.js.meta new file mode 100644 index 0000000..6627451 --- /dev/null +++ b/Documentation/html/search/all_d.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0e60c1b9df4ad96c6b837b2df3ef3197 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_e.js b/Documentation/html/search/all_e.js new file mode 100644 index 0000000..0e99acb --- /dev/null +++ b/Documentation/html/search/all_e.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['samples_20installation_0',['Samples Installation',['../md__installation.html#autotoc_md0',1,'']]], + ['setbias_1',['SetBias',['../class_nano_brain_1_1_neuron.html#a407e9fca0108715d6031ea4f2ae1005d',1,'NanoBrain::Neuron']]], + ['shallowcloneto_2',['shallowcloneto',['../class_nano_brain_1_1_cluster.html#a7ecc2afa858940901336663b435f8fb2',1,'NanoBrain.Cluster.ShallowCloneTo()'],['../class_nano_brain_1_1_neuron.html#afe95b6470ef7689253514229d02fe2b9',1,'NanoBrain.Neuron.ShallowCloneTo()'],['../class_nano_brain_1_1_nucleus.html#a4bb93cd4cd07072f35eae3a98ba5dde8',1,'NanoBrain.Nucleus.ShallowCloneTo()']]], + ['sum_3',['Sum',['../class_nano_brain_1_1_neuron.html#ad7745cc584fbc2659d77c3202ee6adfeaa0ec87054b5e5b7847d0d8780a01a3d5',1,'NanoBrain::Neuron']]], + ['synapse_4',['synapse',['../class_nano_brain_1_1_synapse.html',1,'NanoBrain.Synapse'],['../class_nano_brain_1_1_synapse.html#a63a57254f76939b6a7bbbeb630f839d2',1,'NanoBrain.Synapse.Synapse()']]], + ['synapses_5',['synapses',['../class_nano_brain_1_1_neuron.html#a96a7f4b8480a8fa9fce1d698a41e4dc7',1,'NanoBrain::Neuron']]] +]; diff --git a/Documentation/html/search/all_e.js.meta b/Documentation/html/search/all_e.js.meta new file mode 100644 index 0000000..4635491 --- /dev/null +++ b/Documentation/html/search/all_e.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bfcd342020a22d92685dbc246693fc4a +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/all_f.js b/Documentation/html/search/all_f.js new file mode 100644 index 0000000..1765882 --- /dev/null +++ b/Documentation/html/search/all_f.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['table_20of_20contents_0',['Table of Contents',['../index.html#autotoc_md1',1,'']]], + ['thingclusters_1',['thingClusters',['../class_nano_brain_1_1_cluster.html#a1ea21dfdb1cf3e0e032d44e41308ab04',1,'NanoBrain::Cluster']]], + ['trygetnucleus_2',['TryGetNucleus',['../class_nano_brain_1_1_cluster.html#a40543b820890917a47186b04f0d44478',1,'NanoBrain::Cluster']]], + ['type_3',['Type',['../class_nano_brain_1_1_nucleus.html#a16cdfb57663e2f1c4629c4291b889e89',1,'NanoBrain::Nucleus']]] +]; diff --git a/Documentation/html/search/all_f.js.meta b/Documentation/html/search/all_f.js.meta new file mode 100644 index 0000000..8721055 --- /dev/null +++ b/Documentation/html/search/all_f.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 00d8778b6322d400c94a23c153aabe1c +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/classes_0.js b/Documentation/html/search/classes_0.js new file mode 100644 index 0000000..611f125 --- /dev/null +++ b/Documentation/html/search/classes_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['brain_0',['Brain',['../class_nano_brain_1_1_brain.html',1,'NanoBrain']]] +]; diff --git a/Documentation/html/search/classes_0.js.meta b/Documentation/html/search/classes_0.js.meta new file mode 100644 index 0000000..58bd709 --- /dev/null +++ b/Documentation/html/search/classes_0.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 58020f5cf96f5ccaf93b855230f0e79b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/classes_1.js b/Documentation/html/search/classes_1.js new file mode 100644 index 0000000..4d550bb --- /dev/null +++ b/Documentation/html/search/classes_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['cluster_0',['Cluster',['../class_nano_brain_1_1_cluster.html',1,'NanoBrain']]], + ['clusterprefab_1',['ClusterPrefab',['../class_nano_brain_1_1_cluster_prefab.html',1,'NanoBrain']]] +]; diff --git a/Documentation/html/search/classes_1.js.meta b/Documentation/html/search/classes_1.js.meta new file mode 100644 index 0000000..d493c99 --- /dev/null +++ b/Documentation/html/search/classes_1.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1a4eecdf9848c3e7a94081e9d460757d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/classes_2.js b/Documentation/html/search/classes_2.js new file mode 100644 index 0000000..e9694e2 --- /dev/null +++ b/Documentation/html/search/classes_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['memorycell_0',['MemoryCell',['../class_nano_brain_1_1_memory_cell.html',1,'NanoBrain']]] +]; diff --git a/Documentation/html/search/classes_2.js.meta b/Documentation/html/search/classes_2.js.meta new file mode 100644 index 0000000..f488b9d --- /dev/null +++ b/Documentation/html/search/classes_2.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: aeb163d5904c4b7c1b436d998ac2cd6f +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/classes_3.js b/Documentation/html/search/classes_3.js new file mode 100644 index 0000000..fc3f027 --- /dev/null +++ b/Documentation/html/search/classes_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['neuron_0',['Neuron',['../class_nano_brain_1_1_neuron.html',1,'NanoBrain']]], + ['nucleus_1',['Nucleus',['../class_nano_brain_1_1_nucleus.html',1,'NanoBrain']]] +]; diff --git a/Documentation/html/search/classes_3.js.meta b/Documentation/html/search/classes_3.js.meta new file mode 100644 index 0000000..0e3a822 --- /dev/null +++ b/Documentation/html/search/classes_3.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2d098db1c2b8d2a74ab46725ee498d54 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/classes_4.js b/Documentation/html/search/classes_4.js new file mode 100644 index 0000000..c82e719 --- /dev/null +++ b/Documentation/html/search/classes_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['synapse_0',['Synapse',['../class_nano_brain_1_1_synapse.html',1,'NanoBrain']]] +]; diff --git a/Documentation/html/search/classes_4.js.meta b/Documentation/html/search/classes_4.js.meta new file mode 100644 index 0000000..1fcab88 --- /dev/null +++ b/Documentation/html/search/classes_4.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 782c95a9b0e4b3c838916fc671f880de +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/close.svg b/Documentation/html/search/close.svg new file mode 100644 index 0000000..337d6cc --- /dev/null +++ b/Documentation/html/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/Documentation/html/search/close.svg.meta b/Documentation/html/search/close.svg.meta new file mode 100644 index 0000000..12e214a --- /dev/null +++ b/Documentation/html/search/close.svg.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: b098206296010c8f0984a8c214cd2d0a +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0} + svgType: 3 + texturedSpriteMeshType: 0 + svgPixelsPerUnit: 100 + gradientResolution: 64 + alignment: 0 + customPivot: {x: 0, y: 0} + generatePhysicsShape: 0 + viewportOptions: 0 + preserveViewport: 0 + advancedMode: 0 + tessellationMode: 1 + predefinedResolutionIndex: 1 + targetResolution: 1080 + resolutionMultiplier: 1 + stepDistance: 10 + samplingStepDistance: 100 + maxCordDeviationEnabled: 0 + maxCordDeviation: 1 + maxTangentAngleEnabled: 0 + maxTangentAngle: 5 + keepTextureAspectRatio: 1 + textureSize: 256 + textureWidth: 256 + textureHeight: 256 + wrapMode: 0 + filterMode: 1 + sampleCount: 4 + preserveSVGImageAspect: 0 + useSVGPixelsPerUnit: 0 + spriteData: + TessellationDetail: 0 + SpriteName: + SpritePivot: {x: 0, y: 0} + SpriteAlignment: 0 + SpriteBorder: {x: 0, y: 0, z: 0, w: 0} + SpriteRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + SpriteID: + PhysicsOutlines: [] diff --git a/Documentation/html/search/enums_0.js b/Documentation/html/search/enums_0.js new file mode 100644 index 0000000..b0f050d --- /dev/null +++ b/Documentation/html/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['activationtype_0',['ActivationType',['../class_nano_brain_1_1_neuron.html#ae558c02b00c776805c7fead42cb94612',1,'NanoBrain::Neuron']]] +]; diff --git a/Documentation/html/search/enums_0.js.meta b/Documentation/html/search/enums_0.js.meta new file mode 100644 index 0000000..86c309e --- /dev/null +++ b/Documentation/html/search/enums_0.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1835aa295ea511a6fb757a41e31b1a22 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/enums_1.js b/Documentation/html/search/enums_1.js new file mode 100644 index 0000000..a1effce --- /dev/null +++ b/Documentation/html/search/enums_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['combinatortype_0',['CombinatorType',['../class_nano_brain_1_1_neuron.html#ad7745cc584fbc2659d77c3202ee6adfe',1,'NanoBrain::Neuron']]] +]; diff --git a/Documentation/html/search/enums_1.js.meta b/Documentation/html/search/enums_1.js.meta new file mode 100644 index 0000000..8244f8e --- /dev/null +++ b/Documentation/html/search/enums_1.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0b8d752ed60717203b1c14c244da6430 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/enums_2.js b/Documentation/html/search/enums_2.js new file mode 100644 index 0000000..32db838 --- /dev/null +++ b/Documentation/html/search/enums_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_0',['Type',['../class_nano_brain_1_1_nucleus.html#a16cdfb57663e2f1c4629c4291b889e89',1,'NanoBrain::Nucleus']]] +]; diff --git a/Documentation/html/search/enums_2.js.meta b/Documentation/html/search/enums_2.js.meta new file mode 100644 index 0000000..3f7d252 --- /dev/null +++ b/Documentation/html/search/enums_2.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 492d68d0ec3a737d0a644c211f6f88ef +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/enumvalues_0.js b/Documentation/html/search/enumvalues_0.js new file mode 100644 index 0000000..4e67e01 --- /dev/null +++ b/Documentation/html/search/enumvalues_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['product_0',['Product',['../class_nano_brain_1_1_neuron.html#ad7745cc584fbc2659d77c3202ee6adfeadeb10517653c255364175796ace3553f',1,'NanoBrain::Neuron']]] +]; diff --git a/Documentation/html/search/enumvalues_0.js.meta b/Documentation/html/search/enumvalues_0.js.meta new file mode 100644 index 0000000..03b5941 --- /dev/null +++ b/Documentation/html/search/enumvalues_0.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4c7688f504683f6d4b98d94fe263782c +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/enumvalues_1.js b/Documentation/html/search/enumvalues_1.js new file mode 100644 index 0000000..643f53e --- /dev/null +++ b/Documentation/html/search/enumvalues_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['sum_0',['Sum',['../class_nano_brain_1_1_neuron.html#ad7745cc584fbc2659d77c3202ee6adfeaa0ec87054b5e5b7847d0d8780a01a3d5',1,'NanoBrain::Neuron']]] +]; diff --git a/Documentation/html/search/enumvalues_1.js.meta b/Documentation/html/search/enumvalues_1.js.meta new file mode 100644 index 0000000..4b07e5e --- /dev/null +++ b/Documentation/html/search/enumvalues_1.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: dffdd2edef386a497be686c82df05a77 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/functions_0.js b/Documentation/html/search/functions_0.js new file mode 100644 index 0000000..d6b6327 --- /dev/null +++ b/Documentation/html/search/functions_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['addinstance_0',['addinstance',['../class_nano_brain_1_1_cluster.html#a01b55195c2f5be58659d9b0a5c993a8a',1,'NanoBrain.Cluster.AddInstance()'],['../class_nano_brain_1_1_cluster.html#a1b60bd296f757257a640559b732ed241',1,'NanoBrain.Cluster.AddInstance(ClusterPrefab prefab)']]], + ['addsynapse_1',['AddSynapse',['../class_nano_brain_1_1_neuron.html#a524fdd9e25ebbcb5baca60a942d6eb80',1,'NanoBrain::Neuron']]] +]; diff --git a/Documentation/html/search/functions_0.js.meta b/Documentation/html/search/functions_0.js.meta new file mode 100644 index 0000000..ce4e822 --- /dev/null +++ b/Documentation/html/search/functions_0.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 65ed49f03cb48699081132677596b14e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/functions_1.js b/Documentation/html/search/functions_1.js new file mode 100644 index 0000000..d1b25bf --- /dev/null +++ b/Documentation/html/search/functions_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['cluster_0',['cluster',['../class_nano_brain_1_1_cluster.html#a86341cf5cc0d67a146a48e9c833df7ec',1,'NanoBrain.Cluster.Cluster(ClusterPrefab prefab, Cluster parent)'],['../class_nano_brain_1_1_cluster.html#a3a22ce2493a4d154fd971214b7c484d2',1,'NanoBrain.Cluster.Cluster(ClusterPrefab prefab, ClusterPrefab parent=null)']]], + ['collectreceivers_1',['CollectReceivers',['../class_nano_brain_1_1_cluster.html#ab067c159f399e69bcc9d2211bc9aa3c5',1,'NanoBrain::Cluster']]], + ['collectsynapsesto_2',['CollectSynapsesTo',['../class_nano_brain_1_1_cluster.html#a8736cab5b8381dc5a175fd03031d308e',1,'NanoBrain::Cluster']]] +]; diff --git a/Documentation/html/search/functions_1.js.meta b/Documentation/html/search/functions_1.js.meta new file mode 100644 index 0000000..94e0419 --- /dev/null +++ b/Documentation/html/search/functions_1.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ced74dd46c11936909db8f8f9022697c +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/functions_2.js b/Documentation/html/search/functions_2.js new file mode 100644 index 0000000..1b5fcc2 --- /dev/null +++ b/Documentation/html/search/functions_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['deletenucleus_0',['DeleteNucleus',['../class_nano_brain_1_1_cluster.html#a6b5855021a2733df3c25ed67e8777509',1,'NanoBrain::Cluster']]] +]; diff --git a/Documentation/html/search/functions_2.js.meta b/Documentation/html/search/functions_2.js.meta new file mode 100644 index 0000000..a64f5e4 --- /dev/null +++ b/Documentation/html/search/functions_2.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a0c134925cf8aa77d98a38a4ead437c3 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/functions_3.js b/Documentation/html/search/functions_3.js new file mode 100644 index 0000000..ed9f385 --- /dev/null +++ b/Documentation/html/search/functions_3.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['getneuron_0',['getneuron',['../class_nano_brain_1_1_cluster.html#a938f7cc08d8fee459e0203e3b6869e06',1,'NanoBrain.Cluster.GetNeuron(string neuronName)'],['../class_nano_brain_1_1_cluster.html#a696fcbdd1ae684a7b55963d8e673b22f',1,'NanoBrain.Cluster.GetNeuron(int thingId, string neuronName, string thingName=null)']]], + ['getnucleus_1',['getnucleus',['../class_nano_brain_1_1_cluster.html#a31a62471a88a8180963be74227fd68be',1,'NanoBrain.Cluster.GetNucleus()'],['../class_nano_brain_1_1_cluster_prefab.html#a49601bf5ea05b4f28974a5c0a1345286',1,'NanoBrain.ClusterPrefab.GetNucleus()']]], + ['getnucleusindex_2',['getnucleusindex',['../class_nano_brain_1_1_cluster.html#aec242a8433041ed22dde2375436016ce',1,'NanoBrain.Cluster.GetNucleusIndex(List< Nucleus > nuclei, Nucleus nucleus)'],['../class_nano_brain_1_1_cluster.html#ad9441d41aa6e2bfd3f9acf111dde1dd8',1,'NanoBrain.Cluster.GetNucleusIndex(List< Nucleus > nuclei, string nucleusName)']]], + ['getsynapse_3',['GetSynapse',['../class_nano_brain_1_1_neuron.html#a1f3c83acf569fa483101fd0ce11ec5fc',1,'NanoBrain::Neuron']]] +]; diff --git a/Documentation/html/search/functions_3.js.meta b/Documentation/html/search/functions_3.js.meta new file mode 100644 index 0000000..1e19153 --- /dev/null +++ b/Documentation/html/search/functions_3.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 665a1ed08b7d61e27a5568974097e3fd +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/functions_4.js b/Documentation/html/search/functions_4.js new file mode 100644 index 0000000..c855a1d --- /dev/null +++ b/Documentation/html/search/functions_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['neuron_0',['Neuron',['../class_nano_brain_1_1_neuron.html#a54a94ea928e9a54552692e7d1e84782e',1,'NanoBrain::Neuron']]] +]; diff --git a/Documentation/html/search/functions_4.js.meta b/Documentation/html/search/functions_4.js.meta new file mode 100644 index 0000000..568b3b2 --- /dev/null +++ b/Documentation/html/search/functions_4.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 01d34ffd14a97c743b4d7ac0aba7d702 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/functions_5.js b/Documentation/html/search/functions_5.js new file mode 100644 index 0000000..649d473 --- /dev/null +++ b/Documentation/html/search/functions_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['processstimulus_0',['ProcessStimulus',['../class_nano_brain_1_1_neuron.html#a30c28f0ede8d4cba4e2937cade0e79e0',1,'NanoBrain::Neuron']]] +]; diff --git a/Documentation/html/search/functions_5.js.meta b/Documentation/html/search/functions_5.js.meta new file mode 100644 index 0000000..40ae364 --- /dev/null +++ b/Documentation/html/search/functions_5.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 81fdf1e58035175299f1747116f142cd +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/functions_6.js b/Documentation/html/search/functions_6.js new file mode 100644 index 0000000..5b39ccf --- /dev/null +++ b/Documentation/html/search/functions_6.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['refresh_0',['Refresh',['../class_nano_brain_1_1_cluster.html#a40ad7f93121a3684699c92bcb03b1c74',1,'NanoBrain::Cluster']]], + ['refreshcomputeorders_1',['RefreshComputeOrders',['../class_nano_brain_1_1_cluster.html#acff74557b8c50f2355898855f1ab6073',1,'NanoBrain::Cluster']]], + ['refreshoutputs_2',['RefreshOutputs',['../class_nano_brain_1_1_cluster.html#a209d8f083a5bd82ce764ee5ac7e9f97e',1,'NanoBrain::Cluster']]], + ['removeinstance_3',['RemoveInstance',['../class_nano_brain_1_1_cluster.html#a5454e0c01870e1c2df93b33f43704210',1,'NanoBrain::Cluster']]], + ['removesynapse_4',['RemoveSynapse',['../class_nano_brain_1_1_neuron.html#a2ae2b960608803beabade55d2c830088',1,'NanoBrain::Neuron']]] +]; diff --git a/Documentation/html/search/functions_6.js.meta b/Documentation/html/search/functions_6.js.meta new file mode 100644 index 0000000..9c78ac7 --- /dev/null +++ b/Documentation/html/search/functions_6.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2ecf36c75790523df9f71bcffb8a2900 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/functions_7.js b/Documentation/html/search/functions_7.js new file mode 100644 index 0000000..09608d8 --- /dev/null +++ b/Documentation/html/search/functions_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['setbias_0',['SetBias',['../class_nano_brain_1_1_neuron.html#a407e9fca0108715d6031ea4f2ae1005d',1,'NanoBrain::Neuron']]], + ['shallowcloneto_1',['shallowcloneto',['../class_nano_brain_1_1_cluster.html#a7ecc2afa858940901336663b435f8fb2',1,'NanoBrain.Cluster.ShallowCloneTo()'],['../class_nano_brain_1_1_neuron.html#afe95b6470ef7689253514229d02fe2b9',1,'NanoBrain.Neuron.ShallowCloneTo()'],['../class_nano_brain_1_1_nucleus.html#a4bb93cd4cd07072f35eae3a98ba5dde8',1,'NanoBrain.Nucleus.ShallowCloneTo()']]], + ['synapse_2',['Synapse',['../class_nano_brain_1_1_synapse.html#a63a57254f76939b6a7bbbeb630f839d2',1,'NanoBrain::Synapse']]] +]; diff --git a/Documentation/html/search/functions_7.js.meta b/Documentation/html/search/functions_7.js.meta new file mode 100644 index 0000000..846555a --- /dev/null +++ b/Documentation/html/search/functions_7.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3a0c573691300e89d9cdcdfe9c64e9a7 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/functions_8.js b/Documentation/html/search/functions_8.js new file mode 100644 index 0000000..eb4e316 --- /dev/null +++ b/Documentation/html/search/functions_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['trygetnucleus_0',['TryGetNucleus',['../class_nano_brain_1_1_cluster.html#a40543b820890917a47186b04f0d44478',1,'NanoBrain::Cluster']]] +]; diff --git a/Documentation/html/search/functions_8.js.meta b/Documentation/html/search/functions_8.js.meta new file mode 100644 index 0000000..cc8d6e3 --- /dev/null +++ b/Documentation/html/search/functions_8.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1e1e327b7d4c34f269fc0762fdd605ea +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/functions_9.js b/Documentation/html/search/functions_9.js new file mode 100644 index 0000000..45f6fe1 --- /dev/null +++ b/Documentation/html/search/functions_9.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['updatefromnucleus_0',['UpdateFromNucleus',['../class_nano_brain_1_1_cluster.html#ab2e33a3a6642d31b5a927c7ee2db73ab',1,'NanoBrain::Cluster']]], + ['updatenuclei_1',['updatenuclei',['../class_nano_brain_1_1_memory_cell.html#a780592351f670461286b8cd00ec42ebd',1,'NanoBrain.MemoryCell.UpdateNuclei()'],['../class_nano_brain_1_1_nucleus.html#a31e93d392a4a861b55f3d87f0a7d6d59',1,'NanoBrain.Nucleus.UpdateNuclei()']]], + ['updatestateisolated_2',['updatestateisolated',['../class_nano_brain_1_1_cluster.html#ac40b182a3c5f32ec055d7fabbeaedbf3',1,'NanoBrain.Cluster.UpdateStateIsolated()'],['../class_nano_brain_1_1_nucleus.html#aaf267af9b5ad1b5f0247f04ed2934f97',1,'NanoBrain.Nucleus.UpdateStateIsolated()']]], + ['updateweight_3',['UpdateWeight',['../class_nano_brain_1_1_brain.html#a552d2f938f63f3c0f1997174d9098334',1,'NanoBrain::Brain']]] +]; diff --git a/Documentation/html/search/functions_9.js.meta b/Documentation/html/search/functions_9.js.meta new file mode 100644 index 0000000..3dd70af --- /dev/null +++ b/Documentation/html/search/functions_9.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d1db4d60c64a08735b3de279a9a6d3ab +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/mag.svg b/Documentation/html/search/mag.svg new file mode 100644 index 0000000..ffb6cf0 --- /dev/null +++ b/Documentation/html/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/Documentation/html/search/mag.svg.meta b/Documentation/html/search/mag.svg.meta new file mode 100644 index 0000000..d321622 --- /dev/null +++ b/Documentation/html/search/mag.svg.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 670ba244be3f5de23866683631f24f68 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0} + svgType: 3 + texturedSpriteMeshType: 0 + svgPixelsPerUnit: 100 + gradientResolution: 64 + alignment: 0 + customPivot: {x: 0, y: 0} + generatePhysicsShape: 0 + viewportOptions: 0 + preserveViewport: 0 + advancedMode: 0 + tessellationMode: 1 + predefinedResolutionIndex: 1 + targetResolution: 1080 + resolutionMultiplier: 1 + stepDistance: 10 + samplingStepDistance: 100 + maxCordDeviationEnabled: 0 + maxCordDeviation: 1 + maxTangentAngleEnabled: 0 + maxTangentAngle: 5 + keepTextureAspectRatio: 1 + textureSize: 256 + textureWidth: 256 + textureHeight: 256 + wrapMode: 0 + filterMode: 1 + sampleCount: 4 + preserveSVGImageAspect: 0 + useSVGPixelsPerUnit: 0 + spriteData: + TessellationDetail: 0 + SpriteName: + SpritePivot: {x: 0, y: 0} + SpriteAlignment: 0 + SpriteBorder: {x: 0, y: 0, z: 0, w: 0} + SpriteRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + SpriteID: + PhysicsOutlines: [] diff --git a/Documentation/html/search/mag_d.svg b/Documentation/html/search/mag_d.svg new file mode 100644 index 0000000..4122773 --- /dev/null +++ b/Documentation/html/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/Documentation/html/search/mag_d.svg.meta b/Documentation/html/search/mag_d.svg.meta new file mode 100644 index 0000000..31d72f6 --- /dev/null +++ b/Documentation/html/search/mag_d.svg.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: bb69c47921567861fbba56647589ec16 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0} + svgType: 3 + texturedSpriteMeshType: 0 + svgPixelsPerUnit: 100 + gradientResolution: 64 + alignment: 0 + customPivot: {x: 0, y: 0} + generatePhysicsShape: 0 + viewportOptions: 0 + preserveViewport: 0 + advancedMode: 0 + tessellationMode: 1 + predefinedResolutionIndex: 1 + targetResolution: 1080 + resolutionMultiplier: 1 + stepDistance: 10 + samplingStepDistance: 100 + maxCordDeviationEnabled: 0 + maxCordDeviation: 1 + maxTangentAngleEnabled: 0 + maxTangentAngle: 5 + keepTextureAspectRatio: 1 + textureSize: 256 + textureWidth: 256 + textureHeight: 256 + wrapMode: 0 + filterMode: 1 + sampleCount: 4 + preserveSVGImageAspect: 0 + useSVGPixelsPerUnit: 0 + spriteData: + TessellationDetail: 0 + SpriteName: + SpritePivot: {x: 0, y: 0} + SpriteAlignment: 0 + SpriteBorder: {x: 0, y: 0, z: 0, w: 0} + SpriteRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + SpriteID: + PhysicsOutlines: [] diff --git a/Documentation/html/search/mag_sel.svg b/Documentation/html/search/mag_sel.svg new file mode 100644 index 0000000..553dba8 --- /dev/null +++ b/Documentation/html/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/Documentation/html/search/mag_sel.svg.meta b/Documentation/html/search/mag_sel.svg.meta new file mode 100644 index 0000000..399b5e1 --- /dev/null +++ b/Documentation/html/search/mag_sel.svg.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: b9324c2942b664fb0a31114d5552801c +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0} + svgType: 3 + texturedSpriteMeshType: 0 + svgPixelsPerUnit: 100 + gradientResolution: 64 + alignment: 0 + customPivot: {x: 0, y: 0} + generatePhysicsShape: 0 + viewportOptions: 0 + preserveViewport: 0 + advancedMode: 0 + tessellationMode: 1 + predefinedResolutionIndex: 1 + targetResolution: 1080 + resolutionMultiplier: 1 + stepDistance: 10 + samplingStepDistance: 100 + maxCordDeviationEnabled: 0 + maxCordDeviation: 1 + maxTangentAngleEnabled: 0 + maxTangentAngle: 5 + keepTextureAspectRatio: 1 + textureSize: 256 + textureWidth: 256 + textureHeight: 256 + wrapMode: 0 + filterMode: 1 + sampleCount: 4 + preserveSVGImageAspect: 0 + useSVGPixelsPerUnit: 0 + spriteData: + TessellationDetail: 0 + SpriteName: + SpritePivot: {x: 0, y: 0} + SpriteAlignment: 0 + SpriteBorder: {x: 0, y: 0, z: 0, w: 0} + SpriteRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + SpriteID: + PhysicsOutlines: [] diff --git a/Documentation/html/search/mag_seld.svg b/Documentation/html/search/mag_seld.svg new file mode 100644 index 0000000..c906f84 --- /dev/null +++ b/Documentation/html/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/Documentation/html/search/mag_seld.svg.meta b/Documentation/html/search/mag_seld.svg.meta new file mode 100644 index 0000000..fd12b38 --- /dev/null +++ b/Documentation/html/search/mag_seld.svg.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 41e1362773440fefa94c022a6cf72822 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0} + svgType: 3 + texturedSpriteMeshType: 0 + svgPixelsPerUnit: 100 + gradientResolution: 64 + alignment: 0 + customPivot: {x: 0, y: 0} + generatePhysicsShape: 0 + viewportOptions: 0 + preserveViewport: 0 + advancedMode: 0 + tessellationMode: 1 + predefinedResolutionIndex: 1 + targetResolution: 1080 + resolutionMultiplier: 1 + stepDistance: 10 + samplingStepDistance: 100 + maxCordDeviationEnabled: 0 + maxCordDeviation: 1 + maxTangentAngleEnabled: 0 + maxTangentAngle: 5 + keepTextureAspectRatio: 1 + textureSize: 256 + textureWidth: 256 + textureHeight: 256 + wrapMode: 0 + filterMode: 1 + sampleCount: 4 + preserveSVGImageAspect: 0 + useSVGPixelsPerUnit: 0 + spriteData: + TessellationDetail: 0 + SpriteName: + SpritePivot: {x: 0, y: 0} + SpriteAlignment: 0 + SpriteBorder: {x: 0, y: 0, z: 0, w: 0} + SpriteRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + SpriteID: + PhysicsOutlines: [] diff --git a/Documentation/html/search/namespaces_0.js b/Documentation/html/search/namespaces_0.js new file mode 100644 index 0000000..f525ebd --- /dev/null +++ b/Documentation/html/search/namespaces_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['nanobrain_0',['NanoBrain',['../namespace_nano_brain.html',1,'']]] +]; diff --git a/Documentation/html/search/namespaces_0.js.meta b/Documentation/html/search/namespaces_0.js.meta new file mode 100644 index 0000000..99c7f56 --- /dev/null +++ b/Documentation/html/search/namespaces_0.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c365b7848f276d43ca260709ba34d31a +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/pages_0.js b/Documentation/html/search/pages_0.js new file mode 100644 index 0000000..bde3ebd --- /dev/null +++ b/Documentation/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['brain_20for_20unity_0',['Nano Brain for Unity',['../index.html',1,'']]] +]; diff --git a/Documentation/html/search/pages_0.js.meta b/Documentation/html/search/pages_0.js.meta new file mode 100644 index 0000000..c27e077 --- /dev/null +++ b/Documentation/html/search/pages_0.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6c981a5cf6b62efa5b9c32f9e1b95a62 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/pages_1.js b/Documentation/html/search/pages_1.js new file mode 100644 index 0000000..ca40bee --- /dev/null +++ b/Documentation/html/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['for_20unity_0',['Nano Brain for Unity',['../index.html',1,'']]] +]; diff --git a/Documentation/html/search/pages_1.js.meta b/Documentation/html/search/pages_1.js.meta new file mode 100644 index 0000000..227b374 --- /dev/null +++ b/Documentation/html/search/pages_1.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5b9c38fe93e76835d9d7f62d5617818d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/pages_2.js b/Documentation/html/search/pages_2.js new file mode 100644 index 0000000..dc6d821 --- /dev/null +++ b/Documentation/html/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['installation_0',['Package Installation',['../md__installation.html',1,'']]] +]; diff --git a/Documentation/html/search/pages_2.js.meta b/Documentation/html/search/pages_2.js.meta new file mode 100644 index 0000000..2e9236e --- /dev/null +++ b/Documentation/html/search/pages_2.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2b5c7292911003947b81c10e8cec49bf +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/pages_3.js b/Documentation/html/search/pages_3.js new file mode 100644 index 0000000..11dd9d9 --- /dev/null +++ b/Documentation/html/search/pages_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['nano_20brain_20for_20unity_0',['Nano Brain for Unity',['../index.html',1,'']]], + ['nanobrain_1',['NanoBrain',['../md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html',1,'']]] +]; diff --git a/Documentation/html/search/pages_3.js.meta b/Documentation/html/search/pages_3.js.meta new file mode 100644 index 0000000..44a34fb --- /dev/null +++ b/Documentation/html/search/pages_3.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d5e898cec12687524ad13a526157c187 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/pages_4.js b/Documentation/html/search/pages_4.js new file mode 100644 index 0000000..05d1d2d --- /dev/null +++ b/Documentation/html/search/pages_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['package_20installation_0',['Package Installation',['../md__installation.html',1,'']]] +]; diff --git a/Documentation/html/search/pages_4.js.meta b/Documentation/html/search/pages_4.js.meta new file mode 100644 index 0000000..2730d6b --- /dev/null +++ b/Documentation/html/search/pages_4.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 762ab96aefd8932e5829f8fd5cb0bd93 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/pages_5.js b/Documentation/html/search/pages_5.js new file mode 100644 index 0000000..6508dbb --- /dev/null +++ b/Documentation/html/search/pages_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['unity_0',['Nano Brain for Unity',['../index.html',1,'']]] +]; diff --git a/Documentation/html/search/pages_5.js.meta b/Documentation/html/search/pages_5.js.meta new file mode 100644 index 0000000..9869dd9 --- /dev/null +++ b/Documentation/html/search/pages_5.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 30e182245cd305c60b79eefcba82a8e2 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/properties_0.js b/Documentation/html/search/properties_0.js new file mode 100644 index 0000000..b0f4491 --- /dev/null +++ b/Documentation/html/search/properties_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['basename_0',['baseName',['../class_nano_brain_1_1_cluster.html#ad81aed306939c26d22043ca3a0cd71c4',1,'NanoBrain::Cluster']]], + ['brain_1',['brain',['../class_nano_brain_1_1_brain.html#a9c34c8cba2339f23b6406c45ab8490a8',1,'NanoBrain::Brain']]] +]; diff --git a/Documentation/html/search/properties_0.js.meta b/Documentation/html/search/properties_0.js.meta new file mode 100644 index 0000000..3067454 --- /dev/null +++ b/Documentation/html/search/properties_0.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a5fbd96f77d256c5a90d2c67616466e4 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/properties_1.js b/Documentation/html/search/properties_1.js new file mode 100644 index 0000000..1600c64 --- /dev/null +++ b/Documentation/html/search/properties_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['computeorders_0',['computeOrders',['../class_nano_brain_1_1_cluster.html#af3bb2af13fc7fcb15e7610d4c81cb395',1,'NanoBrain::Cluster']]] +]; diff --git a/Documentation/html/search/properties_1.js.meta b/Documentation/html/search/properties_1.js.meta new file mode 100644 index 0000000..e12ccc6 --- /dev/null +++ b/Documentation/html/search/properties_1.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: fe74a155ea6d16028b093404058396c3 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/properties_2.js b/Documentation/html/search/properties_2.js new file mode 100644 index 0000000..1e01f0d --- /dev/null +++ b/Documentation/html/search/properties_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['defaultoutput_0',['defaultOutput',['../class_nano_brain_1_1_cluster.html#ac2d36a78d001fde5c95bc48f32e0fcc7',1,'NanoBrain::Cluster']]] +]; diff --git a/Documentation/html/search/properties_2.js.meta b/Documentation/html/search/properties_2.js.meta new file mode 100644 index 0000000..0ae2ed6 --- /dev/null +++ b/Documentation/html/search/properties_2.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d052bcbbc70413592b4cba9cfeec57cb +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/properties_3.js b/Documentation/html/search/properties_3.js new file mode 100644 index 0000000..4ee7c8c --- /dev/null +++ b/Documentation/html/search/properties_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['outputs_0',['outputs',['../class_nano_brain_1_1_cluster.html#a89d8b00304b04025ae0446421363aa1f',1,'NanoBrain::Cluster']]] +]; diff --git a/Documentation/html/search/properties_3.js.meta b/Documentation/html/search/properties_3.js.meta new file mode 100644 index 0000000..69c3144 --- /dev/null +++ b/Documentation/html/search/properties_3.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 127747e533ee9514eb83446dfe69454c +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/properties_4.js b/Documentation/html/search/properties_4.js new file mode 100644 index 0000000..8e2934b --- /dev/null +++ b/Documentation/html/search/properties_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['synapses_0',['synapses',['../class_nano_brain_1_1_neuron.html#a96a7f4b8480a8fa9fce1d698a41e4dc7',1,'NanoBrain::Neuron']]] +]; diff --git a/Documentation/html/search/properties_4.js.meta b/Documentation/html/search/properties_4.js.meta new file mode 100644 index 0000000..641633c --- /dev/null +++ b/Documentation/html/search/properties_4.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b3c3469325562c7bc9c32b04b0931302 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/search.css b/Documentation/html/search/search.css new file mode 100644 index 0000000..feb41e1 --- /dev/null +++ b/Documentation/html/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: url('mag_sel.svg'); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: url('mag.svg'); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial,Verdana,sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: black; +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #9D9D9D; + background-color: #F9F9F9; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial,Verdana,sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: black; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: black; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: white; + background-color: #4D4D4D; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid black; + background-color: #EFEFEF; + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: #EFEFEF; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #555555; + font-family: Arial,Verdana,sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #555555; + font-family: Arial,Verdana,sans-serif; + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: Arial,Verdana,sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial,Verdana,sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/Documentation/html/search/search.css.meta b/Documentation/html/search/search.css.meta new file mode 100644 index 0000000..65f4249 --- /dev/null +++ b/Documentation/html/search/search.css.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2dc5ca8306640ec9cbbd36d4afa4334e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/search/search.js b/Documentation/html/search/search.js new file mode 100644 index 0000000..6fd40c6 --- /dev/null +++ b/Documentation/html/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e-{AmhX=Jf@VhhPiD4GOiz; zcRywnUC`Ll$Sd-o>+3=W-UUqj5(`XT7ERB)UpDFUyAP*t|6|+dt@(PF-f5%rpDp?h z8`Lm9nXIBPiBx3galCL(_5JVip`lkxV{dOOjrG4AGBxPezWd+zX3l!O%kKZ{>GPgf pez!SazCHJIhLC_K8R-87{yTf@e9voK&Ifvy!PC{xWt~$(695x~V|f4o literal 0 HcmV?d00001 diff --git a/Documentation/html/splitbar.png.meta b/Documentation/html/splitbar.png.meta new file mode 100644 index 0000000..549ae70 --- /dev/null +++ b/Documentation/html/splitbar.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: e85ea107c00aa2857800f71453860bed +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/splitbard.png b/Documentation/html/splitbard.png new file mode 100644 index 0000000000000000000000000000000000000000..078a6016357fce7c1354b3b4a9dc33e88a794b0f GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf@Vh8*`ZgMOZI3 zo8RDQ^5tC7*dXQMxw64;#qI2q)BbR6m~-axA9}sSz|ZX@AWRd)1MeW zy9&AmwgieKinvM;!@L+jA@}yY^UwdqufP8H{`>4w3z@v_w_ks?lIwr}{rCN_@4su~ oWA&!L7p)T~&Oju~FP^VuIxVNlE%qkV2n!CN78?;SpcOqIf4>i+=%}9071pEpCcLwha_i{q0=#{!j5t+!ddJg6b5Y zM?4Z|0QSKvu8MwfT|BYgbOY9US-dO zZ+;Bm5a`Rk5Z}xZ+!Ch%?8?f@02~z+6#+Q$i95oj0Rkck6jYbXMPFavf32;p0FG*F zYl+2T6c-l**u}(I4G^_Yjo0gCXlRH~DCFMS+5&L2xw%Pmb2G!k!&FvQ0@x)qK-l_A zAP``5bd-jM27rChk&KLtP+wmU6x65&2$@$cEiELINvf*!o9~py#zrEM2+?TNklQRh zJ+!yC=dR1k%Sj{>w6*D`&o5mKa6((Xy}b+$4pLH50_1C5T^-?Y*!ZK4&Mew_Q&SU= zuO5%bc!_vCzGi-G4dBvNMMVX`o+c(HcE)WP34oo?=lg9<72kCzlarHlbac?&txGsx z*4EZoUtc#?mGwI?{il3)V*#bp&(P082|tq*5tkef$0Xy*5*B{p%>Fr>9w2 zSpf>_oQ@zUjrY1~t#@?z0|NuBuC6jSr|$qzNEbj?R~J)LQ^qs`*j&^A+R!AIOHjE? z=yvN=Wi~c89220fxb5w2GMNm3-5Wiu%mAmwM{yM35Tvsk_#ZRbeG%6H4$0rzx&1_Y zDs*{iJ_qJ)(sVfVN5li&djJQZo9ni7D}e zb+_a3lei?#i@!9tiR$b@q5*&CX(irfJ2mDT!0vyUi>NUe>C5l{0000F_#va9;C=_rI)&wWv!QmB?sLFtFi9$%+8pZFp6!xzC1rNnMvMf=AHL_ z-m7PRejeZ`Ux}C)5LZN-@QJ^~ns_OmiQfU-Q~|hX72k@qc?>v0&s{RF|0{kLKZ-v9 zN4O=3i-+O@zzO)p4KX2ZiO2SfUcesTh+jUUb9)PjN8W)5NF>7E-X4I%&dv_Ky}iuL%+S)(0^laC z38H`_LZJ||v$J${bpaeppCp^j(%IPwP${7aBK9+VeSKsy83F-)@Bg>%?rvhS7>Pu} z5Rbkvj({dOYrV9wu`#Bmrl_s01p8frO>(o0<@I($$_8*4BVJ0RfjG3fu zX=%y$bLGpOo0~I^cXxMLUS4K(bro>LnwEt^WrFqfb#l3!G0%g+pzETt=D$AO;^HD3 z8yf(X3i<>(JiqFK1stKnFgZEN=H@1ag5HPo#gB}Pu&}UT3?G1tuQh=lXpuWCP>yQo z^_FC)sto3oTFs3_6aJ&Sm3U!xYK%8PrT+lGHK=%)lwnT*0000klVg2=WT&kP%mU=OCz5} zJ${Fq&Xjq(4m2ki)P)&HD>cpZELU%swqk|qmC5V}h=w0jf7+x2#T Rl7Qwgc)I$ztaD0e0svF%CN%&6 literal 0 HcmV?d00001 diff --git a/Documentation/html/tab_ad.png.meta b/Documentation/html/tab_ad.png.meta new file mode 100644 index 0000000..48ab45d --- /dev/null +++ b/Documentation/html/tab_ad.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 1349c78b8a0f35066b36965e60f5629c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/tab_b.png b/Documentation/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..055273a5d1ae6a3f8f295f39dc05dd0b054d7097 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QZb$`jv*C{Z}0BrWL1=Kd3ay) z;DK*Etj_U24yEa)m!HimvX(e^e2e09nTYJfo`?5lXX~D`v^|ReDe*?JdSVvc27WXO3;nFm1~a{pG!zf>=CSbzy4ZOz*X*&uxwYa jm*NfQi_e+YxGm@JrXN`60gsmQgcnZ^H> wOo=l*#;xS^-gZh*J>w70?Aqf3OmmC*pPP%klE2<{0cZ<@r>mdKI;Vst0GtvwE&u=k literal 0 HcmV?d00001 diff --git a/Documentation/html/tab_h.png.meta b/Documentation/html/tab_h.png.meta new file mode 100644 index 0000000..6b8db80 --- /dev/null +++ b/Documentation/html/tab_h.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 27ca5a7c78903c731bc290365641f63a +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/tab_hd.png b/Documentation/html/tab_hd.png new file mode 100644 index 0000000000000000000000000000000000000000..c0d7a0e296773e67aa258bfa6df5b7eb373bc026 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|_=jF(~r5UVP#z zaOBvzTk?t>-i7~9ORC*9+1y&a--|i))`Gww%I(^piuEgQ5_hPeo rT~wBe7<|@enD4~#e#td0%jfL9UpbXO|E}l)TEO7x>gTe~DWM4fXB;!r literal 0 HcmV?d00001 diff --git a/Documentation/html/tab_hd.png.meta b/Documentation/html/tab_hd.png.meta new file mode 100644 index 0000000..91e9fff --- /dev/null +++ b/Documentation/html/tab_hd.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 64af34948dd43e6619d81ac4c5476b79 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/tab_s.png b/Documentation/html/tab_s.png new file mode 100644 index 0000000000000000000000000000000000000000..cdff2fba9b527d9c261c49eec56ccfa3e7a3187b GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qn{Wkjv*C{Z|~mhJgUIJ8Zh(r zG^KSaT6vvZl=W=^Ce!ch6hCeEM$9w7Pr36s)**1{+1~bIzUP&XEcha_6MGu3RRw!FdT}bUSUj(95imGbr?K>ZPL#sOy?c}Y Q0xf3nboFyt=akR{04kF|M*si- literal 0 HcmV?d00001 diff --git a/Documentation/html/tab_s.png.meta b/Documentation/html/tab_s.png.meta new file mode 100644 index 0000000..0c6f2c9 --- /dev/null +++ b/Documentation/html/tab_s.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 62d3171cd55208db9bafd0df0156d39d +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/tab_sd.png b/Documentation/html/tab_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..f07790c811efbb6418d78042ddca88beacd8833c GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QgNOxjv*C{Z|~mbbP!}8WPReYPho*{k1Yul;()((stWd)c*HS6}N2;@bD#*^ARM{fLC1Q^lU| z1?LV%aVMWyx^>@_pb0@v9E|5Im0KDNzXf>Jf11O-!F0d)8K6xJp00i_>zopr0PPPp AKL7v# literal 0 HcmV?d00001 diff --git a/Documentation/html/tab_sd.png.meta b/Documentation/html/tab_sd.png.meta new file mode 100644 index 0000000..62840d5 --- /dev/null +++ b/Documentation/html/tab_sd.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: c1bede191be9bfd258777bfb640909d8 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/html/tabs.css b/Documentation/html/tabs.css new file mode 100644 index 0000000..b70e9b0 --- /dev/null +++ b/Documentation/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:#424242;-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:url('tab_b.png')}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255, 255, 255, 0.9);color:#2D2D2D;outline:none}.sm-dox a:hover{background-image:url('tab_a.png');background-repeat:repeat-x;color:white;text-shadow:0px 1px 1px rgba(0, 0, 0, 1.0)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255, 255, 255, 0.5);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:white}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url('tab_a.png');background-repeat:repeat-x;color:white;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url('tab_b.png');line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#2D2D2D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url('tab_s.png');background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url('tab_a.png');background-repeat:repeat-x;color:white;text-shadow:0px 1px 1px rgba(0, 0, 0, 1.0)}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent white transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:white;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555555;background-image:none;border:0 !important;color:#555555;background-image:none}.sm-dox ul a:hover{background-image:url('tab_a.png');background-repeat:repeat-x;color:white;text-shadow:0px 1px 1px rgba(0, 0, 0, 1.0)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:white;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url('tab_b.png')}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:white}} diff --git a/Documentation/html/tabs.css.meta b/Documentation/html/tabs.css.meta new file mode 100644 index 0000000..b799213 --- /dev/null +++ b/Documentation/html/tabs.css.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3ef3bd37f39242281ab6d268249c63f8 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/doxygen/images.meta b/Documentation/images.meta similarity index 100% rename from doxygen/images.meta rename to Documentation/images.meta diff --git a/Documentation/images/PasserLifeLogoRight1_300.png b/Documentation/images/PasserLifeLogoRight1_300.png new file mode 100644 index 0000000000000000000000000000000000000000..7480553ab1bdec3bbcef46bae92a68325334b6f3 GIT binary patch literal 10323 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 F{|DE2^oRfe literal 0 HcmV?d00001 diff --git a/doxygen/images/PasserLifeLogoRight1_300.png.meta b/Documentation/images/PasserLifeLogoRight1_300.png.meta similarity index 100% rename from doxygen/images/PasserLifeLogoRight1_300.png.meta rename to Documentation/images/PasserLifeLogoRight1_300.png.meta diff --git a/Editor/BrainPickerWindow.cs.meta b/Editor/BrainPickerWindow.cs.meta index b2de114..1468869 100644 --- a/Editor/BrainPickerWindow.cs.meta +++ b/Editor/BrainPickerWindow.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 9197e2d322d23b5798ab4aef729815b0 \ No newline at end of file +guid: 9197e2d322d23b5798ab4aef729815b0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Brain_Editor.cs.meta b/Editor/Brain_Editor.cs.meta index eaf830b..c91bea9 100644 --- a/Editor/Brain_Editor.cs.meta +++ b/Editor/Brain_Editor.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: f05072314d39990639a2dbf99f322664 \ No newline at end of file +guid: f05072314d39990639a2dbf99f322664 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/ClusterEditor.cs b/Editor/ClusterEditor.cs index 725b27d..0c4b623 100644 --- a/Editor/ClusterEditor.cs +++ b/Editor/ClusterEditor.cs @@ -64,22 +64,24 @@ namespace NanoBrain { public class GraphEditor : GraphView { protected ClusterPrefab prefab; - protected Nucleus currentPrefabNucleus; + //protected Nucleus currentPrefabNucleus; protected override Nucleus currentNucleus { get => base.currentNucleus; set { base.currentNucleus = value; - this.currentPrefabNucleus = value != null ? this.prefab.GetNucleus(value.name) : null; + // this.currentPrefabNucleus = value != null ? this.prefab.GetNucleus(value.name) : null; } } - public GraphEditor(ClusterPrefab prefab) : base(prefab.output.parent) { + public GraphEditor(ClusterPrefab prefab) : base(prefab.cluster.defaultOutput.parent) { this.prefab = prefab; // In a Prefab editor, no instance exists but we need it for the ClusterViewer. // So we create a temporary instance - this.currentCluster = new(prefab); + //this.currentCluster = new(prefab); + this.currentCluster = prefab.cluster; + this.currentCluster.Refresh(); } public void SetGraph(GameObject gameObject, VisualElement inspectorContainer) { @@ -87,7 +89,7 @@ namespace NanoBrain { if (Application.isPlaying == false) this.serializedBrain = new SerializedObject(this.prefab); - this.selectedOutput = this.currentCluster.outputs[0]; + this.selectedOutput = this.currentCluster.defaultOutput; this.currentNucleus = this.selectedOutput; //this.currentCluster = this.currentNucleus.parent; Rebuild(inspectorContainer); @@ -120,9 +122,9 @@ namespace NanoBrain { // create a SerializedObject wrapper so Unity inspector controls work (and Undo) SerializedObject so = new(prefabAsset); - foreach (Nucleus nucleus in this.prefab.nuclei) { - nucleus.Initialize(); - } + // foreach (Nucleus nucleus in this.prefab.cluster.nuclei) { + // nucleus.Initialize(); + // } this.inspectorIMGUIContainer = new IMGUIContainer(() => InspectorHandler(so)); @@ -163,29 +165,10 @@ namespace NanoBrain { GUILayout.Label(nucleusType, headerStyle); // Nucleus name - Cluster cluster = this.currentPrefabNucleus as Cluster; - if (cluster != null) { - EditorGUILayout.BeginHorizontal(); - if (GUILayout.Button(this.currentNucleus.parent.name)) - OnClusterClick(cluster); - EditorGUI.BeginDisabledGroup(true); - EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); - EditorGUI.EndDisabledGroup(); - if (GUILayout.Button("Reimport")) - ReimportCluster(cluster); - EditorGUILayout.EndHorizontal(); - } - else { - string newName = EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); - if (newName != this.currentNucleus.name) { - Nucleus prefabNucleus = this.prefab.GetNucleus(this.currentNucleus.name); - prefabNucleus.name = newName; - // This changes it in the temporary cluster instance - this.currentNucleus.name = newName; - this.prefab.RefreshOutputs(); - // outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList(); - anythingChanged = true; - } + string newName = EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle); + if (newName != this.currentNucleus.name) { + this.currentNucleus.name = newName; + anythingChanged = true; } // Current output value @@ -204,7 +187,7 @@ namespace NanoBrain { if (this.currentNucleus is MemoryCell memory) MemoryCellInspector(memory, ref anythingChanged); // Cluster - else if (cluster != null) + else if (this.currentNucleus is Cluster cluster) ClusterInspector(cluster, ref anythingChanged); // Other else @@ -230,10 +213,8 @@ namespace NanoBrain { bool connecting = GUILayout.Button("Add Output Neuron"); if (connecting) { - Nucleus newOutput = new Neuron(this.prefab, "New Output"); - // Regenerate the temporary clsuter instance - // See also the constructor - this.currentCluster = new(this.prefab); + Nucleus newOutput = new Neuron(this.currentCluster, "New Output"); + this.currentCluster.Refresh(); this.currentNucleus = newOutput; this.selectedOutput = this.currentNucleus; } @@ -249,8 +230,8 @@ namespace NanoBrain { int instanceCount = cluster.instanceCount; if (instanceCount <= 1) { - if (cluster.siblingClusters != null && cluster.siblingClusters.Length > 1) - instanceCount = cluster.siblingClusters.Count(); + if (cluster.instances != null && cluster.instances.Length > 1) + instanceCount = cluster.instances.Count(); else instanceCount = 1; } @@ -268,8 +249,8 @@ namespace NanoBrain { } EditorGUILayout.EndHorizontal(); - if (GUILayout.Button("Reimport Cluster")) - ReimportCluster(cluster); + // if (GUILayout.Button("Reimport Cluster")) + // ReimportCluster(cluster); } protected void NucleusInspector(Nucleus nucleus, ref bool anythingChanged) { @@ -281,9 +262,9 @@ namespace NanoBrain { if (breakOnWake && this.currentNucleus is Neuron currentNeuron) { if (currentNeuron.isSleeping == false) Debug.Break(); + // trace = EditorGUILayout.Toggle("Trace", trace); + // currentNeuron.trace = trace; } - trace = EditorGUILayout.Toggle("Trace", trace); - this.currentNucleus.trace = trace; } protected void SynapsesInspector(ref bool anythingChanged) { @@ -293,31 +274,30 @@ namespace NanoBrain { Neuron.CombinatorType newCombinator = (Neuron.CombinatorType)EditorGUILayout.EnumPopup("Combinator", neuron2.combinator); anythingChanged |= newCombinator != neuron2.combinator; neuron2.combinator = newCombinator; - } - EditorGUIUtility.wideMode = true; - float previousLabelWidth = EditorGUIUtility.labelWidth; - EditorGUIUtility.labelWidth = 100; + EditorGUIUtility.wideMode = true; + float previousLabelWidth = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 100; - Vector3 newBias = EditorGUILayout.Vector3Field("Bias", this.currentNucleus.bias); - if (newBias != this.currentPrefabNucleus.bias) { - anythingChanged |= newBias != this.currentNucleus.bias; - this.currentPrefabNucleus.bias = newBias; - this.currentNucleus.bias = newBias; + Vector3 newBias = EditorGUILayout.Vector3Field("Bias", neuron2.bias); + if (newBias != neuron2.bias) { + anythingChanged |= newBias != neuron2.bias; + neuron2.bias = newBias; + } + EditorGUIUtility.labelWidth = previousLabelWidth; } - EditorGUIUtility.labelWidth = previousLabelWidth; Nucleus[] array = null; int elementIx = -1; - if (this.currentPrefabNucleus.synapses.Count > 0) { - Synapse[] synapses = this.currentPrefabNucleus.synapses.ToArray(); + if (this.currentNucleus is Neuron currentNeuron && currentNeuron.synapses.Count > 0) { + Synapse[] synapses = currentNeuron.synapses.ToArray(); foreach (Synapse synapse in synapses) { if (synapse.neuron == null) continue; if (array != null) { if (synapse.neuron.parent is Cluster iCluster && elementIx > 0) { - int thisElementIx = Cluster.GetNucleusIndex(iCluster.clusterNuclei, synapse.neuron); + int thisElementIx = Cluster.GetNucleusIndex(iCluster.nuclei, synapse.neuron); if (thisElementIx == elementIx) continue; else @@ -330,9 +310,9 @@ namespace NanoBrain { } else { if (synapse.neuron.parent is Cluster iReceptor) { - array = iReceptor.siblingClusters; + array = iReceptor.instances; if (iReceptor is Cluster iCluster) - elementIx = Cluster.GetNucleusIndex(iCluster.clusterNuclei, synapse.neuron); + elementIx = Cluster.GetNucleusIndex(iCluster.nuclei, synapse.neuron); } } @@ -348,21 +328,19 @@ namespace NanoBrain { else { EditorGUILayout.BeginHorizontal(); - if (synapse.neuron.clusterPrefab != this.currentNucleus.clusterPrefab) { + if (synapse.neuron.parent != this.currentNucleus.parent) { // If it is a different cluster GUIStyle labelStyle = new(GUI.skin.label); float labelWidth = 200; - if (synapse.neuron.clusterPrefab != null) { - labelWidth = labelStyle.CalcSize(new GUIContent($"{synapse.neuron.clusterPrefab.name}.")).x; - GUILayout.Label($"{synapse.neuron.clusterPrefab.name}", GUILayout.Width(labelWidth)); + if (synapse.neuron.parent != null) { + labelWidth = labelStyle.CalcSize(new GUIContent($"{synapse.neuron.parent.name}.")).x; + GUILayout.Label($"{synapse.neuron.parent.name}", GUILayout.Width(labelWidth)); } - string[] options = synapse.neuron.clusterPrefab.nuclei.Select(n => n.name).ToArray(); + string[] options = synapse.neuron.parent.nuclei.Select(n => n.name).ToArray(); int selectedIndex = System.Array.IndexOf(options, synapse.neuron.name); int newIndex = EditorGUILayout.Popup(selectedIndex, options); if (newIndex != selectedIndex) { - // Nucleus selectedNucleus = synapse.neuron.parent.clusterNuclei[newIndex]; - // Neuron newNeuron = selectedNucleus as Neuron; - Neuron newNeuron = synapse.neuron.clusterPrefab.nuclei[newIndex] as Neuron; + Neuron newNeuron = synapse.neuron.parent.nuclei[newIndex] as Neuron; ChangeSynapse(synapse, newNeuron); } } @@ -370,13 +348,12 @@ namespace NanoBrain { GUILayout.Label(synapse.neuron.name); bool disconnecting = GUILayout.Button("Disconnect", GUILayout.Width(80)); - if (disconnecting && synapse.neuron is Neuron synapseNeuron) { - synapseNeuron.RemoveReceiver(this.currentNucleus); - this.prefab.GarbageCollection(); + if (disconnecting) { + synapse.neuron.RemoveReceiver(this.currentNucleus); + this.currentCluster.Refresh(); anythingChanged = true; } EditorGUILayout.EndHorizontal(); - } EditorGUI.indentLevel++; @@ -443,13 +420,14 @@ namespace NanoBrain { } protected virtual void AddNeuronInput(Nucleus nucleus) { - Neuron newNeuroid = new(this.prefab, "New neuron"); - newNeuroid.AddReceiver(nucleus); - this.currentNucleus = newNeuroid; + Neuron newNeuron = new(this.currentCluster, "New Neuron"); + //Neuron newNeuroid = new(this.prefab.cluster, "New neuron"); + newNeuron.AddReceiver(nucleus); + this.currentNucleus = newNeuron; } protected virtual void AddMemoryCellInput(Nucleus nucleus) { - MemoryCell newMemory = new(this.prefab, "New memory cell"); + MemoryCell newMemory = new(this.prefab.cluster, "New memory cell"); newMemory.AddReceiver(nucleus); this.currentNucleus = newMemory; } @@ -458,34 +436,34 @@ namespace NanoBrain { ClusterPickerWindow.ShowPicker(brain => OnClusterPicked(nucleus, brain), "Select Cluster"); } private void OnClusterPicked(Nucleus nucleus, ClusterPrefab selectedPrefab) { - Cluster subclusterInstance = new(selectedPrefab, this.prefab); + Cluster subclusterInstance = new(selectedPrefab, this.currentCluster); subclusterInstance.defaultOutput.AddReceiver(nucleus); } - private void ReimportCluster(Cluster subCluster) { - if (subCluster.siblingClusters == null || subCluster.siblingClusters.Length <= 0) { - Cluster reimportedCluster = new(subCluster.prefab, this.prefab); - subCluster.MoveReceivers(reimportedCluster); - // subcluster should be garbage now... - this.currentNucleus = reimportedCluster; - } - else { - this.currentNucleus = null; - List newSiblingsList = new(); - foreach (Cluster sibling in subCluster.siblingClusters) { - Cluster reimportedCluster = new(sibling.prefab, this.prefab) { - name = sibling.name - }; - sibling.MoveReceivers(reimportedCluster); - newSiblingsList.Add(reimportedCluster); - // make the first reimportedCluster the new current nucleus - this.currentNucleus ??= reimportedCluster; - } - Cluster[] newSiblings = newSiblingsList.ToArray(); - foreach (Cluster sibling in newSiblings) - sibling.siblingClusters = newSiblings; - } - } + // private void ReimportCluster(Cluster subCluster) { + // if (subCluster.siblingClusters == null || subCluster.siblingClusters.Length <= 0) { + // Cluster reimportedCluster = new(subCluster.prefab, this.prefab); + // subCluster.MoveReceivers(reimportedCluster); + // // subcluster should be garbage now... + // this.currentNucleus = reimportedCluster; + // } + // else { + // this.currentNucleus = null; + // List newSiblingsList = new(); + // foreach (Cluster sibling in subCluster.siblingClusters) { + // Cluster reimportedCluster = new(sibling.prefab, this.prefab) { + // name = sibling.name + // }; + // sibling.MoveReceivers(reimportedCluster); + // newSiblingsList.Add(reimportedCluster); + // // make the first reimportedCluster the new current nucleus + // this.currentNucleus ??= reimportedCluster; + // } + // Cluster[] newSiblings = newSiblingsList.ToArray(); + // foreach (Cluster sibling in newSiblings) + // sibling.siblingClusters = newSiblings; + // } + // } int selectedConnectNucleus = -1; // Connect to another nucleus @@ -493,11 +471,12 @@ namespace NanoBrain { if (cluster == null) return false; - IEnumerable synapseNuclei = this.currentNucleus.synapses + Neuron currentNeuron = this.currentNucleus as Neuron; + IEnumerable synapseNuclei = currentNeuron.synapses .Where(synapse => synapse.neuron != null) .Select(synapse => synapse.neuron); - IEnumerable nuclei = cluster.nuclei + IEnumerable nuclei = cluster.cluster.nuclei .Except(synapseNuclei); IEnumerable nucleiNames = nuclei .Select(n => { @@ -513,10 +492,13 @@ namespace NanoBrain { EditorGUILayout.EndHorizontal(); if (connecting) { Nucleus nucleus = nuclei.ElementAt(selectedConnectNucleus); - if (nucleus is Cluster subCluster) - subCluster.AddArrayReceiver(this.currentNucleus); - else if (nucleus is Neuron neuron) - neuron.AddReceiver(this.currentNucleus); + // if (nucleus is Cluster subCluster) { + // subCluster.AddArrayReceiver(this.currentNucleus); + // } + // else + if (nucleus is Neuron neuron) + neuron.AddReceiver(this.currentNucleus); + this.currentCluster.Refresh(); } return connecting; } @@ -537,10 +519,10 @@ namespace NanoBrain { // this.prefab.nuclei.Remove(nucleus); // Neuron.Delete(nucleus); - this.prefab.RefreshOutputs(); + this.prefab.cluster.RefreshOutputs(); - this.currentNucleus = this.prefab.output; + this.currentNucleus = this.prefab.cluster.defaultOutput; this.selectedOutput = this.currentNucleus; } @@ -558,11 +540,6 @@ namespace NanoBrain { AddInput(selectedType, this.currentNucleus); } return connecting; - // if (selectedType == Nucleus.Type.None) - // return false; - - // AddInput(selectedType, this.currentNucleus); - // return true; } protected virtual void ChangeSynapse(Synapse synapse, Neuron newNucleus) { @@ -596,8 +573,8 @@ namespace NanoBrain { // } // else { // it is a neuron in a subcluster - synapseNeuron.RemoveReceiver(this.currentPrefabNucleus); - newNucleus.AddReceiver(this.currentPrefabNucleus); + synapseNeuron.RemoveReceiver(this.currentNucleus); + newNucleus.AddReceiver(this.currentNucleus); // } } else { @@ -606,19 +583,6 @@ namespace NanoBrain { } } - protected virtual void DisconnectNucleus(Neuron nucleus) { - if (this.currentNucleus.clusterPrefab == null) - return; - string[] names = this.currentNucleus.synapses.Select(synapse => synapse.neuron.name).ToArray(); - int selectedIndex = -1; - selectedIndex = EditorGUILayout.Popup("Disconnect from", selectedIndex, names); - if (selectedIndex >= 0 && selectedIndex < this.currentNucleus.clusterPrefab.nuclei.Count) { - Synapse synapse = this.currentNucleus.synapses[selectedIndex]; - Neuron synapseNeuron = synapse.neuron as Neuron; - synapseNeuron.RemoveReceiver(this.currentNucleus); - } - } - #endregion Synapses #endregion Inspector diff --git a/Editor/ClusterEditor.cs.meta b/Editor/ClusterEditor.cs.meta index a1a18f5..a933254 100644 --- a/Editor/ClusterEditor.cs.meta +++ b/Editor/ClusterEditor.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 1fc1fb7db9f7ad54a87d31313e7f457d \ No newline at end of file +guid: 1fc1fb7db9f7ad54a87d31313e7f457d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/ClusterViewer.cs b/Editor/ClusterViewer.cs index 5f11269..b6e006a 100644 --- a/Editor/ClusterViewer.cs +++ b/Editor/ClusterViewer.cs @@ -106,10 +106,12 @@ namespace NanoBrain { public void SetGraph(GameObject gameObject) { this.gameObject = gameObject; + if (this.currentCluster == null) + return; if (Application.isPlaying == false) this.serializedBrain = new SerializedObject(this.currentCluster.prefab); - this.selectedOutput = this.currentCluster.outputs[0]; + this.selectedOutput = this.currentCluster.defaultOutput; this.currentNucleus = this.selectedOutput; Rebuild(); } @@ -128,7 +130,7 @@ namespace NanoBrain { } public void OnIMGUI() { - if (Application.isPlaying == false) + if (Application.isPlaying == false && serializedBrain != null) serializedBrain.Update(); Handles.BeginGUI(); @@ -211,7 +213,8 @@ namespace NanoBrain { } private void DescendGraph(Dag.Node receiver, ref int ix, Dag dag) { - foreach (Synapse synapse in receiver.nucleus.synapses) { + Neuron receiverNeuron = receiver.nucleus as Neuron; + foreach (Synapse synapse in receiverNeuron.synapses) { Nucleus nucleus = synapse.neuron; if (nucleus.parent != null && nucleus.parent != currentNucleus.parent) { nucleus = nucleus.parent; @@ -267,7 +270,7 @@ namespace NanoBrain { Handles.color = Color.black; Handles.DrawAAConvexPolygon(verts); int row = 0; - if (cluster.siblingClusters == null) { + if (cluster.instances == null) { Vector3 pos = new(150, margin + row * spacing, 0.0f); Handles.color = Color.white; // The selected sibling highlight ring @@ -276,7 +279,7 @@ namespace NanoBrain { row++; } else { - foreach (Cluster sibling in cluster.siblingClusters) { + foreach (Cluster sibling in cluster.instances) { Vector3 pos = new(150, margin + row * spacing, 0.0f); Handles.color = Color.white; // The selected sibling highlight ring @@ -384,6 +387,9 @@ namespace NanoBrain { } protected void DrawSynapses(Nucleus nucleus, Vector3 parentPos, float size) { + if (nucleus is not Neuron neuron) + return; + if (this.selectedSynapseNeuron != null) { DrawClusterSynapses(this.selectedSynapseNeuron, parentPos, size); return; @@ -396,7 +402,7 @@ namespace NanoBrain { float maxValue = 0; int neuronCount = 0; List drawnNeuronNames = new(); - foreach (Synapse synapse in nucleus.synapses) { + foreach (Synapse synapse in neuron.synapses) { if (synapse.neuron == null) continue; @@ -423,7 +429,7 @@ namespace NanoBrain { int row = 0; //List drawnNeurons = new(); drawnNeuronNames = new(); - foreach (Synapse synapse in nucleus.synapses) { + foreach (Synapse synapse in neuron.synapses) { if (synapse.neuron is null) continue; @@ -453,14 +459,14 @@ namespace NanoBrain { } protected void DrawClusterSynapses(Nucleus nucleus, Vector3 parentPos, float size) { - if (nucleus == null || nucleus.parent == null || nucleus.parent.siblingClusters == null) + if (nucleus == null || nucleus.parent == null || nucleus.parent.instances == null) return; // Hack to disable showing labels expandArray = true; float maxValue = 0; - foreach (Cluster sibling in nucleus.parent.siblingClusters) { + foreach (Cluster sibling in nucleus.parent.instances) { Neuron siblingNeuron = sibling.GetNucleus(nucleus.name) as Neuron; float value = siblingNeuron.outputMagnitude; // no need to add weight as they are all the same if (value > maxValue) @@ -472,7 +478,7 @@ namespace NanoBrain { float margin = 10 + spacing / 2; int row = 0; - foreach (Cluster sibling in nucleus.parent.siblingClusters) { + foreach (Cluster sibling in nucleus.parent.instances) { Neuron siblingNeuron = sibling.GetNucleus(nucleus.name) as Neuron; Vector3 position = new(250, margin + row * spacing, 0.0f); DrawEdge(parentPos, position); @@ -482,14 +488,15 @@ namespace NanoBrain { maxValue = 1; float brightness = siblingNeuron.outputMagnitude / maxValue; color = new Color(brightness, brightness, brightness, 1f); - } DrawNucleus(siblingNeuron, position, size, color); + } + DrawNucleus(siblingNeuron, position, size, color); GUIStyle style = new(EditorStyles.label) { alignment = TextAnchor.UpperCenter, normal = { textColor = Color.white }, fontStyle = FontStyle.Bold, }; Vector3 labelPos = position - Vector3.down * (size + 5); // below neuron - string name = $"{sibling.baseName}.{nucleus.name}"; + string name = $"{sibling.baseName}\n{nucleus.name}"; Handles.Label(labelPos, name, style); row++; } @@ -497,6 +504,9 @@ namespace NanoBrain { } protected void DrawOutputs(Vector2 parentPos, float size) { + if (this.currentCluster == null) + return; + // Determine the maximum value in this layer // This is used to 'scale' the output value colors of the nuclei float maxValue = 0; @@ -603,18 +613,12 @@ namespace NanoBrain { if (nucleus.parent != null && currentNucleus != null && nucleus.parent != currentNucleus.parent && nucleus.parent is Cluster parentCluster1) { // This neuron is part of another cluster parentCluster1.name ??= ""; - string baseName = ""; int colonPos = parentCluster1.name.IndexOf(":"); + string baseName; if (colonPos > 0 && colonPos < parentCluster1.name.Length - 2) - baseName = parentCluster1.name[..colonPos] + "."; + baseName = parentCluster1.name[..colonPos] + "\n"; else - baseName = parentCluster1.name + "."; - // if (colonPos > 0 && colonPos < parentCluster1.name.Length - 2) { - // // if it is an array, we should not show the :0 of the first element - // //baseName = baseName[..colonPos]; - // Handles.Label(labelPos, baseName + nucleus.name, style); - // } - // else + baseName = parentCluster1.name + "\n"; Handles.Label(labelPos, baseName + nucleus.name, style); } else { @@ -686,8 +690,8 @@ namespace NanoBrain { Handles.Label(labelPosition, cluster.instanceCount.ToString(), labelTextStyle); labelTextStyle.normal.textColor = Color.white; } - else if (cluster.siblingClusters != null && cluster.siblingClusters.Length > 1) { - Handles.Label(labelPosition, cluster.siblingClusters.Length.ToString(), labelTextStyle); + else if (cluster.instances != null && cluster.instances.Length > 1) { + Handles.Label(labelPosition, cluster.instances.Length.ToString(), labelTextStyle); labelTextStyle.normal.textColor = Color.white; } } @@ -849,22 +853,34 @@ namespace NanoBrain { void OnSceneGUI(SceneView sceneView) { if (this.gameObject != null) { - // if (this.currentNucleus is IReceptor receptor) { - // foreach (Nucleus nucleus in receptor.nucleiArray) { - // if (nucleus is Neuron neuron) { - // Vector3 worldVector = this.gameObject.transform.TransformVector(neuron.outputValue); - // Handles.color = Color.yellow; - // Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); - // } - // } - // } - // else { - if (this.currentNucleus is Neuron currentNeuron) { - Vector3 worldVector = this.gameObject.transform.TransformVector(currentNeuron.outputValue); - Handles.color = Color.yellow; - Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); + + Handles.color = Color.yellow; + if (this.selectedSynapseNeuron != null) { + foreach (Cluster sibling in this.selectedSynapseNeuron.parent.instances) { + Neuron siblingNeuron = sibling.GetNucleus(this.selectedSynapseNeuron.name) as Neuron; + Vector3 worldVector = this.gameObject.transform.TransformVector(siblingNeuron.outputValue); + Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); + } + // if (this.currentNucleus is Cluster cluster) { + // foreach (Cluster sibling in cluster.siblingClusters) { + + // } + // } + // // if (this.currentNucleus is IReceptor receptor) { + // // foreach (Nucleus nucleus in receptor.nucleiArray) { + // // if (nucleus is Neuron neuron) { + // // Vector3 worldVector = this.gameObject.transform.TransformVector(neuron.outputValue); + // // Handles.color = Color.yellow; + // // Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); + // // } + // // } + } + else { + if (this.currentNucleus is Neuron currentNeuron) { + Vector3 worldVector = this.gameObject.transform.TransformVector(currentNeuron.outputValue); + Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector); + } } - // } } } diff --git a/Editor/ClusterViewer.cs.meta b/Editor/ClusterViewer.cs.meta index ac68b91..7859dec 100644 --- a/Editor/ClusterViewer.cs.meta +++ b/Editor/ClusterViewer.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 4fe58945c76d153edacc220597474ad2 \ No newline at end of file +guid: 4fe58945c76d153edacc220597474ad2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/ConfigurationChecker.cs.meta b/Editor/ConfigurationChecker.cs.meta index b8bea95..68e2048 100644 --- a/Editor/ConfigurationChecker.cs.meta +++ b/Editor/ConfigurationChecker.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: c7539a20f7894542ca347730cd8417b1 \ No newline at end of file +guid: c7539a20f7894542ca347730cd8417b1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Neuron_Drawer.cs b/Editor/Neuron_Drawer.cs new file mode 100644 index 0000000..6cb226c --- /dev/null +++ b/Editor/Neuron_Drawer.cs @@ -0,0 +1,83 @@ +using UnityEngine; +using UnityEditor; +using Unity.Mathematics; +using System; +using System.Reflection; +using System.Collections; + +namespace NanoBrain { + [CustomPropertyDrawer(typeof(Neuron))] + class Neuron_Drawer : PropertyDrawer { + public static void Insepctor(SerializedObject serializedObject, string propertyName ) { + EditorGUILayout.PropertyField(serializedObject.FindProperty(propertyName)); + } + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { + // Draw foldout + properties + label = EditorGUI.BeginProperty(position, label, property); + + // Begin indent block + int indent = EditorGUI.indentLevel; + EditorGUI.indentLevel = 0; + + object instance = GetTargetObjectOfProperty(property); + + float lineHeight = EditorGUIUtility.singleLineHeight; + Rect r = new(position.x, position.y, position.width, lineHeight); + if (instance != null) { + FieldInfo field = typeof(Neuron).GetField("_outputValue", BindingFlags.NonPublic | BindingFlags.Instance); + if (field != null) { + float3 val = (float3)field.GetValue(instance); + EditorGUI.Vector3Field(r, $"Neuron: {label}", val); + } + } + + EditorGUI.indentLevel = indent; + EditorGUI.EndProperty(); + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) { + // height for 1 line + return (EditorGUIUtility.singleLineHeight * 1) + (EditorGUIUtility.standardVerticalSpacing * 0); + } + + public static object GetTargetObjectOfProperty(SerializedProperty prop) { + var path = prop.propertyPath.Replace(".Array.data[", "["); + object obj = prop.serializedObject.targetObject; + var elements = path.Split('.'); + foreach (var element in elements) { + if (element.Contains("[")) { + var elementName = element.Substring(0, element.IndexOf("[")); + var index = Convert.ToInt32(element.Substring(element.IndexOf("[")).Replace("[", "").Replace("]", "")); + obj = GetValue_Imp(obj, elementName, index); + } + else { + obj = GetValue_Imp(obj, element); + } + } + return obj; + } + + static object GetValue_Imp(object source, string name) { + if (source == null) + return null; + + Type t = source.GetType(); + FieldInfo f = t.GetField(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + if (f != null) + return f.GetValue(source); + PropertyInfo p = t.GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + return p?.GetValue(source, null); + } + static object GetValue_Imp(object source, string name, int index) { + if (GetValue_Imp(source, name) is not IEnumerable enumerable) + return null; + IEnumerator en = enumerable.GetEnumerator(); + for (int i = 0; i <= index; i++) { + if (!en.MoveNext()) + return null; + } + return en.Current; + } + } +} \ No newline at end of file diff --git a/Editor/Neuron_Drawer.cs.meta b/Editor/Neuron_Drawer.cs.meta new file mode 100644 index 0000000..b3a4b00 --- /dev/null +++ b/Editor/Neuron_Drawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aa0e340763ca6299e93d514b271ae38d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/README.md b/README.md new file mode 100644 index 0000000..017fe3f --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# %NanoBrain + +Documentation is found in the [Documentation folder](Documentation/html/index.html) diff --git a/README.md.meta b/README.md.meta new file mode 100644 index 0000000..65c5817 --- /dev/null +++ b/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4235740baccf09756af4db8495cd8f87 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/LinearAlgebra/.editorconfig b/Runtime/LinearAlgebra/.editorconfig deleted file mode 100644 index 1ec7f97..0000000 --- a/Runtime/LinearAlgebra/.editorconfig +++ /dev/null @@ -1,19 +0,0 @@ -# EditorConfig is awesome: https://EditorConfig.org - -# top-most EditorConfig file -root = true - -[*] -indent_style = space -indent_size = 4 -end_of_line = crlf -charset = utf-8 -trim_trailing_whitespace = false -insert_final_newline = false -max_line_length = 80 - -[*.cs] -csharp_new_line_before_open_brace = none -# Suppress warnings everywhere -dotnet_diagnostic.IDE1006.severity = none -dotnet_diagnostic.IDE0130.severity = none \ No newline at end of file diff --git a/Runtime/LinearAlgebra/.gitea/workflows/unit_tests.yaml b/Runtime/LinearAlgebra/.gitea/workflows/unit_tests.yaml deleted file mode 100644 index e98b26e..0000000 --- a/Runtime/LinearAlgebra/.gitea/workflows/unit_tests.yaml +++ /dev/null @@ -1,37 +0,0 @@ -name: Build and Run C# Unit Tests - -on: - push: - branches: - - '**' - pull_request: - branches: - - '**' - -jobs: - build-and-test: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Setup .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: '8.0.x' # Specify the .NET SDK version - - - name: Check Current Directory - run: pwd # Logs the current working directory - - - name: List Files - run: ls -la # Lists all files in the current directory - - - name: Restore Dependencies - run: dotnet restore ./LinearAlgebra-csharp.sln # Restore NuGet packages - - - name: Build the Project - run: dotnet build ./LinearAlgebra-csharp.sln --configuration Release # Build the C# project - - - name: Run Unit Tests - run: dotnet test ./test/LinearAlgebra_Test.csproj --configuration Release # Execute unit tests diff --git a/Runtime/LinearAlgebra/.gitignore b/Runtime/LinearAlgebra/.gitignore deleted file mode 100644 index b32a30c..0000000 --- a/Runtime/LinearAlgebra/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -DoxyGen/DoxyWarnLogfile.txt -.vscode/settings.json -**bin -**obj -**.meta diff --git a/Runtime/LinearAlgebra/LinearAlgebra-csharp.sln b/Runtime/LinearAlgebra/LinearAlgebra-csharp.sln deleted file mode 100644 index 4b13b2b..0000000 --- a/Runtime/LinearAlgebra/LinearAlgebra-csharp.sln +++ /dev/null @@ -1,30 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.5.2.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LinearAlgebra", "src\LinearAlgebra.csproj", "{ECB58727-0354-924D-AE7B-22F6B21097EB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LinearAlgebra_Test", "test\LinearAlgebra_Test.csproj", "{715BB399-5FC4-2AC9-3757-177CA0C80774}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {ECB58727-0354-924D-AE7B-22F6B21097EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ECB58727-0354-924D-AE7B-22F6B21097EB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ECB58727-0354-924D-AE7B-22F6B21097EB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ECB58727-0354-924D-AE7B-22F6B21097EB}.Release|Any CPU.Build.0 = Release|Any CPU - {715BB399-5FC4-2AC9-3757-177CA0C80774}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {715BB399-5FC4-2AC9-3757-177CA0C80774}.Debug|Any CPU.Build.0 = Debug|Any CPU - {715BB399-5FC4-2AC9-3757-177CA0C80774}.Release|Any CPU.ActiveCfg = Release|Any CPU - {715BB399-5FC4-2AC9-3757-177CA0C80774}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {E93B8294-87D4-4887-83B7-182A623D5833} - EndGlobalSection -EndGlobal diff --git a/Runtime/LinearAlgebra/src/Angle.cs b/Runtime/LinearAlgebra/src/Angle.cs deleted file mode 100644 index 7d2fd6b..0000000 --- a/Runtime/LinearAlgebra/src/Angle.cs +++ /dev/null @@ -1,341 +0,0 @@ -using System; - -namespace LinearAlgebra { - - public struct AngleFloat { - public const float Rad2Deg = 360.0f / ((float)Math.PI * 2); //0.0174532924F; - public const float Deg2Rad = (float)Math.PI * 2 / 360.0f; //57.29578F; - - private AngleFloat(float degrees) { - this.value = degrees; - } - private readonly float value; - - public static AngleFloat Degrees(float degrees) { - // Reduce it to (-180..180] - if (float.IsFinite(degrees)) { - while (degrees < -180) - degrees += 360; - while (degrees >= 180) - degrees -= 360; - } - return new AngleFloat(degrees); - } - - public static AngleFloat Radians(float radians) { - // Reduce it to (-pi..pi] - if (float.IsFinite(radians)) { - while (radians <= -Math.PI) - radians += 2 * (float)Math.PI; - while (radians > Math.PI) - radians -= 2 * (float)Math.PI; - } - - return new AngleFloat(radians * Rad2Deg); - } - - public static AngleFloat Revolutions(float revolutions) { - // reduce it to (-0.5 .. 0.5] - if (float.IsFinite(revolutions)) { - // Get the integer part - int integerPart = (int)revolutions; - - // Get the decimal part - revolutions -= integerPart; - if (revolutions < -0.5) - revolutions += 1; - if (revolutions >= 0.5) - revolutions -= 1; - } - return new AngleFloat(revolutions * 360); - } - - public readonly float inDegrees => this.value; - - public readonly float inRadians => this.value * Deg2Rad; - - public readonly float inRevolutions => this.value / 360.0f; - - public override string ToString() { - return $"{this.inDegrees}\u00B0"; - } - - public static readonly AngleFloat zero = Degrees(0); - public static readonly AngleFloat deg90 = Degrees(90); - public static readonly AngleFloat deg180 = Degrees(180); - - /// - /// Get the sign of the angle - /// - /// The angle - /// -1 when the angle is negative, 1 when it is positive and 0 in all other cases - public static int Sign(AngleFloat a) { - if (a.value < 0) - return -1; - if (a.value > 0) - return 1; - return 0; - } - - /// - /// Returns the magnitude of the angle - /// - /// The angle - /// The positive magnitude of the angle - /// Negative values are negated to get a positive result - public static AngleFloat Abs(AngleFloat a) { - if (Sign(a) < 0) - return -a; - else - return a; - } - - /// - /// Tests the equality of two angles - /// - /// - /// - /// True when the angles are equal, false otherwise - /// The equality is determine within the limits of precision of a float - public static bool operator ==(AngleFloat a1, AngleFloat a2) { - return a1.value == a2.value; - } - - /// - /// Tests the inequality of two angles - /// - /// - /// - /// True when the angles are not equal, false otherwise - /// The equality is determine within the limits of precision of a float - public static bool operator !=(AngleFloat a1, AngleFloat a2) { - return a1.value != a2.value; - } - - public override readonly bool Equals(object obj) { - if (obj is AngleFloat other) { - return this == other; - } - return false; - } - - public override readonly int GetHashCode() { - return this.value.GetHashCode(); - } - - - /// - /// Tests if the first angle is greater than the second - /// - /// - /// - /// True when a1 is greater than a2, False otherwise - public static bool operator >(AngleFloat a1, AngleFloat a2) { - return a1.value > a2.value; - } - - /// - /// Tests if the first angle is greater than or equal to the second - /// - /// - /// - /// True when a1 is greater than or equal to a2, False otherwise - public static bool operator >=(AngleFloat a1, AngleFloat a2) { - return a1.value >= a2.value; - } - - /// - /// Tests if the first angle is less than the second - /// - /// - /// - /// True when a1 is less than a2, False otherwise - public static bool operator <(AngleFloat a1, AngleFloat a2) { - return a1.value < a2.value; - } - - /// - /// Tests if the first angle is less than or equal to the second - /// - /// - /// - /// True when a1 is less than or equal to a2, False otherwise - public static bool operator <=(AngleFloat a1, AngleFloat a2) { - return a1.value <= a2.value; - } - - /// - /// Negate the angle - /// - /// The angle - /// The negated angle - /// The negation of -180 is still -180 because the range is (-180..180] - public static AngleFloat operator -(AngleFloat a) { - AngleFloat r = new(-a.value); - return r; - } - - /// - /// Subtract two angles - /// - /// Angle 1 - /// Angle 2 - /// The result of the subtraction - public static AngleFloat operator -(AngleFloat a1, AngleFloat a2) { - AngleFloat r = new(a1.value - a2.value); - return r; - } - /// - /// Add two angles - /// - /// Angle 1 - /// Angle 2 - /// The result of the addition - public static AngleFloat operator +(AngleFloat a1, AngleFloat a2) { - AngleFloat r = new(a1.value + a2.value); - return r; - } - - /// - /// Multiplies the angle - /// - /// The angle to multiply - /// The factor by which the angle is multiplied - /// The multiplied angle - public static AngleFloat operator *(AngleFloat a, float factor) { - return Degrees(a.inDegrees * factor); - } - public static AngleFloat operator *(float factor, AngleFloat a) { - return Degrees(factor * a.inDegrees); - } - - /// - /// Clamp the angle between the given min and max values - /// - /// The angle to clamp - /// The minimum angle - /// The maximum angle - /// The clamped angle - /// Angles are normalized - public static float Clamp(AngleFloat angle, AngleFloat min, AngleFloat max) { - return Float.Clamp(angle.inDegrees, min.inDegrees, max.inDegrees); - } - - /// @brief Calculates the cosine of an angle - /// @param angle The given angle - /// @return The cosine of the angle - public static float Cos(AngleFloat angle) { - return MathF.Cos(angle.inRadians); - } - /// @brief Calculates the sine of an angle - /// @param angle The given angle - /// @return The sine of the angle - public static float Sin(AngleFloat angle) { - return MathF.Sin(angle.inRadians); - } - /// @brief Calculates the tangent of an angle - /// @param angle The given angle - /// @return The tangent of the angle - public static float Tan(AngleFloat angle) { - return MathF.Tan(angle.inRadians); - } - - /// @brief Calculates the arc cosine angle - /// @param f The value - /// @return The arc cosine for the given value - public static AngleFloat Acos(float f) { - return Radians(MathF.Acos(f)); - } - /// @brief Calculates the arc sine angle - /// @param f The value - /// @return The arc sine for the given value - public static AngleFloat Asin(float f) { - return Radians(MathF.Asin(f)); - } - /// @brief Calculates the arc tangent angle - /// @param f The value - /// @return The arc tangent for the given value - public static AngleFloat Atan(float f) { - return Radians(MathF.Atan(f)); - } - /// @brief Calculates the tangent for the given values - /// @param y The vertical value - /// @param x The horizontal value - /// @return The tanget for the given values - /// Uses the y and x signs to compute the quadrant - public static AngleFloat Atan2(float y, float x) { - return Radians(MathF.Atan2(y, x)); - } - - /// - /// Rotate from one angle to the other with a maximum degrees - /// - /// Starting angle - /// Target angle - /// Maximum angle to rotate - /// The resulting angle - /// This function is compatible with radian and degrees angles - public static AngleFloat MoveTowards(AngleFloat fromAngle, AngleFloat toAngle, float maxDegrees) { - maxDegrees = Math.Max(0, maxDegrees); // filter out negative distances - AngleFloat d = toAngle - fromAngle; - float dDegrees = Abs(d).inDegrees; - d = Degrees(Float.Clamp(dDegrees, 0, maxDegrees)); - if (Sign(d) < 0) - d = -d; - return fromAngle + d; - } - } - - - /// - /// %Angle utilities - /// - public static class Angles { - public const float pi = 3.1415927410125732421875F; - // public static float Rad2Deg = 360.0f / ((float)Math.PI * 2); - // public static float Deg2Rad = ((float)Math.PI * 2) / 360.0f; - - - /// - /// Determine the angle difference, result is a normalized angle - /// - /// First first angle - /// The second angle - /// the angle between the two angles - /// Angle values should be degrees - public static float Difference(float a, float b) { - float r = Normalize(b - a); - return r; - } - - /// - /// Normalize an angle to the range -180 < angle <= 180 - /// - /// The angle to normalize - /// The normalized angle in interval (-180..180] - /// Angle values should be in degrees - public static float Normalize(float angle) { - if (float.IsInfinity(angle)) - return angle; - - while (angle <= -180) angle += 360; - while (angle > 180) angle -= 360; - return angle; - } - - /// - /// Map interval of angles between vectors [0..Pi] to interval [0..1] - /// - /// The first vector - /// The second vector - /// The resulting factor in interval [0..1] - /// Vectors a and b must be normalized - /// \deprecated Please use Vector2.ToFactor instead. - // [Obsolete("Please use Vector2.ToFactor instead.")] - // public static float ToFactor(Vector2Float v1, Vector2Float v2) { - // return (1 - Vector2Float.Dot(v1, v2)) / 2; - // } - - } - -} \ No newline at end of file diff --git a/Runtime/LinearAlgebra/src/Decomposition.cs b/Runtime/LinearAlgebra/src/Decomposition.cs deleted file mode 100644 index ddaf434..0000000 --- a/Runtime/LinearAlgebra/src/Decomposition.cs +++ /dev/null @@ -1,287 +0,0 @@ -using System; -namespace LinearAlgebra { - class QR { - // QR Decomposition of a matrix A - public static (Matrix2 Q, Matrix2 R) Decomposition(Matrix2 A) { - int nRows = A.nRows; - int nCols = A.nCols; - - float[,] Q = new float[nRows, nCols]; - float[,] R = new float[nCols, nCols]; - - // Perform Gram-Schmidt orthogonalization - for (uint colIx = 0; colIx < nCols; colIx++) { - - // Step 1: v = column(ix) of A - float[] v = new float[nRows]; - for (int rowIx = 0; rowIx < nRows; rowIx++) - v[rowIx] = A.data[rowIx, colIx]; - - // Step 2: Subtract projections of v onto previous q's (orthogonalize) - for (uint colIx2 = 0; colIx2 < colIx; colIx2++) { - float dotProd = 0; - for (int i = 0; i < nRows; i++) - dotProd += Q[i, colIx2] * v[i]; - for (int i = 0; i < nRows; i++) - v[i] -= dotProd * Q[i, colIx2]; - } - - // Step 3: Normalize v to get column(ix) of Q - float norm = 0; - for (int rowIx = 0; rowIx < nRows; rowIx++) - norm += v[rowIx] * v[rowIx]; - norm = (float)Math.Sqrt(norm); - - for (int rowIx = 0; rowIx < nRows; rowIx++) - Q[rowIx, colIx] = v[rowIx] / norm; - - // Store the coefficients of R - for (int colIx2 = 0; colIx2 <= colIx; colIx2++) { - R[colIx2, colIx] = 0; - for (int k = 0; k < nRows; k++) - R[colIx2, colIx] += Q[k, colIx2] * A.data[k, colIx]; - } - } - return (new Matrix2(Q), new Matrix2(R)); - } - - // Reduced QR Decomposition of a matrix A - public static (Matrix2 Q, Matrix2 R) ReducedDecomposition(Matrix2 A) { - int nRows = A.nRows; - int nCols = A.nCols; - - float[,] Q = new float[nRows, nCols]; - float[,] R = new float[nCols, nCols]; - - // Perform Gram-Schmidt orthogonalization - for (int colIx = 0; colIx < nCols; colIx++) { - - // Step 1: v = column(colIx) of A - float[] columnIx = new float[nRows]; - bool isZeroColumn = true; - for (int rowIx = 0; rowIx < nRows; rowIx++) { - columnIx[rowIx] = A.data[rowIx, colIx]; - if (columnIx[rowIx] != 0) - isZeroColumn = false; - } - if (isZeroColumn) { - for (int rowIx = 0; rowIx < nRows; rowIx++) - Q[rowIx, colIx] = 0; - // Set corresponding R element to 0 - R[colIx, colIx] = 0; - - Console.WriteLine($"zero column {colIx}"); - - continue; - } - - // Step 2: Subtract projections of v onto previous q's (orthogonalize) - for (int colIx2 = 0; colIx2 < colIx; colIx2++) { - // Compute the dot product of v and column(colIx2) of Q - float dotProduct = 0; - for (int rowIx2 = 0; rowIx2 < nRows; rowIx2++) - dotProduct += columnIx[rowIx2] * Q[rowIx2, colIx2]; - // Subtract the projection from v - for (int rowIx2 = 0; rowIx2 < nRows; rowIx2++) - columnIx[rowIx2] -= dotProduct * Q[rowIx2, colIx2]; - } - - // Step 3: Normalize v to get column(colIx) of Q - float norm = 0; - for (int rowIx = 0; rowIx < nRows; rowIx++) - norm += columnIx[rowIx] * columnIx[rowIx]; - if (norm == 0) - throw new Exception("invalid value"); - - norm = (float)Math.Sqrt(norm); - - for (int rowIx = 0; rowIx < nRows; rowIx++) - Q[rowIx, colIx] = columnIx[rowIx] / norm; - - // Here is where it deviates from the Full QR Decomposition ! - - // Step 4: Compute the row(colIx) of R - for (int colIx2 = colIx; colIx2 < nCols; colIx2++) { - float dotProduct = 0; - for (int rowIx2 = 0; rowIx2 < nRows; rowIx2++) - dotProduct += Q[rowIx2, colIx] * A.data[rowIx2, colIx2]; - R[colIx, colIx2] = dotProduct; - } - } - if (!float.IsFinite(R[0, 0])) - throw new Exception("invalid value"); - - return (new Matrix2(Q), new Matrix2(R)); - } - } - - class SVD { - // According to ChatGPT, Mathnet uses Golub-Reinsch SVD algorithm - // 1. Bidiagonalization: The input matrix AA is reduced to a bidiagonal form using Golub-Kahan bidiagonalization. - // This process involves applying a sequence of Householder reflections to AA to create a bidiagonal matrix. - // This step reduces the complexity by making the matrix simpler while retaining the essential structure needed for SVD. - // - // 2. Diagonalization: Once the matrix is in bidiagonal form, - // the singular values are computed using an iterative process - // (typically involving QR factorization or Jacobi rotations) until convergence. - // This process diagonalizes the bidiagonal matrix and allows extraction of the singular values. - // - // 3. Computing UU and VTVT: After obtaining the singular values, - // the left singular vectors UU and right singular vectors VTVT are computed - // using the accumulated transformations (such as Householder reflections) from the bidiagonalization step. - - // Bidiagnolizations through Householder transformations - public static (Matrix2 U1, Matrix2 B, Matrix2 V1) Bidiagonalization(Matrix2 A) { - int m = A.nRows; // Rows of A - int n = A.nCols; // Columns of A - float[,] U1 = new float[m, m]; // Left orthogonal matrix - float[,] V1 = new float[n, n]; // Right orthogonal matrix - float[,] B = A.Clone().data; // Copy A to B for transformation - - // Initialize U1 and V1 as identity matrices - for (int i = 0; i < m; i++) - U1[i, i] = 1; - for (int i = 0; i < n; i++) - V1[i, i] = 1; - - // Perform Householder reflections to create a bidiagonal matrix B - for (int j = 0; j < n; j++) { - // Step 1: Construct the Householder vector y - float[] y = new float[m - j]; - for (int i = j; i < m; i++) - y[i - j] = B[i, j]; - - // Step 2: Compute the norm and scalar alpha - float norm = 0; - for (int i = 0; i < y.Length; i++) - norm += y[i] * y[i]; - norm = (float)Math.Sqrt(norm); - - if (B[j, j] > 0) - norm = -norm; - - float alpha = (float)Math.Sqrt(0.5 * (norm * (norm - B[j, j]))); - float r = (float)Math.Sqrt(0.5 * (norm * (norm + B[j, j]))); - - // Step 3: Apply the reflection to zero out below diagonal - for (int k = j; k < n; k++) { - float dot = 0; - for (int i = j; i < m; i++) - dot += y[i - j] * B[i, k]; - dot /= r; - - for (int i = j; i < m; i++) - B[i, k] -= 2 * dot * y[i - j]; - } - - // Step 4: Update U1 with the Householder reflection (U1 * Householder) - for (int i = j; i < m; i++) - U1[i, j] = y[i - j] / alpha; - - // Step 5: Update V1 (storing the Householder vector y) - // Correct indexing: we only need to store part of y in V1 from index j to n - for (int i = j; i < n; i++) - V1[j, i] = B[j, i]; - - // Repeat steps for further columns if necessary - } - return (new Matrix2(U1), new Matrix2(B), new Matrix2(V1)); - } - - public static Matrix2 Bidiagonalize(Matrix2 A) { - int m = A.nRows; // Rows of A - int n = A.nCols; // Columns of A - float[,] B = A.Clone().data; // Copy A to B for transformation - - // Perform Householder reflections to create a bidiagonal matrix B - for (int j = 0; j < n; j++) { - // Step 1: Construct the Householder vector y - float[] y = new float[m - j]; - for (int i = j; i < m; i++) - y[i - j] = B[i, j]; - - // Step 2: Compute the norm and scalar alpha - float norm = 0; - for (int i = 0; i < y.Length; i++) - norm += y[i] * y[i]; - norm = (float)Math.Sqrt(norm); - - if (B[j, j] > 0) - norm = -norm; - - float r = (float)Math.Sqrt(0.5 * (norm * (norm + B[j, j]))); - - // Step 3: Apply the reflection to zero out below diagonal - for (int k = j; k < n; k++) { - float dot = 0; - for (int i = j; i < m; i++) - dot += y[i - j] * B[i, k]; - dot /= r; - - for (int i = j; i < m; i++) - B[i, k] -= 2 * dot * y[i - j]; - } - - // Repeat steps for further columns if necessary - } - return new Matrix2(B); - } - - // QR Iteration for diagonalization of a bidiagonal matrix B - public static (Matrix1 singularValues, Matrix2 U, Matrix2 Vt) QRIteration(Matrix2 B) { - int m = B.nRows; - int n = B.nCols; - - Matrix2 U = new(m, m); // Left singular vectors (U) - Matrix2 Vt = new(n, n); // Right singular vectors (V^T) - float[] singularValues = new float[Math.Min(m, n)]; // Singular values - - // Initialize U and Vt as identity matrices - for (int i = 0; i < m; i++) - U.data[i, i] = 1; - for (int i = 0; i < n; i++) - Vt.data[i, i] = 1; - - // Perform QR iterations - float tolerance = 1e-7f; //1e-12f; for double - bool converged = false; - while (!converged) { - // Perform QR decomposition on the matrix B - (Matrix2 Q, Matrix2 R) = QR.Decomposition(B); - - // Update B to be the product Q * R //R * Q - B = R * Q; - - // Accumulate the transformations in U and Vt - U *= Q; - Vt *= R; - - // Check convergence by looking at the off-diagonal elements of B - converged = true; - for (int i = 0; i < m - 1; i++) { - for (int j = i + 1; j < n; j++) { - if (Math.Abs(B.data[i, j]) > tolerance) { - converged = false; - break; - } - } - } - } - - // Extract singular values (diagonal elements of B) - for (int i = 0; i < Math.Min(m, n); i++) - singularValues[i] = B.data[i, i]; - - return (new Matrix1(singularValues), U, Vt); - } - - public static (Matrix2 U, Matrix1 S, Matrix2 Vt) Decomposition(Matrix2 A) { - if (A.nRows != A.nCols) - throw new ArgumentException("SVD: matrix A has to be square."); - - Matrix2 B = Bidiagonalize(A); - (Matrix1 S, Matrix2 U, Matrix2 Vt) = QRIteration(B); - return (U, S, Vt); - } - } -} \ No newline at end of file diff --git a/Runtime/LinearAlgebra/src/Direction.cs b/Runtime/LinearAlgebra/src/Direction.cs deleted file mode 100644 index fd25b98..0000000 --- a/Runtime/LinearAlgebra/src/Direction.cs +++ /dev/null @@ -1,261 +0,0 @@ -using System; -#if UNITY_5_3_OR_NEWER -using Vector3Float = UnityEngine.Vector3; -#endif - -namespace LinearAlgebra -{ - - /// - /// A direction in 3D space - /// - /// A direction is represented using two angles: - /// * The horizontal angle ranging from -180 (inclusive) to 180 (exclusive) - /// degrees which is a rotation in the horizontal plane - /// * A vertical angle ranging from -90 (inclusive) to 90 (exclusive) degrees - /// which is the rotation in the up/down direction applied after the horizontal - /// rotation has been applied. - /// The angles are automatically normalized to stay within the abovenmentioned - /// ranges. - public struct Direction - { - /// @brief horizontal angle, range = (-180..180] degrees - public AngleFloat horizontal; - /// @brief vertical angle, range in degrees = (-90..90] degrees - public AngleFloat vertical; - - /// - /// Create a new direction - /// - /// The horizontal angle - /// The vertical angle - /// The direction will be normalized automatically - /// to ensure the angles are within the allowed ranges - public Direction(AngleFloat horizontal, AngleFloat vertical) - { - this.horizontal = horizontal; - this.vertical = vertical; - this.Normalize(); - } - - /// - /// Create a direction using angle values in degrees - /// - /// The horizontal angle in degrees - /// The vertical angle in degrees - /// The direction - /// The direction will be normalized automatically - /// to ensure the angles are within the allowed ranges - public static Direction Degrees(float horizontal, float vertical) - { - Direction d = new() - { - horizontal = AngleFloat.Degrees(horizontal), - vertical = AngleFloat.Degrees(vertical) - }; - d.Normalize(); - return d; - } - /// - /// Create a direction using angle values in radians - /// - /// The horizontal angle in radians - /// The vertical angle in radians - /// The direction - public static Direction Radians(float horizontal, float vertical) - { - Direction d = new() - { - horizontal = AngleFloat.Radians(horizontal), - vertical = AngleFloat.Radians(vertical) - }; - d.Normalize(); - return d; - } - - public override readonly string ToString() { - return $"Direction(h: {this.horizontal}, v: {this.vertical})"; - } - - /// - /// A forward direction with zero for both angles - /// - public readonly static Direction forward = Degrees(0, 0); - /// - /// A backward direction with horizontal angle -180 and zero vertical - /// angle - /// - public readonly static Direction backward = Degrees(-180, 0); - /// - /// A upward direction with zero horizontal angle and vertical angle 90 - /// - public readonly static Direction up = Degrees(0, 90); - /// - /// A downward direction with zero horizontal angle and vertical angle - /// -90 - /// - public readonly static Direction down = Degrees(0, -90); - /// - /// A left-pointing direction with horizontal angle -90 and zero - /// vertical angle - /// - public readonly static Direction left = Degrees(-90, 0); - /// - /// A right-pointing direction with horizontal angle 90 and zero - /// vertical angle - /// - public readonly static Direction right = Degrees(90, 0); - - private void Normalize() - { - if (this.vertical > AngleFloat.deg90 || this.vertical < -AngleFloat.deg90) - { - this.horizontal += AngleFloat.deg180; - this.vertical = AngleFloat.Degrees(180 - this.vertical.inDegrees); - } - } - -#if UNITY_5_3_OR_NEWER - /// - /// Convert the direction into a carthesian vector - /// - /// The carthesian vector corresponding to this direction. - public readonly UnityEngine.Vector3 ToVector3() { - // Convert degrees to radians - float radH = this.horizontal.inRadians; - float radV = this.vertical.inRadians; - - // Calculate Vector - float cosV = MathF.Cos(radV); - float sinV = MathF.Sin(radV); - - float x = cosV * MathF.Sin(radH); - float y = sinV; - float z = cosV * MathF.Cos(radH); - - return new UnityEngine.Vector3(x, y, z); - } - - /// - /// Convert a carthesian vector into a direction - /// - /// The carthesian vector - /// The direction - /// Information about the length of the carthesian vector is not - /// included in this transformation - public static Direction FromVector3(UnityEngine.Vector3 v) { - AngleFloat horizontal = AngleFloat.Atan2(v.x, v.z); - AngleFloat vertical = AngleFloat.deg90 - AngleFloat.Acos(v.y); - Direction d = new(horizontal, vertical); - return d; - } -#else - /// - /// Convert the direction into a carthesian vector - /// - /// The carthesian vector corresponding to this direction. - public readonly Vector3Float ToVector3() { - // Quaternion q = Quaternion.Euler(90 - this.vertical.inDegrees, this.horizontal.inDegrees, 0); - // Vector3Float v = q * Vector3Float.forward; - // return v; - - float radH = this.horizontal.inRadians; - float radV = this.vertical.inRadians; - - float cosV = MathF.Cos(radV); - float sinV = MathF.Sin(radV); - - float horizontal = cosV * MathF.Sin(radH); - float vertical = sinV; - float depth = cosV * MathF.Cos(radH); - - return new Vector3Float(horizontal, vertical, depth); - } - - /// - /// Convert a carthesian vector into a direction - /// - /// The carthesian vector - /// The direction - /// Information about the length of the carthesian vector is not - /// included in this transformation - public static Direction FromVector3(Vector3Float v) - { - AngleFloat horizontal = AngleFloat.Atan2(v.horizontal, v.depth); - AngleFloat vertical = AngleFloat.deg90 - AngleFloat.Acos(v.vertical); - Direction d = new(horizontal, vertical); - return d; - } -#endif - - public static Direction operator -(Direction d) { - AngleFloat horizontal = d.horizontal + AngleFloat.deg180; - AngleFloat vertical = -d.vertical; - return new Direction(horizontal, vertical); - } - - /// - /// Tests the equality of two directions - /// - /// - /// - /// True when the direction angles are equal, false otherwise. - public static bool operator ==(Direction d1, Direction d2) - { - bool horizontalEq = d1.horizontal == d2.horizontal; - bool verticalEq = d1.vertical == d2.vertical; - return horizontalEq && verticalEq; - } - - /// - /// Tests the inequality of two directions - /// - /// - /// - /// True when the direction angles are not equal, false otherwise. - public static bool operator !=(Direction d1, Direction d2) - { - bool horizontalNEq = d1.horizontal != d2.horizontal; - bool verticalNEq = d1.vertical != d2.vertical; - return horizontalNEq || verticalNEq; - } - - public override readonly bool Equals(object obj) - { - if (obj is not Direction d) - return false; - - bool horizontalEq = this.horizontal == d.horizontal; - bool verticalEq = this.vertical == d.vertical; - return horizontalEq && verticalEq; - } - - - public override readonly int GetHashCode() - { - return HashCode.Combine(horizontal, vertical); - } - - public static AngleFloat UnsignedAngle(Direction d1, Direction d2) { - // Convert angles from degrees to radians - float horizontal1Rad = d1.horizontal.inRadians; - float vertical1Rad = d1.vertical.inRadians; - - float horizontal2Rad = d2.horizontal.inRadians; - float vertical2Rad = d2.vertical.inRadians; - - // Calculate the cosine of the angle using the spherical law of cosines - float cosTheta = MathF.Sin(vertical1Rad) * MathF.Sin(vertical2Rad) + - MathF.Cos(vertical1Rad) * MathF.Cos(vertical2Rad) * - MathF.Cos(horizontal1Rad - horizontal2Rad); - - // Clip cosTheta to the valid range for acos - cosTheta = Float.Clamp(cosTheta, -1.0f, 1.0f); - - // Calculate the angle - AngleFloat angle = AngleFloat.Acos(cosTheta); - return angle; - } - } - -} \ No newline at end of file diff --git a/Runtime/LinearAlgebra/src/Float.cs b/Runtime/LinearAlgebra/src/Float.cs deleted file mode 100644 index 2217b84..0000000 --- a/Runtime/LinearAlgebra/src/Float.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace LinearAlgebra { - - /// - /// Float number utilities - /// - public class Float { - /// - /// The precision of float numbers - /// - public const float epsilon = 1E-05f; - /// - /// The square of the float number precision - /// - public const float sqrEpsilon = 1e-10f; - - /// - /// Clamp the value between the given minimum and maximum values - /// - /// The value to clamp - /// The minimum value - /// The maximum value - /// The clamped value - public static float Clamp(float f, float min, float max) { - if (f < min) - return min; - if (f > max) - return max; - return f; - } - - /// - /// Clamp the value between to the interval [0..1] - /// - /// The value to clamp - /// The clamped value - public static float Clamp01(float f) { - return Clamp(f, 0, 1); - } - } - -} \ No newline at end of file diff --git a/Runtime/LinearAlgebra/src/LinearAlgebra.csproj b/Runtime/LinearAlgebra/src/LinearAlgebra.csproj deleted file mode 100644 index d2d5a85..0000000 --- a/Runtime/LinearAlgebra/src/LinearAlgebra.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - false - false - net8.0 - - - - - - - - diff --git a/Runtime/LinearAlgebra/src/Matrix.cs b/Runtime/LinearAlgebra/src/Matrix.cs deleted file mode 100644 index 37c6c24..0000000 --- a/Runtime/LinearAlgebra/src/Matrix.cs +++ /dev/null @@ -1,689 +0,0 @@ -using System; -#if UNITY_5_3_OR_NEWER -using Vector3Float = UnityEngine.Vector3; -using Vector2Float = UnityEngine.Vector2; -using Quaternion = UnityEngine.Quaternion; -#endif - -namespace LinearAlgebra { - - public readonly struct Slice - { - public int start { get; } - public int stop { get; } - public Slice(int start, int stop) - { - this.start = start; - this.stop = stop; - } - } - - public class Matrix2 { - public float[,] data { get; } - - public int nRows => data.GetLength(0); - public int nCols => data.GetLength(1); - - public Matrix2(int nRows, int nCols) - { - this.data = new float[nRows, nCols]; - } - public Matrix2(float[,] data) { - this.data = data; - } - - public Matrix2 Clone() { - float[,] data = new float[this.nRows, nCols]; - for (int rowIx = 0; rowIx < this.nRows; rowIx++) { - for (int colIx = 0; colIx < this.nCols; colIx++) - data[rowIx, colIx] = this.data[rowIx, colIx]; - } - return new Matrix2(data); - } - - public static Matrix2 Zero(int nRows, int nCols) - { - return new Matrix2(nRows, nCols); - } - - public static Matrix2 FromVector3(Vector3Float v) { - float[,] result = new float[3, 1]; - result[0, 0] = v.horizontal; - result[1, 0] = v.vertical; - result[2, 0] = v.depth; - return new Matrix2(result); - } - - public static Matrix2 Identity(int size) - { - return Diagonal(1, size); - } - public static Matrix2 Identity(int nRows, int nCols) - { - Matrix2 m = Zero(nRows, nCols); - m.FillDiagonal(1); - return m; - } - - public static Matrix2 Diagonal(Matrix1 v) { - float[,] resultData = new float[v.size, v.size]; - for (int ix = 0; ix < v.size; ix++) - resultData[ix, ix] = v.data[ix]; - return new Matrix2(resultData); - } - public static Matrix2 Diagonal(float f, int size) - { - float[,] resultData = new float[size, size]; - for (int ix = 0; ix < size; ix++) - resultData[ix, ix] = f; - return new Matrix2(resultData); - } - public void FillDiagonal(Matrix1 v) - { - int n = (int)Math.Min(Math.Min(this.nRows, this.nCols), v.size); - for (int ix = 0; ix < n; ix++) - this.data[ix, ix] = v.data[ix]; - } - public void FillDiagonal(float f) - { - int n = Math.Min(this.nRows, this.nCols); - for (int ix = 0; ix < n; ix++) - this.data[ix, ix] = f; - } - - public static Matrix2 SkewMatrix(Vector3Float v) { - float[,] result = new float[3, 3] { - {0, -v.depth, v.vertical}, - {v.depth, 0, -v.horizontal}, - {-v.vertical, v.horizontal, 0} - }; - return new Matrix2(result); - } - - public Matrix1 GetRow(int rowIx) { - float[] row = new float[this.nCols]; - for (int colIx = 0; colIx < this.nCols; colIx++) { - row[colIx] = this.data[rowIx, colIx]; - } - return new Matrix1(row); - } - -#if UNITY_5_3_OR_NEWER - public UnityEngine.Vector3 GetRow3(int rowIx) { - int cols = this.nCols; - UnityEngine.Vector3 row = new() { - x = this.data[rowIx, 0], - y = this.data[rowIx, 1], - z = this.data[rowIx, 2] - }; - return row; - } -#endif - public void SetRow(int rowIx, Matrix1 v) { - for (uint ix = 0; ix < v.size; ix++) - this.data[rowIx, ix] = v.data[ix]; - } - public void SetRow3(int rowIx, Vector3Float v) { - this.data[rowIx, 0] = v.horizontal; - this.data[rowIx, 1] = v.vertical; - this.data[rowIx, 2] = v.depth; - } - - public void SwapRows(int row1, int row2) { - for (uint ix = 0; ix < this.nCols; ix++) { - float temp = this.data[row1, ix]; - this.data[row1, ix] = this.data[row2, ix]; - this.data[row2, ix] = temp; - } - } - - public Matrix1 GetColumn(int colIx) - { - float[] column = new float[this.nRows]; - for (int i = 0; i < this.nRows; i++) { - column[i] = this.data[i, colIx]; - } - return new Matrix1(column); - } - public void SetColumn(int colIx, Matrix1 v) { - for (uint ix = 0; ix < v.size; ix++) - this.data[ix, colIx] = v.data[ix]; - } - public void SetColumn(int colIx, Vector3Float v) { - this.data[0, colIx] = v.horizontal; - this.data[1, colIx] = v.vertical; - this.data[2, colIx] = v.depth; - } - - public static bool AllClose(Matrix2 A, Matrix2 B, float atol = 1e-08f) { - for (int i = 0; i < A.nRows; i++) { - for (int j = 0; j < A.nCols; j++) { - float d = MathF.Abs(A.data[i, j] - B.data[i, j]); - if (d > atol) - return false; - } - } - return true; - } - - public Matrix2 Transpose() { - float[,] resultData = new float[this.nCols, this.nRows]; - for (uint rowIx = 0; rowIx < this.nRows; rowIx++) { - for (uint colIx = 0; colIx < this.nCols; colIx++) - resultData[colIx, rowIx] = this.data[rowIx, colIx]; - } - return new Matrix2(resultData); - // double checked code - } - public Matrix2 transposed { - get => Transpose(); - } - - public static Matrix2 operator -(Matrix2 m) { - float[,] result = new float[m.nRows, m.nCols]; - - for (int i = 0; i < m.nRows; i++) { - for (int j = 0; j < m.nCols; j++) - result[i, j] = -m.data[i, j]; - } - return new Matrix2(result); - } - - public static Matrix2 operator -(Matrix2 A, Matrix2 B) { - if (A.nRows != B.nRows || A.nCols != B.nCols) - throw new System.ArgumentException("Size of A must match size of B."); - - float[,] result = new float[A.nRows, B.nCols]; - - for (int i = 0; i < A.nRows; i++) { - for (int j = 0; j < A.nCols; j++) - result[i, j] = A.data[i, j] - B.data[i, j]; - } - return new Matrix2(result); - } - - public static Matrix2 operator +(Matrix2 A, Matrix2 B) { - if (A.nRows != B.nRows || A.nCols != B.nCols) - throw new System.ArgumentException("Size of A must match size of B."); - - float[,] result = new float[A.nRows, B.nCols]; - - for (int i = 0; i < A.nRows; i++) { - for (int j = 0; j < A.nCols; j++) - result[i, j] = A.data[i, j] + B.data[i, j]; - } - return new Matrix2(result); - } - - public static Matrix2 operator *(Matrix2 A, Matrix2 B) { - if (A.nCols != B.nRows) - throw new System.ArgumentException("Number of columns in A must match number of rows in B."); - - float[,] result = new float[A.nRows, B.nCols]; - - for (int i = 0; i < A.nRows; i++) { - for (int j = 0; j < B.nCols; j++) { - float sum = 0.0f; - for (int k = 0; k < A.nCols; k++) - sum += A.data[i, k] * B.data[k, j]; - - result[i, j] = sum; - } - } - - return new Matrix2(result); - // double checked code - } - - public static Matrix1 operator *(Matrix2 A, Matrix1 v) { - float[] result = new float[A.nRows]; - - for (int i = 0; i < A.nRows; i++) { - for (int j = 0; j < A.nCols; j++) { - result[i] += A.data[i, j] * v.data[j]; - } - } - - return new Matrix1(result); - } - - public static Vector3Float operator *(Matrix2 A, Vector3Float v) { - return new Vector3Float( - A.data[0, 0] * v.horizontal + A.data[0, 1] * v.vertical + A.data[0, 2] * v.depth, - A.data[1, 0] * v.horizontal + A.data[1, 1] * v.vertical + A.data[1, 2] * v.depth, - A.data[2, 0] * v.horizontal + A.data[2, 1] * v.vertical + A.data[2, 2] * v.depth - ); - } - - public static Matrix2 operator *(Matrix2 A, float s) { - float[,] result = new float[A.nRows, A.nCols]; - - for (int i = 0; i < A.nRows; i++) { - for (int j = 0; j < A.nCols; j++) - result[i, j] = A.data[i, j] * s; - } - - return new Matrix2(result); - } - public static Matrix2 operator *(float s, Matrix2 A) { - return A * s; - } - - public static Matrix2 operator /(Matrix2 A, float s) { - float[,] result = new float[A.nRows, A.nCols]; - - for (int i = 0; i < A.nRows; i++) { - for (int j = 0; j < A.nCols; j++) - result[i, j] = A.data[i, j] / s; - } - - return new Matrix2(result); - } - public static Matrix2 operator /(float s, Matrix2 A) { - float[,] result = new float[A.nRows, A.nCols]; - - for (int i = 0; i < A.nRows; i++) { - for (int j = 0; j < A.nCols; j++) - result[i, j] = s / A.data[i, j]; - } - - return new Matrix2(result); - } - - public Matrix2 GetRows(Slice slice) { - return GetRows(slice.start, slice.stop); - } - public Matrix2 GetRows(int from, int to) { - if (from < 0 || to >= this.nRows) - throw new System.ArgumentException("Slice index out of range."); - - float[,] result = new float[to - from, this.nCols]; - int resultRowIx = 0; - for (int rowIx = from; rowIx < to; rowIx++) { - for (int colIx = 0; colIx < this.nCols; colIx++) - result[resultRowIx, colIx] = this.data[rowIx, colIx]; - - resultRowIx++; - } - - return new Matrix2(result); - } - - public Matrix2 Slice(Slice slice) - { - return Slice(slice.start, slice.stop); - } - public Matrix2 Slice(int from, int to) - { - if (from < 0 || to >= this.nRows) - throw new System.ArgumentException("Slice index out of range."); - - float[,] result = new float[to - from, this.nCols]; - int resultRowIx = 0; - for (int rowIx = from; rowIx < to; rowIx++) - { - for (int colIx = 0; colIx < this.nCols; colIx++) - { - result[resultRowIx, colIx] = this.data[rowIx, colIx]; - } - resultRowIx++; - } - - return new Matrix2(result); - } - public Matrix2 Slice(Slice rowRange, Slice colRange) { - return Slice((rowRange.start, rowRange.stop), (colRange.start, colRange.stop)); - } - public Matrix2 Slice((int start, int stop) rowRange, (int start, int stop) colRange) - { - float[,] result = new float[rowRange.stop - rowRange.start, colRange.stop - colRange.start]; - - int resultRowIx = 0; - int resultColIx = 0; - for (int i = rowRange.start; i < rowRange.stop; i++) - { - for (int j = colRange.start; j < colRange.stop; j++) - result[resultRowIx, resultColIx] = this.data[i, j]; - } - return new Matrix2(result); - } - - public void UpdateSlice(Slice slice, Matrix2 m) { - UpdateSlice((slice.start, slice.stop), m); - } - public void UpdateSlice((int start, int stop) slice, Matrix2 m) { - // if (slice.start == slice.stop) - // Console.WriteLine("WARNING: no data is updates when start equals stop in a slice!"); - int mRowIx = 0; - for (int rowIx = slice.start; rowIx < slice.stop; rowIx++, mRowIx++) { - for (int colIx = 0; colIx < this.nCols; colIx++) - this.data[rowIx, colIx] = m.data[mRowIx, colIx]; - } - } - - public void UpdateSlice(Slice rowRange, Slice colRange, Matrix2 m) - { - UpdateSlice((rowRange.start, rowRange.stop), (colRange.start, colRange.stop), m); - } - public void UpdateSlice((int start, int stop) rowRange, (int start, int stop) colRange, Matrix2 m) - { - for (int i = rowRange.start; i < rowRange.stop; i++) - { - for (int j = colRange.start; j < colRange.stop; j++) - this.data[i, j] = m.data[i - rowRange.start, j - colRange.start]; - } - } - - public Matrix2 Inverse() { - Matrix2 A = this; - // unchecked - int n = A.nRows; - - // Create an identity matrix of the same size as the original matrix - float[,] augmentedMatrix = new float[n, 2 * n]; - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - augmentedMatrix[i, j] = A.data[i, j]; - augmentedMatrix[i, j + n] = (i == j) ? 1 : 0; // Identity matrix - } - } - - // Perform Gaussian elimination - for (int i = 0; i < n; i++) { - // Find the pivot row - float pivot = augmentedMatrix[i, i]; - if (Math.Abs(pivot) < 1e-10) // Check for singular matrix - throw new InvalidOperationException("Matrix is singular and cannot be inverted."); - - // Normalize the pivot row - for (int j = 0; j < 2 * n; j++) - augmentedMatrix[i, j] /= pivot; - - // Eliminate the column below the pivot - for (int j = i + 1; j < n; j++) { - float factor = augmentedMatrix[j, i]; - for (int k = 0; k < 2 * n; k++) - augmentedMatrix[j, k] -= factor * augmentedMatrix[i, k]; - } - } - - // Back substitution - for (int i = n - 1; i >= 0; i--) - { - // Eliminate the column above the pivot - for (int j = i - 1; j >= 0; j--) - { - float factor = augmentedMatrix[j, i]; - for (int k = 0; k < 2 * n; k++) - augmentedMatrix[j, k] -= factor * augmentedMatrix[i, k]; - } - } - - // Extract the inverse matrix from the augmented matrix - float[,] inverse = new float[n, n]; - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) - inverse[i, j] = augmentedMatrix[i, j + n]; - } - - return new Matrix2(inverse); - } - - public float Determinant() - { - int n = this.nRows; - if (n != this.nCols) - throw new System.ArgumentException("Matrix must be square."); - - if (n == 1) - return this.data[0, 0]; // Base case for 1x1 matrix - - if (n == 2) // Base case for 2x2 matrix - return this.data[0, 0] * this.data[1, 1] - this.data[0, 1] * this.data[1, 0]; - - float det = 0; - for (int col = 0; col < n; col++) - det += (col % 2 == 0 ? 1 : -1) * this.data[0, col] * this.Minor(0, col).Determinant(); - - return det; - } - - // Helper function to compute the minor of a matrix - private Matrix2 Minor(int rowToRemove, int colToRemove) - { - int n = this.nRows; - float[,] minor = new float[n - 1, n - 1]; - - int r = 0, c = 0; - for (int i = 0; i < n; i++) { - if (i == rowToRemove) continue; - - c = 0; - for (int j = 0; j < n; j++) { - if (j == colToRemove) continue; - - minor[r, c] = this.data[i, j]; - c++; - } - r++; - } - - return new Matrix2(minor); - } - - public static Matrix2 DeleteRows(Matrix2 A, Slice rowRange) { - float[,] result = new float[A.nRows - (rowRange.stop - rowRange.start), A.nCols]; - - int resultRowIx = 0; - for (int i = 0; i < A.nRows; i++) { - if (i >= rowRange.start && i < rowRange.stop) - continue; - - for (int j = 0; j < A.nCols; j++) - result[resultRowIx, j] = A.data[i, j]; - - resultRowIx++; - } - return new Matrix2(result); - } - - internal static Matrix2 DeleteColumns(Matrix2 A, Slice colRange) { - float[,] result = new float[A.nRows, A.nCols - (colRange.stop - colRange.start)]; - - for (int i = 0; i < A.nRows; i++) { - int resultColIx = 0; - for (int j = 0; j < A.nCols; j++) { - if (j >= colRange.start && j < colRange.stop) - continue; - - result[i, resultColIx++] = A.data[i, j]; - } - } - return new Matrix2(result); - } - } - - public class Matrix1 - { - public float[] data { get; } - - public int size => data.GetLength(0); - - public Matrix1(int size) - { - this.data = new float[size]; - } - - public Matrix1(float[] data) { - this.data = data; - } - - public static Matrix1 Zero(int size) - { - return new Matrix1(size); - } - - public static Matrix1 FromVector2(Vector2Float v) { - float[] result = new float[2]; - result[0] = v.horizontal; - result[1] = v.vertical; - return new Matrix1(result); - } - - public static Matrix1 FromVector3(Vector3Float v) { - float[] result = new float[3]; - result[0] = v.horizontal; - result[1] = v.vertical; - result[2] = v.depth; - return new Matrix1(result); - } - -#if UNITY_5_3_OR_NEWER - public static Matrix1 FromQuaternion(Quaternion q) { - float[] result = new float[4]; - result[0] = q.x; - result[1] = q.y; - result[2] = q.z; - result[3] = q.w; - return new Matrix1(result); - } -#endif - - public Vector2Float vector2 { - get { - if (this.size != 2) - throw new System.ArgumentException("Matrix1 must be of size 2"); - return new Vector2Float(this.data[0], this.data[1]); - } - } - public Vector3Float vector3 { - get { - if (this.size != 3) - throw new System.ArgumentException("Matrix1 must be of size 3"); - return new Vector3Float(this.data[0], this.data[1], this.data[2]); - } - } - -#if UNITY_5_3_OR_NEWER - public Quaternion quaternion { - get { - if (this.size != 4) - throw new System.ArgumentException("Matrix1 must be of size 4"); - return new Quaternion(this.data[0], this.data[1], this.data[2], this.data[3]); - } - } -#endif - - public Matrix1 Clone() { - float[] data = new float[this.size]; - for (int rowIx = 0; rowIx < this.size; rowIx++) - data[rowIx] = this.data[rowIx]; - return new Matrix1(data); - } - - - public float magnitude { - get { - float sum = 0; - foreach (var elm in data) - sum += elm; - return sum / data.Length; - } - } - public static Matrix1 operator +(Matrix1 A, Matrix1 B) { - if (A.size != B.size) - throw new System.ArgumentException("Size of A must match size of B."); - - float[] result = new float[A.size]; - - for (int i = 0; i < A.size; i++) { - result[i] = A.data[i] + B.data[i]; - } - return new Matrix1(result); - } - - public Matrix2 Transpose() { - float[,] r = new float[1, this.size]; - for (uint colIx = 0; colIx < this.size; colIx++) - r[1, colIx] = this.data[colIx]; - - return new Matrix2(r); - } - - public static float Dot(Matrix1 a, Matrix1 b) { - if (a.size != b.size) - throw new System.ArgumentException("Vectors must be of the same length."); - - float result = 0.0f; - for (int i = 0; i < a.size; i++) { - result += a.data[i] * b.data[i]; - } - return result; - } - - public static Matrix1 operator -(Matrix1 A, Matrix1 B) { - if (A.size != B.size) - throw new System.ArgumentException("Size of A must match size of B."); - - float[] result = new float[A.size]; - - for (int i = 0; i < A.size; i++) { - result[i] = A.data[i] - B.data[i]; - } - return new Matrix1(result); - } - - public static Matrix1 operator *(Matrix1 A, float f) - { - float[] result = new float[A.size]; - - for (int i = 0; i < A.size; i++) - result[i] += A.data[i] * f; - - return new Matrix1(result); - } - public static Matrix1 operator *(float f, Matrix1 A) { - return A * f; - } - - public static Matrix1 operator /(Matrix1 A, float f) { - float[] result = new float[A.size]; - - for (int i = 0; i < A.size; i++) - result[i] = A.data[i] / f; - - return new Matrix1(result); - } - public static Matrix1 operator /(float f, Matrix1 A) { - float[] result = new float[A.size]; - - for (int i = 0; i < A.size; i++) - result[i] = f / A.data[i]; - - return new Matrix1(result); - } - - public Matrix1 Slice(Slice range) - { - return Slice(range.start, range.stop); - } - public Matrix1 Slice(int from, int to) - { - if (from < 0 || to >= this.size) - throw new System.ArgumentException("Slice index out of range."); - - float[] result = new float[to - from]; - int resultIx = 0; - for (int ix = from; ix < to; ix++) - result[resultIx++] = this.data[ix]; - - return new Matrix1(result); - } - public void UpdateSlice(Slice slice, Matrix1 v) { - int vIx = 0; - for (int ix = slice.start; ix < slice.stop; ix++, vIx++) - this.data[ix] = v.data[vIx]; - } - } - -} \ No newline at end of file diff --git a/Runtime/LinearAlgebra/src/Quat32.cs b/Runtime/LinearAlgebra/src/Quat32.cs deleted file mode 100644 index 19ee9bc..0000000 --- a/Runtime/LinearAlgebra/src/Quat32.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; - -namespace LinearAlgebra { - public class Quat32 { - public float x; - public float y; - public float z; - public float w; - - public Quat32() { - this.x = 0; - this.y = 0; - this.z = 0; - this.w = 1; - } - - public Quat32(float x, float y, float z, float w) { - this.x = x; - this.y = y; - this.z = z; - this.w = w; - } - - public static Quat32 FromSwingTwist(SwingTwist s) { - Quat32 q32 = Quat32.Euler(-s.swing.vertical.inDegrees, s.swing.horizontal.inDegrees, s.twist.inDegrees); - return q32; - } - - public static Quat32 Euler(float yaw, float pitch, float roll) { - float rollOver2 = roll * AngleFloat.Deg2Rad * 0.5f; - float sinRollOver2 = (float)Math.Sin((float)rollOver2); - float cosRollOver2 = (float)Math.Cos((float)rollOver2); - float pitchOver2 = pitch * 0.5f; - float sinPitchOver2 = (float)Math.Sin((float)pitchOver2); - float cosPitchOver2 = (float)Math.Cos((float)pitchOver2); - float yawOver2 = yaw * 0.5f; - float sinYawOver2 = (float)Math.Sin((float)yawOver2); - float cosYawOver2 = (float)Math.Cos((float)yawOver2); - Quat32 result = new Quat32() { - w = cosYawOver2 * cosPitchOver2 * cosRollOver2 + - sinYawOver2 * sinPitchOver2 * sinRollOver2, - x = sinYawOver2 * cosPitchOver2 * cosRollOver2 + - cosYawOver2 * sinPitchOver2 * sinRollOver2, - y = cosYawOver2 * sinPitchOver2 * cosRollOver2 - - sinYawOver2 * cosPitchOver2 * sinRollOver2, - z = cosYawOver2 * cosPitchOver2 * sinRollOver2 - - sinYawOver2 * sinPitchOver2 * cosRollOver2 - }; - return result; - } - - public void ToAngles(out float right, out float up, out float forward) { - float test = this.x * this.y + this.z * this.w; - if (test > 0.499f) { // singularity at north pole - right = 0; - up = 2 * (float)Math.Atan2(this.x, this.w) * AngleFloat.Rad2Deg; - forward = 90; - return; - //return Vector3(0, 2 * (float)atan2(this.x, this.w) * Angle.Rad2Deg, 90); - } - else if (test < -0.499f) { // singularity at south pole - right = 0; - up = -2 * (float)Math.Atan2(this.x, this.w) * AngleFloat.Rad2Deg; - forward = -90; - return; - //return Vector3(0, -2 * (float)atan2(this.x, this.w) * Angle.Rad2Deg, -90); - } - else { - float sqx = this.x * this.x; - float sqy = this.y * this.y; - float sqz = this.z * this.z; - - right = (float)Math.Atan2(2 * this.x * this.w - 2 * this.y * this.z, 1 - 2 * sqx - 2 * sqz) * AngleFloat.Rad2Deg; - up = (float)Math.Atan2(2 * this.y * this.w - 2 * this.x * this.z, 1 - 2 * sqy - 2 * sqz) * AngleFloat.Rad2Deg; - forward = (float)Math.Asin(2 * test) * AngleFloat.Rad2Deg; - return; - // return Vector3( - // atan2f(2 * this.x * this.w - 2 * this.y * this.z, 1 - 2 * sqx - 2 * sqz) * - // Rad2Deg, - // atan2f(2 * this.y * this.w - 2 * this.x * this.z, 1 - 2 * sqy - 2 * sqz) * - // Rad2Deg, - // asinf(2 * test) * Angle.Rad2Deg); - } - } - - } -} \ No newline at end of file diff --git a/Runtime/LinearAlgebra/src/Quaternion.cs b/Runtime/LinearAlgebra/src/Quaternion.cs deleted file mode 100644 index 7936843..0000000 --- a/Runtime/LinearAlgebra/src/Quaternion.cs +++ /dev/null @@ -1,582 +0,0 @@ -using System; -#if UNITY_5_3_OR_NEWER -using Quaternion = UnityEngine.Quaternion; -#endif - -namespace LinearAlgebra { - -#if UNITY_5_3_OR_NEWER - public class QuaternionExtensions { - public static Quaternion Reflect(Quaternion q) { - return new(-q.x, -q.y, -q.z, q.w); - } - - public static Matrix2 ToRotationMatrix(Quaternion q) { - float w = q.x, x = q.y, y = q.z, z = q.w; - - float[,] result = new float[,] - { - { 1 - 2 * (y * y + z * z), 2 * (x * y - w * z), 2 * (x * z + w * y) }, - { 2 * (x * y + w * z), 1 - 2 * (x * x + z * z), 2 * (y * z - w * x) }, - { 2 * (x * z - w * y), 2 * (y * z + w * x), 1 - 2 * (x * x + y * y) } - }; - return new Matrix2(result); - } - - public static Quaternion FromRotationMatrix(Matrix2 m) { - float trace = m.data[0, 0] + m.data[1, 1] + m.data[2, 2]; - float w, x, y, z; - - if (trace > 0) { - float s = 0.5f / (float)Math.Sqrt(trace + 1.0f); - w = 0.25f / s; - x = (m.data[2, 1] - m.data[1, 2]) * s; - y = (m.data[0, 2] - m.data[2, 0]) * s; - z = (m.data[1, 0] - m.data[0, 1]) * s; - } - else { - if (m.data[0, 0] > m.data[1, 1] && m.data[0, 0] > m.data[2, 2]) { - float s = 2.0f * (float)Math.Sqrt(1.0f + m.data[0, 0] - m.data[1, 1] - m.data[2, 2]); - w = (m.data[2, 1] - m.data[1, 2]) / s; - x = 0.25f * s; - y = (m.data[0, 1] + m.data[1, 0]) / s; - z = (m.data[0, 2] + m.data[2, 0]) / s; - } - else if (m.data[1, 1] > m.data[2, 2]) { - float s = 2.0f * (float)Math.Sqrt(1.0f + m.data[1, 1] - m.data[0, 0] - m.data[2, 2]); - w = (m.data[0, 2] - m.data[2, 0]) / s; - x = (m.data[0, 1] + m.data[1, 0]) / s; - y = 0.25f * s; - z = (m.data[1, 2] + m.data[2, 1]) / s; - } - else { - float s = 2.0f * (float)Math.Sqrt(1.0f + m.data[2, 2] - m.data[0, 0] - m.data[1, 1]); - w = (m.data[1, 0] - m.data[0, 1]) / s; - x = (m.data[0, 2] + m.data[2, 0]) / s; - y = (m.data[1, 2] + m.data[2, 1]) / s; - z = 0.25f * s; - } - } - - return new Quaternion(x, y, z, w); - } - } -#else - public struct Quaternion { - public float x; - public float y; - public float z; - public float w; - - /// - /// create a new quaternion with the given values - /// - /// x component - /// y component - /// z component - /// w component - public Quaternion(float x, float y, float z, float w) { - this.x = x; - this.y = y; - this.z = z; - this.w = w; - } - - /// - /// An identity quaternion - /// - public static readonly Quaternion identity = new(0, 0, 0, 1); - - private readonly Vector3Float xyz => new(x, y, z); - - private readonly float magnitude => MathF.Sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); - - private readonly float sqrMagnitude => x * x + y * y + z * z + w * w; - - /// - /// Convert to unit quaternion - /// - /// This will preserve the orientation, - /// but ensures that it is a unit quaternion. - public readonly Quaternion normalized { - get { - float length = this.magnitude; - Quaternion q = new(this.x / length, this.y / length, this.z / length, this.w / length); - return q; - } - } - - /// - /// Convert to unity quaternion - /// - /// The quaternion to convert - /// A unit quaternion - /// This will preserve the orientation, - /// but ensures that it is a unit quaternion. - public static Quaternion Normalize(Quaternion q) { - return q.normalized; - } - - /// - /// Convert to euler angles - /// - /// The quaternion to convert - /// A vector containing euler angles - /// The euler angles performed in the order: Z, X, Y - public static Vector3Float ToAngles(Quaternion q) { - // Extract Euler angles in Unity order (X = pitch, Y = yaw, Z = roll), returned in degrees as (x,pitch),(y,yaw),(z,roll) - // Handle singularities/gimbal lock - float test = 2f * (q.w * q.x - q.y * q.z); - // clamp - if (test >= 1f) test = 1f; - if (test <= -1f) test = -1f; - - float pitch = MathF.Asin(test); // X - - float roll = MathF.Atan2(2f * (q.w * q.z + q.x * q.y), - 1f - 2f * (q.x * q.x + q.z * q.z)); // Z - - float yaw = MathF.Atan2(2f * (q.w * q.y + q.x * q.z), - 1f - 2f * (q.y * q.y + q.x * q.x)); // Y - - const float rad2deg = 180f / MathF.PI; - return new Vector3Float(pitch * rad2deg, yaw * rad2deg, roll * rad2deg); - // float test = q.x * q.y + q.z * q.w; - // if (test > 0.499f) // singularity at north pole - // return new Vector3Float(0, 2 * MathF.Atan2(q.x, q.w) * AngleFloat.Rad2Deg, 90); - - // else if (test < -0.499f) // singularity at south pole - // return new Vector3Float(0, -2 * MathF.Atan2(q.x, q.w) * AngleFloat.Rad2Deg, -90); - - // else { - // float sqx = q.x * q.x; - // float sqy = q.y * q.y; - // float sqz = q.z * q.z; - - // return new Vector3Float( - // MathF.Atan2(2 * q.x * q.w - 2 * q.y * q.z, 1 - 2 * sqx - 2 * sqz) * - // AngleFloat.Rad2Deg, - // MathF.Atan2(2 * q.y * q.w - 2 * q.x * q.z, 1 - 2 * sqy - 2 * sqz) * - // AngleFloat.Rad2Deg, - // MathF.Asin(2 * test) * AngleFloat.Rad2Deg); - // } - } - - /// - /// Create a rotation from euler angles - /// - /// The angle around the right axis - /// The angle around the upward axis - /// The angle around the forward axis - /// The resulting quaternion - /// Rotation are appied in the order Z, X, Y. - public static Quaternion Euler(float x, float y, float z) { - return Quaternion.Euler(new Vector3Float(x, y, z)); - } - /// - /// Create a rotation from a vector containing euler angles - /// - /// Vector with the euler angles - /// The resulting quaternion - /// Rotation are appied in the order Z, X, Y. - public static Quaternion Euler(Vector3Float angles) { - Vector3Float euler = angles * AngleFloat.Deg2Rad; - float cx = MathF.Cos(euler.horizontal * 0.5f); - float sx = MathF.Sin(euler.horizontal * 0.5f); - float cy = MathF.Cos(euler.vertical * 0.5f); - float sy = MathF.Sin(euler.vertical * 0.5f); - float cz = MathF.Cos(euler.depth * 0.5f); - float sz = MathF.Sin(euler.depth * 0.5f); - - // Unity uses intrinsic Z, then X, then Y -> q = Qy * Qx * Qz - Quaternion q; - q.w = cy * cx * cz + sy * sx * sz; - q.x = cy * sx * cz + sy * cx * sz; - q.y = sy * cx * cz - cy * sx * sz; - q.z = cy * cx * sz - sy * sx * cz; - return q; - } - - /// - /// Multiply two quaternions - /// - /// - /// - /// The resulting rotation - public static Quaternion operator *(Quaternion q1, Quaternion q2) { - return new Quaternion( - q1.x * q2.w + q1.y * q2.z - q1.z * q2.y + q1.w * q2.x, - -q1.x * q2.z + q1.y * q2.w + q1.z * q2.x + q1.w * q2.y, - q1.x * q2.y - q1.y * q2.x + q1.z * q2.w + q1.w * q2.z, - -q1.x * q2.x - q1.y * q2.y - q1.z * q2.z + q1.w * q2.w); - } - - /// - /// Rotate a vector using this quaterion - /// - /// The rotation - /// The vector to rotate - /// The rotated vector - public static Vector3Float operator *(Quaternion q, Vector3Float v) { - float num = q.x * 2; - float num2 = q.y * 2; - float num3 = q.z * 2; - float num4 = q.x * num; - float num5 = q.y * num2; - float num6 = q.z * num3; - float num7 = q.x * num2; - float num8 = q.x * num3; - float num9 = q.y * num3; - float num10 = q.w * num; - float num11 = q.w * num2; - float num12 = q.w * num3; - - float px = v.horizontal; - float py = v.vertical; - float pz = v.depth; - float rx = - (1 - (num5 + num6)) * px + (num7 - num12) * py + (num8 + num11) * pz; - float ry = - (num7 + num12) * px + (1 - (num4 + num6)) * py + (num9 - num10) * pz; - float rz = - (num8 - num11) * px + (num9 + num10) * py + (1 - (num4 + num5)) * pz; - Vector3Float result = new(rx, ry, rz); - return result; - } - - /// - /// The inverse of quaterion - /// - /// The quaternion for which the inverse is - /// needed The inverted quaternion - public static Quaternion Inverse(Quaternion q) { - float n = MathF.Sqrt(q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w); - return new Quaternion(-q.x / n, -q.y / n, -q.z / n, q.w / n); - } - - /// - /// A rotation which looks in the given direction - /// - /// The look direction - /// The up direction - /// The look rotation - public static Quaternion LookRotation(Vector3Float forward, Vector3Float up) { - Vector3Float nForward = forward.normalized; - Vector3Float nRight = Vector3Float.Normalize(Vector3Float.Cross(up, nForward)); - Vector3Float nUp = Vector3Float.Cross(nForward, nRight); - float m00 = nRight.horizontal; // x; - float m01 = nRight.vertical; // y; - float m02 = nRight.depth; // z; - float m10 = nUp.horizontal; // x; - float m11 = nUp.vertical; // y; - float m12 = nUp.depth; // z; - float m20 = nForward.horizontal; // x; - float m21 = nForward.vertical; // y; - float m22 = nForward.depth; // z; - - float num8 = (m00 + m11) + m22; - float x, y, z, w; - if (num8 > 0) { - float num = MathF.Sqrt(num8 + 1); - w = num * 0.5f; - num = 0.5f / num; - x = (m12 - m21) * num; - y = (m20 - m02) * num; - z = (m01 - m10) * num; - return new Quaternion(x, y, z, w); - } - if ((m00 >= m11) && (m00 >= m22)) { - float num7 = MathF.Sqrt(((1 + m00) - m11) - m22); - float num4 = 0.5F / num7; - x = 0.5f * num7; - y = (m01 + m10) * num4; - z = (m02 + m20) * num4; - w = (m12 - m21) * num4; - return new Quaternion(x, y, z, w); - } - if (m11 > m22) { - float num6 = MathF.Sqrt(((1 + m11) - m00) - m22); - float num3 = 0.5F / num6; - x = (m10 + m01) * num3; - y = 0.5F * num6; - z = (m21 + m12) * num3; - w = (m20 - m02) * num3; - return new Quaternion(x, y, z, w); - } - float num5 = MathF.Sqrt(((1 + m22) - m00) - m11); - float num2 = 0.5F / num5; - x = (m20 + m02) * num2; - y = (m21 + m12) * num2; - z = 0.5F * num5; - w = (m01 - m10) * num2; - return new Quaternion(x, y, z, w); - } - - /// - /// Creates a quaternion with the given forward direction with up = - /// Vector3::up - /// - /// The look direction - /// The rotation for this direction - /// For the rotation, Vector::up is used for the up direction. - /// Note: if the forward direction == Vector3::up, the result is - /// Quaternion::identity - public static Quaternion LookRotation(Vector3Float forward) { - Vector3Float up = new(0, 1, 0); - return LookRotation(forward, up); - } - - /// - /// Calculat the rotation from on vector to another - /// - /// The from direction - /// The to direction - /// The rotation from the first to the second vector - public static Quaternion FromToRotation(Vector3Float fromDirection, Vector3Float toDirection) { - Vector3Float axis = Vector3Float.Cross(fromDirection, toDirection); - axis = axis.normalized; - AngleFloat angle = Vector3Float.SignedAngle(fromDirection, toDirection, axis); - Quaternion rotation = AngleAxis(angle, axis); - return rotation; - - } - - /// - /// Rotate form one orientation to anther with a maximum amount of degrees - /// - /// The from rotation - /// The destination rotation - /// The maximum amount of degrees to - /// rotate The possibly limited rotation - public static Quaternion RotateTowards(Quaternion from, Quaternion to, - float maxDegreesDelta) { - float num = Quaternion.UnsignedAngle(from, to); - if (num == 0) { - return to; - } - float t = MathF.Min(1, maxDegreesDelta / num); - return SlerpUnclamped(from, to, t); - - } - - /// - /// Convert an angle/axis representation to a quaternion - /// - /// The angle - /// The axis - /// The resulting quaternion - public static Quaternion AngleAxis(AngleFloat angle, Vector3Float axis) { - if (axis.sqrMagnitude == 0.0f) - return Quaternion.identity; - - float radians = angle.inRadians; - radians *= 0.5f; - - Vector3Float axis2 = axis * MathF.Sin(radians); - float x = axis2.horizontal; // x; - float y = axis2.vertical; // y; - float z = axis2.depth; // z; - float w = MathF.Cos(radians); - - return new Quaternion(x, y, z, w).normalized; - } - /// - /// Convert this quaternion to angle/axis representation - /// - /// A pointer to the angle for the result - /// A pointer to the axis for the result - public readonly void ToAngleAxis(out AngleFloat angle, out Vector3Float axis) { - Quaternion q1 = (MathF.Abs(this.w) > 1.0f) ? this.normalized : this; - angle = AngleFloat.Radians(2.0f * MathF.Acos(q1.w)); // angle - float den = MathF.Sqrt(1.0F - q1.w * q1.w); - if (den > 0.0001f) { - axis = Vector3Float.Normalize(q1.xyz / den); - } - else { - // This occurs when the angle is zero. - // Not a problem: just set an arbitrary normalized axis. - axis = Vector3Float.right; - } - } - - /// - /// Get the angle between two orientations - /// - /// The first orientation - /// The second orientation - /// The smallest angle in degrees between the two - /// orientations - public static float UnsignedAngle(Quaternion q1, Quaternion q2) { - // float f = Dot(q1, q2); - // return MathF.Acos(MathF.Min(MathF.Abs(f), 1)) * 2 * AngleFloat.Rad2Deg; - - float dot = q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w; - dot = MathF.Min(MathF.Max(dot, -1f), 1f); - return 2f * MathF.Acos(MathF.Abs(dot)) * (180f / MathF.PI); - } - - /// - /// Sherical lerp between two rotations - /// - /// The first rotation - /// The second rotation - /// The factor between 0 and 1. - /// The resulting rotation - /// A factor 0 returns rotation1, factor1 returns rotation2. - public static Quaternion Slerp(Quaternion a, - Quaternion b, float t) { - if (t > 1) - t = 1; - if (t < 0) - t = 0; - return SlerpUnclamped(a, b, t); - } - - /// - /// Unclamped sherical lerp between two rotations - /// - /// The first rotation - /// The second rotation - /// The factor - /// The resulting rotation - /// A factor 0 returns rotation1, factor1 returns rotation2. - /// Values outside the 0..1 range will result in extrapolated rotations - public static Quaternion SlerpUnclamped(Quaternion a, - Quaternion b, float t) { - // if either input is zero, return the other. - if (a.sqrMagnitude == 0.0f) { - if (b.sqrMagnitude == 0.0f) { - return identity; - } - return b; - } - else if (b.sqrMagnitude == 0.0f) { - return a; - } - - Vector3Float axyz = a.xyz; - Vector3Float bxyz = b.xyz; - float cosHalfAngle = a.w * b.w + Vector3Float.Dot(axyz, bxyz); - - Quaternion b2 = b; - if (cosHalfAngle >= 1.0f || cosHalfAngle <= -1.0f) { - // angle = 0.0f, so just return one input. - return a; - } - else if (cosHalfAngle < 0.0f) { - b2.x = -b.x; - b2.y = -b.y; - b2.z = -b.z; - b2.w = -b.w; - cosHalfAngle = -cosHalfAngle; - } - - float blendA; - float blendB; - if (cosHalfAngle < 0.99f) { - // do proper slerp for big angles - float halfAngle = MathF.Acos(cosHalfAngle); - float sinHalfAngle = MathF.Sin(halfAngle); - float oneOverSinHalfAngle = 1.0F / sinHalfAngle; - blendA = MathF.Sin(halfAngle * (1.0F - t)) * oneOverSinHalfAngle; - blendB = MathF.Sin(halfAngle * t) * oneOverSinHalfAngle; - } - else { - // do lerp if angle is really small. - blendA = 1.0f - t; - blendB = t; - } - Vector3Float v = axyz * blendA + b2.xyz * blendB; - Quaternion result = - new(v.horizontal, v.vertical, v.depth, blendA * a.w + blendB * b2.w); - if (result.sqrMagnitude > 0.0f) - return result.normalized; - else - return Quaternion.identity; - } - - /// - /// Convert this quaternion to angle/axis representation - /// - /// A pointer to the angle for the result - /// A pointer to the axis for the result - public readonly void ToAngleAxis(out float angle, out Vector3Float axis) { - ToAxisAngleRad(this, out axis, out angle); - angle *= AngleFloat.Rad2Deg; - } - private static void ToAxisAngleRad(Quaternion q, - out Vector3Float axis, - out float angle) { - Quaternion q1 = (MathF.Abs(q.w) > 1.0f) ? Quaternion.Normalize(q) : q; - angle = 2.0f * MathF.Acos(q1.w); // angle - float den = MathF.Sqrt(1.0F - q1.w * q1.w); - if (den > 0.0001f) { - axis = (q1.xyz / den).normalized; - } - else { - // This occurs when the angle is zero. - // Not a problem: just set an arbitrary normalized axis. - axis = new Vector3Float(1, 0, 0); - } - } - - /// - /// Returns the angle of around the give axis for a rotation - /// - /// The axis around which the angle should be - /// computed The source rotation - /// The signed angle around the axis - public static float GetAngleAround(Vector3Float axis, Quaternion rotation) { - Quaternion secondaryRotation = GetRotationAround(axis, rotation); - secondaryRotation.ToAngleAxis(out float rotationAngle, out Vector3Float rotationAxis); - - // Do the axis point in opposite directions? - if (Vector3Float.Dot(axis, rotationAxis) < 0) - rotationAngle = -rotationAngle; - - return rotationAngle; - } - - /// - /// Returns the rotation limited around the given axis - /// - /// The axis which which the rotation should be - /// limited The source rotation - /// The rotation around the given axis - public static Quaternion GetRotationAround(Vector3Float axis, Quaternion rotation) { - Vector3Float ra = new(rotation.x, rotation.y, rotation.z); // rotation axis - Vector3Float p = Vector3Float.Project( - ra, axis); // return projection ra on to axis (parallel component) - Quaternion twist = new(p.horizontal, p.vertical, p.depth, rotation.w); - twist = Normalize(twist); - return twist; - - } - - /// - /// Swing-twist decomposition of a rotation - /// - /// The base direction for the decomposition - /// The source rotation - /// A pointer to the quaternion for the swing - /// result A pointer to the quaternion for the - /// twist result - static void GetSwingTwist(Vector3Float axis, Quaternion q, - out Quaternion swing, out Quaternion twist) { - twist = GetRotationAround(axis, q); - swing = q * Inverse(twist); - } - - /// - /// Calculate the dot product of two quaternions - /// - /// The first rotation - /// The second rotation - /// - public static float Dot(Quaternion q1, Quaternion q2) { - return q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w; - } - } -#endif - -} \ No newline at end of file diff --git a/Runtime/LinearAlgebra/src/Spherical.cs b/Runtime/LinearAlgebra/src/Spherical.cs deleted file mode 100644 index 318839d..0000000 --- a/Runtime/LinearAlgebra/src/Spherical.cs +++ /dev/null @@ -1,279 +0,0 @@ -using System; -using System.Collections.Generic; - -#if UNITY_5_3_OR_NEWER -using Vector3 = UnityEngine.Vector3; -#endif - -namespace LinearAlgebra { - /// - /// A spherical vector - /// - /// This is a struct such that it is a value type and cannot be null - public struct Spherical { - /// - /// Create a spherical vector - /// - /// The distance in meters - /// The direction of the vector - public Spherical(float distance, Direction direction) { - if (distance > 0) { - this.distance = distance; - this.direction = direction; - } - else { - this.distance = -distance; - this.direction = -direction; - } - } - - /// - /// Create spherical vector. All given angles are in degrees - /// - /// The distance in meters - /// The horizontal angle in degrees - /// The vertical angle in degrees - /// - public static Spherical Degrees(float distance, float horizontal, float vertical) { - Direction direction = Direction.Degrees(horizontal, vertical); - Spherical s = new(distance, direction); - return s; - } - - public static Spherical Radians(float distance, float horizontal, float vertical) { - Direction direction = Direction.Radians(horizontal, vertical); - Spherical s = new(distance, direction); - return s; - } - - /// - /// The distance in meters - /// - /// @remark The distance should never be negative - public float distance; - /// - /// The direction of the vector - /// - public Direction direction; - - /// - /// A spherical vector with zero degree angles and distance - /// - public readonly static Spherical zero = new(0, Direction.forward); - /// - /// A normalized forward-oriented vector - /// - public readonly static Spherical forward = new(1, Direction.forward); - -#if UNITY_5_3_OR_NEWER - public static Spherical FromVector3(Vector3 v) { - float distance = v.magnitude; - Direction direction = Direction.FromVector3(v / distance); - return new Spherical(distance, direction); - } - - public readonly Vector3 ToVector3() { - Vector3 v = this.direction.ToVector3(); - v *= this.distance; - return v; - } -#else - public static Spherical FromVector3(Vector3Float v) { - float distance = v.magnitude; - if (distance == 0.0f) - return Spherical.zero; - else { - float verticalAngle = (float)(Math.PI / 2 - Math.Acos(v.vertical / distance)) * AngleFloat.Rad2Deg; - float horizontalAngle = (float)Math.Atan2(v.horizontal, v.depth) * AngleFloat.Rad2Deg; - return Degrees(distance, horizontalAngle, verticalAngle); - } - } - - public readonly Vector3Float ToVector3() { - // float verticalRad = (AngleFloat.deg90 - this.direction.vertical).inRadians; - // float horizontalRad = this.direction.horizontal.inRadians; - // float cosVertical = (float)Math.Cos(verticalRad); - // float sinVertical = (float)Math.Sin(verticalRad); - // float cosHorizontal = (float)Math.Cos(horizontalRad); - // float sinHorizontal = (float)Math.Sin(horizontalRad); - - // float x = this.distance * sinVertical * sinHorizontal; - // float y = this.distance * cosVertical; - // float z = this.distance * sinVertical * cosHorizontal; - - // Vector3Float v = new(x, y, z); - Vector3Float v = this.direction.ToVector3(); - v *= this.distance; - return v; - } -#endif - - public override readonly string ToString() { - return $"Spherical({this.distance}, h: {this.direction.horizontal}, v: {this.direction.vertical})"; - } - - - public readonly float magnitude => this.distance; - - public Spherical normalized { - get { - Spherical r = new() { - distance = 1, - direction = this.direction - }; - return r; - } - } - - public static Spherical operator +(Spherical s1, Spherical s2) { - // let's do it the easy way... - // using vars to be compatible with both unity (Vector3) and native (Vector3Float) - var v1 = s1.ToVector3(); - var v2 = s2.ToVector3(); - var v = v1 + v2; - Spherical r = FromVector3(v); - return r; - } - - public static Spherical operator *(Spherical v, float d) { - Spherical r = new(v.distance * d, v.direction); - return r; - } - - public static bool operator ==(Spherical v1, Spherical v2) { - return (v1.distance == v2.distance && v1.direction == v2.direction); - } - - public static bool operator !=(Spherical v1, Spherical v2) { - return (v1.distance != v2.distance || v1.direction != v2.direction); - } - - public override readonly bool Equals(object o) { - if (o is Spherical s) - return this == s; - return false; - } - - public override readonly int GetHashCode() { - return HashCode.Combine(this.distance, this.direction); - } - - public static float Distance(Spherical v1, Spherical v2) { - // Convert degrees to radians - float thetaARadians = v1.direction.horizontal.inRadians; - float phiARadians = v1.direction.vertical.inRadians;// DegreesToRadians(phiA); - float thetaBRadians = v2.direction.horizontal.inRadians; // DegreesToRadians(thetaB); - float phiBRadians = v2.direction.vertical.inRadians; // DegreesToRadians(phiB); - - // Calculate sine and cosine values - float sinPhiA = MathF.Sin(phiARadians); - float cosPhiA = MathF.Cos(phiARadians); - float sinPhiB = MathF.Sin(phiBRadians); - float cosPhiB = MathF.Cos(phiBRadians); - - // Calculate the cosine of the difference in azimuthal angles - float cosThetaDifference = MathF.Cos(thetaARadians - thetaBRadians); - - // Apply the spherical law of cosines - float distance = MathF.Sqrt( - v1.distance * v1.distance + - v2.distance * v2.distance - - 2 * v1.distance * v2.distance * (sinPhiA * sinPhiB * cosThetaDifference + cosPhiA * cosPhiB) - ); - - return distance; - } - - public static Spherical Average(Spherical v1, Spherical v2) { - const float EPS = 1e-6f; - - // Angles in radians - float a1 = v1.direction.horizontal.inRadians; - float a2 = v2.direction.horizontal.inRadians; - float e1 = v1.direction.vertical.inRadians; - float e2 = v2.direction.vertical.inRadians; - - // Fast path: exactly same direction (allowing wrap for azimuth) -> preserve exact angles - bool sameAz = MathF.Abs(MathF.IEEERemainder(a1 - a2, MathF.PI * 2f)) < EPS; - bool sameEl = MathF.Abs(e1 - e2) < EPS; - if (sameAz && sameEl) { - // Distances may differ; average distance but keep exact angles from v1 - float rAvgExact = 0.5f * (v1.distance + v2.distance); - return new Spherical(rAvgExact, v1.direction); - } - - // Horizontal unit-circle sum - float cx = MathF.Cos(a1) + MathF.Cos(a2); - float cy = MathF.Sin(a1) + MathF.Sin(a2); - - // Vertical as z = sin(el) - float z1 = MathF.Sin(e1); - float z2 = MathF.Sin(e2); - float cz = z1 + z2; - - // Magnitude of summed unit-direction vectors - float sumX = cx; - float sumY = cy; - float sumZ = cz; - float magSum = MathF.Sqrt(sumX * sumX + sumY * sumY + sumZ * sumZ); - - // If the two direction unit-vectors cancel (or nearly), return zero distance. - if (magSum < EPS) { - return Spherical.Radians(0f, 0f, 0f); - } - - // Normalized averaged direction components - float ux = sumX / magSum; - float uy = sumY / magSum; - float uz = sumZ / magSum; - - // Compute averaged angles from normalized vector - float azAvgRad = MathF.Atan2(uy, ux); - float elAvgRad = MathF.Asin(Float.Clamp(uz, -1f, 1f)); - - // Average distance (arithmetic mean) - float rAvg = 0.5f * (v1.distance + v2.distance); - - return Spherical.Radians(rAvg, azAvgRad, elAvgRad); - } - - public static Spherical Sum(List vectors) { - if (vectors == null || vectors.Count == 0) - throw new ArgumentException("vectors must contain at least one element", nameof(vectors)); - -#if UNITY_5_3_OR_NEWER - Vector3 sum = Vector3.zero; -#else - Vector3Float sum = Vector3Float.zero; -#endif - foreach (Spherical v in vectors) - sum += v.ToVector3(); - - return FromVector3(sum); - } - - - public static Spherical Average(List vectors) { - if (vectors == null || vectors.Count == 0) - throw new ArgumentException("vectors must contain at least one element", nameof(vectors)); - -#if UNITY_5_3_OR_NEWER - Vector3 sum = Vector3.zero; -#else - Vector3Float sum = Vector3Float.zero; -#endif - int n = 0; - foreach (Spherical v in vectors) { - sum += v.ToVector3(); - n++; - } - var avg = sum / n; - - // if (avg.sqrMagnitude == 0f) - // return new Spherical(0f, new Direction(AngleFloat.Radians(0f), AngleFloat.Radians(0f))); - // else - return FromVector3(avg); - } - - } -} \ No newline at end of file diff --git a/Runtime/LinearAlgebra/src/SwingTwist.cs b/Runtime/LinearAlgebra/src/SwingTwist.cs deleted file mode 100644 index df6e048..0000000 --- a/Runtime/LinearAlgebra/src/SwingTwist.cs +++ /dev/null @@ -1,136 +0,0 @@ -// #if !UNITY_5_3_OR_NEWER -// using UnityEngine; -// #endif - -namespace LinearAlgebra { - - /// - /// An orientation using swing and twist angles - /// - /// The swing rotation - /// The twist rotation - public struct SwingTwist { - public Direction swing; - public AngleFloat twist; - - public SwingTwist(Direction swing, AngleFloat twist) { - this.swing = swing; - this.twist = twist; - } - - /// - /// Create a swing/twist rotation using angles in degrees - /// - /// The swing angle in the horizontal plane in degrees - /// The swing angle in the vertical plan in degrees - /// The twist angle in degrees - /// The swing/twist rotation - public static SwingTwist Degrees(float horizontalSwing, float verticalSwing, float twist) { - Direction swing = Direction.Degrees(horizontalSwing, verticalSwing); - AngleFloat twistAngle = AngleFloat.Degrees(twist); - SwingTwist s = new(swing, twistAngle); - return s; - } - - /// - /// Create a swing/twist rotation using angles in degrees - /// - /// The swing angle in the horizontal plane in degrees - /// The swing angle in the vertical plan in degrees - /// The twist angle in degrees - /// The swing/twist rotation - public static SwingTwist Radians(float horizontalSwing, float verticalSwing, float twist) { - Direction swing = Direction.Radians(horizontalSwing, verticalSwing); - AngleFloat twistAngle = AngleFloat.Radians(twist); - SwingTwist s = new(swing, twistAngle); - return s; - } - -#if UNITY_5_3_OR_NEWER - /// - /// A zero angle rotation - /// - public static readonly SwingTwist zero = Degrees(0, 0, 0); - - public Spherical ToAngleAxis() { - UnityEngine.Quaternion q = this.ToQuaternion(); - q.ToAngleAxis(out float angle, out UnityEngine.Vector3 axis); - Direction direction = Direction.FromVector3(axis); - - Spherical r = new(angle, direction); - return r; - } - - public static SwingTwist FromAngleAxis(Spherical r) { - UnityEngine.Vector3 vectorAxis = r.direction.ToVector3(); - UnityEngine.Quaternion q = UnityEngine.Quaternion.AngleAxis(r.distance, vectorAxis); - return FromQuaternion(q); - } - - /// - /// Convert a quaternion in a swing/twist rotation - /// - /// The quaternion to convert - /// The swing/twist rotation - public static SwingTwist FromQuaternion(UnityEngine.Quaternion q) { - UnityEngine.Vector3 angles = q.eulerAngles; - SwingTwist r = Degrees(angles.y, -angles.x, -angles.z); - return r; - } - - public UnityEngine.Quaternion ToQuaternion() { - UnityEngine.Quaternion q = UnityEngine.Quaternion.Euler(this.swing.vertical.inDegrees, - this.swing.horizontal.inDegrees, - this.twist.inDegrees); - return q; - } -#else - /// - /// A zero angle rotation - /// - public static readonly SwingTwist zero = Degrees(0, 0, 0); - - public Spherical ToAngleAxis() { - LinearAlgebra.Quaternion q = this.ToQuaternion(); - q.ToAngleAxis(out float angle, out Vector3Float axis); - Direction direction = Direction.FromVector3(axis); - - Spherical r = new(angle, direction); - return r; - } - - public static SwingTwist FromAngleAxis(Spherical r) { - Vector3Float vectorAxis = r.direction.ToVector3(); - LinearAlgebra.Quaternion q = LinearAlgebra.Quaternion.AngleAxis(AngleFloat.Degrees(r.distance), vectorAxis); - return FromQuaternion(q); - } - - /// - /// Convert a quaternion in a swing/twist rotation - /// - /// The quaternion to convert - /// The swing/twist rotation - public static SwingTwist FromQuaternion(LinearAlgebra.Quaternion q) { - Vector3Float v = LinearAlgebra.Quaternion.ToAngles(q); - SwingTwist r = Degrees(v.vertical, v.horizontal, v.depth); - return r; - } - - public LinearAlgebra.Quaternion ToQuaternion() { - LinearAlgebra.Quaternion q = LinearAlgebra.Quaternion.Euler(this.swing.vertical.inDegrees, - this.swing.horizontal.inDegrees, - this.twist.inDegrees); - return q; - - } - - public static SwingTwist FromQuat32(Quat32 q32) { - q32.ToAngles(out float right, out float up, out float forward); - SwingTwist r = Degrees(up, right, forward); - return r; - } -#endif - - } - -} \ No newline at end of file diff --git a/Runtime/LinearAlgebra/src/Vector2Float.cs b/Runtime/LinearAlgebra/src/Vector2Float.cs deleted file mode 100644 index ac1867c..0000000 --- a/Runtime/LinearAlgebra/src/Vector2Float.cs +++ /dev/null @@ -1,479 +0,0 @@ -using System; -using System.Numerics; - -namespace LinearAlgebra { - - /* - public struct Vector2Int { - public int horizontal; - public int vertical; - - public Vector2Int(int horizontal, int vertical) { - this.horizontal = horizontal; - this.vertical = vertical; - } - - /// - /// A vector with zero for all axis - /// - public static readonly Vector2Int zero = new(0, 0); - /// - /// A vector with values (1, 1) - /// - public static readonly Vector2Int one = new(1, 1); - /// - /// A vector with values (0, 1) - /// - public static readonly Vector2Int up = new(0, 1); - /// - /// A vector with values (0, -1) - /// - public static readonly Vector2Int down = new(0, -1); - /// - /// A vector with values (0, 1) - /// - public static readonly Vector2Int forward = new(0, 1); - /// - /// A vector with values (0, -1) - /// - public static readonly Vector2Int back = new(0, -1); - /// - /// A vector3 with values (-1, 0) - /// - public static readonly Vector2Int left = new(-1, 0); - /// - /// A vector with values (1, 0) - /// - public static readonly Vector2Int right = new(1, 0); - - /// - /// Tests if the vector has equal values as the given vector - /// - /// The vector to compare to - /// true if the vector values are equal - public readonly bool Equals(Vector2Int v) => this.horizontal == v.horizontal && vertical == v.vertical; - - /// - /// Tests if the vector is equal to the given object - /// - /// The object to compare to - /// false when the object is not a Vector2 or does not have equal values - public override readonly bool Equals(object obj) { - if (obj is not Vector2Int v) - return false; - - return (this.horizontal == v.horizontal && this.vertical == v.vertical); - } - - /// - /// Tests if the two vectors have equal values - /// - /// The first vector - /// The second vector - /// truewhen the vectors have equal values - /// Note that this uses a Float equality check which cannot be not exact in all cases. - /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon - /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon - public static bool operator ==(Vector2Int v1, Vector2Int v2) { - return (v1.horizontal == v2.horizontal && v1.vertical == v2.vertical); - } - /// - /// Tests if two vectors have different values - /// - /// The first vector - /// The second vector - /// truewhen the vectors have different values - /// Note that this uses a Float equality check which cannot be not exact in all case. - /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon. - /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon - public static bool operator !=(Vector2Int v1, Vector2Int v2) { - return (v1.horizontal != v2.horizontal || v1.vertical != v2.vertical); - } - public readonly float magnitude { - get { - int h = this.horizontal; - int v = this.vertical; - return MathF.Sqrt(h * h + v * v); - } - } - - public static float MagnitudeOf(Vector2Int v) { - return v.magnitude; - } - - public static Vector2Int operator -(Vector2Int v1, Vector2Int v2) { - return new Vector2Int(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical); - } - public static Vector2Int operator +(Vector2Int v1, Vector2Int v2) { - return new Vector2Int(v1.horizontal + v2.horizontal, v1.vertical + v2.vertical); - } - - public static float Distance(Vector2Int v1, Vector2Int v2) { - return (v1 - v2).magnitude; - } - } - - public struct Vector2Float { - public float horizontal; - public float vertical; - - public Vector2Float(float horizontal, float vertical) { - this.horizontal = horizontal; - this.vertical = vertical; - } - - public readonly float magnitude { - get { - float h = this.horizontal; - float v = this.vertical; - return MathF.Sqrt(h * h + v * v); - } - } - - public static Vector2Float operator -(Vector2Float v1, Vector2Float v2) { - return new Vector2Float(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical); - } - - public static float Distance(Vector2Float v1, Vector2Float v2) { - return (v1 - v2).magnitude; - } - } - */ - - /// - /// 2-dimensional vectors - /// - public struct Vector2Float { - - /// - /// The right axis of the vector - /// - public float horizontal; // left/right - /// - /// The upward/forward axis of the vector - /// - public float vertical; // forward/backward - // directions are to be inline with Vector3 as much as possible... - - /// - /// Create a new 2-dimensional vector - /// - /// x axis value - /// y axis value - public Vector2Float(float x, float y) { - this.horizontal = x; - this.vertical = y; - } - - /// - /// Convert a Vector2Int into a Vector2Float - /// - /// The Vector2Int - public Vector2Float(Vector2Int v) { - this.horizontal = v.horizontal; - this.vertical = v.vertical; - } - - /// - /// A vector with zero for all axis - /// - public static readonly Vector2Float zero = new Vector2Float(0, 0); - /// - /// A vector with values (1, 1) - /// - public static readonly Vector2Float one = new Vector2Float(1, 1); - /// - /// A vector with values (0, 1) - /// - public static readonly Vector2Float up = new Vector2Float(0, 1); - /// - /// A vector with values (0, -1) - /// - public static readonly Vector2Float down = new Vector2Float(0, -1); - /// - /// A vector with values (0, 1) - /// - public static readonly Vector2Float forward = new Vector2Float(0, 1); - /// - /// A vector with values (0, -1) - /// - public static readonly Vector2Float back = new Vector2Float(0, -1); - /// - /// A vector3 with values (-1, 0) - /// - public static readonly Vector2Float left = new Vector2Float(-1, 0); - /// - /// A vector with values (1, 0) - /// - public static readonly Vector2Float right = new Vector2Float(1, 0); - - /// - /// The squared length of this vector - /// - /// The squared length - /// The squared length is computationally simpler than the real length. - /// Think of Pythagoras A^2 + B^2 = C^2. - /// This leaves out the calculation of the squared root of C. - public readonly float sqrMagnitude => horizontal * horizontal + vertical * vertical; - public static float SqrMagnitudeOf(Vector2Float v) { - return v.sqrMagnitude; - } - - /// - /// The length of this vector - /// - /// The length of this vector - public readonly float magnitude => MathF.Sqrt(horizontal * horizontal + vertical * vertical); - public static float MagnitudeOf(Vector2Float v) { - return v.magnitude; - } - - /// - /// Convert the vector to a length of a 1 - /// - /// The vector with length 1 - public Vector2Float normalized { - get { - float l = magnitude; - Vector2Float v = zero; - if (l > Float.epsilon) - v = this / l; - return v; - } - } - public static Vector2Float Normalize(Vector2Float v) { - return v.normalized; - } - - /// - /// Add two vectors - /// - /// The first vector - /// The second vector - /// The result of adding the two vectors - public static Vector2Float operator +(Vector2Float v1, Vector2Float v2) { - Vector2Float v = new Vector2Float(v1.horizontal + v2.horizontal, v1.vertical + v2.vertical); - return v; - } - - /// - /// Subtract two vectors - /// - /// The first vector - /// The second vector - /// The result of adding the two vectors - public static Vector2Float operator -(Vector2Float v1, Vector2Float v2) { - Vector2Float v = new Vector2Float(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical); - return v; - } - - /// - /// Negate the vector - /// - /// The vector to negate - /// The negated vector - /// This will result in a vector pointing in the opposite direction - public static Vector2Float operator -(Vector2Float v1) { - Vector2Float v = new Vector2Float(-v1.horizontal, -v1.vertical); - return v; - } - - /// - /// Scale a vector uniformly down - /// - /// The vector to scale - /// The scaling factor - /// The scaled vector - /// Each component of the vector will be devided by the same factor. - public static Vector2Float operator /(Vector2Float v, float f) { - Vector2Float r = new(v.horizontal / f, v.vertical / f); - return r; - } - - - /// - /// Scale a vector uniformly up - /// - /// The vector to scale - /// The scaling factor - /// The scaled vector - /// Each component of the vector will be multipled with the same factor. - public static Vector2Float operator *(Vector2Float v1, float f) { - Vector2Float v = new Vector2Float(v1.horizontal * f, v1.vertical * f); - return v; - } - - /// - /// Scale a vector uniformly up - /// - /// The scaling factor - /// The vector to scale - /// The scaled vector - /// Each component of the vector will be multipled with the same factor. - public static Vector2Float operator *(float f, Vector2Float v1) { - Vector2Float v = new Vector2Float(f * v1.horizontal, f * v1.vertical); - return v; - } - - /// @brief Scale the vector using another vector - /// @param v1 The vector to scale - /// @param v2 A vector with the scaling factors - /// @return The scaled vector - /// @remark Each component of the vector v1 will be multiplied with the - /// matching component from the scaling vector v2. - public static Vector2Float Scale(Vector2Float v1, Vector2Float v2) { - return new Vector2Float(v1.horizontal * v2.horizontal, v1.vertical * v2.vertical); - } - - /// - /// Tests if the vector has equal values as the given vector - /// - /// The vector to compare to - /// true if the vector values are equal - //public readonly bool Equals(Vector2Float v1) => horizontal == v1.horizontal && vertical == v1.vertical; - - /// - /// Tests if the two vectors have equal values - /// - /// The first vector - /// The second vector - /// truewhen the vectors have equal values - /// Note that this uses a Float equality check which cannot be not exact in all cases. - /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon - /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon - public static bool operator ==(Vector2Float v1, Vector2Float v2) { - return (v1.horizontal == v2.horizontal && v1.vertical == v2.vertical); - } - - /// - /// Tests if two vectors have different values - /// - /// The first vector - /// The second vector - /// truewhen the vectors have different values - /// Note that this uses a Float equality check which cannot be not exact in all case. - /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon. - /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon - public static bool operator !=(Vector2Float v1, Vector2Float v2) { - return (v1.horizontal != v2.horizontal || v1.vertical != v2.vertical); - } - - /// - /// Tests if the vector is equal to the given object - /// - /// The object to compare to - /// false when the object is not a Vector2 or does not have equal values - public override readonly bool Equals(object obj) { - if (obj is not Vector2Float v) - return false; - - return (horizontal == v.horizontal && vertical == v.vertical); - } - - /// - /// Get an hash code for the vector - /// - /// The hash code - public override readonly int GetHashCode() { - return HashCode.Combine(horizontal, vertical); - } - - /// - /// Get the distance between two vectors - /// - /// The first vector - /// The second vector - /// The distance between the two vectors - public static float Distance(Vector2Float v1, Vector2Float v2) { - float x = v1.horizontal - v2.horizontal; - float y = v1.vertical - v2.vertical; - float d = (float)Math.Sqrt(x * x + y * y); - return d; - } - - /// - /// The dot product of two vectors - /// - /// The first vector - /// The second vector - /// The dot product of the two vectors - public static float Dot(Vector2Float v1, Vector2Float v2) { - return v1.horizontal * v2.horizontal + v1.vertical * v2.vertical; - } - - /// - /// Calculate the signed angle between two vectors. - /// - /// The starting vector - /// The ending vector - /// The axis to rotate around - /// The signed angle in degrees - public static float SignedAngle(Vector2Float from, Vector2Float to) { - //float sign = Math.Sign(v1.y * v2.x - v1.x * v2.y); - //return Vector2.Angle(v1, v2) * sign; - - float sqrMagFrom = from.sqrMagnitude; - float sqrMagTo = to.sqrMagnitude; - - if (sqrMagFrom == 0 || sqrMagTo == 0) - return 0; - //if (!isfinite(sqrMagFrom) || !isfinite(sqrMagTo)) - // return nanf(""); - - float angleFrom = (float)Math.Atan2(from.vertical, from.horizontal); - float angleTo = (float)Math.Atan2(to.vertical, to.horizontal); - return -(angleTo - angleFrom) * AngleFloat.Rad2Deg; - } - - public static float UnsignedAngle(Vector2Float from, Vector2Float to) { - return MathF.Abs(SignedAngle(from, to)); - } - - /// - /// Rotates the vector with the given angle - /// - /// The vector to rotate - /// The angle in degrees - /// - public static Vector2Float Rotate(Vector2Float v1, AngleFloat angle) { - float sin = (float)Math.Sin(angle.inRadians); - float cos = (float)Math.Cos(angle.inRadians); - // float sin = AngleFloat.Sin(angle); - // float cos = AngleFloat.Cos(angle); - - float tx = v1.horizontal; - float ty = v1.vertical; - Vector2Float v = new Vector2Float() { - horizontal = (cos * tx) - (sin * ty), - vertical = (sin * tx) + (cos * ty) - }; - return v; - } - - /// - /// Lerp between two vectors - /// - /// The from vector - /// The to vector - /// The interpolation distance [0..1] - /// The lerped vector - /// The factor f is unclamped. Value 0 matches the *v1* vector, Value 1 - /// matches the *v2* vector Value -1 is *v1* vector minus the difference - /// between *v1* and *v2* etc. - public static Vector2Float Lerp(Vector2Float v1, Vector2Float v2, float f) { - Vector2Float v = v1 + (v2 - v1) * f; - return v; - } - - /// - /// Map interval of angles between vectors [0..Pi] to interval [0..1] - /// - /// The first vector - /// The second vector - /// The resulting factor in interval [0..1] - /// Vectors a and b must be normalized - public static float ToFactor(Vector2Float v1, Vector2Float v2) { - return (1 - Vector2Float.Dot(v1, v2)) / 2; - } - } -} \ No newline at end of file diff --git a/Runtime/LinearAlgebra/src/Vector2Int.cs b/Runtime/LinearAlgebra/src/Vector2Int.cs deleted file mode 100644 index ed68e8b..0000000 --- a/Runtime/LinearAlgebra/src/Vector2Int.cs +++ /dev/null @@ -1,185 +0,0 @@ -using System; - -namespace LinearAlgebra { - - public struct Vector2Int { - public int horizontal; - public int vertical; - - public Vector2Int(int horizontal, int vertical) { - this.horizontal = horizontal; - this.vertical = vertical; - } - - /// - /// A vector with zero for all axis - /// - public static readonly Vector2Int zero = new(0, 0); - /// - /// A vector with values (1, 1) - /// - public static readonly Vector2Int one = new(1, 1); - /// - /// A vector with values (0, 1) - /// - public static readonly Vector2Int up = new(0, 1); - /// - /// A vector with values (0, -1) - /// - public static readonly Vector2Int down = new(0, -1); - /// - /// A vector with values (0, 1) - /// - public static readonly Vector2Int forward = new(0, 1); - /// - /// A vector with values (0, -1) - /// - public static readonly Vector2Int back = new(0, -1); - /// - /// A vector3 with values (-1, 0) - /// - public static readonly Vector2Int left = new(-1, 0); - /// - /// A vector with values (1, 0) - /// - public static readonly Vector2Int right = new(1, 0); - - /* - /// - /// Get an hash code for the vector - /// - /// The hash code - public override int GetHashCode() { - return (this.horizontal, this.vertical).GetHashCode(); - } - - /// - /// Tests if the vector has equal values as the given vector - /// - /// The vector to compare to - /// true if the vector values are equal - public readonly bool Equals(Vector2Int v) => this.horizontal == v.horizontal && vertical == v.vertical; - - */ - - /// - /// Tests if the two vectors have equal values - /// - /// The first vector - /// The second vector - /// truewhen the vectors have equal values - /// Note that this uses a Float equality check which cannot be not exact in all cases. - /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon - /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon - public static bool operator ==(Vector2Int v1, Vector2Int v2) { - return (v1.horizontal == v2.horizontal && v1.vertical == v2.vertical); - } - /// - /// Tests if two vectors have different values - /// - /// The first vector - /// The second vector - /// truewhen the vectors have different values - /// Note that this uses a Float equality check which cannot be not exact in all case. - /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon. - /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon - public static bool operator !=(Vector2Int v1, Vector2Int v2) { - return (v1.horizontal != v2.horizontal || v1.vertical != v2.vertical); - } - - /// - /// Tests if the vector is equal to the given object - /// - /// The object to compare to - /// false when the object is not a Vector2 or does not have equal values - public override readonly bool Equals(object obj) { - if (obj is not Vector2Int v) - return false; - - return (this.horizontal == v.horizontal && this.vertical == v.vertical); - } - - /// - /// Get an hash code for the vector - /// - /// The hash code - public override readonly int GetHashCode() { - return HashCode.Combine(horizontal, vertical); - } - - public readonly float sqrMagnitude => this.horizontal * this.horizontal + this.vertical * this.vertical; - - public static float SqrMagnitudeOf(Vector2Int v) { - return v.sqrMagnitude; - } - - public readonly float magnitude => - MathF.Sqrt(this.horizontal * this.horizontal + this.vertical * this.vertical); - - public static float MagnitudeOf(Vector2Int v) { - return v.magnitude; - } - - /// @brief Convert the vector to a length of 1 - /// @return The vector normalized to a length of 1 - public readonly Vector2Float normalized { - get { - float l = magnitude; - Vector2Float v = Vector2Float.zero; - if (l > Float.epsilon) - v = new Vector2Float(this) / l; - return v; - } - } - /// @brief Convert the vector to a length of 1 - /// @param v The vector to convert - /// @return The vector normalized to a length of 1 - public static Vector2Float Normalize(Vector2Int v) { - float num = v.magnitude; - Vector2Float result = Vector2Float.zero; - if (num > Float.epsilon) - result = new Vector2Float(v) / num; - - return result; - } - - public static Vector2Int operator -(Vector2Int v) { - return new Vector2Int(-v.horizontal, -v.vertical); - } - - public static Vector2Int operator -(Vector2Int v1, Vector2Int v2) { - return new Vector2Int(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical); - } - public static Vector2Int operator +(Vector2Int v1, Vector2Int v2) { - return new Vector2Int(v1.horizontal + v2.horizontal, v1.vertical + v2.vertical); - } - - public static Vector2Int operator /(Vector2Int v, int f) { - return new Vector2Int(v.horizontal / f, v.vertical / f); - } - - public static Vector2Int operator *(Vector2Int v1, int d) { - return new Vector2Int(v1.horizontal * d, v1.vertical * d); - } - - public static Vector2Int operator *(int d, Vector2Int v1) { - return new Vector2Int(d * v1.horizontal, d * v1.vertical); - } - - public static Vector2Int Scale(Vector2Int v1, Vector2Int v2) { - return new Vector2Int(v1.horizontal * v2.horizontal, v1.vertical * v2.vertical); - } - - /// @brief The dot product of two vectors - /// @param v1 The first vector - /// @param v2 The second vector - /// @return The dot product of the two vectors - public static int Dot(Vector2Int v1, Vector2Int v2) { - return v1.horizontal * v2.horizontal + v1.vertical * v2.vertical; - } - - public static float Distance(Vector2Int v1, Vector2Int v2) { - return (v1 - v2).magnitude; - } - } -} \ No newline at end of file diff --git a/Runtime/LinearAlgebra/src/Vector3Float.cs b/Runtime/LinearAlgebra/src/Vector3Float.cs deleted file mode 100644 index bcf8626..0000000 --- a/Runtime/LinearAlgebra/src/Vector3Float.cs +++ /dev/null @@ -1,402 +0,0 @@ -//#if !UNITY_5_3_OR_NEWER -using System; - -namespace LinearAlgebra { - /* - public struct Vector3Float { - public float horizontal; - public float vertical; - public float depth; - - public Vector3Float(float horizontal, float vertical, float depth) { - this.horizontal = horizontal; - this.vertical = vertical; - this.depth = depth; - } - - /// - /// A vector with zero for all axis - /// - public static readonly Vector3Float zero = new(0, 0, 0); - - public readonly float magnitude { - get => (float)Math.Sqrt(this.horizontal * this.horizontal + this.vertical * this.vertical + this.depth * this.depth); - } - - /// - /// Convert the vector to a length of a 1 - /// - /// The vector with length 1 - public readonly Vector3Float normalized { - get { - float l = magnitude; - Vector3Float v = zero; - if (l > Float.epsilon) - v = this / l; - return v; - } - } - - - public static Vector3Float operator *(Vector3Float v, float f) { - Vector3Float r = new(v.horizontal * f, v.vertical * f, v.depth * f); - return r; - } - public static Vector3Float operator /(Vector3Float v, float f) { - Vector3Float r = new(v.horizontal / f, v.vertical / f, v.depth / f); - return r; - } - - public static float Dot(Vector3Float v1, Vector3Float v2) { - return v1.horizontal * v2.horizontal + v1.vertical * v2.vertical + - v1.depth * v2.depth; - } - - const float epsilon = 1E-05f; - public static Vector3Float Project(Vector3Float v, Vector3Float n) { - float sqrMagnitude = Dot(n, n); - if (sqrMagnitude < epsilon) - return zero; - else { - float dot = Dot(v, n); - Vector3Float r = n * dot; - r /= sqrMagnitude; - return r; - } - - } - } - */ - - /// - /// 3-dimensional vectors - /// - /// This uses the right-handed coordinate system. - public struct Vector3Float { - - /// - /// The right axis of the vector - /// - public float horizontal; //> left/right - /// - /// The upward axis of the vector - /// - public float vertical; //> up/down - /// - /// The forward axis of the vector - /// - public float depth; //> forward/backward - - /// - /// Create a new 3-dimensional vector - /// - /// x axis value - /// y axis value - /// z axis value - public Vector3Float(float horizontal, float vertical, float depth) { - this.horizontal = horizontal; - this.vertical = vertical; - this.depth = depth; - } - - public Vector3Float(Vector3Int v) { - this.horizontal = v.horizontal; - this.vertical = v.vertical; - this.depth = v.depth; - } - - public static Vector3Float FromSpherical(Spherical s) { - float verticalRad = (AngleFloat.deg90 - s.direction.vertical).inRadians; - float horizontalRad = s.direction.horizontal.inRadians; - float cosVertical = MathF.Cos(verticalRad); - float sinVertical = MathF.Sin(verticalRad); - float cosHorizontal = MathF.Cos(horizontalRad); - float sinHorizontal = MathF.Sin(horizontalRad); - - float horizontal = s.distance * sinVertical * sinHorizontal; - float vertical = s.distance * cosVertical; - float depth = s.distance * sinVertical * cosHorizontal; - return new Vector3Float(horizontal, vertical, depth); - } - - public override string ToString() { - return $"({this.horizontal}, {this.vertical}, {this.depth})"; - } - - /// - /// A vector with zero for all axis - /// - public static readonly Vector3Float zero = new Vector3Float(0, 0, 0); - /// - /// A vector with one for all axis - /// - public static readonly Vector3Float one = new Vector3Float(1, 1, 1); - /// - /// A Vector3Float with values (-1, 0, 0) - /// - public static readonly Vector3Float left = new Vector3Float(-1, 0, 0); - /// - /// A vector with values (1, 0, 0) - /// - public static readonly Vector3Float right = new Vector3Float(1, 0, 0); - /// - /// A vector with values (0, -1, 0) - /// - public static readonly Vector3Float down = new Vector3Float(0, -1, 0); - /// - /// A vector with values (0, 1, 0) - /// - public static readonly Vector3Float up = new Vector3Float(0, 1, 0); - /// - /// A vector with values (0, 0, -1) - /// - public static readonly Vector3Float back = new Vector3Float(0, -1, 0); - /// - /// A vector with values (0, 0, 1) - /// - public static readonly Vector3Float forward = new Vector3Float(0, 1, 0); - - /// @brief The vector length - /// @return The vector length - public readonly float magnitude => MathF.Sqrt(horizontal * horizontal + vertical * vertical + depth * depth); - /// - /// The vector length - /// - /// The vector for which you need the length - /// The vector length - public static float MagnitudeOf(Vector3Float v) { - return v.magnitude; - } - - /// @brief The squared vector length - /// @return The squared vector length - /// @remark The squared length is computationally simpler than the real - /// length. Think of Pythagoras A^2 + B^2 = C^2. This leaves out the - /// calculation of the squared root of C. - public readonly float sqrMagnitude => (horizontal * horizontal + vertical * vertical + depth * depth); - - /// - /// The squared vector length - /// - /// The vector for which you need the squared length - /// The squared vector length - /// The squared length is computationally simpler than the real - /// length. Think of Pythagoras A^2 + B^2 = C^2. This leaves out the - /// calculation of the squared root of C. - public static float SqrMagnitudeOf(Vector3Float v) { - return v.sqrMagnitude; - } - - /// @brief Convert the vector to a length of 1 - /// @return The vector normalized to a length of 1 - public readonly Vector3Float normalized { - get { - float l = magnitude; - Vector3Float v = zero; - if (l > Float.epsilon) - v = this / l; - return v; - } - } - /// @brief Convert the vector to a length of 1 - /// @param v The vector to convert - /// @return The vector normalized to a length of 1 - public static Vector3Float Normalize(Vector3Float v) { - float num = v.magnitude; - Vector3Float result = zero; - if (num > Float.epsilon) - result = v / num; - - return result; - } - - /// - /// Negate te vector such that it points in the opposite direction - /// - /// - /// The negated vector - public static Vector3Float operator -(Vector3Float v1) { - Vector3Float v = new(-v1.horizontal, -v1.vertical, -v1.depth); - return v; - } - - /// - /// Subtract two vectors - /// - /// - /// - /// The result of the subtraction - public static Vector3Float operator -(Vector3Float v1, Vector3Float v2) { - Vector3Float v = new(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical, v1.depth - v2.depth); - return v; - } - - /// - /// Add two vectors - /// - /// - /// - /// The result of the addition - public static Vector3Float operator +(Vector3Float v1, Vector3Float v2) { - Vector3Float v = new(v1.horizontal + v2.horizontal, v1.vertical + v2.vertical, v1.depth + v2.depth); - return v; - } - - /// @brief Scale the vector using another vector - /// @param v1 The vector to scale - /// @param v2 A vector with the scaling factors - /// @return The scaled vector - /// @remark Each component of the vector v1 will be multiplied with the - /// matching component from the scaling vector v2. - public static Vector3Float Scale(Vector3Float v1, Vector3Float v2) { - return new Vector3Float(v1.horizontal * v2.horizontal, v1.vertical * v2.vertical, v1.depth * v2.depth); - } - - - public static Vector3Float operator *(Vector3Float v1, float d) { - Vector3Float v = new(v1.horizontal * d, v1.vertical * d, v1.depth * d); - return v; - } - - public static Vector3Float operator *(float d, Vector3Float v1) { - Vector3Float v = new(d * v1.horizontal, d * v1.vertical, d * v1.depth); - return v; - } - - public static Vector3Float operator /(Vector3Float v1, float d) { - Vector3Float v = new(v1.horizontal / d, v1.vertical / d, v1.depth / d); - return v; - } - - - //public bool Equals(Vector3Float v) => (horizontal == v.horizontal && vertical == v.vertical && depth == v.depth); - - public static bool operator ==(Vector3Float v1, Vector3Float v2) { - return (v1.horizontal == v2.horizontal && v1.vertical == v2.vertical && v1.depth == v2.depth); - } - - public static bool operator !=(Vector3Float v1, Vector3Float v2) { - return (v1.horizontal != v2.horizontal || v1.vertical != v2.vertical || v1.depth != v2.depth); - } - - public override readonly bool Equals(object obj) { - if (obj is not Vector3Float v) - return false; - - return (horizontal == v.horizontal && vertical == v.vertical && depth == v.depth); - } - - public override readonly int GetHashCode() { - return HashCode.Combine(horizontal, vertical, depth); - } - - /// @brief The distance between two vectors - /// @param v1 The first vector - /// @param v2 The second vector - /// @return The distance between the two vectors - public static float Distance(Vector3Float v1, Vector3Float v2) { - return (v2 - v1).magnitude; - } - - /// @brief The dot product of two vectors - /// @param v1 The first vector - /// @param v2 The second vector - /// @return The dot product of the two vectors - public static float Dot(Vector3Float v1, Vector3Float v2) { - return v1.horizontal * v2.horizontal + v1.vertical * v2.vertical + v1.depth * v2.depth; - } - - /// @brief The cross product of two vectors - /// @param v1 The first vector - /// @param v2 The second vector - /// @return The cross product of the two vectors - public static Vector3Float Cross(Vector3Float v1, Vector3Float v2) { - return new Vector3Float(v1.vertical * v2.depth - v1.depth * v2.vertical, v1.depth * v2.horizontal - v1.horizontal * v2.depth, - v1.horizontal * v2.vertical - v1.vertical * v2.horizontal); - - } - - /// @brief Project the vector on another vector - /// @param v The vector to project - /// @param n The normal vecto to project on - /// @return The projected vector - public static Vector3Float Project(Vector3Float v, Vector3Float n) { - float sqrMagnitude = Dot(n, n); - if (sqrMagnitude < Float.epsilon) - return zero; - else { - float dot = Dot(v, n); - Vector3Float r = n * dot / sqrMagnitude; - return r; - } - } - - /// @brief Project the vector on a plane defined by a normal orthogonal to the - /// plane. - /// @param v The vector to project - /// @param n The normal of the plane to project on - /// @return Teh projected vector - public static Vector3Float ProjectOnPlane(Vector3Float v, Vector3Float n) { - Vector3Float r = v - Project(v, n); - return r; - } - - /// @brief The angle between two vectors - /// @param v1 The first vector - /// @param v2 The second vector - /// @return The angle between the two vectors - /// @remark This reterns an unsigned angle which is the shortest distance - /// between the two vectors. Use Vector3::SignedAngle if a signed angle is - /// needed. - public static AngleFloat UnsignedAngle(Vector3Float v1, Vector3Float v2) { - float denominator = MathF.Sqrt(v1.sqrMagnitude * v2.sqrMagnitude); - if (denominator < Float.epsilon) - return AngleFloat.zero; - - float dot = Dot(v1, v2); - float fraction = dot / denominator; - if (float.IsNaN(fraction)) - return AngleFloat.Degrees( - fraction); // short cut to returning NaN universally - - float cdot = Float.Clamp(fraction, -1.0f, 1.0f); - float r = MathF.Acos(cdot); - return AngleFloat.Radians(r); - } - /// @brief The signed angle between two vectors - /// @param v1 The starting vector - /// @param v2 The ending vector - /// @param axis The axis to rotate around - /// @return The signed angle between the two vectors - public static AngleFloat SignedAngle(Vector3Float v1, Vector3Float v2, - Vector3Float axis) { - // angle in [0,180] - AngleFloat angle = UnsignedAngle(v1, v2); - - Vector3Float cross = Cross(v1, v2); - float b = Dot(axis, cross); - float signd = b < 0 ? -1.0F : (b > 0 ? 1.0F : 0.0F); - - // angle in [-179,180] - AngleFloat signed_angle = angle * signd; - - return signed_angle; - } - - - /// @brief Lerp (linear interpolation) between two vectors - /// @param v1 The starting vector - /// @param v2 The ending vector - /// @param f The interpolation distance - /// @return The lerped vector - /// @remark The factor f is unclamped. Value 0 matches the vector *v1*, Value - /// 1 matches vector *v2*. Value -1 is vector *v1* minus the difference - /// between *v1* and *v2* etc. - public static Vector3Float Lerp(Vector3Float v1, Vector3Float v2, float f) { - Vector3Float v = v1 + (v2 - v1) * f; - return v; - } - - } -} -//#endif \ No newline at end of file diff --git a/Runtime/LinearAlgebra/src/Vector3Int.cs b/Runtime/LinearAlgebra/src/Vector3Int.cs deleted file mode 100644 index 18edf40..0000000 --- a/Runtime/LinearAlgebra/src/Vector3Int.cs +++ /dev/null @@ -1,273 +0,0 @@ -//#if !UNITY_5_3_OR_NEWER -using System; - -namespace LinearAlgebra { - - /// - /// 3-dimensional vectors - /// - /// This uses the right-handed coordinate system. - /// - /// Create a new 3-dimensional vector - /// - /// x axis value - /// y axis value - /// z axis value - public struct Vector3Int { - - /// - /// The right axis of the vector - /// - public int horizontal; //> left/right - /// - /// The upward axis of the vector - /// - public int vertical; //> up/down - /// - /// The forward axis of the vector - /// - public int depth; //> forward/backward - - public Vector3Int(int horizontal, int vertical, int depth) { - this.horizontal = horizontal; - this.vertical = vertical; - this.depth = depth; - } - - /// - /// A vector with zero for all axis - /// - public static readonly Vector3Int zero = new(0, 0, 0); - /// - /// A vector with one for all axis - /// - public static readonly Vector3Int one = new(1, 1, 1); - /// - /// A Vector3Int with values (-1, 0, 0) - /// - public static readonly Vector3Int left = new(-1, 0, 0); - /// - /// A vector with values (1, 0, 0) - /// - public static readonly Vector3Int right = new(1, 0, 0); - /// - /// A vector with values (0, -1, 0) - /// - public static readonly Vector3Int down = new(0, -1, 0); - /// - /// A vector with values (0, 1, 0) - /// - public static readonly Vector3Int up = new(0, 1, 0); - /// - /// A vector with values (0, 0, -1) - /// - public static readonly Vector3Int back = new(0, -1, 0); - /// - /// A vector with values (0, 0, 1) - /// - public static readonly Vector3Int forward = new(0, 1, 0); - - /// @brief The vector length - /// @return The vector length - public readonly float magnitude => MathF.Sqrt(horizontal * horizontal + vertical * vertical + depth * depth); - /// - /// The vector length - /// - /// The vector for which you need the length - /// The vector length - public static float MagnitudeOf(Vector3Int v) { - return v.magnitude; - } - - /// @brief The squared vector length - /// @return The squared vector length - /// @remark The squared length is computationally simpler than the real - /// length. Think of Pythagoras A^2 + B^2 = C^2. This leaves out the - /// calculation of the squared root of C. - public readonly float sqrMagnitude => (horizontal * horizontal + vertical * vertical + depth * depth); - - /// - /// The squared vector length - /// - /// The vector for which you need the squared length - /// The squared vector length - /// The squared length is computationally simpler than the real - /// length. Think of Pythagoras A^2 + B^2 = C^2. This leaves out the - /// calculation of the squared root of C. - public static float SqrMagnitudeOf(Vector3Int v) { - return v.sqrMagnitude; - } - - /// @brief Convert the vector to a length of 1 - /// @return The vector normalized to a length of 1 - public readonly Vector3Float normalized { - get { - float l = magnitude; - Vector3Float v = Vector3Float.zero; - if (l > Float.epsilon) - v = new Vector3Float(this) / l; - return v; - } - } - /// @brief Convert the vector to a length of 1 - /// @param v The vector to convert - /// @return The vector normalized to a length of 1 - public static Vector3Float Normalize(Vector3Int v) { - float num = v.magnitude; - Vector3Float result = Vector3Float.zero; - if (num > Float.epsilon) - result = new Vector3Float(v) / num; - - return result; - } - - /// - /// Negate te vector such that it points in the opposite direction - /// - /// - /// The negated vector - public static Vector3Int operator -(Vector3Int v1) { - Vector3Int v = new(-v1.horizontal, -v1.vertical, -v1.depth); - return v; - } - - /// - /// Subtract two vectors - /// - /// - /// - /// The result of the subtraction - public static Vector3Int operator -(Vector3Int v1, Vector3Int v2) { - Vector3Int v = new(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical, v1.depth - v2.depth); - return v; - } - - /// - /// Add two vectors - /// - /// - /// - /// The result of the addition - public static Vector3Int operator +(Vector3Int v1, Vector3Int v2) { - Vector3Int v = new(v1.horizontal + v2.horizontal, v1.vertical + v2.vertical, v1.depth + v2.depth); - return v; - } - - /// @brief Scale the vector using another vector - /// @param v1 The vector to scale - /// @param v2 A vector with the scaling factors - /// @return The scaled vector - /// @remark Each component of the vector v1 will be multiplied with the - /// matching component from the scaling vector v2. - public static Vector3Int Scale(Vector3Int v1, Vector3Int v2) { - return new Vector3Int(v1.horizontal * v2.horizontal, v1.vertical * v2.vertical, v1.depth * v2.depth); - } - - - public static Vector3Int operator *(Vector3Int v1, int d) { - Vector3Int v = new(v1.horizontal * d, v1.vertical * d, v1.depth * d); - return v; - } - - public static Vector3Int operator *(int d, Vector3Int v1) { - Vector3Int v = new(d * v1.horizontal, d * v1.vertical, d * v1.depth); - return v; - } - - public static Vector3Int operator /(Vector3Int v1, int d) { - Vector3Int v = new(v1.horizontal / d, v1.vertical / d, v1.depth / d); - return v; - } - - public bool Equals(Vector3Int v) => (horizontal == v.horizontal && vertical == v.vertical && depth == v.depth); - - public override bool Equals(object obj) { - if (!(obj is Vector3Int v)) - return false; - - return (horizontal == v.horizontal && vertical == v.vertical && depth == v.depth); - } - - public static bool operator ==(Vector3Int v1, Vector3Int v2) { - return (v1.horizontal == v2.horizontal && v1.vertical == v2.vertical && v1.depth == v2.depth); - } - - public static bool operator !=(Vector3Int v1, Vector3Int v2) { - return (v1.horizontal != v2.horizontal || v1.vertical != v2.vertical || v1.depth != v2.depth); - } - - public override int GetHashCode() { - return (horizontal, vertical, depth).GetHashCode(); - } - - /// @brief The distance between two vectors - /// @param v1 The first vector - /// @param v2 The second vector - /// @return The distance between the two vectors - public static float Distance(Vector3Int v1, Vector3Int v2) { - return (v2 - v1).magnitude; - } - - /// @brief The dot product of two vectors - /// @param v1 The first vector - /// @param v2 The second vector - /// @return The dot product of the two vectors - public static float Dot(Vector3Int v1, Vector3Int v2) { - return v1.horizontal * v2.horizontal + v1.vertical * v2.vertical + v1.depth * v2.depth; - } - - /// @brief The cross product of two vectors - /// @param v1 The first vector - /// @param v2 The second vector - /// @return The cross product of the two vectors - public static Vector3Int Cross(Vector3Int v1, Vector3Int v2) { - return new Vector3Int(v1.vertical * v2.depth - v1.depth * v2.vertical, v1.depth * v2.horizontal - v1.horizontal * v2.depth, - v1.horizontal * v2.vertical - v1.vertical * v2.horizontal); - - } - - /// @brief The angle between two vectors - /// @param v1 The first vector - /// @param v2 The second vector - /// @return The angle between the two vectors - /// @remark This reterns an unsigned angle which is the shortest distance - /// between the two vectors. Use Vector3::SignedAngle if a signed angle is - /// needed. - public static AngleFloat UnsignedAngle(Vector3Int v1, Vector3Int v2) { - float denominator = MathF.Sqrt(v1.sqrMagnitude * v2.sqrMagnitude); - if (denominator < Float.epsilon) - return AngleFloat.zero; - - float dot = Dot(v1, v2); - float fraction = dot / denominator; - if (float.IsNaN(fraction)) - return AngleFloat.Degrees( - fraction); // short cut to returning NaN universally - - float cdot = Float.Clamp(fraction, -1.0f, 1.0f); - float r = MathF.Acos(cdot); - return AngleFloat.Radians(r); - } - /// @brief The signed angle between two vectors - /// @param v1 The starting vector - /// @param v2 The ending vector - /// @param axis The axis to rotate around - /// @return The signed angle between the two vectors - public static AngleFloat SignedAngle(Vector3Int v1, Vector3Int v2, - Vector3Int axis) { - // angle in [0,180] - AngleFloat angle = UnsignedAngle(v1, v2); - - Vector3Int cross = Cross(v1, v2); - float b = Dot(axis, cross); - float signd = b < 0 ? -1.0F : (b > 0 ? 1.0F : 0.0F); - - // angle in [-179,180] - AngleFloat signed_angle = angle * signd; - - return signed_angle; - } - - } -} -//#endif \ No newline at end of file diff --git a/Runtime/LinearAlgebra/src/float16.cs b/Runtime/LinearAlgebra/src/float16.cs deleted file mode 100644 index 4b58cdd..0000000 --- a/Runtime/LinearAlgebra/src/float16.cs +++ /dev/null @@ -1,322 +0,0 @@ -using System; - -namespace LinearAlgebra { - - public class float16 { - // - // FILE: float16.cpp - // AUTHOR: Rob Tillaart - // VERSION: 0.1.8 - // PURPOSE: library for Float16s for Arduino - // URL: http://en.wikipedia.org/wiki/Half-precision_floating-point_format - - ushort _value; - - public float16() { _value = 0; } - - public float16(float f) { - //_value = f32tof16(f); - _value = F32ToF16__(f); - } - - public float toFloat() { - return f16tof32(_value); - } - - public ushort GetBinary() { return _value; } - public void SetBinary(ushort value) { _value = value; } - - ////////////////////////////////////////////////////////// - // - // EQUALITIES - // - /* - bool float16::operator ==(const float16 &f) { return (_value == f._value); } - - bool float16::operator !=(const float16 &f) { return (_value != f._value); } - - bool float16::operator >(const float16 &f) { - if ((_value & 0x8000) && (f._value & 0x8000)) - return _value < f._value; - if (_value & 0x8000) - return false; - if (f._value & 0x8000) - return true; - return _value > f._value; - } - - bool float16::operator >=(const float16 &f) { - if ((_value & 0x8000) && (f._value & 0x8000)) - return _value <= f._value; - if (_value & 0x8000) - return false; - if (f._value & 0x8000) - return true; - return _value >= f._value; - } - - bool float16::operator <(const float16 &f) { - if ((_value & 0x8000) && (f._value & 0x8000)) - return _value > f._value; - if (_value & 0x8000) - return true; - if (f._value & 0x8000) - return false; - return _value < f._value; - } - - bool float16::operator <=(const float16 &f) { - if ((_value & 0x8000) && (f._value & 0x8000)) - return _value >= f._value; - if (_value & 0x8000) - return true; - if (f._value & 0x8000) - return false; - return _value <= f._value; - } - - ////////////////////////////////////////////////////////// - // - // NEGATION - // - float16 float16::operator -() { - float16 f16; - f16.setBinary(_value ^ 0x8000); - return f16; - } - - ////////////////////////////////////////////////////////// - // - // MATH - // - float16 float16::operator +(const float16 &f) { - return float16(this->toDouble() + f.toDouble()); - } - - float16 float16::operator -(const float16 &f) { - return float16(this->toDouble() - f.toDouble()); - } - - float16 float16::operator *(const float16 &f) { - return float16(this->toDouble() * f.toDouble()); - } - - float16 float16::operator /(const float16 &f) { - return float16(this->toDouble() / f.toDouble()); - } - - float16 & float16::operator+=(const float16 &f) { - *this = this->toDouble() + f.toDouble(); - return *this; - } - - float16 & float16::operator-=(const float16 &f) { - *this = this->toDouble() - f.toDouble(); - return *this; - } - - float16 & float16::operator*=(const float16 &f) { - *this = this->toDouble() * f.toDouble(); - return *this; - } - - float16 & float16::operator/=(const float16 &f) { - *this = this->toDouble() / f.toDouble(); - return *this; - } - - ////////////////////////////////////////////////////////// - // - // MATH HELPER FUNCTIONS - // - int float16::sign() { - if (_value & 0x8000) - return -1; - if (_value & 0xFFFF) - return 1; - return 0; - } - - bool float16::isZero() { return ((_value & 0x7FFF) == 0x0000); } - - bool float16::isNaN() { - if ((_value & 0x7C00) != 0x7C00) - return false; - if ((_value & 0x03FF) == 0x0000) - return false; - return true; - } - - bool float16::isInf() { return ((_value == 0x7C00) || (_value == 0xFC00)); } - */ - ////////////////////////////////////////////////////////// - // - // CORE CONVERSION - // - float f16tof32(ushort _value) { - //ushort sgn; - ushort man; - int exp; - float f; - - //Debug.Log($"{_value}"); - - bool sgn = (_value & 0x8000) > 0; - exp = (_value & 0x7C00) >> 10; - man = (ushort)(_value & 0x03FF); - - //Debug.Log($"{sgn} {exp} {man}"); - - // ZERO - if ((_value & 0x7FFF) == 0) { - return sgn ? -0 : 0; - } - // NAN & INF - if (exp == 0x001F) { - if (man == 0) - return sgn ? float.NegativeInfinity : float.PositiveInfinity; //-INFINITY : INFINITY; - else - return float.NaN; // NAN; - } - - // SUBNORMAL/NORMAL - if (exp == 0) - f = 0; - else - f = 1; - - // PROCESS MANTISSE - for (int i = 9; i >= 0; i--) { - f *= 2; - if ((man & (1 << i)) != 0) - f = f + 1; - } - //Debug.Log($"{f}"); - f = f * (float)Math.Pow(2.0f, exp - 25); - if (exp == 0) { - f = f * (float)Math.Pow(2.0f, -13); // 5.96046447754e-8; - } - //Debug.Log($"{f}"); - return sgn ? -f : f; - } - - public static uint SingleToInt32Bits(float value) { - byte[] bytes = BitConverter.GetBytes(value); - if (BitConverter.IsLittleEndian) - Array.Reverse(bytes); // If the system is little-endian, reverse the byte order - return BitConverter.ToUInt32(bytes, 0); - } - - public ushort F32ToF16__(float f) { - uint t = BitConverter.ToUInt32(BitConverter.GetBytes(f), 0); - ushort man = (ushort)((t & 0x007FFFFF) >> 12); - int exp = (int)((t & 0x7F800000) >> 23); - bool sgn = (t & 0x80000000) != 0; - - // handle 0 - if ((t & 0x7FFFFFFF) == 0) { - return sgn ? (ushort)0x8000 : (ushort)0x0000; - } - // denormalized float32 does not fit in float16 - if (exp == 0x00) { - return sgn ? (ushort)0x8000 : (ushort)0x0000; - } - // handle infinity & NAN - if (exp == 0x00FF) { - if (man != 0) - return 0xFE00; // NAN - return sgn ? (ushort)0xFC00 : (ushort)0x7C00; // -INF : INF - } - - // normal numbers - exp = exp - 127 + 15; - // overflow does not fit => INF - if (exp > 30) { - return sgn ? (ushort)0xFC00 : (ushort)0x7C00; // -INF : INF - } - // subnormal numbers - if (exp < -38) { - return sgn ? (ushort)0x8000 : (ushort)0x0000; // -0 or 0 ? just 0 ? - } - if (exp <= 0) // subnormal - { - man >>= (exp + 14); - // rounding - man++; - man >>= 1; - if (sgn) - return (ushort)(0x8000 | man); - return man; - } - - // normal - // TODO rounding - exp <<= 10; - man++; - man >>= 1; - if (sgn) - return (ushort)(0x8000 | exp | man); - return (ushort)(exp | man); - } - - //This function is faulty!!!! - ushort f32tof16(float f) { - //uint t = *(uint*)&f; - //uint t = (uint)BitConverter.SingleToInt32Bits(f); - uint t = SingleToInt32Bits(f); - // man bits = 10; but we keep 11 for rounding - ushort man = (ushort)((t & 0x007FFFFF) >> 12); - short exp = (short)((t & 0x7F800000) >> 23); - bool sgn = (t & 0x80000000) != 0; - - // handle 0 - if ((t & 0x7FFFFFFF) == 0) { - return sgn ? (ushort)0x8000 : (ushort)0x0000; - } - // denormalized float32 does not fit in float16 - if (exp == 0x00) { - return sgn ? (ushort)0x8000 : (ushort)0x0000; - } - // handle infinity & NAN - if (exp == 0x00FF) { - if (man != 0) - return 0xFE00; // NAN - return sgn ? (ushort)0xFC00 : (ushort)0x7C00; // -INF : INF - } - - // normal numbers - exp = (short)(exp - 127 + 15); - // overflow does not fit => INF - if (exp > 30) { - return sgn ? (ushort)0xFC00 : (ushort)0x7C00; // -INF : INF - } - // subnormal numbers - if (exp < -38) { - return sgn ? (ushort)0x8000 : (ushort)0x0000; // -0 or 0 ? just 0 ? - } - if (exp <= 0) // subnormal - { - man >>= (exp + 14); - // rounding - man++; - man >>= 1; - if (sgn) - return (ushort)(0x8000 | man); - return man; - } - - // normal - // TODO rounding - exp <<= 10; - man++; - man >>= 1; - ushort uexp = (ushort)exp; - if (sgn) - return (ushort)(0x8000 | uexp | man); - return (ushort)(uexp | man); - } - - // -- END OF FILE -- - } - -} \ No newline at end of file diff --git a/Runtime/LinearAlgebra/test/AngleTest.cs b/Runtime/LinearAlgebra/test/AngleTest.cs deleted file mode 100644 index 8362d82..0000000 --- a/Runtime/LinearAlgebra/test/AngleTest.cs +++ /dev/null @@ -1,501 +0,0 @@ -#if !UNITY_5_6_OR_NEWER -using System; -using System.Formats.Asn1; -using NUnit.Framework; - -namespace LinearAlgebra.Test { - public class AngleTests { - [SetUp] - public void Setup() { - } - - [Test] - public void Construct() { - // Degrees - float angle = 0.0f; - AngleFloat a = AngleFloat.Degrees(angle); - Assert.AreEqual(angle, a.inDegrees); - - angle = -180.0f; - a = AngleFloat.Degrees(angle); - Assert.AreEqual(angle, a.inDegrees); - - angle = 270.0f; - a = AngleFloat.Degrees(angle); - Assert.AreEqual(-90, a.inDegrees); - - angle = -270.0f; - a = AngleFloat.Degrees(angle); - Assert.AreEqual(90, a.inDegrees); - - // Radians - angle = 0.0f; - a = AngleFloat.Radians(angle); - Assert.AreEqual(angle, a.inRadians); - - angle = (float)-Math.PI; - a = AngleFloat.Radians(angle); - Assert.AreEqual(angle, a.inRadians); - - angle = (float)Math.PI * 1.5f; - a = AngleFloat.Radians(angle); - Assert.AreEqual(-Math.PI * 0.5f, a.inRadians, 1.0E-05F); - - // Revolutions - angle = 0.0f; - a = AngleFloat.Revolutions(angle); - Assert.AreEqual(angle, a.inRevolutions); - - angle = -0.5f; - a = AngleFloat.Revolutions(angle); - Assert.AreEqual(angle, a.inRevolutions); - - angle = 0.75f; - a = AngleFloat.Revolutions(angle); - Assert.AreEqual(-0.25f, a.inRevolutions); - - } - - [Test] - public void Revolutions() { - AngleFloat a; - - // Test zero - a = AngleFloat.Revolutions(0.0f); - Assert.AreEqual(0.0f, a.inRevolutions); - - // Test positive values within range - a = AngleFloat.Revolutions(0.25f); - Assert.AreEqual(0.25f, a.inRevolutions); - - a = AngleFloat.Revolutions(0.5f); - Assert.AreEqual(-0.5f, a.inRevolutions); - - // Test negative values within range - a = AngleFloat.Revolutions(-0.25f); - Assert.AreEqual(-0.25f, a.inRevolutions); - - a = AngleFloat.Revolutions(-0.5f); - Assert.AreEqual(-0.5f, a.inRevolutions); - - // Test values outside range (positive) - a = AngleFloat.Revolutions(1.0f); - Assert.AreEqual(0.0f, a.inRevolutions); - - a = AngleFloat.Revolutions(1.25f); - Assert.AreEqual(0.25f, a.inRevolutions); - - a = AngleFloat.Revolutions(1.75f); - Assert.AreEqual(-0.25f, a.inRevolutions); - - // Test values outside range (negative) - a = AngleFloat.Revolutions(-1.0f); - Assert.AreEqual(0.0f, a.inRevolutions); - - a = AngleFloat.Revolutions(-1.25f); - Assert.AreEqual(-0.25f, a.inRevolutions); - - a = AngleFloat.Revolutions(-1.75f); - Assert.AreEqual(0.25f, a.inRevolutions); - - // Test infinity - a = AngleFloat.Revolutions(float.PositiveInfinity); - Assert.AreEqual(float.PositiveInfinity, a.inRevolutions); - - a = AngleFloat.Revolutions(float.NegativeInfinity); - Assert.AreEqual(float.NegativeInfinity, a.inRevolutions); - } - - [Test] - public void Equality() { - // Test equality operator - Assert.IsTrue(AngleFloat.Degrees(90) == AngleFloat.Degrees(90), "90 == 90"); - Assert.IsFalse(AngleFloat.Degrees(90) == AngleFloat.Degrees(45), "90 == 45"); - Assert.IsTrue(AngleFloat.Degrees(0) == AngleFloat.Degrees(0), "0 == 0"); - Assert.IsTrue(AngleFloat.Degrees(-180) == AngleFloat.Degrees(-180), "-180 == -180"); - - // Test inequality operator - Assert.IsTrue(AngleFloat.Degrees(90) != AngleFloat.Degrees(45), "90 != 45"); - Assert.IsFalse(AngleFloat.Degrees(90) != AngleFloat.Degrees(90), "90 != 90"); - Assert.IsTrue(AngleFloat.Degrees(0) != AngleFloat.Degrees(1), "0 != 1"); - - // Test greater than operator - Assert.IsTrue(AngleFloat.Degrees(90) > AngleFloat.Degrees(45), "90 > 45"); - Assert.IsFalse(AngleFloat.Degrees(45) > AngleFloat.Degrees(90), "45 > 90"); - Assert.IsFalse(AngleFloat.Degrees(90) > AngleFloat.Degrees(90), "90 > 90"); - - // Test greater than or equal operator - Assert.IsTrue(AngleFloat.Degrees(90) >= AngleFloat.Degrees(45), "90 >= 45"); - Assert.IsTrue(AngleFloat.Degrees(90) >= AngleFloat.Degrees(90), "90 >= 90"); - Assert.IsFalse(AngleFloat.Degrees(45) >= AngleFloat.Degrees(90), "45 >= 90"); - - // Test less than operator - Assert.IsTrue(AngleFloat.Degrees(45) < AngleFloat.Degrees(90), "45 < 90"); - Assert.IsFalse(AngleFloat.Degrees(90) < AngleFloat.Degrees(45), "90 < 45"); - Assert.IsFalse(AngleFloat.Degrees(90) < AngleFloat.Degrees(90), "90 < 90"); - - // Test less than or equal operator - Assert.IsTrue(AngleFloat.Degrees(45) <= AngleFloat.Degrees(90), "45 <= 90"); - Assert.IsTrue(AngleFloat.Degrees(90) <= AngleFloat.Degrees(90), "90 <= 90"); - Assert.IsFalse(AngleFloat.Degrees(90) <= AngleFloat.Degrees(45), "90 <= 45"); - } - - // [Test] - // public void Normalize() { - // float r = 0; - - // r = Angle.Normalize(90); - // Assert.AreEqual(r, 90, "Normalize 90"); - - // r = Angle.Normalize(-90); - // Assert.AreEqual(r, -90, "Normalize -90"); - - // r = Angle.Normalize(270); - // Assert.AreEqual(r, -90, "Normalize 270"); - - // r = Angle.Normalize(270 + 360); - // Assert.AreEqual(r, -90, "Normalize 270+360"); - - // r = Angle.Normalize(-270); - // Assert.AreEqual(r, 90, "Normalize -270"); - - // r = Angle.Normalize(-270 - 360); - // Assert.AreEqual(r, 90, "Normalize -270-360"); - - // r = Angle.Normalize(0); - // Assert.AreEqual(r, 0, "Normalize 0"); - - // r = Angle.Normalize(float.PositiveInfinity); - // Assert.AreEqual(r, float.PositiveInfinity, "Normalize INFINITY"); - - // r = Angle.Normalize(float.NegativeInfinity); - // Assert.AreEqual(r, float.NegativeInfinity, "Normalize INFINITY"); - // } - - [Test] - public void Clamp() { - float r = 0; - - r = AngleFloat.Clamp(AngleFloat.Degrees(1), AngleFloat.Degrees(0), AngleFloat.Degrees(2)); - Assert.AreEqual(1, r, "Clamp 1 0 2"); - - r = AngleFloat.Clamp(AngleFloat.Degrees(-1), AngleFloat.Degrees(0), AngleFloat.Degrees(2)); - Assert.AreEqual(0, r, "Clamp -1 0 2"); - - r = AngleFloat.Clamp(AngleFloat.Degrees(3), AngleFloat.Degrees(0), AngleFloat.Degrees(2)); - Assert.AreEqual(2, r, "Clamp 3 0 2"); - - r = AngleFloat.Clamp(AngleFloat.Degrees(1), AngleFloat.Degrees(0), AngleFloat.Degrees(0)); - Assert.AreEqual(0, r, "Clamp 1 0 0"); - - r = AngleFloat.Clamp(AngleFloat.Degrees(0), AngleFloat.Degrees(0), AngleFloat.Degrees(0)); - Assert.AreEqual(0, r, "Clamp 0 0 0"); - - r = AngleFloat.Clamp(AngleFloat.Degrees(0), AngleFloat.Degrees(1), AngleFloat.Degrees(-1)); - Assert.AreEqual(1, r, "Clamp 0 1 -1"); - - r = AngleFloat.Clamp(AngleFloat.Degrees(1), AngleFloat.Degrees(0), AngleFloat.Degrees(float.PositiveInfinity)); - Assert.AreEqual(1, r, "Clamp 1 0 INFINITY"); - - r = AngleFloat.Clamp(AngleFloat.Degrees(1), AngleFloat.Degrees(float.NegativeInfinity), AngleFloat.Degrees(1)); - Assert.AreEqual(1, r, "Clamp 1 -INFINITY 1"); - } - - [Test] - public void Cos() { - // Test zero - Assert.AreEqual(1.0f, AngleFloat.Cos(AngleFloat.Degrees(0)), 1.0E-05F, "Cos(0°)"); - - // Test 90 degrees - Assert.AreEqual(0.0f, AngleFloat.Cos(AngleFloat.Degrees(90)), 1.0E-05F, "Cos(90°)"); - - // Test 180 degrees - Assert.AreEqual(-1.0f, AngleFloat.Cos(AngleFloat.Degrees(180)), 1.0E-05F, "Cos(180°)"); - - // Test 270 degrees - Assert.AreEqual(0.0f, AngleFloat.Cos(AngleFloat.Degrees(270)), 1.0E-05F, "Cos(270°)"); - - // Test 45 degrees - Assert.AreEqual(MathF.Sqrt(2) / 2, AngleFloat.Cos(AngleFloat.Degrees(45)), 1.0E-05F, "Cos(45°)"); - - // Test negative angle - Assert.AreEqual(1.0f, AngleFloat.Cos(AngleFloat.Degrees(-360)), 1.0E-05F, "Cos(-360°)"); - - // Test using radians - Assert.AreEqual(1.0f, AngleFloat.Cos(AngleFloat.Radians(0)), 1.0E-05F, "Cos(0 rad)"); - Assert.AreEqual(0.0f, AngleFloat.Cos(AngleFloat.Radians((float)Math.PI / 2)), 1.0E-05F, "Cos(Ï€/2)"); - Assert.AreEqual(-1.0f, AngleFloat.Cos(AngleFloat.Radians((float)Math.PI)), 1.0E-05F, "Cos(Ï€)"); - } - - [Test] - public void Sin() { - // Test zero - Assert.AreEqual(0.0f, AngleFloat.Sin(AngleFloat.Degrees(0)), 1.0E-05F, "Sin(0°)"); - - // Test 90 degrees - Assert.AreEqual(1.0f, AngleFloat.Sin(AngleFloat.Degrees(90)), 1.0E-05F, "Sin(90°)"); - - // Test 180 degrees - Assert.AreEqual(0.0f, AngleFloat.Sin(AngleFloat.Degrees(180)), 1.0E-05F, "Sin(180°)"); - - // Test 270 degrees - Assert.AreEqual(-1.0f, AngleFloat.Sin(AngleFloat.Degrees(270)), 1.0E-05F, "Sin(270°)"); - - // Test 45 degrees - Assert.AreEqual(MathF.Sqrt(2) / 2, AngleFloat.Sin(AngleFloat.Degrees(45)), 1.0E-05F, "Sin(45°)"); - - // Test negative angle - Assert.AreEqual(0.0f, AngleFloat.Sin(AngleFloat.Degrees(-360)), 1.0E-05F, "Sin(-360°)"); - - // Test using radians - Assert.AreEqual(0.0f, AngleFloat.Sin(AngleFloat.Radians(0)), 1.0E-05F, "Sin(0 rad)"); - Assert.AreEqual(1.0f, AngleFloat.Sin(AngleFloat.Radians((float)Math.PI / 2)), 1.0E-05F, "Sin(Ï€/2)"); - Assert.AreEqual(0.0f, AngleFloat.Sin(AngleFloat.Radians((float)Math.PI)), 1.0E-05F, "Sin(Ï€)"); - } - - [Test] - public void Tan() { - // Test zero - Assert.AreEqual(0.0f, AngleFloat.Tan(AngleFloat.Degrees(0)), 1.0E-05F, "Tan(0°)"); - - // Test 45 degrees - Assert.AreEqual(1.0f, AngleFloat.Tan(AngleFloat.Degrees(45)), 1.0E-05F, "Tan(45°)"); - - // Test -45 degrees - Assert.AreEqual(-1.0f, AngleFloat.Tan(AngleFloat.Degrees(-45)), 1.0E-05F, "Tan(-45°)"); - - // Test using radians - Assert.AreEqual(0.0f, AngleFloat.Tan(AngleFloat.Radians(0)), 1.0E-05F, "Tan(0 rad)"); - Assert.AreEqual(1.0f, AngleFloat.Tan(AngleFloat.Radians((float)Math.PI / 4)), 1.0E-05F, "Tan(Ï€/4)"); - } - - [Test] - public void Acos() { - // Test 1 (0 degrees) - Assert.AreEqual(0.0f, AngleFloat.Acos(1.0f).inRadians, 1.0E-05F, "Acos(1)"); - - // Test 0 (90 degrees or Ï€/2 radians) - Assert.AreEqual((float)Math.PI / 2, AngleFloat.Acos(0.0f).inRadians, 1.0E-05F, "Acos(0)"); - - // Test -1 (-180 degrees or Ï€ radians) - Assert.AreEqual((float)-Math.PI, AngleFloat.Acos(-1.0f).inRadians, 1.0E-05F, "Acos(-1)"); - - // Test 0.5 (60 degrees or Ï€/3 radians) - Assert.AreEqual((float)Math.PI / 3, AngleFloat.Acos(0.5f).inRadians, 1.0E-05F, "Acos(0.5)"); - - // Test sqrt(2)/2 (45 degrees or Ï€/4 radians) - Assert.AreEqual((float)Math.PI / 4, AngleFloat.Acos(MathF.Sqrt(2) / 2).inRadians, 1.0E-05F, "Acos(√2/2)"); - } - - [Test] - public void Asin() { - // Test 0 (0 degrees) - Assert.AreEqual(0.0f, AngleFloat.Asin(0.0f).inRadians, 1.0E-05F, "Asin(0)"); - - // Test 1 (90 degrees or Ï€/2 radians) - Assert.AreEqual((float)Math.PI / 2, AngleFloat.Asin(1.0f).inRadians, 1.0E-05F, "Asin(1)"); - - // Test -1 (-90 degrees or -Ï€/2 radians) - Assert.AreEqual(-(float)Math.PI / 2, AngleFloat.Asin(-1.0f).inRadians, 1.0E-05F, "Asin(-1)"); - - // Test 0.5 (30 degrees or Ï€/6 radians) - Assert.AreEqual((float)Math.PI / 6, AngleFloat.Asin(0.5f).inRadians, 1.0E-05F, "Asin(0.5)"); - - // Test sqrt(2)/2 (45 degrees or Ï€/4 radians) - Assert.AreEqual((float)Math.PI / 4, AngleFloat.Asin(MathF.Sqrt(2) / 2).inRadians, 1.0E-05F, "Asin(√2/2)"); - } - - - [Test] - public void Atan() { - // Test zero - Assert.AreEqual(0.0f, AngleFloat.Atan(0.0f).inRadians, 1.0E-05F, "Atan(0)"); - - // Test 1 (45 degrees or Ï€/4 radians) - Assert.AreEqual((float)Math.PI / 4, AngleFloat.Atan(1.0f).inRadians, 1.0E-05F, "Atan(1)"); - - // Test -1 (-45 degrees or -Ï€/4 radians) - Assert.AreEqual(-(float)Math.PI / 4, AngleFloat.Atan(-1.0f).inRadians, 1.0E-05F, "Atan(-1)"); - - // Test sqrt(3) (60 degrees or Ï€/3 radians) - Assert.AreEqual((float)Math.PI / 3, AngleFloat.Atan(MathF.Sqrt(3)).inRadians, 1.0E-05F, "Atan(√3)"); - - // Test 1/sqrt(3) (30 degrees or Ï€/6 radians) - Assert.AreEqual((float)Math.PI / 6, AngleFloat.Atan(1.0f / MathF.Sqrt(3)).inRadians, 1.0E-05F, "Atan(1/√3)"); - - // Test positive infinity - Assert.AreEqual((float)Math.PI / 2, AngleFloat.Atan(float.PositiveInfinity).inRadians, 1.0E-05F, "Atan(+∞)"); - - // Test negative infinity - Assert.AreEqual(-(float)Math.PI / 2, AngleFloat.Atan(float.NegativeInfinity).inRadians, 1.0E-05F, "Atan(-∞)"); - } - - [Test] - public void Atan2() { - // Test basic quadrant I - Assert.AreEqual((float)Math.PI / 4, AngleFloat.Atan2(1.0f, 1.0f).inRadians, 1.0E-05F, "Atan2(1, 1)"); - - // Test quadrant II - Assert.AreEqual(3 * (float)Math.PI / 4, AngleFloat.Atan2(1.0f, -1.0f).inRadians, 1.0E-05F, "Atan2(1, -1)"); - - // Test quadrant III - Assert.AreEqual(-(float)Math.PI * 0.75f, AngleFloat.Atan2(-1.0f, -1.0f).inRadians, 1.0E-05F, "Atan2(-1, -1)"); - - // Test quadrant IV - Assert.AreEqual(-(float)Math.PI / 4, AngleFloat.Atan2(-1.0f, 1.0f).inRadians, 1.0E-05F, "Atan2(-1, 1)"); - - // Test positive x-axis - Assert.AreEqual(0.0f, AngleFloat.Atan2(0.0f, 1.0f).inRadians, 1.0E-05F, "Atan2(0, 1)"); - - // Test positive y-axis - Assert.AreEqual((float)Math.PI / 2, AngleFloat.Atan2(1.0f, 0.0f).inRadians, 1.0E-05F, "Atan2(1, 0)"); - - // Test negative y-axis - Assert.AreEqual(-(float)Math.PI / 2, AngleFloat.Atan2(-1.0f, 0.0f).inRadians, 1.0E-05F, "Atan2(-1, 0)"); - - // Test origin - Assert.AreEqual(0.0f, AngleFloat.Atan2(0.0f, 0.0f).inRadians, 1.0E-05F, "Atan2(0, 0)"); - - // Test with different magnitudes - Assert.AreEqual((float)Math.PI / 3, AngleFloat.Atan2(MathF.Sqrt(3), 1.0f).inRadians, 1.0E-05F, "Atan2(√3, 1)"); - - // Test negative x-axis - Assert.AreEqual((float)-Math.PI, AngleFloat.Atan2(0.0f, -1.0f).inRadians, 1.0E-05F, "Atan2(0, -1)"); - } - - [Test] - public void Multiplication() { - AngleFloat r = AngleFloat.zero; - - // Angle * float - r = AngleFloat.Degrees(90) * 2; - Assert.AreEqual(-180, r.inDegrees, "Multiply 90 * 2"); - - r = AngleFloat.Degrees(45) * 0.5f; - Assert.AreEqual(22.5f, r.inDegrees, "Multiply 45 * 0.5"); - - r = AngleFloat.Degrees(90) * 0; - Assert.AreEqual(0, r.inDegrees, "Multiply 90 * 0"); - - r = AngleFloat.Degrees(-90) * 2; - Assert.AreEqual(-180, r.inDegrees, "Multiply -90 * 2"); - - r = AngleFloat.Degrees(270) * 2; - Assert.AreEqual(-180, r.inDegrees, "Multiply 270 * 2 (normalized)"); - - // float * Angle - r = 2 * AngleFloat.Degrees(90); - Assert.AreEqual(-180, r.inDegrees, "Multiply 2 * 90"); - - r = 0.5f * AngleFloat.Degrees(45); - Assert.AreEqual(22.5, r.inDegrees, "Multiply 0.5 * 45"); - - r = 0 * AngleFloat.Degrees(90); - Assert.AreEqual(0, r.inDegrees, "Multiply 0 * 90"); - - r = 2 * AngleFloat.Degrees(-90); - Assert.AreEqual(-180, r.inDegrees, "Multiply 2 * -90"); - - // Negative factor - r = AngleFloat.Degrees(90) * -1; - Assert.AreEqual(-90, r.inDegrees, "Multiply 90 * -1"); - - r = -1 * AngleFloat.Degrees(90); - Assert.AreEqual(-90, r.inDegrees, "Multiply -1 * 90"); - } - - [Test] - public void MoveTowards() { - AngleFloat r = AngleFloat.zero; - - r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), 30); - Assert.AreEqual(30, r.inDegrees, "MoveTowards 0 90 30"); - - r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), 90); - Assert.AreEqual(90, r.inDegrees, "MoveTowards 0 90 90"); - - r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), 180); - Assert.AreEqual(90, r.inDegrees, "MoveTowards 0 90 180"); - - r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), 270); - Assert.AreEqual(90, r.inDegrees, "MoveTowrads 0 90 270"); - - r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), -30); - Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 90 -30"); - - r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(-90), -30); - Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 -90 -30"); - - r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(-90), -90); - Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 -90 -90"); - - r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(-90), -180); - Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 -90 -180"); - - r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(-90), -270); - Assert.AreEqual(0, r.inDegrees, "MoveTowrads 0 -90 -270"); - - r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), 0); - Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 90 0"); - - r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(0), 0); - Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 0 0"); - - r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(0), 30); - Assert.AreEqual(0, r.inDegrees, "MoveTowrads 0 0 30"); - - r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), float.PositiveInfinity); - Assert.AreEqual(90, r.inDegrees, "MoveTowards 0 90 INFINITY"); - - r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(float.PositiveInfinity), 30); - Assert.AreEqual(30, r.inDegrees, "MoveTowrads 0 INFINITY 30"); - - r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(-90), float.NegativeInfinity); - Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 -90 -INFINITY"); - - r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(float.NegativeInfinity), -30); - Assert.AreEqual(0, r.inDegrees, "MoveTowrads 0 -INFINITY -30"); - - } - - [Test] - public void Difference() { - float r = 0; - - r = Angles.Difference(0, 90); - Assert.AreEqual(90, r, "Difference 0 90"); - - r = Angles.Difference(0, -90); - Assert.AreEqual(-90, r, "Difference 0 -90"); - - r = Angles.Difference(0, 270); - Assert.AreEqual(-90, r, "Difference 0 270"); - - r = Angles.Difference(0, -270); - Assert.AreEqual(90, r, "Difference 0 -270"); - - r = Angles.Difference(90, 0); - Assert.AreEqual(-90, r, "Difference 90 0"); - - r = Angles.Difference(-90, 0); - Assert.AreEqual(90, r, "Difference -90 0"); - - r = Angles.Difference(0, 0); - Assert.AreEqual(0, r, "Difference 0 0"); - - r = Angles.Difference(90, 90); - Assert.AreEqual(0, r, "Difference 90 90"); - - r = Angles.Difference(0, float.PositiveInfinity); - Assert.AreEqual(float.PositiveInfinity, r, "Difference 0 INFINITY"); - - r = Angles.Difference(0, float.NegativeInfinity); - Assert.AreEqual(float.NegativeInfinity, r, "Difference 0 -INFINITY"); - - r = Angles.Difference(float.NegativeInfinity, float.PositiveInfinity); - Assert.AreEqual(float.PositiveInfinity, r, "Difference -INFINITY INFINITY"); - } - } - -} -#endif diff --git a/Runtime/LinearAlgebra/test/DirectionTest.cs b/Runtime/LinearAlgebra/test/DirectionTest.cs deleted file mode 100644 index 0eb9882..0000000 --- a/Runtime/LinearAlgebra/test/DirectionTest.cs +++ /dev/null @@ -1,226 +0,0 @@ -#if !UNITY_5_6_OR_NEWER -using System; -using NUnit.Framework; - -namespace LinearAlgebra.Test { - public class DirectionTest { - - [Test] - public void RadiansForward() { - Direction d = Direction.Radians(0, 0); - Assert.AreEqual(0, d.horizontal.inDegrees, 0.0001f); - Assert.AreEqual(0, d.vertical.inDegrees, 0.0001f); - } - - [Test] - public void RadiansUp() { - Direction d = Direction.Radians(0, (float)Math.PI / 2); - Assert.AreEqual(0, d.horizontal.inDegrees, 0.0001f); - Assert.AreEqual(90, d.vertical.inDegrees, 0.0001f); - } - - [Test] - public void RadiansDown() { - Direction d = Direction.Radians(0, -(float)Math.PI / 2); - Assert.AreEqual(0, d.horizontal.inDegrees, 0.0001f); - Assert.AreEqual(-90, d.vertical.inDegrees, 0.0001f); - } - - [Test] - public void RadiansArbitrary() { - Direction d = Direction.Radians((float)Math.PI / 4, (float)Math.PI / 6); - Assert.AreEqual(45, d.horizontal.inDegrees, 0.0001f); - Assert.AreEqual(30, d.vertical.inDegrees, 0.0001f); - } - - [Test] - public void DegreesNormalize1() { - Direction d = Direction.Degrees(112, 91); - Assert.AreEqual(-68, d.horizontal.inDegrees, 0.0001f); - Assert.AreEqual(89, d.vertical.inDegrees, 0.0001f); - } - - [Test] - public void RadiansEquivalentToDegreesConversion() { - Direction d1 = Direction.Radians((float)Math.PI / 3, (float)Math.PI / 4); - Direction d2 = Direction.Degrees(60, 45); - Assert.AreEqual(d1.horizontal.inDegrees, d2.horizontal.inDegrees, 0.0001f); - Assert.AreEqual(d1.vertical.inDegrees, d2.vertical.inDegrees, 0.0001f); - } - - [Test] - public void ToVector3Forward() { - Direction d = Direction.forward; - Vector3Float v = d.ToVector3(); - Assert.AreEqual(0, v.horizontal, 0.0001f); - Assert.AreEqual(0, v.vertical, 0.0001f); - Assert.AreEqual(1, v.depth, 0.0001f); - } - - [Test] - public void ToVector3Up() { - Direction d = Direction.up; - Vector3Float v = d.ToVector3(); - Assert.AreEqual(0, v.horizontal, 0.0001f); - Assert.AreEqual(1, v.vertical, 0.0001f); - Assert.AreEqual(0, v.depth, 0.0001f); - } - - [Test] - public void ToVector3Down() { - Direction d = Direction.down; - Vector3Float v = d.ToVector3(); - Assert.AreEqual(0, v.horizontal, 0.0001f); - Assert.AreEqual(-1, v.vertical, 0.0001f); - Assert.AreEqual(0, v.depth, 0.0001f); - } - - [Test] - public void ToVector3Left() { - Direction d = Direction.left; - Vector3Float v = d.ToVector3(); - Assert.AreEqual(-1, v.horizontal, 0.0001f); - Assert.AreEqual(0, v.vertical, 0.0001f); - Assert.AreEqual(0, v.depth, 0.0001f); - } - - [Test] - public void FromVector3Forward() { - Vector3Float v = new(0, 0, 1); - Direction d = Direction.FromVector3(v); - Assert.AreEqual(0, d.horizontal.inDegrees, 0.0001f); - Assert.AreEqual(0, d.vertical.inDegrees, 0.0001f); - } - - [Test] - public void ToVector3AndBack() { - Direction d1 = Direction.Degrees(45, 30); - Vector3Float v = d1.ToVector3(); - Direction d2 = Direction.FromVector3(v); - Assert.AreEqual(d1.horizontal.inDegrees, d2.horizontal.inDegrees, 0.0001f); - Assert.AreEqual(d1.vertical.inDegrees, d2.vertical.inDegrees, 0.0001f); - } - - [Test] - public void ToVector3AndBack2() { - Direction d1 = Direction.Degrees(-135, 85); - Vector3Float v = d1.ToVector3(); - Direction d2 = Direction.FromVector3(v); - Assert.AreEqual(d1.horizontal.inDegrees, d2.horizontal.inDegrees, 0.0001f); - Assert.AreEqual(d1.vertical.inDegrees, d2.vertical.inDegrees, 0.0001f); - } - - [Test] - public void Compare() { - Direction d1 = Direction.Degrees(45, 135); - Direction d2 = new(AngleFloat.Degrees(45), AngleFloat.Degrees(135)); - bool r; - r = d1 == d2; - Assert.True(r); - Assert.AreEqual(d1, d2); - } - - [Test] - public void NotEqualWithDifferentHorizontal() { - Direction d1 = Direction.Degrees(45, 30); - Direction d2 = Direction.Degrees(90, 30); - Assert.True(d1 != d2); - } - - [Test] - public void NotEqualWithDifferentVertical() { - Direction d1 = Direction.Degrees(45, 30); - Direction d2 = Direction.Degrees(45, 60); - Assert.True(d1 != d2); - } - - [Test] - public void NotEqualWithDifferentBoth() { - Direction d1 = Direction.Degrees(45, 30); - Direction d2 = Direction.Degrees(90, 60); - Assert.True(d1 != d2); - } - - [Test] - public void NotEqualWithSameValues() { - Direction d1 = Direction.Degrees(45, 30); - Direction d2 = Direction.Degrees(45, 30); - Assert.False(d1 != d2); - } - - - [Test] - public void EqualsWithSameValues() { - Direction d1 = Direction.Degrees(45, 30); - Direction d2 = Direction.Degrees(45, 30); - Assert.True(d1.Equals(d2)); - } - - [Test] - public void EqualsWithDifferentHorizontal() { - Direction d1 = Direction.Degrees(45, 30); - Direction d2 = Direction.Degrees(90, 30); - Assert.False(d1.Equals(d2)); - } - - [Test] - public void EqualsWithDifferentVertical() { - Direction d1 = Direction.Degrees(45, 30); - Direction d2 = Direction.Degrees(45, 60); - Assert.False(d1.Equals(d2)); - } - - [Test] - public void EqualsWithDifferentBoth() { - Direction d1 = Direction.Degrees(45, 30); - Direction d2 = Direction.Degrees(90, 60); - Assert.False(d1.Equals(d2)); - } - - [Test] - public void EqualsWithNonDirectionObject() { - Direction d = Direction.Degrees(45, 30); - Assert.False(d.Equals("not a direction")); - } - - [Test] - public void EqualsWithNull() { - Direction d = Direction.Degrees(45, 30); - Assert.False(d.Equals(null)); - } - - [Test] - public void EqualsWithZeros() { - Direction d1 = Direction.forward; - Direction d2 = Direction.Degrees(0, 0); - Assert.True(d1.Equals(d2)); - } - - [Test] - public void HashCode() { - Direction d1 = Direction.Degrees(45, 30); - Direction d2 = Direction.Degrees(45, 30); - Assert.AreEqual(d1.GetHashCode(), d2.GetHashCode()); - - d1 = Direction.Degrees(45, 30); - d2 = Direction.Degrees(90, 30); - Assert.AreNotEqual(d1.GetHashCode(), d2.GetHashCode()); - - d1 = Direction.Degrees(45, 30); - d2 = Direction.Degrees(45, 60); - Assert.AreNotEqual(d1.GetHashCode(), d2.GetHashCode()); - - Direction d = Direction.Degrees(45, 30); - int hash1 = d.GetHashCode(); - int hash2 = d.GetHashCode(); - Assert.AreEqual(hash1, hash2); - - d1 = Direction.forward; - d2 = Direction.Degrees(0, 0); - Assert.AreEqual(d1.GetHashCode(), d2.GetHashCode()); - } - - }; -} -#endif - diff --git a/Runtime/LinearAlgebra/test/LinearAlgebra_Test.csproj b/Runtime/LinearAlgebra/test/LinearAlgebra_Test.csproj deleted file mode 100644 index 5b48e60..0000000 --- a/Runtime/LinearAlgebra/test/LinearAlgebra_Test.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - net8.0 - false - true - - - - - - - - - - - - - diff --git a/Runtime/LinearAlgebra/test/QuaternionTest.cs b/Runtime/LinearAlgebra/test/QuaternionTest.cs deleted file mode 100644 index 9dd5a96..0000000 --- a/Runtime/LinearAlgebra/test/QuaternionTest.cs +++ /dev/null @@ -1,185 +0,0 @@ -#if !UNITY_5_6_OR_NEWER -using NUnit.Framework; - -namespace LinearAlgebra.Test { - - public class QuaternionTest { - - [SetUp] - public void Setup() { - } - - [Test] - public void Normalize() { - Quaternion q1 = new(0, 0, 0, 1); - Quaternion r = Quaternion.identity; - - r = q1.normalized; - Assert.AreEqual(r, q1, "q.normalized 0 0 0 1"); - - r = Quaternion.Normalize(q1); - Assert.AreEqual(r, q1, "q.normalized 0 0 0 1"); - } - - [Test] - public void ToAngles() { - Quaternion q1 = new(0, 0, 0, 1); - Vector3Float v = Vector3Float.zero; - - v = Quaternion.ToAngles(q1); - Assert.AreEqual(v, new Vector3Float(0, 0, 0), "ToAngles 0 0 0 1"); - - q1 = new(1, 0, 0, 0); - v = Quaternion.ToAngles(q1); - Assert.AreEqual(0, v.horizontal, "1 0 0 0 H"); - Assert.AreEqual(180, v.vertical, "1 0 0 0 V"); - Assert.AreEqual(180, v.depth, "1 0 0 0 D"); - - } - - [Test] - public void Multiplication() { - Quaternion q1 = new(0, 0, 0, 1); - Quaternion q2 = new(1, 0, 0, 0); - Quaternion r; - - r = q1 * q2; - Assert.AreEqual(r, new Quaternion(1, 0, 0, 0), "0 0 0 1 * 1 0 0 0 "); - } - - [Test] - public void MultiplicationVector() { - Quaternion q1 = new(0, 0, 0, 1); - Vector3Float v1 = new(0, 1, 0); - Vector3Float r; - - r = q1 * v1; - Assert.AreEqual(r, new Vector3Float(0, 1, 0), "0 0 0 1 * Vector 0 1 0"); - - q1 = new(1, 0, 0, 0); - r = q1 * v1; - Assert.AreEqual(r, new Vector3Float(0, -1, 0), "1 0 0 0 * Vector 0 1 0"); - } - - [Test] - public void Equality() { - Quaternion q1 = new(0, 0, 0, 1); - Quaternion q2 = new(1, 0, 0, 0); - Assert.AreNotEqual(q1, q2, "0 0 0 1 == 1 0 0 0"); - - q2 = new(0, 0, 0, 1); - Assert.AreEqual(q1, q2, "0 0 0 1 == 1 0 0 0"); - } - - [Test, Ignore("ToDo")] - public void Inverse() { } - - [Test, Ignore("ToDo")] - public void LookRotation() { } - - [Test, Ignore("ToDo")] - public void FromToRotation() { } - - [Test, Ignore("ToDo")] - public void RotateTowards() { } - - [Test, Ignore("ToDo")] - public void AngleAxis() { } - - [Test, Ignore("ToDo")] - public void Angle() { } - - [Test, Ignore("ToDo")] - public void Slerp() { } - - [Test, Ignore("ToDo")] - public void SlerpUnclamped() { } - - [Test] - public void Euler() { - Vector3Float v1 = new(0, 0, 0); - Quaternion q; - - q = Quaternion.Euler(v1); - Assert.AreEqual(q, Quaternion.identity, "Euler Vector 0 0 0"); - - q = Quaternion.Euler(0, 0, 0); - Assert.AreEqual(q, Quaternion.identity, "Euler 0 0 0"); - - v1 = new(90, 90, -90); - q = Quaternion.Euler(v1); - Assert.AreEqual(q, new Quaternion(0, 0.707106709F, -0.707106709F, 0), "Euler Vector 90 90 -90"); - - q = Quaternion.Euler(90, 90, -90); - Assert.AreEqual(q, new Quaternion(0, 0.707106709F, -0.707106709F, 0), "Euler 90 90 -90"); - } - - [Test] - public void EulerToAngles() { - Vector3Float v; - Quaternion q; - Quaternion r; - - //v = new(0, 0, 0); - q = Quaternion.Euler(0, 0 , 0); - v = Quaternion.ToAngles(q); - r = Quaternion.Euler(v); - Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f, "0 0 0"); - - q = Quaternion.Euler(-45, -30, -15); - v = Quaternion.ToAngles(q); - r = Quaternion.Euler(v); - Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f, "-45, -30, -15"); - - // Gimball lock - // q = Quaternion.Euler(90, 90, -90); - // v = Quaternion.ToAngles(q); - // r = Quaternion.Euler(v); - // Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f, "0 0 0"); - - } - - [Test] - public void GetAngleAround() { - Vector3Float v1 = new(0, 1, 0); - Quaternion q1 = new(0, 0, 0, 1); - - float f = Quaternion.GetAngleAround(v1, q1); - Assert.AreEqual(f, 0, "GetAngleAround 0 1 0 , 0 0 0 1"); - - q1 = new(0, 0.707106709F, -0.707106709F, 0); - f = Quaternion.GetAngleAround(v1, q1); - Assert.AreEqual(f, 180, "GetAngleAround 0 1 0 , 0 0.7 -0.7 0"); - - v1 = new(0, 0, 0); - f = Quaternion.GetAngleAround(v1, q1); - Assert.IsTrue(float.IsNaN(f), "GetAngleAround 0 0 0 , 0 0.7 -0.7 0"); - } - - [Test] - public void GetRotationAround() { - Vector3Float v1 = new(0, 1, 0); - Quaternion q1 = new(0, 0, 0, 1); - - Quaternion q = Quaternion.GetRotationAround(v1, q1); - Assert.AreEqual(q, new Quaternion(0, 0, 0, 1), "GetRotationAround 0 1 0 , 0 0 0 1"); - - q1 = new(0, 0.707106709F, -0.707106709F, 0); - q = Quaternion.GetRotationAround(v1, q1); - Assert.AreEqual(q, new Quaternion(0, 1, 0, 0), "GetRotationAround 0 1 0 , 0 0.7 -0.7 0"); - - v1 = new(0, 0, 0); - q = Quaternion.GetRotationAround(v1, q1); - bool r = float.IsNaN(q.x) && float.IsNaN(q.y) && float.IsNaN(q.z) && float.IsNaN(q.w); - Assert.IsTrue(r, "GetRotationAround 0 0 0 , 0 0.7 -0.7 0"); - } - - [Test, Ignore("ToDo")] - public void GetSwingTwist() { } - - [Test, Ignore("ToDo")] - public void Dot() { } - - } -} -#endif \ No newline at end of file diff --git a/Runtime/LinearAlgebra/test/SphericalTest.cs b/Runtime/LinearAlgebra/test/SphericalTest.cs deleted file mode 100644 index b28b9d9..0000000 --- a/Runtime/LinearAlgebra/test/SphericalTest.cs +++ /dev/null @@ -1,271 +0,0 @@ -//#if !UNITY_5_6_OR_NEWER -using System; -using System.Collections.Generic; -using NUnit.Framework; - -namespace LinearAlgebra.Test { - public class SphericalTest { - [SetUp] - public void Setup() { - } - - [Test] - public void FromVector3() { -#if UNITY_5_6_OR_NEWER - UnityEngine.Vector3 v = new(0, 0, 1); -#else - Vector3Float v = new(0, 0, 1); -#endif - Spherical s = Spherical.FromVector3(v); - Assert.AreEqual(1.0f, s.distance, "s.distance 0 0 1"); - Assert.AreEqual(0.0f, s.direction.horizontal.inDegrees, "s.hor 0 0 1"); - Assert.AreEqual(0.0f, s.direction.vertical.inDegrees, 1.0E-05F, "s.vert 0 0 1"); - - v = new(0, 1, 0); - s = Spherical.FromVector3(v); - Assert.AreEqual(1.0f, s.distance, "s.distance 0 1 0"); - Assert.AreEqual(0.0f, s.direction.horizontal.inDegrees, "s.hor 0 1 0"); - Assert.AreEqual(90.0f, s.direction.vertical.inDegrees, "s.vert 0 1 0"); - - v = new(1, 0, 0); - s = Spherical.FromVector3(v); - Assert.AreEqual(1.0f, s.distance, "s.distance 1 0 0"); - Assert.AreEqual(90.0f, s.direction.horizontal.inDegrees, "s.hor 1 0 0"); - Assert.AreEqual(0.0f, s.direction.vertical.inDegrees, 1.0E-05F, "s.vert 1 0 0"); - } - - [Test] - public void Addition() { - Spherical v1 = Spherical.Degrees(1, 45, 0); - Spherical v2 = Spherical.zero; - Spherical r = Spherical.zero; - - r = v1 + v2; - Assert.AreEqual(v1.distance, r.distance, 1.0E-05F, "Addition(0,0,0)"); - - r = v1; - r += v2; - Assert.AreEqual(v1.distance, r.distance, 1.0E-05F, "Addition(0,0,0)"); - - v2 = Spherical.Degrees(1, 0, 90); - r = v1 + v2; - Assert.AreEqual(Math.Sqrt(2), r.distance, 1.0E-05F, "Addition(1 0 90)"); - Assert.AreEqual(45.0f, r.direction.horizontal.inDegrees, 1e-5f, "Addition(1 0 90)"); - Assert.AreEqual(45.0f, r.direction.vertical.inDegrees, 1.0E-05F, "Addition(1 0 90)"); - } - - [Test] - public void Average2_IdenticalVectors() { - Direction dir = Direction.Radians(MathF.PI / 4f, MathF.PI / 6f); - Spherical v = new(2.5f, dir); - - Spherical avg = Spherical.Average(v, v); - - Assert.AreEqual(2.5f, avg.distance, 1e-5f); - Assert.AreEqual(dir.horizontal, avg.direction.horizontal); - Assert.AreEqual(dir.vertical, avg.direction.vertical); - } - - [Test] - public void Average2_OppositeUnitVectors() { - // Two opposite vectors: same distance, horizontal opposite (pi apart), same vertical - Spherical v1 = Spherical.Radians(1f, 0f, 0f); - Spherical v2 = Spherical.Radians(1f, MathF.PI, 0f); - Spherical avg = Spherical.Average(v1, v2); - - Assert.AreEqual(0f, avg.distance, 1e-4f); - // When distance is zero, angles may be undefined; allow any angle but ensure near-zero magnitude - } - - [Test] - public void Average2_WeightedByDistance() { - // Two vectors same direction but different distances -> weighted average distance - Direction dir = Direction.Radians(MathF.PI / 3f, MathF.PI / 4f); - Spherical a = new(1f, dir); - Spherical b = new(3f, dir); - Spherical avg = Spherical.Average(a, b); - - // average distance should be (1+3)/2 = 2 - Assert.AreEqual(2f, avg.distance, 1e-5f); - Assert.AreEqual(dir.horizontal.inRadians, avg.direction.horizontal.inRadians, 1e-5f); - Assert.AreEqual(dir.vertical.inRadians, avg.direction.vertical.inRadians, 1e-5f); - } - - [Test] - public void Average2_OppositeButNotExact_NotZero() { - // Nearly opposite but not exact; expect a valid averaged direction and averaged distance - Direction d1 = Direction.Radians(0f, 0f); - Direction d2 = Direction.Radians(MathF.PI - 1e-3f, 0.0f); // slight offset - Spherical v1 = new(2.0f, d1); - Spherical v2 = new(4.0f, d2); - - Spherical avg = Spherical.Average(v1, v2); - - // Distance is arithmetic mean - Assert.AreEqual(3.0f, avg.distance, 1e-5f); - - // Averaged azimuth should be near +pi/2 or -pi/2? we can check it's not NaN and unit-vector properties hold - float ux = MathF.Cos(avg.direction.horizontal.inRadians) * MathF.Cos(avg.direction.vertical.inRadians); - float uy = MathF.Sin(avg.direction.horizontal.inRadians) * MathF.Cos(avg.direction.vertical.inRadians); - float uz = MathF.Sin(avg.direction.vertical.inRadians); - float mag = MathF.Sqrt(ux * ux + uy * uy + uz * uz); - Assert.IsTrue(mag > 0.999f && mag < 1.001f); - - } - - [Test] - public void Average2_BasicAverageDirectionAndDistance() { - // Two different directions not cancelling: expect vector-average result - Direction d1 = Direction.Radians(MathF.PI / 6f, MathF.PI / 12f); // 30°, 15° - Direction d2 = Direction.Radians(MathF.PI / 3f, MathF.PI / 18f); // 60°, 10° - Spherical v1 = new(2.0f, d1); - Spherical v2 = new(4.0f, d2); - - Spherical avg = Spherical.Average(v1, v2); - - // Distance is arithmetic mean - Assert.AreEqual(3.0f, avg.distance, 1e-5f); - - // Check averaged unit-vector equals normalized sum of unit vectors computed here - float a1 = d1.horizontal.inRadians; - float a2 = d2.horizontal.inRadians; - float e1 = d1.vertical.inRadians; - float e2 = d2.vertical.inRadians; - - float cx = MathF.Cos(a1) + MathF.Cos(a2); - float cy = MathF.Sin(a1) + MathF.Sin(a2); - float z1 = MathF.Sin(e1); - float z2 = MathF.Sin(e2); - float cz = z1 + z2; - float mag = MathF.Sqrt(cx * cx + cy * cy + cz * cz); - Assert.IsTrue(mag > 1e-6f); - - float ux = cx / mag; - float uy = cy / mag; - float uz = cz / mag; - - // Reconstruct direction from avg result - float uxAvg = MathF.Cos(avg.direction.horizontal.inRadians) * MathF.Cos(avg.direction.vertical.inRadians); - float uyAvg = MathF.Sin(avg.direction.horizontal.inRadians) * MathF.Cos(avg.direction.vertical.inRadians); - float uzAvg = MathF.Sin(avg.direction.vertical.inRadians); - - Assert.AreEqual(ux, uxAvg, 1e-4f); - Assert.AreEqual(uy, uyAvg, 1e-4f); - Assert.AreEqual(uz, uzAvg, 1e-4f); - } - - [Test] - public void Average_IdenticalVectors() { - var dir = Direction.Radians(MathF.PI / 4f, MathF.PI / 6f); - var v = new Spherical(2.5f, dir); - var list = new List { v, v, v }; - - var avg = Spherical.Average(list); - - Assert.AreEqual(2.5f, avg.distance, 1e-5f); - Assert.AreEqual(dir.horizontal, avg.direction.horizontal); - Assert.AreEqual(dir.vertical, avg.direction.vertical); - } - - [Test] - public void Average_SingleElement() { - Spherical s = Spherical.Radians(1.234f, 0.3f, -0.7f); - Spherical avg = Spherical.Average(new List { s }); - - Assert.AreEqual(s.distance, avg.distance, 1e-5f); - Assert.AreEqual(s.direction.horizontal.inRadians, avg.direction.horizontal.inRadians, 1e-5f); - Assert.AreEqual(s.direction.vertical.inRadians, avg.direction.vertical.inRadians, 1e-5f); - } - - [Test] - public void Average_OppositeUnitVectors() { - // Two opposite vectors: same distance, horizontal opposite (pi apart), same vertical - Spherical v1 = Spherical.Radians(1f, 0f, 0f); - Spherical v2 = Spherical.Radians(1f, MathF.PI, 0f); - Spherical avg = Spherical.Average(new List { v1, v2 }); - - Assert.AreEqual(0f, avg.distance, 1e-4f); - // When distance is zero, angles may be undefined; allow any angle but ensure near-zero magnitude - } - - [Test] - public void Average_WeightedByDistance() { - // Two vectors same direction but different distances -> weighted average distance - Direction dir = Direction.Radians(MathF.PI / 3f, MathF.PI / 4f); - Spherical a = new(1f, dir); - Spherical b = new(3f, dir); - Spherical avg = Spherical.Average(new List { a, b }); - - // average distance should be (1+3)/2 = 2 - Assert.AreEqual(2f, avg.distance, 1e-5f); - Assert.AreEqual(dir.horizontal.inRadians, avg.direction.horizontal.inRadians, 1e-5f); - Assert.AreEqual(dir.vertical.inRadians, avg.direction.vertical.inRadians, 1e-5f); - } - - [Test] - public void Average_AxisSymmetricAroundVertical() { - // Four vectors around azimuth 0, pi/2, pi, 3pi/2 at same elevation (vertical) angle phi - float phi = MathF.PI / 6f; // elevation from horizontal plane - var dirs = new List { - new(1f, Direction.Radians(0f, phi)), - new(1f, Direction.Radians(MathF.PI/2, phi)), - new(1f, Direction.Radians(MathF.PI, phi)), - new(1f, Direction.Radians(3*MathF.PI/2, phi)) - }; - - Spherical avg = Spherical.Average(dirs); - - // rAvg should equal r * sin(elevation) = sin(phi) - Assert.AreEqual(MathF.Sin(phi), avg.distance, 1e-4f); - // vertical angle undefined when horizontal xy components cancel; allow any angle but ensure r matches - } - - [Test] - public void Average_AxisSymmetricAroundVertical2() { - // Four vectors around azimuth 0, pi/2, pi, 3pi/2 at same polar angle from vertical (alpha) - float alpha = MathF.PI / 6f; // polar angle from vertical - float elevation = MathF.PI / 2f - alpha; // convert polar-from-vertical to elevation - var dirs = new List { - new(1f, Direction.Radians(0f, elevation)), - new(1f, Direction.Radians(MathF.PI/2, elevation)), - new(1f, Direction.Radians(MathF.PI, elevation)), - new(1f, Direction.Radians(3*MathF.PI/2, elevation)) - }; - - Spherical avg = Spherical.Average(dirs); - - // rAvg should equal r * sin(elevation) which equals cos(alpha) - Assert.AreEqual(MathF.Cos(alpha), avg.distance, 1e-4f); - } - - [Test] - public void Average_CompareWithVector3() { - // Four vectors around azimuth 0, pi/2, pi, 3pi/2 at same polar angle from vertical (alpha) - float alpha = MathF.PI / 6f; // polar angle from vertical - float elevation = MathF.PI / 2f - alpha; // convert polar-from-vertical to elevation - List dirs = new List { - new(1f, Direction.Radians(0f, elevation)), - new(2f, Direction.Radians(MathF.PI/2, elevation+1)), - new(3f, Direction.Radians(MathF.PI, elevation+2)), - new(4f, Direction.Radians(3*MathF.PI/2, elevation+3)) - }; - - Spherical avg = Spherical.Average(dirs); - -#if UNITY_5_3_OR_NEWER - UnityEngine.Vector3 r = UnityEngine.Vector3.zero; -#else - Vector3Float r = Vector3Float.zero; -#endif - foreach (Spherical dir in dirs) { - r += dir.ToVector3(); - } - r = r / 4; - Spherical avg2 = Spherical.FromVector3(r); - - Assert.AreEqual(avg, avg2); - } - - } -} -//#endif \ No newline at end of file diff --git a/Runtime/LinearAlgebra/test/SwingTwistTest.cs b/Runtime/LinearAlgebra/test/SwingTwistTest.cs deleted file mode 100644 index 5f05a96..0000000 --- a/Runtime/LinearAlgebra/test/SwingTwistTest.cs +++ /dev/null @@ -1,131 +0,0 @@ -#if !UNITY_5_6_OR_NEWER -using NUnit.Framework; - -namespace LinearAlgebra.Test { - - [TestFixture] - public class SwingTwistTest { - - [Test] - public void Degrees_CreatesSwingTwistWithDegreeAngles() { - SwingTwist st = SwingTwist.Degrees(45, 30, 15); - Assert.IsNotNull(st); - Assert.AreEqual(45, st.swing.horizontal.inDegrees, 0.01f); - Assert.AreEqual(30, st.swing.vertical.inDegrees, 0.01f); - Assert.AreEqual(15, st.twist.inDegrees, 0.01f); - } - - [Test] - public void Radians_CreatesSwingTwistWithRadianAngles() { - float pi = (float)System.Math.PI; - SwingTwist st = SwingTwist.Radians(pi / 4, pi / 6, pi / 12); - Assert.IsNotNull(st); - Assert.AreEqual(45, st.swing.horizontal.inDegrees, 0.01f); - Assert.AreEqual(30, st.swing.vertical.inDegrees, 0.01f); - Assert.AreEqual(15, st.twist.inDegrees, 0.01f); - } - - [Test] - public void Zero_CreatesZeroRotation() { - SwingTwist st = SwingTwist.zero; - Assert.AreEqual(0, st.swing.horizontal.inDegrees, 0.01f); - Assert.AreEqual(0, st.swing.vertical.inDegrees, 0.01f); - Assert.AreEqual(0, st.twist.inDegrees, 0.01f); - } - - [Test] - public void QuaternionTest() { - Quaternion q; - SwingTwist s; - Quaternion r; - - q = Quaternion.identity; - s = SwingTwist.FromQuaternion(q); - r = s.ToQuaternion(); - Assert.AreEqual(q, r); - - q = Quaternion.Euler(90, 0, 0); - s = SwingTwist.FromQuaternion(q); - Assert.AreEqual(0, s.swing.horizontal.inDegrees, 10e-2f); - Assert.AreEqual(90, s.swing.vertical.inDegrees, 10e-2f); - Assert.AreEqual(0, s.twist.inDegrees, 0.01f); - r = s.ToQuaternion(); - Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f); - - q = Quaternion.Euler(0, 90, 0); - s = SwingTwist.FromQuaternion(q); - Assert.AreEqual(90, s.swing.horizontal.inDegrees,10e-2f); - Assert.AreEqual(0, s.swing.vertical.inDegrees, 0.01f); - Assert.AreEqual(0, s.twist.inDegrees, 0.01f); - r = s.ToQuaternion(); - Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f); - - q = Quaternion.Euler(0, 0, 90); - s = SwingTwist.FromQuaternion(q); - Assert.AreEqual(0, s.swing.horizontal.inDegrees, 0.01f); - Assert.AreEqual(0, s.swing.vertical.inDegrees, 0.01f); - Assert.AreEqual(90, s.twist.inDegrees, 0.01f); - r = s.ToQuaternion(); - Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f); - - q = Quaternion.Euler(0, 180, 0); - s = SwingTwist.FromQuaternion(q); - Assert.AreEqual(-180, s.swing.horizontal.inDegrees, 0.01f); - Assert.AreEqual(0, s.swing.vertical.inDegrees, 0.01f); - Assert.AreEqual(0, s.twist.inDegrees, 0.01f); - r = s.ToQuaternion(); - Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f); - - q = Quaternion.Euler(0, 135, 0); - s = SwingTwist.FromQuaternion(q); - Assert.AreEqual(135, s.swing.horizontal.inDegrees, 0.01f); - Assert.AreEqual(0, s.swing.vertical.inDegrees, 0.01f); - Assert.AreEqual(0, s.twist.inDegrees, 0.01f); - r = s.ToQuaternion(); - Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f); - - q = Quaternion.Euler(60, 45, 30); - s = SwingTwist.FromQuaternion(q); - Assert.AreEqual(45, s.swing.horizontal.inDegrees, 0.01f); - Assert.AreEqual(60, s.swing.vertical.inDegrees, 0.01f); - Assert.AreEqual(30, s.twist.inDegrees, 0.01f); - // r = s.ToQuaternion(); - // Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f); - - // q = Quaternion.Euler(-45, -30, -15); - // s = SwingTwist.FromQuaternion(q); - // Assert.AreEqual(-30, s.swing.horizontal.inDegrees, 0.01f); - // Assert.AreEqual(-45, s.swing.vertical.inDegrees, 0.01f); - // Assert.AreEqual(-15, s.twist.inDegrees, 0.01f); - // r = s.ToQuaternion(); - // Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f); - - // q = Quaternion.Euler(180, 180, 180); - // s = SwingTwist.FromQuaternion(q); - // Assert.AreEqual(-180, s.swing.horizontal.inDegrees, 0.01f); - // Assert.AreEqual(-180, s.swing.vertical.inDegrees, 0.01f); - // Assert.AreEqual(-180, s.twist.inDegrees, 0.01f); - // r = s.ToQuaternion(); - // Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f); - - } - - [Test] - public void ToAngleAxis_ConvertsToSpherical() { - SwingTwist st = SwingTwist.Degrees(45, 30, 15); - Spherical s = st.ToAngleAxis(); - Assert.IsNotNull(s); - } - - [Test] - public void FromAngleAxis_ConvertsFromSpherical() { - Spherical s = new(90, Direction.Degrees(45, 0)); - SwingTwist st = SwingTwist.FromAngleAxis(s); - Assert.IsNotNull(st); - } - - } - -} - -#endif \ No newline at end of file diff --git a/Runtime/LinearAlgebra/test/Vector2FloatTest.cs b/Runtime/LinearAlgebra/test/Vector2FloatTest.cs deleted file mode 100644 index 867765a..0000000 --- a/Runtime/LinearAlgebra/test/Vector2FloatTest.cs +++ /dev/null @@ -1,364 +0,0 @@ -#if !UNITY_5_6_OR_NEWER -using NUnit.Framework; - -namespace LinearAlgebra.Test { - using Vector2 = Vector2Float; - - public class Vector2FloatTest { - - [SetUp] - public void Setup() { - } - - [Test] - public void FromPolar() { - } - - [Test] - public void Equality() { - Vector2 v1 = new(4, 5); - Vector2 v2 = new(1, 2); - - Assert.IsFalse(v1 == v2, "4 5 == 1 2"); - Assert.IsTrue(v1 != v2, "4 5 != 1 2"); - - v2 = new(4, 5); - Assert.IsTrue(v1 == v2, "4 5 == 4 5"); - Assert.IsFalse(v1 != v2, "4 5 != 4 5"); - } - - [Test] - public void Magnitude() { - Vector2 v = new(1, 2); - float m = 0; - m = v.magnitude; - Assert.AreEqual(m, 2.236068F, "v.magnitude 1 2"); - - m = Vector2.MagnitudeOf(v); - Assert.AreEqual(m, 2.236068F, "MagnitudeOf 1 2"); - - v = new(-1, -2); - m = v.magnitude; - Assert.AreEqual(m, 2.236068F, "v.magnitude -1 -2"); - - v = new(0, 0); - m = v.magnitude; - Assert.AreEqual(m, 0, "v.magnitude 0 0"); - } - - [Test] - public void SqrMagnitude() { - Vector2 v = new(1, 2); - float m = 0; - - m = v.sqrMagnitude; - Assert.AreEqual(m, 5, "v.sqrMagnitude 1 2"); - - m = Vector2.SqrMagnitudeOf(v); - Assert.AreEqual(m, 5, "SqrMagnitudeOf 1 2"); - - v = new(-1, -2); - m = v.sqrMagnitude; - Assert.AreEqual(m, 5, "v.sqrMagnitude -1 -2"); - - v = new(0, 0); - m = v.sqrMagnitude; - Assert.AreEqual(m, 0, "v.sqrMagnitude 0 0"); - } - - [Test] - public void Distance() { - Vector2 v1 = new(4, 5); - Vector2 v2 = new(1, 2); - float f = 0; - - f = Vector2.Distance(v1, v2); - Assert.AreEqual(f, 4.24264002f, 1.0E-05F, "Distance(4 5, 1 2)"); - - v2 = new(-1, -2); - f = Vector2.Distance(v1, v2); - Assert.AreEqual(f, 8.602325F, "Distance(4 5, 1 2)"); - - v2 = new(0, 0); - f = Vector2.Distance(v1, v2); - Assert.AreEqual(f, 6.403124F, 1.0E-05F, "Distance(4 5, 1 2)"); - } - - [Test] - public void Normalize() { - Vector2 v = new(0, 3); - Vector2Float r; - - r = v.normalized; - Assert.AreEqual(0, r.horizontal, "normalized 0 3 H"); - Assert.AreEqual(1, r.vertical, "normalized 0 3 V"); - - r = Vector2.Normalize(v); - Assert.AreEqual(0, r.horizontal, "Normalize 0 3 H"); - Assert.AreEqual(1, r.vertical, "Normalize 0 3 V"); - - v = new(0, -3); - r = v.normalized; - Assert.AreEqual(0, r.horizontal, "normalized 0 -3 H"); - Assert.AreEqual(-1, r.vertical, "normalized 0 -3 V"); - - v = new(0, 0); - r = v.normalized; - Assert.AreEqual(0, r.horizontal, "normalized 0 0 H"); - Assert.AreEqual(0, r.vertical, "normalized 0 0 V"); - } - - [Test] - public void Negate() { - Vector2 v = new(4, 5); - Vector2 r; - - r = -v; - Assert.AreEqual(-4, r.horizontal, "- 4 5 H"); - Assert.AreEqual(-5, r.vertical, "- 4 5 V"); - - v = new(-4, -5); - r = -v; - Assert.AreEqual(4, r.horizontal, "- -4 -5 H"); - Assert.AreEqual(5, r.vertical, "- -4 -5 V"); - - v = new(0, 0); - r = -v; - Assert.AreEqual(0, r.horizontal, "- 0 0 H"); - Assert.AreEqual(0, r.vertical, "- 0 0 V"); - } - - [Test] - public void Subtract() { - Vector2 v1 = new(4, 5); - Vector2 v2 = new(1, 2); - Vector2 r = Vector2.zero; - - r = v1 - v2; - Assert.IsTrue(r == new Vector2(3, 3), "4 5 - 1 2"); - - v2 = new(-1, -2); - r = v1 - v2; - Assert.IsTrue(r == new Vector2(5, 7), "4 5 - -1 -2"); - - v2 = new(4, 5); - r = v1 - v2; - Assert.IsTrue(r == new Vector2(0, 0), "4 5 - 4 5"); - r = v1; - r -= v2; - Assert.AreEqual(r, new Vector2(0, 0), "4 5 - 4 5"); - - v2 = new(0, 0); - r = v1 - v2; - Assert.AreEqual(r, new Vector2(4, 5), "4 5 - 0 0"); - r -= v2; - Assert.AreEqual(r, new Vector2(4, 5), "4 5 - 0 0"); - } - - [Test] - public void Addition() { - Vector2 v1 = new(4, 5); - Vector2 v2 = new(1, 2); - Vector2 r = Vector2.zero; - - r = v1 + v2; - Assert.IsTrue(r == new Vector2(5, 7), "4 5 + 1 2"); - - v2 = new(-1, -2); - r = v1 + v2; - Assert.IsTrue(r == new Vector2(3, 3), "4 5 + -1 -2"); - r = v1; - r += v2; - Assert.AreEqual(r, new Vector2(3, 3), "4 5 + -1 -2"); - - v2 = new(0, 0); - r = v1 + v2; - Assert.AreEqual(r, new Vector2(4, 5), "4 5 + 0 0"); - r += v2; - Assert.AreEqual(r, new Vector2(4, 5), "4 5 + 0 0"); - } - - [Test] - public void Scale() { - Vector2 v1 = new(4, 5); - Vector2 v2 = new(1, 2); - Vector2 r; - - r = Vector2.Scale(v1, v2); - Assert.AreEqual(4, r.horizontal, "Scale 4 5 , 1 2 H"); - Assert.AreEqual(10, r.vertical, "Scale 4 5 , 1 2 V"); - - v2 = new(-1, -2); - r = Vector2.Scale(v1, v2); - Assert.AreEqual(-4, r.horizontal, "Scale 4 5 , -1 -2 H"); - Assert.AreEqual(-10, r.vertical, "Scale 4 5 , -1 -2 V"); - - v2 = new(0, 0); - r = Vector2.Scale(v1, v2); - Assert.AreEqual(0, r.horizontal, "Scale 4 5 , 0 0 H"); - Assert.AreEqual(0, r.vertical, "Scale 4 5 , 0 0 V"); - } - - [Test] - public void Multiply() { - Vector2 v1 = new(4, 5); - int f = 3; - Vector2 r; - - r = v1 * f; - Assert.AreEqual(12, r.horizontal, "4 5 * 3 H"); - Assert.AreEqual(15, r.vertical, "4 5 * 3 V"); - - r = f * v1; - Assert.AreEqual(12, r.horizontal, "3 * 4 5 H"); - Assert.AreEqual(15, r.vertical, "3 * 4 5 V"); - - f = -3; - r = v1 * f; - Assert.AreEqual(-12, r.horizontal, "4 5 * -3 H"); - Assert.AreEqual(-15, r.vertical, "4 5 * -3 V"); - - f = 0; - r = v1 * f; - Assert.AreEqual(0, r.horizontal, "4 5 * 0 H"); - Assert.AreEqual(0, r.vertical, "4 5 * 0 V"); - } - - [Test] - public void Divide() { - Vector2 v1 = new(4, 5); - float f = 2; - Vector2 r; - - r = v1 / f; - Assert.AreEqual(2, r.horizontal, "4 5 / 2 H"); - Assert.AreEqual(2.5, r.vertical, "4 5 / 2 V"); - - f = -2; - r = v1 / f; - Assert.AreEqual(-2, r.horizontal, "4 5 / -2 H"); - Assert.AreEqual(-2.5, r.vertical, "4 5 / -2 V"); - - f = 0; - r = v1 / f; - Assert.AreEqual(float.PositiveInfinity, r.horizontal, "4 5 / 0 H"); - Assert.AreEqual(float.PositiveInfinity, r.vertical, "4 5 / 0 V"); - } - - [Test] - public void Dot() { - Vector2 v1 = new(4, 5); - Vector2 v2 = new(1, 2); - float f; - - f = Vector2.Dot(v1, v2); - Assert.AreEqual(14, f, "Dot(4 5, 1 2)"); - - v2 = new(-1, -2); - f = Vector2.Dot(v1, v2); - Assert.AreEqual(-14, f, "Dot(4 5, -1 -2)"); - - v2 = new(0, 0); - f = Vector2.Dot(v1, v2); - Assert.AreEqual(0, f, "Dot(4 5, 0 0)"); - } - - [Test] - public void SignedAngle() { - Vector2 v1 = new(4, 5); - Vector2 v2 = new(1, 2); - float f; - - f = Vector2.SignedAngle(v1, v2); - Assert.AreEqual(-12.094758f, f); - - v2 = new(-1, -2); - f = Vector2.SignedAngle(v1, v2); - Assert.AreEqual(167.905228f, f); - - v2 = new(0, 0); - f = Vector2.SignedAngle(v1, v2); - Assert.AreEqual(0, f); - - v1 = new(0, 1); - v2 = new(1, 0); - f = Vector2.SignedAngle(v1, v2); - Assert.AreEqual(90, f); - - v1 = new(0, 1); - v2 = new(0, -1); - f = Vector2.SignedAngle(v1, v2); - Assert.AreEqual(180, f); - } - - [Test] - public void UnsignedAngle() { - Vector2 v1 = new(4, 5); - Vector2 v2 = new(1, 2); - float f; - - f = Vector2.UnsignedAngle(v1, v2); - Assert.AreEqual(12.094758f, f); - - v2 = new(-1, -2); - f = Vector2.UnsignedAngle(v1, v2); - Assert.AreEqual(167.905228f, f); - - v2 = new(0, 0); - f = Vector2.UnsignedAngle(v1, v2); - Assert.AreEqual(0, f); - - v1 = new(0, 1); - v2 = new(1, 0); - f = Vector2.UnsignedAngle(v1, v2); - Assert.AreEqual(90, f); - - v1 = new(0, 1); - v2 = new(0, -1); - f = Vector2.UnsignedAngle(v1, v2); - Assert.AreEqual(180, f); - } - - [Test] - public void Rotate() { - Vector2 v1 = new(1, 2); - Vector2 r; - - r = Vector2.Rotate(v1, AngleFloat.Degrees(0)); - Assert.AreEqual(0, Vector2.Distance(r, v1)); - - r = Vector2.Rotate(v1, AngleFloat.Degrees(180)); - Assert.AreEqual(0, Vector2.Distance(r, new Vector2(-1, -2)), 1.0e-06); - - r = Vector2.Rotate(v1, AngleFloat.Degrees(-90)); - Assert.AreEqual(0, Vector2.Distance(r, new Vector2(2, -1)), 1.0e-06); - - r = Vector2.Rotate(v1, AngleFloat.Degrees(270)); - Assert.AreEqual(0, Vector2.Distance(r, new Vector2(2, -1)), 1.0e-06); - } - - [Test] - public void Lerp() { - Vector2 v1 = new(4, 5); - Vector2 v2 = new(1, 2); - Vector2 r; - - r = Vector2.Lerp(v1, v2, 0); - Assert.AreEqual(0, Vector2.Distance(r, v1), 0); - - r = Vector2.Lerp(v1, v2, 1); - Assert.AreEqual(0, Vector2.Distance(r, v2), 0); - - r = Vector2.Lerp(v1, v2, 0.5f); - Assert.AreEqual(0, Vector2.Distance(r, new Vector2(2.5f, 3.5f)), 0); - - r = Vector2.Lerp(v1, v2, -1); - Assert.AreEqual(0, Vector2.Distance(r, new Vector2(7, 8)), 0); - - r = Vector2.Lerp(v1, v2, 2); - Assert.AreEqual(0, Vector2.Distance(r, new Vector2(-2, -1)), 0); - } - - } -} -#endif \ No newline at end of file diff --git a/Runtime/LinearAlgebra/test/Vector2IntTest.cs b/Runtime/LinearAlgebra/test/Vector2IntTest.cs deleted file mode 100644 index 3647ca0..0000000 --- a/Runtime/LinearAlgebra/test/Vector2IntTest.cs +++ /dev/null @@ -1,270 +0,0 @@ -#if !UNITY_5_6_OR_NEWER -using NUnit.Framework; - -namespace LinearAlgebra.Test { - using Vector2 = Vector2Int; - - public class Vector2IntTest { - - [SetUp] - public void Setup() { - } - - [Test] - public void FromPolar() { - } - - [Test] - public void Equality() { - Vector2 v1 = new(4, 5); - Vector2 v2 = new(1, 2); - - Assert.IsFalse(v1 == v2, "4 5 == 1 2"); - Assert.IsTrue(v1 != v2, "4 5 != 1 2"); - - v2 = new(4, 5); - Assert.IsTrue(v1 == v2, "4 5 == 4 5"); - Assert.IsFalse(v1 != v2, "4 5 != 4 5"); - } - - [Test] - public void Magnitude() { - Vector2 v = new(1, 2); - float m = 0; - m = v.magnitude; - Assert.AreEqual(m, 2.236068F, "v.magnitude 1 2"); - - m = Vector2.MagnitudeOf(v); - Assert.AreEqual(m, 2.236068F, "MagnitudeOf 1 2"); - - v = new(-1, -2); - m = v.magnitude; - Assert.AreEqual(m, 2.236068F, "v.magnitude -1 -2"); - - v = new(0, 0); - m = v.magnitude; - Assert.AreEqual(m, 0, "v.magnitude 0 0"); - } - - [Test] - public void SqrMagnitude() { - Vector2 v = new(1, 2); - float m = 0; - - m = v.sqrMagnitude; - Assert.AreEqual(m, 5, "v.sqrMagnitude 1 2"); - - m = Vector2.SqrMagnitudeOf(v); - Assert.AreEqual(m, 5, "SqrMagnitudeOf 1 2"); - - v = new(-1, -2); - m = v.sqrMagnitude; - Assert.AreEqual(m, 5, "v.sqrMagnitude -1 -2"); - - v = new(0, 0); - m = v.sqrMagnitude; - Assert.AreEqual(m, 0, "v.sqrMagnitude 0 0"); - } - - [Test] - public void Distance() { - Vector2 v1 = new(4, 5); - Vector2 v2 = new(1, 2); - float f = 0; - - f = Vector2.Distance(v1, v2); - Assert.AreEqual(f, 4.24264002f, 1.0E-05F, "Distance(4 5, 1 2)"); - - v2 = new(-1, -2); - f = Vector2.Distance(v1, v2); - Assert.AreEqual(f, 8.602325F, "Distance(4 5, 1 2)"); - - v2 = new(0, 0); - f = Vector2.Distance(v1, v2); - Assert.AreEqual(f, 6.403124F, 1.0E-05F, "Distance(4 5, 1 2)"); - } - - [Test] - public void Normalize() { - Vector2 v = new(0, 3); - Vector2Float r; - - r = v.normalized; - Assert.AreEqual(0, r.horizontal, "normalized 0 3 H"); - Assert.AreEqual(1, r.vertical, "normalized 0 3 V"); - - r = Vector2.Normalize(v); - Assert.AreEqual(0, r.horizontal, "Normalize 0 3 H"); - Assert.AreEqual(1, r.vertical, "Normalize 0 3 V"); - - v = new(0, -3); - r = v.normalized; - Assert.AreEqual(0, r.horizontal, "normalized 0 -3 H"); - Assert.AreEqual(-1, r.vertical, "normalized 0 -3 V"); - - v = new(0, 0); - r = v.normalized; - Assert.AreEqual(0, r.horizontal, "normalized 0 0 H"); - Assert.AreEqual(0, r.vertical, "normalized 0 0 V"); - } - - [Test] - public void Negate() { - Vector2 v = new(4, 5); - Vector2 r; - - r = -v; - Assert.AreEqual(-4, r.horizontal, "- 4 5 H"); - Assert.AreEqual(-5, r.vertical, "- 4 5 V"); - - v = new(-4, -5); - r = -v; - Assert.AreEqual(4, r.horizontal, "- -4 -5 H"); - Assert.AreEqual(5, r.vertical, "- -4 -5 V"); - - v = new(0, 0); - r = -v; - Assert.AreEqual(0, r.horizontal, "- 0 0 H"); - Assert.AreEqual(0, r.vertical, "- 0 0 V"); - } - - [Test] - public void Subtract() { - Vector2 v1 = new(4, 5); - Vector2 v2 = new(1, 2); - Vector2 r = Vector2.zero; - - r = v1 - v2; - Assert.IsTrue(r == new Vector2(3, 3), "4 5 - 1 2"); - - v2 = new(-1, -2); - r = v1 - v2; - Assert.IsTrue(r == new Vector2(5, 7), "4 5 - -1 -2"); - - v2 = new(4, 5); - r = v1 - v2; - Assert.IsTrue(r == new Vector2(0, 0), "4 5 - 4 5"); - r = v1; - r -= v2; - Assert.AreEqual(r, new Vector2(0, 0), "4 5 - 4 5"); - - v2 = new(0, 0); - r = v1 - v2; - Assert.AreEqual(r, new Vector2(4, 5), "4 5 - 0 0"); - r -= v2; - Assert.AreEqual(r, new Vector2(4, 5), "4 5 - 0 0"); - } - - [Test] - public void Addition() { - Vector2 v1 = new(4, 5); - Vector2 v2 = new(1, 2); - Vector2 r = Vector2.zero; - - r = v1 + v2; - Assert.IsTrue(r == new Vector2(5, 7), "4 5 + 1 2"); - - v2 = new(-1, -2); - r = v1 + v2; - Assert.IsTrue(r == new Vector2(3, 3), "4 5 + -1 -2"); - r = v1; - r += v2; - Assert.AreEqual(r, new Vector2(3, 3), "4 5 + -1 -2"); - - v2 = new(0, 0); - r = v1 + v2; - Assert.AreEqual(r, new Vector2(4, 5), "4 5 + 0 0"); - r += v2; - Assert.AreEqual(r, new Vector2(4, 5), "4 5 + 0 0"); - } - - [Test] - public void Scale() { - Vector2 v1 = new(4, 5); - Vector2 v2 = new(1, 2); - Vector2 r; - - r = Vector2.Scale(v1, v2); - Assert.AreEqual(4, r.horizontal, "Scale 4 5 , 1 2 H"); - Assert.AreEqual(10, r.vertical, "Scale 4 5 , 1 2 V"); - - v2 = new(-1, -2); - r = Vector2.Scale(v1, v2); - Assert.AreEqual(-4, r.horizontal, "Scale 4 5 , -1 -2 H"); - Assert.AreEqual(-10, r.vertical, "Scale 4 5 , -1 -2 V"); - - v2 = new(0, 0); - r = Vector2.Scale(v1, v2); - Assert.AreEqual(0, r.horizontal, "Scale 4 5 , 0 0 H"); - Assert.AreEqual(0, r.vertical, "Scale 4 5 , 0 0 V"); - } - - [Test] - public void Multiply() { - Vector2 v1 = new(4, 5); - int f = 3; - Vector2 r; - - r = v1 * f; - Assert.AreEqual(12, r.horizontal, "4 5 * 3 H"); - Assert.AreEqual(15, r.vertical, "4 5 * 3 V"); - - r = f * v1; - Assert.AreEqual(12, r.horizontal, "3 * 4 5 H"); - Assert.AreEqual(15, r.vertical, "3 * 4 5 V"); - - f = -3; - r = v1 * f; - Assert.AreEqual(-12, r.horizontal, "4 5 * -3 H"); - Assert.AreEqual(-15, r.vertical, "4 5 * -3 V"); - - f = 0; - r = v1 * f; - Assert.AreEqual(0, r.horizontal, "4 5 * 0 H"); - Assert.AreEqual(0, r.vertical, "4 5 * 0 V"); - } - - [Test] - public void Divide() { - Vector2 v1 = new(4, 5); - int f = 2; - Vector2 r; - - r = v1 / f; - Assert.AreEqual(2, r.horizontal, "4 5 / 2 H"); - Assert.AreEqual(2, r.vertical, "4 5 / 2 V"); - - f = -2; - r = v1 / f; - Assert.AreEqual(-2, r.horizontal, "4 5 / -2 H"); - Assert.AreEqual(-2, r.vertical, "4 5 / -2 V"); - - Assert.Throws(() => { - f = 0; - r = v1 / f; - Assert.AreEqual(float.PositiveInfinity, r.horizontal, "4 5 / 0 H"); - Assert.AreEqual(float.PositiveInfinity, r.vertical, "4 5 / 0 V"); - }); - } - - [Test] - public void Dot() { - Vector2 v1 = new(4, 5); - Vector2 v2 = new(1, 2); - int f; - - f = Vector2.Dot(v1, v2); - Assert.AreEqual(14, f, "Dot(4 5, 1 2)"); - - v2 = new(-1, -2); - f = Vector2.Dot(v1, v2); - Assert.AreEqual(-14, f, "Dot(4 5, -1 -2)"); - - v2 = new(0, 0); - f = Vector2.Dot(v1, v2); - Assert.AreEqual(0, f, "Dot(4 5, 0 0)"); - } - - } -} -#endif \ No newline at end of file diff --git a/Runtime/LinearAlgebra/test/Vector3FloatTest.cs b/Runtime/LinearAlgebra/test/Vector3FloatTest.cs deleted file mode 100644 index fd3c2dc..0000000 --- a/Runtime/LinearAlgebra/test/Vector3FloatTest.cs +++ /dev/null @@ -1,581 +0,0 @@ -#if !UNITY_5_6_OR_NEWER -using NUnit.Framework; - -namespace LinearAlgebra.Test { - using Vector3 = Vector3Float; - - public class Vector3FloatTest { - - [Test] - public void FromSpherical() { - Vector3 v = new(0, 0, 1); - Spherical s = Spherical.FromVector3(v); - Vector3 r = Vector3.FromSpherical(s); - - Assert.AreEqual(0, r.horizontal, "0 0 1"); - Assert.AreEqual(0, r.vertical, 1.0e-06, "0 0 1"); - Assert.AreEqual(1, r.depth, "0 0 1"); - - v = new(0, 1, 0); - s = Spherical.FromVector3(v); - r = Vector3.FromSpherical(s); - Assert.AreEqual(0, r.horizontal, "0 0 1"); - Assert.AreEqual(1, r.vertical, "0 0 1"); - Assert.AreEqual(0, r.depth, 1.0e-06, "0 0 1"); - - v = new(1, 0, 0); - s = Spherical.FromVector3(v); - r = Vector3.FromSpherical(s); - Assert.AreEqual(1, r.horizontal, "0 0 1"); - Assert.AreEqual(0, r.vertical, 1.0e-06, "0 0 1"); - Assert.AreEqual(0, r.depth, 1.0e-06, "0 0 1"); - } - - [Test] - public void Magnitude() { - Vector3 v = new(1, 2, 3); - float m = 0; - - m = v.magnitude; - Assert.AreEqual(3.7416575f, m, "magnitude 1 2 3"); - - m = Vector3.MagnitudeOf(v); - Assert.AreEqual(3.7416575f, m, "MagnitudeOf 1 2 3"); - - v = new(-1, -2, -3); - m = v.magnitude; - Assert.AreEqual(3.7416575f, m, "magnitude -1 -2 -3"); - - v = new(0, 0, 0); - m = v.magnitude; - Assert.AreEqual(0, m, "magnitude 0 0 0"); - - // Infinity tests are still missing - } - - [Test] - public void SqrMagnitude() { - Vector3 v = new(1, 2, 3); - float m = 0; - - m = v.sqrMagnitude; - Assert.AreEqual(14, m, "sqrMagnitude 1 2 3"); - - m = Vector3.SqrMagnitudeOf(v); - Assert.AreEqual(14, m, "SqrMagnitudeOf 1 2 3"); - - v = new(-1, -2, -3); - m = v.sqrMagnitude; - Assert.AreEqual(14, m, "sqrMagnitude -1 -2 -3"); - - v = new(0, 0, 0); - m = v.sqrMagnitude; - Assert.AreEqual(0, m, "sqrMagnitude 0 0 0"); - - // Infinity tests are still missing - } - - [Test] - public void Normalize() { - Vector3 v = new(0, 2, 0); - Vector3 r; - - r = v.normalized; - Assert.AreEqual(new Vector3(0, 1, 0), r, "normalized 0 2 0"); - - r = Vector3.Normalize(v); - Assert.AreEqual(new Vector3(0, 1, 0), r, "Normalize 0 2 0"); - - v = new(0, -2, 0); - r = v.normalized; - Assert.AreEqual(new Vector3(0, -1, 0), r, "normalized 0 -2 0"); - v = new(0, 0, 0); - r = v.normalized; - Assert.AreEqual(new Vector3(0, 0, 0), r, "normalized 0 0 0"); - - v = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); - r = v.normalized; - Assert.IsTrue(float.IsNaN(r.horizontal), "normalized infinity infinity infinity"); - Assert.IsTrue(float.IsNaN(r.vertical), "normalized infinity infinity infinity"); - Assert.IsTrue(float.IsNaN(r.depth), "normalized infinity infinity infinity"); - - v = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); - r = v.normalized; - Assert.IsTrue(float.IsNaN(r.horizontal), "normalized -infinity -infinity -infinity"); - Assert.IsTrue(float.IsNaN(r.vertical), "normalized -infinity -infinity -infinity"); - Assert.IsTrue(float.IsNaN(r.depth), "normalized -infinity -infinity -infinity"); - } - - [Test] - public void Negate() { - Vector3 v = new(4, 5, 6); - Vector3 r; - - r = -v; - Assert.AreEqual(-4, r.horizontal, "- 4 5 6 H"); - Assert.AreEqual(-5, r.vertical, "- 4 5 6 V"); - Assert.AreEqual(-6, r.depth, "- 4 5 6 D"); - - v = new(-4, -5, -6); - r = -v; - Assert.AreEqual(4, r.horizontal, "- -4 -5 -6 H"); - Assert.AreEqual(5, r.vertical, "- -4 -5 -6 V"); - Assert.AreEqual(6, r.depth, "- -4 -5 -6 D"); - - v = new(0, 0, 0); - r = -v; - Assert.AreEqual(new Vector3(0, 0, 0), r, "- 0 0 0"); - Assert.AreEqual(0, r.horizontal, "- 0 0 0 H"); - Assert.AreEqual(0, r.vertical, "- 0 0 0 V"); - Assert.AreEqual(0, r.depth, "- 0 0 0 D"); - - - v = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); - r = -v; - Assert.AreEqual(new Vector3(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity), r, "- inifinty infinity infinity"); - - v = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); - r = -v; - Assert.AreEqual(new Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity), r, "- -inifinty -infinity -infinity"); - } - - [Test] - public void Subtract() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - Vector3 r = Vector3.zero; - - r = v1 - v2; - Assert.IsTrue(r == new Vector3(3, 3, 3), "4 5 6 - 1 2 3"); - - v2 = new(-1, -2, -3); - r = v1 - v2; - Assert.IsTrue(r == new Vector3(5, 7, 9), "4 5 6 - -1 -2 -3"); - - v2 = new(4, 5, 6); - r = v1 - v2; - Assert.IsTrue(r == new Vector3(0, 0, 0), "4 5 6 - 4 5 6"); - r = v1; - r -= v2; - Assert.AreEqual(r, new Vector3(0, 0, 0), "4 5 6 - 4 5 6"); - - v2 = new(0, 0, 0); - r = v1 - v2; - Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 - 0 0 0"); - r -= v2; - Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 - 0 0 0"); - - // Infinity tests are still missing - } - - [Test] - public void Addition() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - Vector3 r = Vector3.zero; - - r = v1 + v2; - Assert.IsTrue(r == new Vector3(5, 7, 9), "4 5 6 + 1 2 3"); - - v2 = new(-1, -2, -3); - r = v1 + v2; - Assert.IsTrue(r == new Vector3(3, 3, 3), "4 5 6 + -1 -2 -3"); - r = v1; - r += v2; - Assert.AreEqual(r, new Vector3(3, 3, 3), "4 5 6 + -1 -2 -3"); - - v2 = new(0, 0, 0); - r = v1 + v2; - Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 + 0 0 0"); - r += v2; - Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 + 0 0 0"); - - // Infinity tests are still missing - } - - [Test] - public void Scale() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - Vector3 r; - - r = Vector3.Scale(v1, v2); - Assert.AreEqual(4, r.horizontal, "Scale 4 5 6 , 1 2 3 H"); - Assert.AreEqual(10, r.vertical, "Scale 4 5 6 , 1 2 3 V"); - Assert.AreEqual(18, r.depth, "Scale 4 5 6 , 1 2 3 D"); - - v2 = new(-1, -2, -3); - r = Vector3.Scale(v1, v2); - Assert.AreEqual(-4, r.horizontal, "Scale 4 5 6 , -1 -2 -3 H"); - Assert.AreEqual(-10, r.vertical, "Scale 4 5 6 , -1 -2 -3 V"); - Assert.AreEqual(-18, r.depth, "Scale 4 5 6 , -1 -2 -3 D"); - - v2 = new(0, 0, 0); - r = Vector3.Scale(v1, v2); - Assert.AreEqual(0, r.horizontal, "Scale 4 5 6 , 0 0 0 H"); - Assert.AreEqual(0, r.vertical, "Scale 4 5 6 , 0 0 0 V"); - Assert.AreEqual(0, r.depth, "Scale 4 5 6 , 0 0 0 D"); - - v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); - r = Vector3.Scale(v1, v2); - Assert.AreEqual(float.PositiveInfinity, r.horizontal, "Scale 4 5 6 , inf inf inf H"); - Assert.AreEqual(float.PositiveInfinity, r.vertical, "Scale 4 5 6 , inf inf inf V"); - Assert.AreEqual(float.PositiveInfinity, r.depth, "Scale 4 5 6 , inf inf inf D"); - - v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); - r = Vector3.Scale(v1, v2); - Assert.AreEqual(float.NegativeInfinity, r.horizontal, "Scale 4 5 6 , -inf -inf -inf H"); - Assert.AreEqual(float.NegativeInfinity, r.vertical, "Scale 4 5 6 , -inf -inf -inf V"); - Assert.AreEqual(float.NegativeInfinity, r.depth, "Scale 4 5 6 , -inf -inf -inf D"); - } - - [Test] - public void Multiply() { - Vector3 v1 = new(4, 5, 6); - float f = 3; - Vector3 r; - - r = v1 * f; - Assert.AreEqual(12, r.horizontal, "4 5 6 * 3 H"); - Assert.AreEqual(15, r.vertical, "4 5 6 * 3 V"); - Assert.AreEqual(18, r.depth, "4 5 6 * 3 D"); - - f = -3; - r = v1 * f; - Assert.AreEqual(-12, r.horizontal, "4 5 6 * -3 H"); - Assert.AreEqual(-15, r.vertical, "4 5 6 * -3 V"); - Assert.AreEqual(-18, r.depth, "4 5 6 * -3 D"); - - f = 0; - r = v1 * f; - Assert.AreEqual(0, r.horizontal, "4 5 6 * 0 H"); - Assert.AreEqual(0, r.vertical, "4 5 6 * 0 V"); - Assert.AreEqual(0, r.depth, "4 5 6 * 0 D"); - - f = float.PositiveInfinity; - r = v1 * f; - Assert.AreEqual(float.PositiveInfinity, r.horizontal, "4 5 6 * inf H"); - Assert.AreEqual(float.PositiveInfinity, r.vertical, "4 5 6 * inf V"); - Assert.AreEqual(float.PositiveInfinity, r.depth, "4 5 6 * inf D"); - - f = float.NegativeInfinity; - r = v1 * f; - Assert.AreEqual(float.NegativeInfinity, r.horizontal, "4 5 6 * -inf H"); - Assert.AreEqual(float.NegativeInfinity, r.vertical, "4 5 6 * -inf V"); - Assert.AreEqual(float.NegativeInfinity, r.depth, "4 5 6 * -inf D"); - } - - [Test] - public void Divide() { - Vector3 v1 = new(4, 5, 6); - float f = 2; - Vector3 r; - - r = v1 / f; - Assert.AreEqual(2, r.horizontal, "4 5 6 / 2 H"); - Assert.AreEqual(2.5, r.vertical, "4 5 6 / 2 V"); - Assert.AreEqual(3, r.depth, "4 5 6 / 2 D"); - - f = -2; - r = v1 / f; - Assert.AreEqual(-2, r.horizontal, "4 5 6 / -2 H"); - Assert.AreEqual(-2.5, r.vertical, "4 5 6 / -2 V"); - Assert.AreEqual(-3, r.depth, "4 5 6 / -2 D"); - - f = 0; - r = v1 / f; - Assert.AreEqual(float.PositiveInfinity, r.horizontal, "4 5 6 / 0 H"); - Assert.AreEqual(float.PositiveInfinity, r.vertical, "4 5 6 / 0 V"); - Assert.AreEqual(float.PositiveInfinity, r.depth, "4 5 6 / 0 D"); - - f = float.PositiveInfinity; - r = v1 / f; - Assert.AreEqual(0, r.horizontal, "4 5 6 / inf H"); - Assert.AreEqual(0, r.vertical, "4 5 6 / inf V"); - Assert.AreEqual(0, r.depth, "4 5 6 / inf D"); - - f = float.NegativeInfinity; - r = v1 / f; - Assert.AreEqual(0, r.horizontal, "4 5 6 / -inf H"); - Assert.AreEqual(0, r.vertical, "4 5 6 / -inf V"); - Assert.AreEqual(0, r.depth, "4 5 6 / -inf D"); - } - - [Test] - public void Dot() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - float f; - - f = Vector3.Dot(v1, v2); - Assert.AreEqual(32, f, "Dot(4 5 6, 1 2 3)"); - - v2 = new(-1, -2, -3); - f = Vector3.Dot(v1, v2); - Assert.AreEqual(-32, f, "Dot(4 5 6, -1 -2 -3)"); - - v2 = new(0, 0, 0); - f = Vector3.Dot(v1, v2); - Assert.AreEqual(0, f, "Dot(4 5 6, 0 0 0)"); - - v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); - f = Vector3.Dot(v1, v2); - Assert.AreEqual(float.PositiveInfinity, f, "Dot(4 5 6, inf inf inf)"); - - v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); - f = Vector3.Dot(v1, v2); - Assert.AreEqual(float.NegativeInfinity, f, "Dot(4 5 6, -inf -inf -inf)"); - } - - [Test] - public void Equality() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - bool r; - - r = v1 == v2; - Assert.IsFalse(r, "4 5 6 == 1 2 3"); - - v2 = new(4, 5, 6); - r = v1 == v2; - Assert.IsTrue(r, "4 5 6 == 4 5 6"); - - v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); - r = v1 == v2; - Assert.IsFalse(r, "4 5 6 == inf inf inf"); - - v1 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); - r = v1 == v2; - Assert.IsFalse(r, "-inf -inf -inf == inf inf inf"); - } - - [Test] - public void Distance() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - float f; - - f = Vector3.Distance(v1, v2); - Assert.AreEqual(5.19615221F, f, "Distance(4 5 6, 1 2 3)"); - - v2 = new(-1, -2, -3); - f = Vector3.Distance(v1, v2); - Assert.AreEqual(12.4498997F, f, "Distance(4 5 6, -1 -2 -3)"); - - v2 = new(0, 0, 0); - f = Vector3.Distance(v1, v2); - Assert.AreEqual(v1.magnitude, f, "Distance(4 5 6, 0 0 0)"); - - v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); - f = Vector3.Distance(v1, v2); - Assert.AreEqual(float.PositiveInfinity, f, "Distance(4 5 6, inf inf inf)"); - - v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); - f = Vector3.Distance(v1, v2); - Assert.AreEqual(float.PositiveInfinity, f, "Distance(4 5 6, -inf -inf -inf)"); - } - - [Test] - public void Cross() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - Vector3 r; - - r = Vector3.Cross(v1, v2); - Assert.AreEqual(3, r.horizontal, "Cross(4 5 6, 1 2 3) H"); - Assert.AreEqual(-6, r.vertical, "Cross(4 5 6, 1 2 3) V"); - Assert.AreEqual(3, r.depth, "Cross(4 5 6, 1 2 3) D"); - - v2 = new(-1, -2, -3); - r = Vector3.Cross(v1, v2); - Assert.AreEqual(-3, r.horizontal, "Cross(4 5 6, -1 -2 -3) H"); - Assert.AreEqual(6, r.vertical, "Cross(4 5 6, -1 -2 -3) V"); - Assert.AreEqual(-3, r.depth, "Cross(4 5 6, -1 -2 -3) D"); - - v2 = new(0, 0, 0); - r = Vector3.Cross(v1, v2); - Assert.AreEqual(0, r.horizontal, "Cross(4 5 6, 0 0 0) H"); - Assert.AreEqual(0, r.vertical, "Cross(4 5 6, 0 0 0) V"); - Assert.AreEqual(0, r.depth, "Cross(4 5 6, 0 0 0) D"); - - v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); - r = Vector3.Cross(v1, v2); - Assert.IsTrue(float.IsNaN(r.horizontal), "Cross(4 5 6, inf inf inf) H"); - Assert.IsTrue(float.IsNaN(r.vertical), "Cross(4 5 6, inf inf inf) V"); - Assert.IsTrue(float.IsNaN(r.depth), "Cross(4 5 6, inf inf inf) D"); - - v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); - r = Vector3.Cross(v1, v2); - Assert.IsTrue(float.IsNaN(r.horizontal), "Cross(4 5 6, -inf -inf -inf) H"); - Assert.IsTrue(float.IsNaN(r.vertical), "Cross(4 5 6, -inf -inf -inf) V"); - Assert.IsTrue(float.IsNaN(r.depth), "Cross(4 5 6, -inf -inf -inf) D"); - } - - [Test] - public void Project() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - Vector3 r; - - r = Vector3.Project(v1, v2); - Assert.AreEqual(2.28571439F, r.horizontal, "Project(4 5 6, 1 2 3) H"); - Assert.AreEqual(4.57142878F, r.vertical, "Project(4 5 6, 1 2 3) V"); - Assert.AreEqual(6.85714293F, r.depth, "Project(4 5 6, 1 2 3) D"); - - v2 = new(-1, -2, -3); - r = Vector3.Project(v1, v2); - Assert.AreEqual(2.28571439F, r.horizontal, "Project(4 5 6, -1 -2 -3) H"); - Assert.AreEqual(4.57142878F, r.vertical, "Project(4 5 6, -1 -2 -3) V"); - Assert.AreEqual(6.85714293F, r.depth, "Project(4 5 6, -1 -2 -3) D"); - - v2 = new(0, 0, 0); - r = Vector3.Project(v1, v2); - Assert.AreEqual(0, r.horizontal, "Project(4 5 6, 0 0 0) H"); - Assert.AreEqual(0, r.vertical, "Project(4 5 6, 0 0 0) V"); - Assert.AreEqual(0, r.depth, "Project(4 5 6, 0 0 0) D"); - - r = Vector3.Project(v2, v1); - Assert.AreEqual(0, r.horizontal, "Project(0 0 0, 4 5 6) H"); - Assert.AreEqual(0, r.vertical, "Project(0 0 0, 4 5 6) V"); - Assert.AreEqual(0, r.depth, "Project(0 0 0, 4 5 6) D"); - - v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); - r = Vector3.Project(v1, v2); - Assert.IsTrue(float.IsNaN(r.horizontal), "Project(4 5 6, inf inf inf) H"); - Assert.IsTrue(float.IsNaN(r.vertical), "Project(4 5 6, inf inf inf) V"); - Assert.IsTrue(float.IsNaN(r.depth), "Project(4 5 6, inf inf inf) D"); - - v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); - r = Vector3.Project(v1, v2); - Assert.IsTrue(float.IsNaN(r.horizontal), "Project(4 5 6, -inf -inf -inf) H"); - Assert.IsTrue(float.IsNaN(r.vertical), "Project(4 5 6, -inf -inf -inf) V"); - Assert.IsTrue(float.IsNaN(r.depth), "Project(4 5 6, -inf -inf -inf) D"); - } - - [Test] - public void ProjectOnPlane() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - Vector3 r; - - r = Vector3.ProjectOnPlane(v1, v2); - Assert.AreEqual(1.71428561F, r.horizontal, "ProjectOnPlane(4 5 6, 1 2 3) H"); - Assert.AreEqual(0.428571224F, r.vertical, "ProjectOnPlane(4 5 6, 1 2 3) V"); - Assert.AreEqual(-0.857142925F, r.depth, "ProjectOnPlane(4 5 6, 1 2 3) D"); - - v2 = new(-1, -2, -3); - r = Vector3.ProjectOnPlane(v1, v2); - Assert.AreEqual(1.71428561F, r.horizontal, "ProjectOnPlane(4 5 6, -1 -2 -3) H"); - Assert.AreEqual(0.428571224F, r.vertical, "ProjectOnPlane(4 5 6, -1 -2 -3) V"); - Assert.AreEqual(-0.857142925F, r.depth, "ProjectOnPlane(4 5 6, -1 -2 -3) D"); - - v2 = new(0, 0, 0); - r = Vector3.ProjectOnPlane(v1, v2); - Assert.AreEqual(4, r.horizontal, "ProjectOnPlane(4 5 6, 0 0 0) H"); - Assert.AreEqual(5, r.vertical, "ProjectOnPlane(4 5 6, 0 0 0) V"); - Assert.AreEqual(6, r.depth, "ProjectOnPlane(4 5 6, 0 0 0) D"); - - r = Vector3.ProjectOnPlane(v2, v1); - Assert.AreEqual(0, r.horizontal, "ProjectOnPlane(0 0 0, 4 5 6) H"); - Assert.AreEqual(0, r.vertical, "ProjectOnPlane(0 0 0, 4 5 6) V"); - Assert.AreEqual(0, r.depth, "ProjectOnPlane(0 0 0, 4 5 6) D"); - - v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); - r = Vector3.ProjectOnPlane(v1, v2); - Assert.IsTrue(float.IsNaN(r.horizontal), "ProjectOnPlane(4 5 6, inf inf inf) H"); - Assert.IsTrue(float.IsNaN(r.vertical), "ProjectOnPlane(4 5 6, inf inf inf) V"); - Assert.IsTrue(float.IsNaN(r.depth), "ProjectOnPlane(4 5 6, inf inf inf) D"); - - v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); - r = Vector3.ProjectOnPlane(v1, v2); - Assert.IsTrue(float.IsNaN(r.horizontal), "ProjectOnPlane(4 5 6, -inf -inf -inf) H"); - Assert.IsTrue(float.IsNaN(r.vertical), "ProjectOnPlane(4 5 6, -inf -inf -inf) V"); - Assert.IsTrue(float.IsNaN(r.depth), "ProjectOnPlane(4 5 6, -inf -inf -inf) D"); - } - - [Test] - public void UnsignedAngle() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - AngleFloat a; - - a = Vector3.UnsignedAngle(v1, v2); - Assert.AreEqual(12.9331379F, a.inDegrees, "Angle(4 5 6, 1 2 3)"); - - v2 = new(-1, -2, -3); - a = Vector3.UnsignedAngle(v1, v2); - Assert.AreEqual(167.066849F, a.inDegrees, "Angle(4 5 6, -1 -2 -3)"); - - v2 = new(0, 0, 0); - a = Vector3.UnsignedAngle(v1, v2); - Assert.AreEqual(0, a.inDegrees, "Angle(4 5 6, 0 0 0)"); - - v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); - a = Vector3.UnsignedAngle(v1, v2); - Assert.IsTrue(float.IsNaN(a.inDegrees), "Angle(4 5 6, inf inf inf)"); - - v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); - a = Vector3.UnsignedAngle(v1, v2); - Assert.IsTrue(float.IsNaN(a.inDegrees), "Angle(4 5 6, inf inf inf)"); - } - - [Test] - public void SignedAngle() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - Vector3 v3 = new(7, 8, -9); - AngleFloat a; - - a = Vector3.SignedAngle(v1, v2, v3); - Assert.AreEqual(-12.9331379F, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, 7 8 -9)"); - - v2 = new(-1, -2, -3); - a = Vector3.SignedAngle(v1, v2, v3); - Assert.AreEqual(167.066849F, a.inDegrees, "SignedAngle(4 5 6, -1 -2 -3, 7 8 -9)"); - - v2 = new(0, 0, 0); - a = Vector3.SignedAngle(v1, v2, v3); - Assert.AreEqual(0, a.inDegrees, "SignedAngle(4 5 6, 0 0 0, 7 8 -9)"); - - v2 = new(1, 2, 3); - v3 = new(-7, -8, 9); - a = Vector3.SignedAngle(v1, v2, v3); - Assert.AreEqual(12.9331379F, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, -7 -8 9)"); - - v3 = new(0, 0, 0); - a = Vector3.SignedAngle(v1, v2, v3); - Assert.AreEqual(0, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, 0 0 0)"); - - v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); - a = Vector3.SignedAngle(v1, v2, v3); - Assert.IsTrue(float.IsNaN(a.inDegrees), "SignedAngle(4 5 6, inf inf inf, 0 0 0)"); - - v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); - a = Vector3.SignedAngle(v1, v2, v3); - Assert.IsTrue(float.IsNaN(a.inDegrees), "SignedAngle(4 5 6, -inf -inf -inf, 0 0 0)"); - } - - [Test] - public void Lerp() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - Vector3 r; - - r = Vector3.Lerp(v1, v2, 0); - Assert.AreEqual(0, Vector3.Distance(r, v1), 0); - - r = Vector3.Lerp(v1, v2, 1); - Assert.AreEqual(0, Vector3.Distance(r, v2), 0); - - r = Vector3.Lerp(v1, v2, 0.5f); - Assert.AreEqual(0, Vector3.Distance(r, new Vector3(2.5f, 3.5f, 4.5f)), 0); - - r = Vector3.Lerp(v1, v2, -1); - Assert.AreEqual(0, Vector3.Distance(r, new Vector3(7, 8, 9)), 0); - - r = Vector3.Lerp(v1, v2, 2); - Assert.AreEqual(0, Vector3.Distance(r, new Vector3(-2, -1, 0)), 0); - } - } -} -#endif \ No newline at end of file diff --git a/Runtime/LinearAlgebra/test/Vector3IntTest.cs b/Runtime/LinearAlgebra/test/Vector3IntTest.cs deleted file mode 100644 index b718178..0000000 --- a/Runtime/LinearAlgebra/test/Vector3IntTest.cs +++ /dev/null @@ -1,349 +0,0 @@ -#if !UNITY_5_6_OR_NEWER -using NUnit.Framework; - -namespace LinearAlgebra.Test { - using Vector3 = Vector3Int; - - public class Vector3IntTest { - - [Test] - public void Equality() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - - Assert.IsFalse(v1 == v2, "4 5 6 == 1 2 3"); - Assert.IsTrue(v1 != v2, "4 5 6 != 1 2 3"); - - v2 = new(4, 5, 6); - Assert.IsTrue(v1 == v2, "4 5 6 == 4 5 6"); - Assert.IsFalse(v1 != v2, "4 5 6 != 4 5 6"); - } - - [Test] - public void Magnitude() { - Vector3 v = new(1, 2, 3); - float m = 0; - - m = v.magnitude; - Assert.AreEqual(3.7416575f, m, "magnitude 1 2 3"); - - m = Vector3.MagnitudeOf(v); - Assert.AreEqual(3.7416575f, m, "MagnitudeOf 1 2 3"); - - v = new(-1, -2, -3); - m = v.magnitude; - Assert.AreEqual(3.7416575f, m, "magnitude -1 -2 -3"); - - v = new(0, 0, 0); - m = v.magnitude; - Assert.AreEqual(0, m, "magnitude 0 0 0"); - - // Infinity tests are still missing - } - - [Test] - public void SqrMagnitude() { - Vector3 v = new(1, 2, 3); - float m = 0; - - m = v.sqrMagnitude; - Assert.AreEqual(14, m, "sqrMagnitude 1 2 3"); - - m = Vector3.SqrMagnitudeOf(v); - Assert.AreEqual(14, m, "SqrMagnitudeOf 1 2 3"); - - v = new(-1, -2, -3); - m = v.sqrMagnitude; - Assert.AreEqual(14, m, "sqrMagnitude -1 -2 -3"); - - v = new(0, 0, 0); - m = v.sqrMagnitude; - Assert.AreEqual(0, m, "sqrMagnitude 0 0 0"); - - // Infinity tests are still missing - } - - [Test] - public void Distance() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - float f; - - f = Vector3.Distance(v1, v2); - Assert.AreEqual(5.19615221F, f, "Distance(4 5 6, 1 2 3)"); - - v2 = new(-1, -2, -3); - f = Vector3.Distance(v1, v2); - Assert.AreEqual(12.4498997F, f, "Distance(4 5 6, -1 -2 -3)"); - - v2 = new(0, 0, 0); - f = Vector3.Distance(v1, v2); - Assert.AreEqual(v1.magnitude, f, "Distance(4 5 6, 0 0 0)"); - } - - [Test] - public void Normalize() { - Vector3 v = new(0, 2, 0); - Vector3Float r; - - r = v.normalized; - //Assert.AreEqual(new Vector3(0, 1, 0), r, "normalized 0 2 0"); - Assert.AreEqual(0, r.horizontal, "normalized 0 2 0"); - Assert.AreEqual(1, r.vertical, "normalized 0 2 0"); - Assert.AreEqual(0, r.depth, "normalized 0 2 0"); - - r = Vector3.Normalize(v); - Assert.AreEqual(new Vector3Float(0, 1, 0), r, "Normalize 0 2 0"); - - v = new(0, -2, 0); - r = v.normalized; - Assert.AreEqual(new Vector3Float(0, -1, 0), r, "normalized 0 -2 0"); - v = new(0, 0, 0); - r = v.normalized; - Assert.AreEqual(new Vector3Float(0, 0, 0), r, "normalized 0 0 0"); - } - - [Test] - public void Negate() { - Vector3 v = new(4, 5, 6); - Vector3 r; - - r = -v; - Assert.AreEqual(-4, r.horizontal, "- 4 5 6 H"); - Assert.AreEqual(-5, r.vertical, "- 4 5 6 V"); - Assert.AreEqual(-6, r.depth, "- 4 5 6 D"); - - v = new(-4, -5, -6); - r = -v; - Assert.AreEqual(4, r.horizontal, "- -4 -5 -6 H"); - Assert.AreEqual(5, r.vertical, "- -4 -5 -6 V"); - Assert.AreEqual(6, r.depth, "- -4 -5 -6 D"); - - v = new(0, 0, 0); - r = -v; - Assert.AreEqual(new Vector3(0, 0, 0), r, "- 0 0 0"); - Assert.AreEqual(0, r.horizontal, "- 0 0 0 H"); - Assert.AreEqual(0, r.vertical, "- 0 0 0 V"); - Assert.AreEqual(0, r.depth, "- 0 0 0 D"); - } - - [Test] - public void Subtract() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - Vector3 r = Vector3.zero; - - r = v1 - v2; - Assert.IsTrue(r == new Vector3(3, 3, 3), "4 5 6 - 1 2 3"); - - v2 = new(-1, -2, -3); - r = v1 - v2; - Assert.IsTrue(r == new Vector3(5, 7, 9), "4 5 6 - -1 -2 -3"); - - v2 = new(4, 5, 6); - r = v1 - v2; - Assert.IsTrue(r == new Vector3(0, 0, 0), "4 5 6 - 4 5 6"); - r = v1; - r -= v2; - Assert.AreEqual(r, new Vector3(0, 0, 0), "4 5 6 - 4 5 6"); - - v2 = new(0, 0, 0); - r = v1 - v2; - Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 - 0 0 0"); - r -= v2; - Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 - 0 0 0"); - - // Infinity tests are still missing - } - - [Test] - public void Addition() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - Vector3 r = Vector3.zero; - - r = v1 + v2; - Assert.IsTrue(r == new Vector3(5, 7, 9), "4 5 6 + 1 2 3"); - - v2 = new(-1, -2, -3); - r = v1 + v2; - Assert.IsTrue(r == new Vector3(3, 3, 3), "4 5 6 + -1 -2 -3"); - r = v1; - r += v2; - Assert.AreEqual(r, new Vector3(3, 3, 3), "4 5 6 + -1 -2 -3"); - - v2 = new(0, 0, 0); - r = v1 + v2; - Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 + 0 0 0"); - r += v2; - Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 + 0 0 0"); - - // Infinity tests are still missing - } - - [Test] - public void Scale() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - Vector3 r; - - r = Vector3.Scale(v1, v2); - Assert.AreEqual(4, r.horizontal, "Scale 4 5 6 , 1 2 3 H"); - Assert.AreEqual(10, r.vertical, "Scale 4 5 6 , 1 2 3 V"); - Assert.AreEqual(18, r.depth, "Scale 4 5 6 , 1 2 3 D"); - - v2 = new(-1, -2, -3); - r = Vector3.Scale(v1, v2); - Assert.AreEqual(-4, r.horizontal, "Scale 4 5 6 , -1 -2 -3 H"); - Assert.AreEqual(-10, r.vertical, "Scale 4 5 6 , -1 -2 -3 V"); - Assert.AreEqual(-18, r.depth, "Scale 4 5 6 , -1 -2 -3 D"); - - v2 = new(0, 0, 0); - r = Vector3.Scale(v1, v2); - Assert.AreEqual(0, r.horizontal, "Scale 4 5 6 , 0 0 0 H"); - Assert.AreEqual(0, r.vertical, "Scale 4 5 6 , 0 0 0 V"); - Assert.AreEqual(0, r.depth, "Scale 4 5 6 , 0 0 0 D"); - } - - [Test] - public void Multiply() { - Vector3 v1 = new(4, 5, 6); - int f = 3; - Vector3 r; - - r = v1 * f; - Assert.AreEqual(12, r.horizontal, "4 5 6 * 3 H"); - Assert.AreEqual(15, r.vertical, "4 5 6 * 3 V"); - Assert.AreEqual(18, r.depth, "4 5 6 * 3 D"); - - r = f * v1; - Assert.AreEqual(12, r.horizontal, "3 * 4 5 6 H"); - Assert.AreEqual(15, r.vertical, "3 * 4 5 6 V"); - Assert.AreEqual(18, r.depth, "3 * 4 5 6 D"); - - f = -3; - r = v1 * f; - Assert.AreEqual(-12, r.horizontal, "4 5 6 * -3 H"); - Assert.AreEqual(-15, r.vertical, "4 5 6 * -3 V"); - Assert.AreEqual(-18, r.depth, "4 5 6 * -3 D"); - - f = 0; - r = v1 * f; - Assert.AreEqual(0, r.horizontal, "4 5 6 * 0 H"); - Assert.AreEqual(0, r.vertical, "4 5 6 * 0 V"); - Assert.AreEqual(0, r.depth, "4 5 6 * 0 D"); - } - - [Test] - public void Divide() { - Vector3 v1 = new(4, 5, 6); - int f = 2; - Vector3 r; - - r = v1 / f; - Assert.AreEqual(2, r.horizontal, "4 5 6 / 2 H"); - Assert.AreEqual(2, r.vertical, "4 5 6 / 2 V"); - Assert.AreEqual(3, r.depth, "4 5 6 / 2 D"); - - f = -2; - r = v1 / f; - Assert.AreEqual(-2, r.horizontal, "4 5 6 / -2 H"); - Assert.AreEqual(-2, r.vertical, "4 5 6 / -2 V"); - Assert.AreEqual(-3, r.depth, "4 5 6 / -2 D"); - - Assert.Throws(() => { - f = 0; - r = v1 / f; - }); - } - - [Test] - public void Dot() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - float f; - - f = Vector3.Dot(v1, v2); - Assert.AreEqual(32, f, "Dot(4 5 6, 1 2 3)"); - - v2 = new(-1, -2, -3); - f = Vector3.Dot(v1, v2); - Assert.AreEqual(-32, f, "Dot(4 5 6, -1 -2 -3)"); - - v2 = new(0, 0, 0); - f = Vector3.Dot(v1, v2); - Assert.AreEqual(0, f, "Dot(4 5 6, 0 0 0)"); - } - - [Test] - public void Cross() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - Vector3 r; - - r = Vector3.Cross(v1, v2); - Assert.AreEqual(3, r.horizontal, "Cross(4 5 6, 1 2 3) H"); - Assert.AreEqual(-6, r.vertical, "Cross(4 5 6, 1 2 3) V"); - Assert.AreEqual(3, r.depth, "Cross(4 5 6, 1 2 3) D"); - - v2 = new(-1, -2, -3); - r = Vector3.Cross(v1, v2); - Assert.AreEqual(-3, r.horizontal, "Cross(4 5 6, -1 -2 -3) H"); - Assert.AreEqual(6, r.vertical, "Cross(4 5 6, -1 -2 -3) V"); - Assert.AreEqual(-3, r.depth, "Cross(4 5 6, -1 -2 -3) D"); - - v2 = new(0, 0, 0); - r = Vector3.Cross(v1, v2); - Assert.AreEqual(0, r.horizontal, "Cross(4 5 6, 0 0 0) H"); - Assert.AreEqual(0, r.vertical, "Cross(4 5 6, 0 0 0) V"); - Assert.AreEqual(0, r.depth, "Cross(4 5 6, 0 0 0) D"); - } - - [Test] - public void UnsignedAngle() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - AngleFloat a; - - a = Vector3.UnsignedAngle(v1, v2); - Assert.AreEqual(12.9331379F, a.inDegrees, "Angle(4 5 6, 1 2 3)"); - - v2 = new(-1, -2, -3); - a = Vector3.UnsignedAngle(v1, v2); - Assert.AreEqual(167.066849F, a.inDegrees, "Angle(4 5 6, -1 -2 -3)"); - - v2 = new(0, 0, 0); - a = Vector3.UnsignedAngle(v1, v2); - Assert.AreEqual(0, a.inDegrees, "Angle(4 5 6, 0 0 0)"); - } - - [Test] - public void SignedAngle() { - Vector3 v1 = new(4, 5, 6); - Vector3 v2 = new(1, 2, 3); - Vector3 v3 = new(7, 8, -9); - AngleFloat a; - - a = Vector3.SignedAngle(v1, v2, v3); - Assert.AreEqual(-12.9331379F, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, 7 8 -9)"); - - v2 = new(-1, -2, -3); - a = Vector3.SignedAngle(v1, v2, v3); - Assert.AreEqual(167.066849F, a.inDegrees, "SignedAngle(4 5 6, -1 -2 -3, 7 8 -9)"); - - v2 = new(0, 0, 0); - a = Vector3.SignedAngle(v1, v2, v3); - Assert.AreEqual(0, a.inDegrees, "SignedAngle(4 5 6, 0 0 0, 7 8 -9)"); - - v2 = new(1, 2, 3); - v3 = new(-7, -8, 9); - a = Vector3.SignedAngle(v1, v2, v3); - Assert.AreEqual(12.9331379F, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, -7 -8 9)"); - - v3 = new(0, 0, 0); - a = Vector3.SignedAngle(v1, v2, v3); - Assert.AreEqual(0, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, 0 0 0)"); - } - } -} -#endif \ No newline at end of file diff --git a/Runtime/Scripts/Brain.cs b/Runtime/Scripts/Brain.cs index acb28f3..afffba0 100644 --- a/Runtime/Scripts/Brain.cs +++ b/Runtime/Scripts/Brain.cs @@ -45,7 +45,7 @@ namespace NanoBrain { /// The name of the Neuron for which the weights are updated /// The new Synapse weight public static void UpdateWeight(Cluster brain, string name, float weight) { - Nucleus root = brain.defaultOutput; + Neuron root = brain.defaultOutput; foreach (Synapse synapse in root.synapses) { if (synapse.neuron.name == name) { if (synapse.weight != weight) { diff --git a/Runtime/Scripts/Brain.cs.meta b/Runtime/Scripts/Brain.cs.meta index 1666c60..fc8b1c9 100644 --- a/Runtime/Scripts/Brain.cs.meta +++ b/Runtime/Scripts/Brain.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 92f34a5e4027a1dc39efd8ce63cf6aba \ No newline at end of file +guid: 92f34a5e4027a1dc39efd8ce63cf6aba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/Core/Cluster.cs b/Runtime/Scripts/Core/Cluster.cs index 87366f3..8779e03 100644 --- a/Runtime/Scripts/Core/Cluster.cs +++ b/Runtime/Scripts/Core/Cluster.cs @@ -17,6 +17,10 @@ namespace NanoBrain { public class Cluster : Nucleus { // It may be that clusters will not be nuclei anymore in the future.... + /// + /// The prefab used to create this cluster + /// + /// Cluster should always be created from prefabs public ClusterPrefab prefab; /// @@ -31,20 +35,37 @@ namespace NanoBrain { } } - // This should not be serialized - //[SerializeReference] + /// + /// All cluster instance of a multi-cluster + /// + /// A cluster is a multi-cluster when there is more than one instance. + /// The actual instances are only created at runtime. + /// The value instanceCount determines how many instances will be present at runtime. [NonSerialized] - public Cluster[] siblingClusters; - // This serialization should be enough + public Cluster[] instances; + + /// + /// The number of cluster instances in a multi-cluster + /// + /// A cluster is a multi-clsuter when there is more than one instance. [SerializeField] public int instanceCount = 1; + /// + /// The mapping from things to cluster instances + /// + /// In a multi-cluster each instance can be used for a thing. + /// Cluster instance may also not (yet) be mapped to a thing. public Dictionary thingClusters = new(); + /// + /// All nuclei in this cluster + /// [SerializeReference] - public List clusterNuclei = new(); + public List nuclei = new(); // the nuclei sorted using topological sorting // to ensure that the cluster is computer in the right order - public List sortedNuclei; + + //public List sortedNuclei; #region Init @@ -58,10 +79,10 @@ namespace NanoBrain { this.name = prefab.name; this.parent = parent; - this.parent?.clusterNuclei.Add(this); + this.parent?.nuclei.Add(this); ClonePrefab(); - _ = this.inputs; - this.sortedNuclei = TopologicalSort(this.clusterNuclei); + // _ = this.inputs; + //this.sortedNuclei = TopologicalSort(this.nuclei); } /// @@ -72,14 +93,12 @@ namespace NanoBrain { public Cluster(ClusterPrefab prefab, ClusterPrefab parent = null) { this.prefab = prefab; this.name = prefab.name; - this.clusterPrefab = parent; - - if (this.clusterPrefab != null) - this.clusterPrefab.nuclei.Add(this); + if (parent != null) + this.parent = parent.cluster; ClonePrefab(); - _ = this.inputs; - this.sortedNuclei = TopologicalSort(this.clusterNuclei); + // _ = this.inputs; + //this.sortedNuclei = TopologicalSort(this.nuclei); } /// @@ -88,15 +107,13 @@ namespace NanoBrain { /// Strange that this does not take any parameters or return values. /// Where which the clone be found??? private void ClonePrefab() { - Nucleus[] prefabNuclei = this.prefab.nuclei.ToArray(); + Nucleus[] prefabNuclei = this.prefab.cluster.nuclei.ToArray(); // first clone the nuclei without their connections foreach (Nucleus nucleus in prefabNuclei) { nucleus.ShallowCloneTo(this); } - Nucleus[] clonedNuclei = this.clusterNuclei.ToArray(); - // foreach (Nucleus n in clonedNuclei) - // n.name += "(c)"; + Nucleus[] clonedNuclei = this.nuclei.ToArray(); // Now clone the connections for (int nucleusIx = 0; nucleusIx < prefabNuclei.Length; nucleusIx++) { @@ -110,10 +127,10 @@ namespace NanoBrain { foreach (Synapse prefabSynapse in prefabNeuron.synapses) { Neuron synapseNeuron = prefabSynapse.neuron; - if (synapseNeuron.clusterPrefab != null && synapseNeuron.clusterPrefab != this.prefab) { + if (synapseNeuron.parent.prefab != null && synapseNeuron.parent.prefab != this.prefab) { // Neuron is in another cluster, find the cloned cluster first - ClusterPrefab prefabCluster = synapseNeuron.clusterPrefab; - Cluster clonedCluster = this.clusterNuclei.Find(n => n.name == prefabCluster.name) as Cluster; + Cluster prefabCluster = synapseNeuron.parent; + Cluster clonedCluster = this.nuclei.Find(n => n.name == prefabCluster.name) as Cluster; if (clonedCluster == null) continue; @@ -122,7 +139,7 @@ namespace NanoBrain { if (neuronIx < 0) // Could not find the neuron in the prefab cluster continue; - if (clonedCluster.clusterNuclei[neuronIx] is not Neuron clonedSender) + if (clonedCluster.nuclei[neuronIx] is not Neuron clonedSender) // Could not find the neuron in the cloned cluster continue; @@ -130,7 +147,7 @@ namespace NanoBrain { //Debug.Log($"Add synapse {clonedCluster.name}.{clonedSender.name} -> {clonedNeuron.name} [{clonedSender.receivers.Count}]"); } else { - int ix = GetNucleusIndex(prefabNuclei, prefabSynapse.neuron); + int ix = GetNucleusIndex(this.prefab.cluster.nuclei, prefabSynapse.neuron); if (ix < 0) continue; if (clonedNuclei[ix] is not Neuron clonedSender) @@ -141,28 +158,6 @@ namespace NanoBrain { // Debug.Log($"Add synapse {clonedSender.name} -> {clonedNeuron.name}"); } } - - // // Copy the receivers, which will also create the synapses - // foreach (Nucleus receiver in prefabNeuron.receivers.ToArray()) { - // int ix = GetNucleusIndex(prefabNuclei, receiver); - // if (ix < 0) - // continue; - - // if (clonedNuclei[ix] is not Nucleus clonedReceiver) - // continue; - - // // Find the synapse for the weight - // float weight = 1; - // foreach (Synapse synapse in receiver.synapses) { - // // Find the weight for this synapse - // if (synapse.neuron == prefabNucleus) { - // weight = synapse.weight; - // break; - // } - // } - - // clonedNeuron.AddReceiver(clonedReceiver, weight); - // } } if (Application.isPlaying) { @@ -179,7 +174,7 @@ namespace NanoBrain { Debug.Log($"create {clonedCluster.prefab.name} sibling"); Cluster sibling = new(clonedCluster.prefab, this) { name = $"{clonedCluster.baseName}: {instanceIx}", - clusterPrefab = this.clusterPrefab, + parent = this.parent, instanceCount = this.instanceCount, }; siblings.Add(sibling); @@ -187,226 +182,104 @@ namespace NanoBrain { } Cluster[] siblingClusters = siblings.ToArray(); foreach (Cluster sibling in siblings) - sibling.siblingClusters = siblingClusters; + sibling.instances = siblingClusters; + } + + // Ensure that all neurons are computed to initialize bias + foreach (Nucleus clonedNucleus in clonedNuclei) { + if (clonedNucleus is not Cluster) + clonedNucleus.UpdateStateIsolated(); } } - /* - for (int nucleusIx = 0; nucleusIx < clonedNuclei.Length; nucleusIx++) { - Nucleus prefabNucleus = prefabNuclei[nucleusIx]; - if (prefabNucleus is not Cluster prefabCluster) - continue; - - if (prefabCluster.instanceCount <= 1) - 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.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; - } - } } - /* - // Collect the subclusters - List subClusters = new(); - foreach (Nucleus nucleus in prefabNuclei) { - foreach (Synapse synapse in nucleus.synapses) { - Nucleus synapseNucleus = synapse.neuron; - Cluster subCluster = synapseNucleus.parent; - if (subCluster is null || - synapseNucleus.clusterPrefab == this.clusterPrefab) { + // /// + // /// Sort the nuclei in a correct evaluation order + // /// + // /// + // /// + // /// + // private List TopologicalSort(List nodes) { + // Dictionary inDegree = new(); + // foreach (Nucleus node in nodes) + // inDegree[node] = 0; // Initialize in-degree to zero - continue; - } - // if (synapseNucleus is not Cluster subCluster) - // continue; - if (subClusters.Contains(subCluster)) - continue; - subClusters.Add(subCluster); - } - } - // Create the subcluster instances - foreach (Cluster subCluster in subClusters) { - for (int ix = 0; ix < subCluster.instanceCount; ix++) { - // create the new instance - Cluster clusterInstance = new(subCluster.prefab); - // connect it - foreach ((Neuron sender, Nucleus receiver) in subCluster.CollectConnections()) { - int receiverIx = GetNucleusIndex(prefabNuclei, receiver); - if (receiverIx < 0) - continue; + // // Calculate in-degrees + // foreach (Nucleus node in nodes) { + // if (node is Cluster cluster) { + // foreach (Nucleus receiver in cluster.CollectReceivers()) + // inDegree[receiver]++; + // } + // else if (node is Neuron neuron) { + // foreach (Nucleus receiver in neuron.receivers) + // inDegree[receiver]++; + // } + // } - if (clonedNuclei[receiverIx] is not Nucleus clonedReceiver) - continue; + // Queue queue = new(); + // foreach (Nucleus node in nodes) { + // if (inDegree[node] == 0) // Nodes with no dependencies + // queue.Enqueue(node); + // } + // // The queue basically stores all input nuclei? - // Find the synapse for the weight - float weight = 1; - foreach (Synapse synapse in receiver.synapses) { - // Find the weight for this synapse - if (synapse.neuron == sender) { - weight = synapse.weight; - break; - } - } + // List sortedOrder = new(); + // while (queue.Count > 0) { + // Nucleus current = queue.Dequeue(); + // sortedOrder.Add(current); // Process the node - if (clusterInstance.GetNucleus(sender.name) is not Neuron clonedSender) - continue; + // if (current is Neuron neuron) { + // foreach (Nucleus receiver in neuron.receivers) { + // inDegree[receiver]--; + // if (inDegree[receiver] == 0) // If all dependencies resolved + // queue.Enqueue(receiver); + // } + // } + // else if (current is Cluster cluster) { + // foreach (Nucleus receiver in cluster.CollectReceivers()) { + // inDegree[receiver]--; + // if (inDegree[receiver] == 0) // If all dependencies resolved + // queue.Enqueue(receiver); + // } + // } + // } - clonedSender.AddReceiver(clonedReceiver, weight); - } - } - } - */ + // // Check for cycles in the graph + // if (sortedOrder.Count != nodes.Count) + // throw new InvalidOperationException("Graph is not a DAG; a cycle exists."); - // foreach (Nucleus nucleus in this.clusterNuclei) { - // if (nucleus is Cluster clonedSubCluster) - // RestoreAllExternalReceivers(clonedSubCluster, this.prefab, this); - // } - } + // return sortedOrder; + // } - private void CloneSynapses(Neuron prefabNeuron, Neuron clonedNeuron) { - foreach (Synapse prefabSynapse in prefabNeuron.synapses) { - Neuron synapseNeuron = prefabSynapse.neuron; - if (synapseNeuron.clusterPrefab != null && synapseNeuron.clusterPrefab != this.prefab) { - // Neuron is in another cluster, find the cloned cluster first - ClusterPrefab prefabCluster = synapseNeuron.clusterPrefab; - Cluster clonedCluster = this.clusterNuclei.Find(n => n.name == prefabCluster.name) as Cluster; - if (clonedCluster == null) - continue; - // Now find the neuron in that cloned cluster - int neuronIx = GetNucleusIndex(prefabCluster.nuclei, prefabSynapse.neuron.name); - if (neuronIx < 0) - // Could not find the neuron in the prefab cluster - continue; - if (clonedCluster.clusterNuclei[neuronIx] is not Neuron clonedSender) - // Could not find the neuron in the cloned cluster - continue; + // public override Nucleus Clone(ClusterPrefab parent) { + // Cluster clone = new(this.prefab, parent); - clonedSender.AddReceiver(clonedNeuron, prefabSynapse.weight); - //Debug.Log($"Add synapse {clonedCluster.name}.{clonedSender.name} -> {clonedNeuron.name} [{clonedSender.receivers.Count}]"); - } - else { - Neuron clonedSender = this.clusterNuclei.Find(n => n.name == prefabSynapse.neuron.name) as Neuron; - // Copy the receivers which will also create the synapse - clonedSender.AddReceiver(clonedNeuron, prefabSynapse.weight); - // Debug.Log($"Add synapse {clonedSender.name} -> {clonedNeuron.name}"); - } - } + // foreach (Nucleus nucleus in this.nuclei) { + // if (nucleus is Neuron output) { + // foreach (Nucleus receiver in output.receivers) { + // int ix = GetNucleusIndex(this.nuclei, output); + // Debug.Log($"{output.name} -> {receiver.name}: {ix}"); + // if (ix < 0) + // continue; - } + // if (clone.nuclei[ix] is not Neuron clonedOutput) + // continue; - /// - /// Sort the nuclei in a correct evaluation order - /// - /// - /// - /// - private List TopologicalSort(List nodes) { - Dictionary inDegree = new(); - foreach (Nucleus node in nodes) - inDegree[node] = 0; // Initialize in-degree to zero + // clonedOutput.AddReceiver(receiver); + // } + // } + // } - // Calculate in-degrees - foreach (Nucleus node in nodes) { - if (node is Cluster cluster) { - foreach (Nucleus receiver in cluster.CollectReceivers()) - inDegree[receiver]++; - } - else if (node is Neuron neuron) { - foreach (Nucleus receiver in neuron.receivers) - inDegree[receiver]++; - } - } - - Queue queue = new(); - foreach (Nucleus node in nodes) { - if (inDegree[node] == 0) // Nodes with no dependencies - queue.Enqueue(node); - } - // The queue basically stores all input nuclei? - - List sortedOrder = new(); - while (queue.Count > 0) { - Nucleus current = queue.Dequeue(); - sortedOrder.Add(current); // Process the node - - if (current is Neuron neuron) { - foreach (Nucleus receiver in neuron.receivers) { - inDegree[receiver]--; - if (inDegree[receiver] == 0) // If all dependencies resolved - queue.Enqueue(receiver); - } - } - else if (current is Cluster cluster) { - foreach (Nucleus receiver in cluster.CollectReceivers()) { - inDegree[receiver]--; - if (inDegree[receiver] == 0) // If all dependencies resolved - queue.Enqueue(receiver); - } - } - } - - // Check for cycles in the graph - if (sortedOrder.Count != nodes.Count) - throw new InvalidOperationException("Graph is not a DAG; a cycle exists."); - - return sortedOrder; - } - - public override Nucleus Clone(ClusterPrefab parent) { - Cluster clone = new(this.prefab, parent); - - foreach (Synapse synapse in this.synapses) { - Synapse clonedSynapse = clone.AddSynapse(synapse.neuron); - clonedSynapse.weight = synapse.weight; - } - - foreach (Nucleus nucleus in this.clusterNuclei) { - if (nucleus is Neuron output) { - foreach (Nucleus receiver in output.receivers) { - int ix = GetNucleusIndex(this.clusterNuclei, output); - Debug.Log($"{output.name} -> {receiver.name}: {ix}"); - if (ix < 0) - continue; - - if (clone.clusterNuclei[ix] is not Neuron clonedOutput) - continue; - - clonedOutput.AddReceiver(receiver); - } - } - } - - return clone; - } + // return clone; + // } + /// \copydoc NanoBrain::Nucleus::ShallowCloneTo public override Nucleus ShallowCloneTo(Cluster parent) { // Clusters should not be cloned, but instantiated from the prefab.... Cluster clone = new(this.prefab, parent) { name = this.name, - clusterPrefab = this.clusterPrefab, + parent = this.parent, instanceCount = this.instanceCount, }; // Somehow siblingClusters should be cloned too. Believe I do this in ClonePrefab right now. @@ -416,23 +289,26 @@ namespace NanoBrain { private static void CopyAllExternalReceivers(Cluster sourceCluster, Cluster sibling, ClusterPrefab prefabParent, Cluster clonedParent) { - for (int nucleusIx = 0; nucleusIx < sourceCluster.clusterNuclei.Count; nucleusIx++) { - Nucleus sourceNucleus = sourceCluster.clusterNuclei[nucleusIx]; + for (int nucleusIx = 0; nucleusIx < sourceCluster.nuclei.Count; nucleusIx++) { + Nucleus sourceNucleus = sourceCluster.nuclei[nucleusIx]; if (sourceNucleus is not Neuron sourceNeuron) continue; - if (sibling.clusterNuclei[nucleusIx] is not Neuron clonedNeuron) + if (sibling.nuclei[nucleusIx] is not Neuron clonedNeuron) continue; // copy the receivers (and thus synapses) from the source to the sibling foreach (Nucleus receiver in sourceNeuron.receivers) { - int ix = GetNucleusIndex(clonedParent.clusterNuclei, receiver); - if (ix < 0 || ix >= clonedParent.clusterNuclei.Count) + if (receiver is not Neuron receiverNeuron) + continue; + + int ix = GetNucleusIndex(clonedParent.nuclei, receiver); + if (ix < 0 || ix >= clonedParent.nuclei.Count) continue; // Find the synapse for the weight float weight = 1; - foreach (Synapse synapse in receiver.synapses) { + foreach (Synapse synapse in receiverNeuron.synapses) { // Find the weight for this synapse if (synapse.neuron == sourceNucleus) { weight = synapse.weight; @@ -447,14 +323,12 @@ namespace NanoBrain { } - protected int GetNucleusIndex(Nucleus[] nuclei, Nucleus nucleus) { - for (int i = 0; i < nuclei.Length; i++) { - if (nucleus == nuclei[i]) - return i; - } - return -1; - } - + /// + /// Get the index of a nucleus in a list of nuclei + /// + /// The list of nuclei to search + /// The nucleus to find + /// The index of the nucleus in the list or -1 when it has not been found public static int GetNucleusIndex(List nuclei, Nucleus nucleus) { int i = 0; foreach (Nucleus nucleiElement in nuclei) { @@ -466,6 +340,12 @@ namespace NanoBrain { return -1; } + /// + /// Get the index of a nucleus with the given name in a list of nuclei + /// + /// The list of nuclei to search + /// The name of the nucleus to find + /// The index of the nucleus in the list or -1 when it has not been found public static int GetNucleusIndex(List nuclei, string nucleusName) { int i = 0; foreach (Nucleus nucleiElement in nuclei) { @@ -477,28 +357,39 @@ namespace NanoBrain { return -1; } - #endregion Init #region Cluster Array + /// + /// Increase the number of instances in an multi-cluster + /// + /// /remark Note this does not create the instances. + /// This is only intended to be used for prefabs. public void AddInstance() { this.instanceCount++; } + /// + /// Create an new instance in a multi-cluster + /// + /// The prefab to use to create the new instance + /// /remark This does not change the instanceCount. + /// It should only be used at runtime. public void AddInstance(ClusterPrefab prefab) { // Ensure siblingClusters exists - if (this.siblingClusters == null || this.siblingClusters.Length == 0) - this.siblingClusters = new Cluster[1] { this }; + if (this.instances == null || this.instances.Length == 0) + this.instances = new Cluster[1] { this }; // Prepare the new array - int newLength = this.siblingClusters.Length + 1; + int newLength = this.instances.Length + 1; Cluster[] newSiblings = new Cluster[newLength]; for (int i = 0; i < newSiblings.Length - 1; i++) - newSiblings[i] = this.siblingClusters[i]; + newSiblings[i] = this.instances[i]; - Cluster newCluster = this.Clone(prefab) as Cluster; + //Cluster newCluster = this.Clone(prefab) as Cluster; + Cluster newCluster = new(prefab); string baseName = this.name; int colonPos = baseName.IndexOf(":"); if (colonPos > 0) @@ -508,65 +399,37 @@ namespace NanoBrain { // All siblingClusters need to user this array! foreach (Cluster sibling in newSiblings) - sibling.siblingClusters = newSiblings; + sibling.instances = newSiblings; } + /// + /// Decrease the number of instance in a multi-cluster + /// public void RemoveInstance() { if (instanceCount > 1) instanceCount--; else { - if (this.siblingClusters == null || this.siblingClusters.Length <= 1) + // It is not clear to me why we update the siblingClusters when the + // instanceCount <= 1.... + if (this.instances == null || this.instances.Length <= 1) return; // Prepare the new array - int newLength = this.siblingClusters.Length - 1; + int newLength = this.instances.Length - 1; Cluster[] newClusters = new Cluster[newLength]; for (int i = 0; i < newLength; i++) - newClusters[i] = this.siblingClusters[i]; + newClusters[i] = this.instances[i]; - Neuron.Delete(this.siblingClusters[^1]); - this.siblingClusters = newClusters; + Neuron.Delete(this.instances[^1]); + this.instances = newClusters; } } - public virtual Cluster GetThingCluster() { - Cluster selectedCluster = SelectCluster(); - return selectedCluster; - } - public virtual Cluster GetThingCluster(int thingId, string thingName = null) { - if (thingClusters.TryGetValue(thingId, out Cluster cluster)) - return cluster; - - Cluster selectedCluster = SelectCluster(); - selectedCluster.name = baseName + ": " + thingName; - thingClusters[thingId] = selectedCluster; - return selectedCluster; - } - - private Cluster SelectCluster() { - if (this.siblingClusters == null) - return this; - - // Find a sleeping cluster - foreach (Cluster cluster in this.siblingClusters) { - if (cluster.defaultOutput.isSleeping) { - RemoveThingCluster(cluster); - return cluster; - } - } - - // Otherwise find longest unused cluster - Cluster unusedCluster = this.siblingClusters[0]; - for (int ix = 1; ix < this.siblingClusters.Length; ix++) { - if (this.siblingClusters[ix].defaultOutput.lastUpdate < unusedCluster.defaultOutput.lastUpdate) - unusedCluster = this.siblingClusters[ix]; - } - - RemoveThingCluster(unusedCluster); - return unusedCluster; - } - + /// + /// Remove a mapping from a thing to a cluster such that it becomes available for new things + /// + /// The multi-cluster instance which not no longer be mapped private void RemoveThingCluster(Cluster cluster) { List keysToRemove = new(); foreach (KeyValuePair kvp in thingClusters) { @@ -578,60 +441,68 @@ namespace NanoBrain { thingClusters.Remove(thingId); } - public bool SameSiblingsAs(Cluster[] otherSiblingClusters) { - if (this.siblingClusters == null) - return false; - for (int ix = 0; ix < this.siblingClusters.Length; ix++) { - if (this.siblingClusters[ix] != otherSiblingClusters[ix]) - return false; - } - return true; - } + // public bool SameSiblingsAs(Cluster[] otherSiblingClusters) { + // if (this.siblingClusters == null) + // return false; + // for (int ix = 0; ix < this.siblingClusters.Length; ix++) { + // if (this.siblingClusters[ix] != otherSiblingClusters[ix]) + // return false; + // } + // return true; + // } - public void AddArrayReceiver(Nucleus receiverToAdd, float weight = 1) { - this.defaultOutput.AddReceiver(receiverToAdd, weight); - // foreach (Cluster cluster in this.siblingClusters) { - // cluster.defaultOutput.AddReceiver(receiverToAdd, weight); - // } + // public void AddArrayReceiver(Nucleus receiverToAdd, float weight = 1) { + // this.defaultOutput.AddReceiver(receiverToAdd, weight); + // // foreach (Cluster cluster in this.siblingClusters) { + // // cluster.defaultOutput.AddReceiver(receiverToAdd, weight); + // // } - } + // } #endregion ClusterArray - public List _inputs = null; - public virtual List inputs { + + // private List _inputs = null; + // public virtual List inputs { + // get { + // if (this._inputs == null) { + // this._inputs = new(); + // foreach (Nucleus nucleus in this.nuclei) { + // if (nucleus is not Neuron neuron) + // continue; + + // // inputs have no synapses + // if (neuron.synapses.Count == 0) + // this._inputs.Add(nucleus); + // } + // RefreshComputeOrders(); + // } + // return this._inputs; + // } + // } + + /// + /// This gives the order in which nuclei should be computed when a nucleus is updated + /// + private Dictionary> _computeOrders; + /// + /// This gives the order in which nuclei should be computed when a nucleus is updated + /// + public Dictionary> computeOrders { get { - if (this._inputs == null) { - this._inputs = new(); - foreach (Nucleus nucleus in this.clusterNuclei) { - // inputs have no synapses - if (nucleus.synapses.Count == 0) - this._inputs.Add(nucleus); - } - ComputeOrders(); + if (_computeOrders == null || _computeOrders.Count == 0) { + _computeOrders = new(); + foreach (Nucleus nucleus in this.nuclei) + _computeOrders[nucleus] = TopologicalSort2(nucleus); } - return this._inputs; + return _computeOrders; } } - - public Dictionary> computeOrders = new(); - private void ComputeOrders() { - foreach (Nucleus nucleus in this.clusterNuclei) { - // if (nucleus is Cluster cluster) { - // List synapses = this.CollectSynapsesTo(cluster); - // foreach (Synapse synapse in synapses) { - // computeOrders[synapse.neuron] = TopologicalSort2(synapse.neuron); - // Debug.Log($"{this.baseName}: Order for {cluster.baseName}.{synapse.neuron.name}"); - // } - // // List receivers = cluster.CollectReceivers(); - // // foreach (Nucleus receiver in receivers) - // // computeOrders[receiver] = TopologicalSort2(receiver); - // } - // else { - computeOrders[nucleus] = TopologicalSort2(nucleus); - Debug.Log($"{this.baseName} Order for {nucleus.name}"); - // } - } + /// + /// Refresh the order in which neurons should be computed + /// + public void RefreshComputeOrders() { + this._computeOrders = null; } private List TopologicalSort2(Nucleus startNode) { @@ -696,19 +567,31 @@ namespace NanoBrain { return sortedOrder; } + /// + /// The first nucleus in a cluster is the default output + /// public virtual Neuron defaultOutput {//=> this.nuclei[0] as Nucleus; get { - if (this.clusterNuclei.Count > 0) - return this.clusterNuclei[0] as Neuron; + if (this.nuclei.Count > 0) + return this.nuclei[0] as Neuron; return null; } } + + /// + /// The neurons without outgoing connections + /// + /// These neurons can potentially be connected to neurons in other clusters protected List _outputs = null; + /// + /// The neurons without outgoing connections + /// + /// These neurons can potentially be connected to neurons in other clusters public List outputs { get { - if (this._outputs == null) { + if (this._outputs == null || this._outputs.Count == 0) { this._outputs = new(); - foreach (Nucleus nucleus in this.clusterNuclei) { + foreach (Nucleus nucleus in this.nuclei) { if (nucleus is Neuron neuron && neuron.receivers.Count == 0) this._outputs.Add(neuron); } @@ -716,12 +599,21 @@ namespace NanoBrain { return this._outputs; } } + /// + /// Reset the list of outputs such that they will be re-determined + /// public void RefreshOutputs() { this._outputs = null; } + /// + /// Try to find a nucleus in this cluster + /// + /// The name of the nucleus to find + /// The found nucleus or null if it is not found + /// True when the nucleus is found, false otherwise public bool TryGetNucleus(string nucleusName, out Nucleus foundNucleus) { - foreach (Nucleus receptor in this.clusterNuclei) { + foreach (Nucleus receptor in this.nuclei) { if (receptor is Nucleus nucleus) if (nucleus.name == nucleusName) { foundNucleus = nucleus; @@ -732,12 +624,17 @@ namespace NanoBrain { return false; } + /// + /// Get a nucleus in this cluster + /// + /// The name of the nucleus to find + /// The found nucleus or null when it is not found public Nucleus GetNucleus(string nucleusName) { int dotPosition = nucleusName.IndexOf('.'); if (dotPosition >= 0) { string clusterName = nucleusName[..dotPosition]; string clusterName0 = clusterName + ": 0"; - foreach (Nucleus nucleus in this.clusterNuclei) { + foreach (Nucleus nucleus in this.nuclei) { if (nucleus is Cluster cluster) { if (cluster.name == clusterName || cluster.name == clusterName0) { string subNucleusName = nucleusName[(dotPosition + 1)..]; @@ -749,9 +646,9 @@ namespace NanoBrain { } else { string nucleusName0 = nucleusName + ": 0"; - foreach (Nucleus nucleus in this.clusterNuclei) { - if (nucleus is Cluster) { //IReceptor receptor) { - if (nucleus.name == nucleusName | nucleus.name == nucleusName0) + foreach (Nucleus nucleus in this.nuclei) { + if (nucleus is Cluster) { + if (nucleus.name == nucleusName || nucleus.name == nucleusName0) return nucleus; } else if (nucleus.name == nucleusName) @@ -761,17 +658,89 @@ namespace NanoBrain { } } + /// + /// Get a neuron in this cluster + /// + /// The name of the neuron to find + /// The found neuron or null when it is not found + public Neuron GetNeuron(string neuronName) { + foreach (Nucleus nucleus in this.nuclei) { + if (nucleus is Neuron neuron && neuron.name == neuronName) + return neuron; + } + return null; + } + + /// + /// Get a neuron in an instance of a multi-cluster + /// + /// The id of the thing mapped to the cluster instance + /// The name of the neuron to find + /// The name of the thing mapped to the cluster instance + /// The found neuron or null when it is not found + /// The cluster instance mapped to the thing will be neuron.parent if a neuron is found. + public Neuron GetNeuron(int thingId, string neuronName, string thingName = null) { + if (this.instances == null || this.instances.Length <= 1) + return this.GetNeuron(neuronName); + + // See if we are already using a cluster for thingId + if (thingClusters.TryGetValue(thingId, out Cluster cluster)) + return cluster.GetNeuron(neuronName); + + // Find the cluster with the lowest value neuron + Neuron lowestNeuron = null; + foreach (Cluster sibling in this.instances) { + Neuron neuron = sibling.GetNeuron(neuronName); + if (lowestNeuron == null || neuron.outputMagnitude < lowestNeuron.outputMagnitude) + lowestNeuron = neuron; + } + Cluster selectedCluster = lowestNeuron.parent; + RemoveThingCluster(selectedCluster); + selectedCluster.name = baseName + ": " + thingName; + thingClusters[thingId] = selectedCluster; + return lowestNeuron; + /* + // Find a sleeping cluster + // foreach (Cluster cluster in this.siblingClusters) { + // if (cluster.defaultOutput.isSleeping) { + // RemoveThingCluster(cluster); + // return cluster; + // } + // } + + // Find longest unused cluster + // Note this uses the default output... + Cluster unusedCluster = this.siblingClusters[0]; + for (int ix = 1; ix < this.siblingClusters.Length; ix++) { + if (this.siblingClusters[ix].defaultOutput.lastUpdate < unusedCluster.defaultOutput.lastUpdate) + unusedCluster = this.siblingClusters[ix]; + } + + RemoveThingCluster(unusedCluster); + //return unusedCluster; + + Cluster cluster = GetThingCluster(thingId, thingName); + Neuron neuron = cluster?.GetNeuron(neuronName); + return neuron; + */ + } + + /// + /// Delete a nucleus from this clsuter + /// + /// The nucleus to delete + /// True if a nucleus was deleted, false if the nucleus could not be found public bool DeleteNucleus(Nucleus nucleus) { - if (this.clusterNuclei.Contains(nucleus) == false) { + if (this.nuclei.Contains(nucleus) == false) { // Try to find the nucleus by name if (TryGetNucleus(nucleus.name, out nucleus) == false) return false; } Neuron.Delete(nucleus); - int nucleusIx = this.clusterNuclei.IndexOf(nucleus); - this.clusterNuclei.Remove(nucleus); - this.prefab.nuclei.RemoveAt(nucleusIx); + //int nucleusIx = this.nuclei.IndexOf(nucleus); + this.nuclei.Remove(nucleus); + //this.prefab.cluster.nuclei.RemoveAt(nucleusIx); RefreshOutputs(); return true; @@ -779,9 +748,14 @@ namespace NanoBrain { #region Receivers + /// + /// Collect all receiving nuclei of signals from this cluster + /// + /// Ensure that a receiver is only listed once in the result + /// The list of receivers public virtual List CollectReceivers(bool removeDuplicates = false) { List receivers = new(); - foreach (Nucleus outputNucleus in this.clusterNuclei) { + foreach (Nucleus outputNucleus in this.nuclei) { if (outputNucleus is not Neuron output) continue; @@ -789,7 +763,7 @@ namespace NanoBrain { foreach (Nucleus receiver in output.receivers) { // Debug.Log($"output {receiver.name}"); // Only add receivers outside this cluster - if (receiver.clusterPrefab != this.prefab) { + if (receiver.parent.prefab != this.prefab) { if (removeDuplicates == false || receivers.Contains(receiver) == false) // Debug.Log($" YES"); receivers.Add(receiver); @@ -799,28 +773,38 @@ namespace NanoBrain { return receivers; } - public List<(Neuron, Nucleus)> CollectConnections() { - List<(Neuron, Nucleus)> connections = new(); + /// + /// Collect all connections to receivers of signals from this cluster + /// + /// A list of pairs of the sending neuron in this cluster and the matching receiving nucleus + // public List<(Neuron, Nucleus)> CollectConnections() { + // List<(Neuron, Nucleus)> connections = new(); - foreach (Nucleus outputNucleus in this.clusterNuclei) { - if (outputNucleus is not Neuron output) - continue; + // foreach (Nucleus outputNucleus in this.nuclei) { + // if (outputNucleus is not Neuron output) + // continue; - foreach (Nucleus receiver in output.receivers) { - // Only add receivers outside this cluster - if (receiver.clusterPrefab != this.prefab) - connections.Add((output, receiver)); - } - } - return connections; - } + // foreach (Nucleus receiver in output.receivers) { + // // Only add receivers outside this cluster + // if (receiver.parent.prefab != this.prefab) + // connections.Add((output, receiver)); + // } + // } + // return connections; + // } + + /// + /// Collect all synapses of senders in another cluster of signals to this cluster + /// + /// The other cluster with sending neurons + /// A list of synapses to the neurons in the other clusters public List CollectSynapsesTo(Cluster otherCluster) { List collectedSynapses = new(); - foreach (Nucleus nucleus in this.clusterNuclei) { + foreach (Nucleus nucleus in this.nuclei) { if (nucleus is not Neuron neuron) continue; - foreach (Synapse synapse in nucleus.synapses) { + foreach (Synapse synapse in neuron.synapses) { if (synapse.neuron.parent == otherCluster) collectedSynapses.Add(synapse); } @@ -828,36 +812,43 @@ namespace NanoBrain { return collectedSynapses; } - public void MoveReceivers(Cluster newCluster) { - Debug.Log($"Move receivers for {this.name} to {newCluster.name}"); - foreach (Nucleus outputNucleus in this.clusterNuclei) { - if (outputNucleus is not Neuron output) - continue; - // Find the existing output in the new cluster - if (newCluster.GetNucleus(output.name) is not Neuron newOutput) { - Debug.LogWarning($"Could not find output {this.name}.{output.name} in {newCluster.name}"); - continue; - } - Debug.Log($"Check {this.name}.{output.name} receivers"); - Nucleus[] receivers = output.receivers.ToArray(); - foreach (Nucleus receiver in receivers) { - if (receiver.clusterPrefab != this.prefab) { - // Replace synapse with new synapse - // to the new cluster - Debug.Log($"move {receiver.name} from {this.name}.{output.name} to {newCluster.name}.{newOutput.name}"); - Synapse synapse = receiver.GetSynapse(output); - newOutput.AddReceiver(receiver, synapse.weight); - output.RemoveReceiver(receiver); - } - } - } - } + // public void MoveReceivers(Cluster newCluster) { + // Debug.Log($"Move receivers for {this.name} to {newCluster.name}"); + // foreach (Nucleus outputNucleus in this.nuclei) { + // if (outputNucleus is not Neuron output) + // continue; + + // // Find the existing output in the new cluster + // if (newCluster.GetNucleus(output.name) is not Neuron newOutput) { + // Debug.LogWarning($"Could not find output {this.name}.{output.name} in {newCluster.name}"); + // continue; + // } + // Debug.Log($"Check {this.name}.{output.name} receivers"); + // Nucleus[] receivers = output.receivers.ToArray(); + // foreach (Nucleus receiver in receivers) { + // if (receiver.parent.prefab != this.prefab) { + // // Replace synapse with new synapse + // // to the new cluster + // Debug.Log($"move {receiver.name} from {this.name}.{output.name} to {newCluster.name}.{newOutput.name}"); + // if (receiver is not Neuron receiverNeuron) + // continue; + // Synapse synapse = receiverNeuron.GetSynapse(output); + // newOutput.AddReceiver(receiver, synapse.weight); + // output.RemoveReceiver(receiver); + // } + // } + // } + // } #endregion Receivers #region Update + /// + /// Update the state of the nucleus and all nuclei receiving from it + /// + /// The nucleus to start updating public void UpdateFromNucleus(Nucleus startNucleus) { // no bias+synapse input state calculation for now... @@ -867,41 +858,50 @@ namespace NanoBrain { } List computeOrder = this.computeOrders[startNucleus]; - //if (startNucleus.trace) - Debug.Log($"Update from {startNucleus.name}"); foreach (Nucleus nucleus in computeOrder) { if (nucleus is not Cluster) { nucleus.UpdateStateIsolated(); - //if (startNucleus.trace && nucleus is Neuron neuron) - Debug.Log($" {nucleus.name}"); if (nucleus is Neuron neuron) { foreach (Nucleus receiver in neuron.receivers) { if (receiver.parent != this) { - Debug.Log($" External: {receiver.parent.name}.{receiver.name}"); + //Debug.Log($" External: {receiver.parent.name}.{receiver.name}"); receiver.parent.UpdateFromNucleus(receiver); } } } } } - - // continue in parent - //this.parent?.UpdateFromNucleus(this); - - UpdateNuclei(); + //UpdateNuclei(); } + /// \copydoc NanoBrain::Nucleus::UpdateStateIsolated public override void UpdateStateIsolated() { throw new Exception("Cluster should not be updated!"); } - public override void UpdateNuclei() { - foreach (Nucleus nucleus in this.clusterNuclei) - nucleus.UpdateNuclei(); - } + // Don't think this does anything anymore... + // public override void UpdateNuclei() { + // foreach (Nucleus nucleus in this.nuclei) + // nucleus.UpdateNuclei(); + // } #endregion Update + /// + /// Recalculate derived properties + /// + /// This can be used to recalculate derived properties after the set of nuclei has been changed + public void Refresh() { + // This should not be needed, but somehow somewhere the parent is changed... + foreach (Nucleus nucleus in this.nuclei) { + // if (nucleus is not Neuron neuron) + // continue; + nucleus.parent = this; + } + RefreshOutputs(); + RefreshComputeOrders(); + } + } } \ No newline at end of file diff --git a/Runtime/Scripts/Core/Cluster.cs.meta b/Runtime/Scripts/Core/Cluster.cs.meta index a10caff..c77fea0 100644 --- a/Runtime/Scripts/Core/Cluster.cs.meta +++ b/Runtime/Scripts/Core/Cluster.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: f13cdc4a175a9f379a00317ae68d8bea \ No newline at end of file +guid: f13cdc4a175a9f379a00317ae68d8bea +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/Core/MemoryCell.cs b/Runtime/Scripts/Core/MemoryCell.cs index 7f9fe6e..e959e16 100644 --- a/Runtime/Scripts/Core/MemoryCell.cs +++ b/Runtime/Scripts/Core/MemoryCell.cs @@ -12,7 +12,7 @@ namespace NanoBrain { [Serializable] public class MemoryCell : Neuron { - public MemoryCell(ClusterPrefab cluster, string name) : base(cluster, name) { } + // public MemoryCell(ClusterPrefab cluster, string name) : base(cluster, name) { } public MemoryCell(Cluster parent, string name) : base(parent, name) { } public bool staticMemory = false; diff --git a/Runtime/Scripts/Core/MemoryCell.cs.meta b/Runtime/Scripts/Core/MemoryCell.cs.meta index ef74aba..24dc14d 100644 --- a/Runtime/Scripts/Core/MemoryCell.cs.meta +++ b/Runtime/Scripts/Core/MemoryCell.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 29633aa3fe5cd9dcc8d886051f45d4d8 \ No newline at end of file +guid: 29633aa3fe5cd9dcc8d886051f45d4d8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/Core/Neuron.cs b/Runtime/Scripts/Core/Neuron.cs index a4bbed8..a4927d8 100644 --- a/Runtime/Scripts/Core/Neuron.cs +++ b/Runtime/Scripts/Core/Neuron.cs @@ -23,26 +23,91 @@ namespace NanoBrain { public Neuron(Cluster parent, string name) { this.parent = parent; this.name = name; - this.parent?.clusterNuclei.Add(this); + this.parent?.nuclei.Add(this); } /// /// Create a new Neuron in a Cluster Prefab /// /// The Cluster Preafb in which the new Neuron should be created /// The name of the new Neuron - public Neuron(ClusterPrefab prefab, string name) { - this.clusterPrefab = prefab; - this.name = name; - if (this.clusterPrefab != null) { - this.clusterPrefab.nuclei.Add(this); - this.clusterPrefab.RefreshOutputs(); - } - else - Debug.LogError("No prefab when adding neuron to prefab"); - } + // public Neuron(ClusterPrefab prefab, string name) { + // this.clusterPrefab = prefab; + // this.name = name; + // if (this.clusterPrefab != null) { + // this.clusterPrefab.cluster.nuclei.Add(this); + // this.clusterPrefab.cluster.RefreshOutputs(); + // } + // else + // Debug.LogError("No prefab when adding neuron to prefab"); + // } #region Serialization + /// + /// The bias + /// + /// The bias which a value which is always added to the combined value of the neuron + /// It does not have a synapse and therefore no weight of source nucleus + public Vector3 bias = Vector3.zero; + + #region Synapses + + [SerializeField] + private List _synapses = new(); + /// + /// The synapses of the nucleus + /// + public List synapses => _synapses; + + /// + /// Add a new synapse to this nuclues + /// + /// The nucleus from which the signals may originate + /// The weight applied to the input. Default value = 1 + /// The created Synapse + /// This will add a new input to this nucleus with the given weight. + public Synapse AddSynapse(Neuron sendingNucleus, float weight = 1) { + Synapse synapse = new(sendingNucleus, weight); + this.synapses.Add(synapse); + return synapse; + } + + // public Synapse AddSynapse(ClusterPrefab clusterPrefab, string neuronName, float weight = 1) { + + // } + + /// + /// Find a synapse + /// + /// The sender of the input to the Synapse + /// The found Synapse or null when the sender has no synapse to this nucleus. + public Synapse GetSynapse(Nucleus sender) { + foreach (Synapse synapse in this.synapses) + if (synapse.neuron == sender) + return synapse; + return null; + } + + /// + /// Remove a synapse from a Nucleus + /// + /// Remote the synapse connecting to this Nucleus + public void RemoveSynapse(Nucleus sendingNucleus) { + this.synapses.RemoveAll(synapse => synapse.neuron == sendingNucleus); + } + + #endregion Synapses + + /// + /// Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus + /// + /// + public virtual void SetBias(Vector3 inputValue) { + this.bias = inputValue; + this.lastUpdate = Time.time; + this.parent?.UpdateFromNucleus(this); + } + /// /// The type of combinators /// @@ -52,8 +117,6 @@ namespace NanoBrain { Sum, /// Multiply the weighted values Product, - /// Take the maximum of all the weighted values - Max, } /// /// The type of combinator used for this Neuron @@ -211,16 +274,11 @@ namespace NanoBrain { public float outputSqrMagnitude => _outputValue.sqrMagnitude; #endif - public bool isFiring { - get { - SleepCheck(); - return this.outputMagnitude > 0.5f; - } - } + public bool isFiring => this.outputMagnitude > 0.5f; public Action WhenFiring; - - public virtual bool isSleeping => Time.time - this.lastUpdate > this.timeToSleep; //this.outputMagnitude == 0; + public bool persistOutput = false; + public virtual bool isSleeping => !persistOutput && (Time.time - this.lastUpdate > this.timeToSleep); public void SleepCheck() { if (this.isSleeping) { #if UNITY_MATHEMATICS @@ -231,34 +289,41 @@ namespace NanoBrain { } } - [NonSerialized] + /// + /// Toggle for printing debugging trace data + /// + //public bool trace = false; + + //[NonSerialized] public float lastUpdate = 0; public readonly float timeToSleep = 1f; /// \copydoc NanoBrain::Nucleus::ShallowCloneTo public override Nucleus ShallowCloneTo(Cluster newParent) { - Neuron clone = new(newParent, this.name); + Neuron clone = new(newParent, this.name) { + // prefabNucleus = this + }; CloneFields(clone); return clone; } - /// \copydoc NanoBrain::Nucleus::Clone - public override Nucleus Clone(ClusterPrefab prefab) { - Neuron clone = new(prefab, this.name); - CloneFields(clone); - foreach (Synapse synapse in this.synapses) { - Synapse clonedSynapse = clone.AddSynapse(synapse.neuron); - clonedSynapse.weight = synapse.weight; - } - foreach (Nucleus receiver in this.receivers) { - clone.AddReceiver(receiver); - } - return clone; - } + // \copydoc NanoBrain::Nucleus::Clone + // public override Nucleus Clone(ClusterPrefab prefab) { + // Neuron clone = new(prefab.cluster, this.name); + // CloneFields(clone); + // foreach (Synapse synapse in this.synapses) { + // Synapse clonedSynapse = clone.AddSynapse(synapse.neuron); + // clonedSynapse.weight = synapse.weight; + // } + // foreach (Nucleus receiver in this.receivers) { + // clone.AddReceiver(receiver); + // } + // return clone; + // } protected virtual void CloneFields(Neuron clone) { - clone.clusterPrefab = this.clusterPrefab; clone.bias = this.bias; + clone.persistOutput = this.persistOutput; clone.combinator = this.combinator; clone.curve = this.curve; clone.curvePreset = this.curvePreset; @@ -268,8 +333,8 @@ namespace NanoBrain { public static void Delete(Nucleus nucleus) { if (nucleus == null) return; - if (nucleus.synapses != null) { - foreach (Synapse synapse in nucleus.synapses) { + if (nucleus is Neuron neuron) { + foreach (Synapse synapse in neuron.synapses) { if (synapse.neuron is Neuron synapse_nucleus) { if (synapse_nucleus.receivers.Count > 1) { // there is another nucleus feeding into this input nucleus @@ -281,45 +346,43 @@ namespace NanoBrain { } } } - } - if (nucleus is Neuron neuron) { foreach (Nucleus receiver in neuron.receivers) { - if (receiver != null && receiver.synapses != null) - receiver.synapses.RemoveAll(s => s.neuron == nucleus); + if (receiver is not Neuron receiverNeuron) + continue; + if (receiver != null && receiverNeuron.synapses != null) + receiverNeuron.synapses.RemoveAll(s => s.neuron == nucleus); } } else if (nucleus is Cluster cluster) { // remove all receivers for this cluster - foreach (Nucleus clusterNucleus in cluster.clusterNuclei) { + foreach (Nucleus clusterNucleus in cluster.nuclei) { if (clusterNucleus is Neuron output) { foreach (Nucleus receiver in output.receivers) { - receiver.synapses.RemoveAll(s => s.neuron == output); + if (receiver is not Neuron receiverNeuron) + continue; + receiverNeuron.synapses.RemoveAll(s => s.neuron == output); } } } } - if (nucleus.clusterPrefab != null) { - nucleus.clusterPrefab.nuclei.RemoveAll(n => n == nucleus); - nucleus.clusterPrefab.RefreshOutputs(); - nucleus.clusterPrefab.GarbageCollection(); + if (nucleus.parent.prefab != null) { + nucleus.parent.prefab.cluster.nuclei.RemoveAll(n => n == nucleus); + nucleus.parent.prefab.cluster.RefreshOutputs(); + nucleus.parent.prefab.GarbageCollection(); } } public override void UpdateStateIsolated() { - CheckSleepingSynapses(); var result = Combinator(); - this.outputValue = Activator(result); + this.outputValue = ApplyActivator(result); this.lastUpdate = Time.time; } protected void CheckSleepingSynapses() { - foreach (Synapse synapse in this.synapses) { - if (synapse.isSleeping) { - synapse.neuron.outputValue = Vector3.zero; - } - } + foreach (Synapse synapse in this.synapses) + synapse.neuron.SleepCheck(); } #region Combinator @@ -329,42 +392,27 @@ namespace NanoBrain { protected Func Combinator => combinator switch { CombinatorType.Sum => CombinatorSum, CombinatorType.Product => CombinatorProduct, - CombinatorType.Max => CombinatorMax, _ => CombinatorSum }; public float3 CombinatorSum() { float3 sum = this.bias; - foreach (Synapse synapse in this.synapses) + foreach (Synapse synapse in this.synapses) { + synapse.neuron.SleepCheck(); sum += synapse.weight * synapse.neuron.outputValue; + } return sum; } public float3 CombinatorProduct() { float3 product = this.bias; foreach (Synapse synapse in this.synapses) { + synapse.neuron.SleepCheck(); product *= synapse.weight * synapse.neuron.outputValue; } return product; } - public float3 CombinatorMax() { - float3 max = this.bias; - float maxLength = length(max); - - //Applying the weight factors - foreach (Synapse synapse in this.synapses) { - float3 input = synapse.weight * synapse.neuron.outputValue; - - float inputLength = length(input); - if (inputLength > maxLength) { - max = input; - maxLength = inputLength; - } - } - return max; - } - #else protected Func Combinator => combinator switch { @@ -413,6 +461,20 @@ namespace NanoBrain { #if UNITY_MATHEMATICS + // This does not allocate memory and seems faster than the solution below + float3 ApplyActivator(float3 x) { + switch (curvePreset) { + case ActivationType.Linear: return ActivatorLinear(x); + case ActivationType.Sqrt: return ActivatorSqrt(x); + case ActivationType.Power: return ActivatorPower(x); + case ActivationType.Reciprocal: return ActivatorReciprocal(x); + case ActivationType.Tanh: return ActivatorTanh(x); + case ActivationType.Binary: return ActivatorBinary(x); + case ActivationType.Normalized: return ActivatorNormalized(x); + default: return ActivatorCustom(x); + } + } + public Func Activator => this.curvePreset switch { ActivationType.Linear => ActivatorLinear, ActivationType.Sqrt => ActivatorSqrt, @@ -524,25 +586,40 @@ namespace NanoBrain { } public virtual void AddReceiver(Nucleus receiverToAdd, float weight = 1) { - this._receivers.Add(receiverToAdd); - receiverToAdd.AddSynapse(this, weight); + if (receiverToAdd is not Neuron receiverNeuron) + return; + this._receivers.Add(receiverNeuron); + receiverNeuron.AddSynapse(this, weight); //Debug.Log($"Add synapse {this.clusterPrefab.name}.{this.name} -> {receiverToAdd.name} --- [{this.receivers.Count}]"); } public virtual void RemoveReceiver(Nucleus receiverToRemove) { - this._receivers.RemoveAll(receiver => receiver == receiverToRemove); - receiverToRemove.synapses.RemoveAll(synapse => synapse.neuron == this); + if (receiverToRemove is not Neuron receiverNeuron) + return; + this._receivers.RemoveAll(receiver => receiver == receiverNeuron); + receiverNeuron.synapses.RemoveAll(synapse => synapse.neuron == this); + + // Nucleus prefabReceiver = receiverToRemove.prefabNucleus; + // if (this.prefabNucleus is Neuron prefabNeuron && prefabReceiver != null) { + // prefabNeuron.receivers.RemoveAll(receiver => receiver == prefabReceiver); + // prefabReceiver.synapses.RemoveAll(synapse => synapse.neuron == prefabNeuron); + // } } #endregion Receivers - public override void ProcessStimulus(Vector3 inputValue) { - ; + /// + /// Process an external stimulus + /// + /// The value of the stimulus + /// The id of the thing causing the stimulus + /// The name of the thing causing the stimulus + public virtual void ProcessStimulus(Vector3 inputValue) { this.lastUpdate = Time.time; this.bias = inputValue; - this.parent.UpdateFromNucleus(this); + this.parent?.UpdateFromNucleus(this); } } diff --git a/Runtime/Scripts/Core/Neuron.cs.meta b/Runtime/Scripts/Core/Neuron.cs.meta index e520090..37266c0 100644 --- a/Runtime/Scripts/Core/Neuron.cs.meta +++ b/Runtime/Scripts/Core/Neuron.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 750748f3f0e7d472fbf88ab02987074c \ No newline at end of file +guid: 750748f3f0e7d472fbf88ab02987074c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/Core/Nucleus.cs b/Runtime/Scripts/Core/Nucleus.cs index 314fee3..4864165 100644 --- a/Runtime/Scripts/Core/Nucleus.cs +++ b/Runtime/Scripts/Core/Nucleus.cs @@ -17,11 +17,15 @@ public abstract class Nucleus { /// public string name; + // [NonSerialized] + // public Nucleus prefabNucleus; + /// /// The cluster prefab in which the nucleus is located /// - [SerializeReference] - public ClusterPrefab clusterPrefab; + // [SerializeReference] + // public ClusterPrefab clusterPrefab; + /// /// The cluster instance in which the nucleus is located /// @@ -31,7 +35,7 @@ public abstract class Nucleus { /// /// Toggle for printing debugging trace data /// - public bool trace = false; + //public bool trace = false; /// /// Function to make a partial clone of this nucleus @@ -44,7 +48,7 @@ public abstract class Nucleus { /// /// /// - public abstract Nucleus Clone(ClusterPrefab prefab); + // public abstract Nucleus Clone(ClusterPrefab prefab); /// /// The types of Nucleus @@ -59,62 +63,62 @@ public abstract class Nucleus { //ClusterArray, } - public virtual void Initialize() {} + // public virtual void Initialize() {} - #region Synapses + // #region Synapses - /// - /// The bias of the nucleus - /// - /// The bias which a value which is always added to the combined value of the nucleus - /// It does not have a synapse and therefore no weight of source nucleus - public Vector3 bias = Vector3.zero; + // /// + // /// The bias of the nucleus + // /// + // /// The bias which a value which is always added to the combined value of the nucleus + // /// It does not have a synapse and therefore no weight of source nucleus + // //public Vector3 bias = Vector3.zero; - [SerializeField] - private List _synapses = new(); - /// - /// The synapses of the nucleus - /// - public List synapses => _synapses; + // [SerializeField] + // private List _synapses = new(); + // /// + // /// The synapses of the nucleus + // /// + // public List synapses => _synapses; - /// - /// Add a new synapse to this nuclues - /// - /// The nucleus from which the signals may originate - /// The weight applied to the input. Default value = 1 - /// The created Synapse - /// This will add a new input to this nucleus with the given weight. - public Synapse AddSynapse(Neuron sendingNucleus, float weight = 1) { - Synapse synapse = new(sendingNucleus, weight); - this.synapses.Add(synapse); - return synapse; - } + // /// + // /// Add a new synapse to this nuclues + // /// + // /// The nucleus from which the signals may originate + // /// The weight applied to the input. Default value = 1 + // /// The created Synapse + // /// This will add a new input to this nucleus with the given weight. + // public Synapse AddSynapse(Neuron sendingNucleus, float weight = 1) { + // Synapse synapse = new(sendingNucleus, weight); + // this.synapses.Add(synapse); + // return synapse; + // } - // public Synapse AddSynapse(ClusterPrefab clusterPrefab, string neuronName, float weight = 1) { + // // public Synapse AddSynapse(ClusterPrefab clusterPrefab, string neuronName, float weight = 1) { - // } + // // } - /// - /// Find a synapse - /// - /// The sender of the input to the Synapse - /// The found Synapse or null when the sender has no synapse to this nucleus. - public Synapse GetSynapse(Nucleus sender) { - foreach (Synapse synapse in this.synapses) - if (synapse.neuron == sender) - return synapse; - return null; - } + // /// + // /// Find a synapse + // /// + // /// The sender of the input to the Synapse + // /// The found Synapse or null when the sender has no synapse to this nucleus. + // public Synapse GetSynapse(Nucleus sender) { + // foreach (Synapse synapse in this.synapses) + // if (synapse.neuron == sender) + // return synapse; + // return null; + // } - /// - /// Remove a synapse from a Nucleus - /// - /// Remote the synapse connecting to this Nucleus - public void RemoveSynapse(Nucleus sendingNucleus) { - this.synapses.RemoveAll(synapse => synapse.neuron == sendingNucleus); - } + // /// + // /// Remove a synapse from a Nucleus + // /// + // /// Remote the synapse connecting to this Nucleus + // public void RemoveSynapse(Nucleus sendingNucleus) { + // this.synapses.RemoveAll(synapse => synapse.neuron == sendingNucleus); + // } - #endregion Synapses + // #endregion Synapses #region Update @@ -129,23 +133,14 @@ public abstract class Nucleus { public virtual void UpdateNuclei() { } - /// - /// Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus - /// - /// - public virtual void SetBias(Vector3 inputValue) { - this.bias = inputValue; - this.parent.UpdateFromNucleus(this); - } - - /// - /// Process an external stimulus - /// - /// The value of the stimulus - /// The id of the thing causing the stimulus - /// The name of the thing causing the stimulus - public virtual void ProcessStimulus(Vector3 inputValue) { //, int thingId = 0, string thingName = "") { - } + // /// + // /// Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus + // /// + // /// + // public virtual void SetBias(Vector3 inputValue) { + // this.bias = inputValue; + // this.parent.UpdateFromNucleus(this); + // } #endregion Update diff --git a/Runtime/Scripts/Core/Nucleus.cs.meta b/Runtime/Scripts/Core/Nucleus.cs.meta index 08b3cf8..0868066 100644 --- a/Runtime/Scripts/Core/Nucleus.cs.meta +++ b/Runtime/Scripts/Core/Nucleus.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 4310eea6ab77628b085387a226c1c386 \ No newline at end of file +guid: 4310eea6ab77628b085387a226c1c386 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/Core/Synapse.cs.meta b/Runtime/Scripts/Core/Synapse.cs.meta index e62612c..7c45e30 100644 --- a/Runtime/Scripts/Core/Synapse.cs.meta +++ b/Runtime/Scripts/Core/Synapse.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 334a58eafccd60cbdb32f719e9e861c6 \ No newline at end of file +guid: 334a58eafccd60cbdb32f719e9e861c6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs b/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs index 2920733..c00f234 100644 --- a/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs +++ b/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs @@ -8,134 +8,146 @@ namespace NanoBrain { /// [CreateAssetMenu(menuName = "Passer/Cluster")] public class ClusterPrefab : ScriptableObject { - /// The nuclei in this cluster - [SerializeReference] - // This list should not include any clusters... - public List nuclei = new(); - /// - /// The output of this cluster - /// - /// This only returens the first(default) nucleus. Use outputs[0] instead - public virtual Nucleus output => this.nuclei[0] as Nucleus; + public Cluster cluster; + /* + /// The nuclei in this cluster + [SerializeReference] + // This list should not include any clusters... + public List nuclei = new(); - /// - /// The nuclei in this cluster which are meant for receiving signals from outside the cluster - /// - /// This is currently the nuclei which do not have any incoming synapse - public List _inputs = null; - public virtual List inputs { - get { - if (this._inputs == null) { - this._inputs = new(); - foreach (Nucleus receptor in this.nuclei) { - if (receptor is Nucleus nucleus) { - // inputs have no incoming synapses yet. - if (nucleus.synapses.Count == 0) - this._inputs.Add(nucleus); + /// + /// The output of this cluster + /// + /// This only returens the first(default) nucleus. Use outputs[0] instead + public virtual Nucleus output => this.nuclei[0] as Nucleus; + + /// + /// The nuclei in this cluster which are meant for receiving signals from outside the cluster + /// + /// This is currently the nuclei which do not have any incoming synapse + public List _inputs = null; + public virtual List inputs { + get { + if (this._inputs == null) { + this._inputs = new(); + foreach (Nucleus receptor in this.nuclei) { + if (receptor is Nucleus nucleus) { + // inputs have no incoming synapses yet. + if (nucleus.synapses.Count == 0) + this._inputs.Add(nucleus); + } + } } + return this._inputs; } } - return this._inputs; - } - } - /// - /// The nuclei in this cluster which are meant for sending signals onward - /// - private List _outputs = null; - public List outputs { - get { - if (this._outputs == null) - RefreshOutputs(); - return this._outputs; - } - } - /// - /// Redetermine the outpus in the cluster - /// - public void RefreshOutputs() { - this._outputs = new(); - foreach (Nucleus nucleus in this.nuclei) { - if (nucleus is Neuron neuron && neuron.receivers.Count == 0) - this._outputs.Add(nucleus); - } - } - + /// + /// The nuclei in this cluster which are meant for sending signals onward + /// + private List _outputs = null; + public List outputs { + get { + if (this._outputs == null) + RefreshOutputs(); + return this._outputs; + } + } + /// + /// Redetermine the outpus in the cluster + /// + public void RefreshOutputs() { + this._outputs = new(); + foreach (Nucleus nucleus in this.nuclei) { + if (nucleus is Neuron neuron && neuron.receivers.Count == 0) + this._outputs.Add(nucleus); + } + } + */ /// /// Retrieve a nucleus in this cluster /// /// The name of the nucleus /// The Nucleus with the given name or null if no such Nucleus could be found public Nucleus GetNucleus(string nucleusName) { - foreach (Nucleus nucleus in this.nuclei) { - if (nucleus.name == nucleusName) - return nucleus; - } - return null; + return cluster.GetNucleus(nucleusName); + // foreach (Nucleus nucleus in this.nuclei) { + // if (nucleus.name == nucleusName) + // return nucleus; + // } + // return null; } // Call this function to ensure that there is at least one nucleus // This is an invariant and should be ensured before the nucleus is used // because output requires it. public void EnsureInitialization() { - nuclei ??= new List(); - if (nuclei.Count == 0) - new Neuron(this, "Output"); // Every cluster should have at least 1 neuron + this.cluster.prefab = this; + this.cluster.name = this.name; + this.cluster.nuclei ??= new List(); + if (this.cluster.nuclei.Count <= 0) + new Neuron(this.cluster, "Output"); // Every cluster should have at least 1 neuron + this.cluster.instanceCount = 1; + // nuclei ??= new List(); + // if (nuclei.Count == 0) + // new Neuron(this, "Output"); // Every cluster should have at least 1 neuron } public void GarbageCollection() { - HashSet visitedNuclei = new(); - foreach (Nucleus output in this.outputs) - MarkNuclei(visitedNuclei, output); - //Debug.Log($"Garbage collection found {visitedNuclei.Count} Nuclei"); - this.nuclei.RemoveAll(nucleus => visitedNuclei.Contains(nucleus) == false); + // HashSet visitedNuclei = new(); + // foreach (Nucleus output in this.outputs) + // MarkNuclei(visitedNuclei, output); + // //Debug.Log($"Garbage collection found {visitedNuclei.Count} Nuclei"); + // this.nuclei.RemoveAll(nucleus => visitedNuclei.Contains(nucleus) == false); } - public void MarkNuclei(HashSet visitedNuclei, Nucleus nucleus) { - if (nucleus is null) - return; + // public void MarkNuclei(HashSet visitedNuclei, Nucleus nucleus) { + // if (nucleus is null) + // return; - if (nucleus.parent != null && nucleus.parent.prefab != this) - visitedNuclei.Add(nucleus.parent); - else - visitedNuclei.Add(nucleus); - if (nucleus.synapses != null) { - HashSet visitedSynapses = new(); - foreach (Synapse synapse in nucleus.synapses) { - if (synapse != null && synapse.neuron != null) { - visitedSynapses.Add(synapse); - if (synapse.neuron is Nucleus synapse_nucleus) - MarkNuclei(visitedNuclei, synapse_nucleus); - } - } - nucleus.synapses.RemoveAll(synapse => visitedSynapses.Contains(synapse) == false); - } - if (nucleus is Neuron neuron && neuron.receivers != null) { - HashSet visitedReceivers = new(); - foreach (Nucleus receiver in neuron.receivers) { - if (receiver != null && receiver != null) { - visitedReceivers.Add(receiver); - visitedNuclei.Add(receiver); - } - } - neuron.receivers.RemoveAll(receiver => visitedReceivers.Contains(receiver) == false); - } - } + // if (nucleus.parent != null && nucleus.parent.prefab != this) + // visitedNuclei.Add(nucleus.parent); + // else + // visitedNuclei.Add(nucleus); + // if (nucleus is Neuron neuron) { + // if (neuron.synapses != null) { + // HashSet visitedSynapses = new(); + // foreach (Synapse synapse in neuron.synapses) { + // if (synapse != null && synapse.neuron != null) { + // visitedSynapses.Add(synapse); + // if (synapse.neuron is Nucleus synapse_nucleus) + // MarkNuclei(visitedNuclei, synapse_nucleus); + // } + // } + // neuron.synapses.RemoveAll(synapse => visitedSynapses.Contains(synapse) == false); + // } + // if (neuron.receivers != null) { + // HashSet visitedReceivers = new(); + // foreach (Nucleus receiver in neuron.receivers) { + // if (receiver != null && receiver != null) { + // visitedReceivers.Add(receiver); + // visitedNuclei.Add(receiver); + // } + // } + // neuron.receivers.RemoveAll(receiver => visitedReceivers.Contains(receiver) == false); + // } + // } + // } - public virtual void UpdateNuclei() { - foreach (Nucleus nucleus in this.nuclei) - nucleus.UpdateNuclei(); - } + // public virtual void UpdateNuclei() { + // foreach (Nucleus nucleus in this.nuclei) + // nucleus.UpdateNuclei(); + // } - public int GetNucleusIndex(Nucleus receiver) { - int ix = 0; - foreach (Nucleus nucleus in this.nuclei) { - if (receiver == nucleus) - return ix; - ix++; - } - return -1; - } + // public int GetNucleusIndex(Nucleus receiver) { + // int ix = 0; + // foreach (Nucleus nucleus in this.nuclei) { + // if (receiver == nucleus) + // return ix; + // ix++; + // } + // return -1; + // } } } diff --git a/doxygen/DoxyWarnLogfile.txt b/doxygen/DoxyWarnLogfile.txt deleted file mode 100644 index 14f5b84..0000000 --- a/doxygen/DoxyWarnLogfile.txt +++ /dev/null @@ -1,230 +0,0 @@ -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Angle.cs:294: warning: Member pi (variable) of class LinearAlgebra.Angles is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Direction.cs:76: warning: Member ToString() (function) of struct LinearAlgebra.Direction is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Direction.cs:223: warning: Member Equals(object obj) (function) of struct LinearAlgebra.Direction is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Direction.cs:234: warning: Member GetHashCode() (function) of struct LinearAlgebra.Direction is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Direction.cs:191: warning: Member operator-(Direction d) (function) of struct LinearAlgebra.Direction is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Direction.cs:239: warning: Member UnsignedAngle(Direction d1, Direction d2) (function) of struct LinearAlgebra.Direction is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:12: warning: Unsupported xml/html tag found -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:75: warning: Member ToVector3() (function) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:92: warning: Member ToVector3() (function) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:111: warning: Member ToString() (function) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:151: warning: Member Equals(object o) (function) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:157: warning: Member GetHashCode() (function) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:43: warning: Member Radians(float distance, float horizontal, float vertical) (function) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:69: warning: Member FromVector3(Vector3 v) (function) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:81: warning: Member FromVector3(Vector3Float v) (function) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:128: warning: Member operator+(Spherical s1, Spherical s2) (function) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:138: warning: Member operator*(Spherical v, float d) (function) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:143: warning: Member operator==(Spherical v1, Spherical v2) (function) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:147: warning: Member operator!=(Spherical v1, Spherical v2) (function) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:161: warning: Member Distance(Spherical v1, Spherical v2) (function) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:187: warning: Member Average(Spherical v1, Spherical v2) (function) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:240: warning: Member Sum(List< Spherical > vectors) (function) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:256: warning: Member Average(List< Spherical > vectors) (function) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:116: warning: Member magnitude (property) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:118: warning: Member normalized (property) of struct LinearAlgebra.Spherical is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:16: warning: Member SwingTwist(Direction swing, AngleFloat twist) (function) of struct LinearAlgebra.SwingTwist is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:55: warning: Member ToAngleAxis() (function) of struct LinearAlgebra.SwingTwist is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:81: warning: Member ToQuaternion() (function) of struct LinearAlgebra.SwingTwist is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:93: warning: Member ToAngleAxis() (function) of struct LinearAlgebra.SwingTwist is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:119: warning: Member ToQuaternion() (function) of struct LinearAlgebra.SwingTwist is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:64: warning: Member FromAngleAxis(Spherical r) (function) of struct LinearAlgebra.SwingTwist is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:102: warning: Member FromAngleAxis(Spherical r) (function) of struct LinearAlgebra.SwingTwist is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:127: warning: Member FromQuat32(Quat32 q32) (function) of struct LinearAlgebra.SwingTwist is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:13: warning: Member swing (variable) of struct LinearAlgebra.SwingTwist is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:14: warning: Member twist (variable) of struct LinearAlgebra.SwingTwist is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:218: warning: Member SqrMagnitudeOf(Vector2Float v) (function) of struct LinearAlgebra.Vector2Float is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:227: warning: Member MagnitudeOf(Vector2Float v) (function) of struct LinearAlgebra.Vector2Float is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:244: warning: Member Normalize(Vector2Float v) (function) of struct LinearAlgebra.Vector2Float is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:428: warning: Member UnsignedAngle(Vector2Float from, Vector2Float to) (function) of struct LinearAlgebra.Vector2Float is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:335: warning: argument 'v1' from the argument list of LinearAlgebra.Vector2Float.operator== has multiple @param documentation sections -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:407: warning: argument 'axis' of command @param is not found in the argument list of LinearAlgebra.Vector2Float::SignedAngle(Vector2Float from, Vector2Float to) -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:102: warning: Member Vector3Float(Vector3Int v) (function) of struct LinearAlgebra.Vector3Float is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:122: warning: Member ToString() (function) of struct LinearAlgebra.Vector3Float is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:282: warning: Member Equals(object obj) (function) of struct LinearAlgebra.Vector3Float is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:289: warning: Member GetHashCode() (function) of struct LinearAlgebra.Vector3Float is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:108: warning: Member FromSpherical(Spherical s) (function) of struct LinearAlgebra.Vector3Float is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:256: warning: Member operator*(Vector3Float v1, float d) (function) of struct LinearAlgebra.Vector3Float is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:261: warning: Member operator*(float d, Vector3Float v1) (function) of struct LinearAlgebra.Vector3Float is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:266: warning: Member operator/(Vector3Float v1, float d) (function) of struct LinearAlgebra.Vector3Float is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:274: warning: Member operator==(Vector3Float v1, Vector3Float v2) (function) of struct LinearAlgebra.Vector3Float is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:278: warning: Member operator!=(Vector3Float v1, Vector3Float v2) (function) of struct LinearAlgebra.Vector3Float is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:31: warning: Member Vector3Int(int horizontal, int vertical, int depth) (function) of struct LinearAlgebra.Vector3Int is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:182: warning: Member Equals(Vector3Int v) (function) of struct LinearAlgebra.Vector3Int is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:184: warning: Member Equals(object obj) (function) of struct LinearAlgebra.Vector3Int is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:199: warning: Member GetHashCode() (function) of struct LinearAlgebra.Vector3Int is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:167: warning: Member operator*(Vector3Int v1, int d) (function) of struct LinearAlgebra.Vector3Int is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:172: warning: Member operator*(int d, Vector3Int v1) (function) of struct LinearAlgebra.Vector3Int is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:177: warning: Member operator/(Vector3Int v1, int d) (function) of struct LinearAlgebra.Vector3Int is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:191: warning: Member operator==(Vector3Int v1, Vector3Int v2) (function) of struct LinearAlgebra.Vector3Int is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:195: warning: Member operator!=(Vector3Int v1, Vector3Int v2) (function) of struct LinearAlgebra.Vector3Int is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/test/Vector2FloatTest.cs:5: warning: Member Vector2 (typedef) of namespace LinearAlgebra.Test is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/test/Vector3FloatTest.cs:5: warning: Member Vector3 (typedef) of namespace LinearAlgebra.Test is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:215: warning: Member Clone(ClusterPrefab parent) (function) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:239: warning: Member ShallowCloneTo(Cluster parent) (function) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:428: warning: Member TryGetNucleus(string nucleusName, out Nucleus foundNucleus) (function) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:440: warning: Member GetNucleus(string nucleusName) (function) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:476: warning: Member CollectReceivers() (function) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:493: warning: Member UpdateFromNucleus(Nucleus startNucleus) (function) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:516: warning: Member UpdateStateIsolated() (function) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:293: warning: Member GetNucleusIndex(List< Nucleus > nuclei, Nucleus nucleus) (function) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:306: warning: Member prefab (variable) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:310: warning: Member clusterNuclei (variable) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:313: warning: Member sortedNuclei (variable) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:316: warning: Member _inputs (variable) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:332: warning: Member computeOrders (variable) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:285: warning: Member GetNucleusIndex(Nucleus[] nuclei, Nucleus nucleus) (function) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:414: warning: Member _outputs (variable) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:317: warning: Member inputs (property) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:407: warning: Member defaultOutput (property) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:415: warning: Member outputs (property) of class NanoBrain.Cluster is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:79: warning: Member EnsureInitialization() (function) of class NanoBrain.ClusterPrefab is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:85: warning: Member GarbageCollection() (function) of class NanoBrain.ClusterPrefab is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:93: warning: Member MarkNuclei(HashSet< Nucleus > visitedNuclei, Nucleus nucleus) (function) of class NanoBrain.ClusterPrefab is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:124: warning: Member UpdateNuclei() (function) of class NanoBrain.ClusterPrefab is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:129: warning: Member GetNucleusIndex(Nucleus receiver) (function) of class NanoBrain.ClusterPrefab is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:26: warning: Member inputs (property) of class NanoBrain.ClusterPrefab is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:45: warning: Member outputs (property) of class NanoBrain.ClusterPrefab is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:24: warning: Unsupported xml/html tag found -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:24: warning: Unsupported xml/html tag found -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:18: warning: Unsupported xml/html tag found -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:18: warning: Unsupported xml/html tag found -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:15: warning: Member MemoryCell(ClusterPrefab cluster, string name) (function) of class NanoBrain.MemoryCell is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:16: warning: Member MemoryCell(Cluster parent, string name) (function) of class NanoBrain.MemoryCell is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:28: warning: Member ShallowCloneTo(Cluster newParent) (function) of class NanoBrain.MemoryCell is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:45: warning: Member UpdateStateIsolated() (function) of class NanoBrain.MemoryCell is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:83: warning: Member GenerateCurve() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:270: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:311: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:277: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:318: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:285: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:327: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:439: warning: Member AddReceiver(Nucleus receiverToAdd, float weight=1) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:444: warning: Member RemoveReceiver(Nucleus receiverToRemove) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:469: warning: Member ProcessStimulusDirect(Vector3 inputValue, int thingId=0, string thingName=null) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:218: warning: Member Delete(Nucleus nucleus) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:18: warning: Member staticMemory (variable) of class NanoBrain.MemoryCell is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:72: warning: Member _curvePreset (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:80: warning: Member curve (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:81: warning: Member curveMax (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:179: warning: Member WhenFiring (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:185: warning: Member stale (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:186: warning: Member staleValueForSleep (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:209: warning: Member CloneFields(Neuron clone) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:358: warning: Member ActivatorLinear(float3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:397: warning: Member ActivatorLinear(Vector3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:362: warning: Member ActivatorSqrt(float3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:401: warning: Member ActivatorSqrt(Vector3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:367: warning: Member ActivatorPower(float3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:406: warning: Member ActivatorPower(Vector3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:372: warning: Member ActivatorReciprocal(float3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:411: warning: Member ActivatorReciprocal(Vector3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:381: warning: Member ActivatorCustom(float3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:420: warning: Member ActivatorCustom(Vector3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:151: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:165: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:19: warning: Member isSleeping (property) of class NanoBrain.MemoryCell is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:73: warning: Member curvePreset (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:152: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:166: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:160: warning: Member outputMagnitude (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:161: warning: Member outputSqrMagnitude (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:178: warning: Member isFiring (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:263: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:304: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:350: warning: Member Activator (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:389: warning: Member Activator (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:434: warning: Member receivers (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:83: warning: Member GenerateCurve() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:254: warning: Member UpdateStateIsolated() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:270: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:277: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:285: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:311: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:318: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:327: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:439: warning: Member AddReceiver(Nucleus receiverToAdd, float weight=1) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:444: warning: Member RemoveReceiver(Nucleus receiverToRemove) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:469: warning: Member ProcessStimulusDirect(Vector3 inputValue, int thingId=0, string thingName=null) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:218: warning: Member Delete(Nucleus nucleus) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:72: warning: Member _curvePreset (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:80: warning: Member curve (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:81: warning: Member curveMax (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:179: warning: Member WhenFiring (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:185: warning: Member stale (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:186: warning: Member staleValueForSleep (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:209: warning: Member CloneFields(Neuron clone) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:358: warning: Member ActivatorLinear(float3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:362: warning: Member ActivatorSqrt(float3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:367: warning: Member ActivatorPower(float3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:372: warning: Member ActivatorReciprocal(float3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:381: warning: Member ActivatorCustom(float3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:397: warning: Member ActivatorLinear(Vector3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:401: warning: Member ActivatorSqrt(Vector3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:406: warning: Member ActivatorPower(Vector3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:411: warning: Member ActivatorReciprocal(Vector3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:420: warning: Member ActivatorCustom(Vector3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:151: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:165: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:73: warning: Member curvePreset (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:152: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:160: warning: Member outputMagnitude (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:161: warning: Member outputSqrMagnitude (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:166: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:178: warning: Member isFiring (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:182: warning: Member isSleeping (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:263: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:304: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:350: warning: Member Activator (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:389: warning: Member Activator (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:434: warning: Member receivers (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:189: warning: argument 'parent' of command @param is not found in the argument list of NanoBrain.Neuron::ShallowCloneTo(Cluster newParent) -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:189: warning: The following parameter of NanoBrain.Neuron.ShallowCloneTo(Cluster newParent) is not documented: - parameter 'newParent' -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/NucleusArray.cs:83: warning: Member thingReceivers (variable) of class NanoBrain.NucleusArray is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/NucleusArray.cs:22: warning: Member nuclei (property) of class NanoBrain.NucleusArray is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Receptor.cs:81: warning: Member UpdateStateIsolated() (function) of class NanoBrain.Receptor is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:83: warning: Member GenerateCurve() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:270: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:311: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:277: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:318: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:285: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:327: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:439: warning: Member AddReceiver(Nucleus receiverToAdd, float weight=1) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:444: warning: Member RemoveReceiver(Nucleus receiverToRemove) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:469: warning: Member ProcessStimulusDirect(Vector3 inputValue, int thingId=0, string thingName=null) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:218: warning: Member Delete(Nucleus nucleus) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:72: warning: Member _curvePreset (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:80: warning: Member curve (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:81: warning: Member curveMax (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:179: warning: Member WhenFiring (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:185: warning: Member stale (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:186: warning: Member staleValueForSleep (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:209: warning: Member CloneFields(Neuron clone) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:358: warning: Member ActivatorLinear(float3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:397: warning: Member ActivatorLinear(Vector3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:362: warning: Member ActivatorSqrt(float3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:401: warning: Member ActivatorSqrt(Vector3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:367: warning: Member ActivatorPower(float3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:406: warning: Member ActivatorPower(Vector3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:372: warning: Member ActivatorReciprocal(float3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:411: warning: Member ActivatorReciprocal(Vector3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:381: warning: Member ActivatorCustom(float3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:420: warning: Member ActivatorCustom(Vector3 input) (function) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:151: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:165: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Receptor.cs:60: warning: Member array (property) of class NanoBrain.Receptor is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:73: warning: Member curvePreset (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:152: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:166: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:160: warning: Member outputMagnitude (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:161: warning: Member outputSqrMagnitude (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:178: warning: Member isFiring (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:182: warning: Member isSleeping (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:263: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:304: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:350: warning: Member Activator (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:389: warning: Member Activator (property) of class NanoBrain.Neuron is not documented. -/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:434: warning: Member receivers (property) of class NanoBrain.Neuron is not documented. From fa8cd1c728388d3f84164724a76726d97f0fe3e3 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Thu, 7 May 2026 15:33:45 +0200 Subject: [PATCH 38/38] Fixes following nanobrain update --- CreatureControl/Runtime/Scripts/CreatureAnimator.cs | 11 +++++++++-- NanoBrain/Runtime/Scripts/Core/Cluster.cs | 3 --- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CreatureControl/Runtime/Scripts/CreatureAnimator.cs b/CreatureControl/Runtime/Scripts/CreatureAnimator.cs index 90acd3a..07a47ea 100644 --- a/CreatureControl/Runtime/Scripts/CreatureAnimator.cs +++ b/CreatureControl/Runtime/Scripts/CreatureAnimator.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using UnityEngine; using UnityEditor.Animations; -using LinearAlgebra; namespace CreatureControl { @@ -102,7 +101,7 @@ namespace CreatureControl { this.animator.SetFloat("Right", rightAnimationSpeed); Quaternion rotation = this.transform.rotation * Quaternion.Inverse(lastOrientation); - float rotationAngleY = Angles.Normalize(rotation.eulerAngles.y); + float rotationAngleY = AnglesNormalize(rotation.eulerAngles.y); float rotationSpeed = rotationAngleY / Time.deltaTime; float rotAnimationSpeed = rotationSpeed / rootMotionScaleRotate; this.animator.SetFloat("Rotation", rotAnimationSpeed); @@ -111,6 +110,14 @@ namespace CreatureControl { lastOrientation = this.transform.rotation; } + float AnglesNormalize(float angle) { + if (float.IsInfinity(angle)) + return angle; + + while (angle <= -180) angle += 360; + while (angle > 180) angle -= 360; + return angle; + } } } \ No newline at end of file diff --git a/NanoBrain/Runtime/Scripts/Core/Cluster.cs b/NanoBrain/Runtime/Scripts/Core/Cluster.cs index 2d5a1f7..8779e03 100644 --- a/NanoBrain/Runtime/Scripts/Core/Cluster.cs +++ b/NanoBrain/Runtime/Scripts/Core/Cluster.cs @@ -504,9 +504,6 @@ namespace NanoBrain { public void RefreshComputeOrders() { this._computeOrders = null; } - public void RefreshComputeOrders() { - this._computeOrders = null; - } private List TopologicalSort2(Nucleus startNode) { Dictionary inDegree = new();