Automatic recreate cluster instance
This commit is contained in:
parent
92bfb29ed0
commit
57967e3409
@ -103,6 +103,8 @@ namespace NanoBrain.Unity {
|
|||||||
public Nucleus currentNucleus = null;
|
public Nucleus currentNucleus = null;
|
||||||
public Nucleus selectedSynapseNeuron = null;
|
public Nucleus selectedSynapseNeuron = null;
|
||||||
public Nucleus selectedOutput;
|
public Nucleus selectedOutput;
|
||||||
|
public bool isOpen = true;
|
||||||
|
public bool initialized;
|
||||||
|
|
||||||
#region Focus Graph
|
#region Focus Graph
|
||||||
|
|
||||||
|
|||||||
@ -1,12 +1,9 @@
|
|||||||
using System.Linq;
|
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UIElements;
|
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
using System;
|
using System;
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
namespace NanoBrain.Unity {
|
namespace NanoBrain.Unity {
|
||||||
|
|
||||||
@ -15,7 +12,16 @@ namespace NanoBrain.Unity {
|
|||||||
|
|
||||||
static Cluster_Drawer() {
|
static Cluster_Drawer() {
|
||||||
SceneView.duringSceneGui += OnSceneGUI;
|
SceneView.duringSceneGui += OnSceneGUI;
|
||||||
|
Selection.selectionChanged += OnSelectionChanged;
|
||||||
|
if (clusterView != null)
|
||||||
|
clusterView.initialized = false;
|
||||||
}
|
}
|
||||||
|
~Cluster_Drawer() {
|
||||||
|
SceneView.duringSceneGui -= OnSceneGUI;
|
||||||
|
}
|
||||||
|
|
||||||
|
//static readonly Dictionary<string, bool> s_foldouts = new();
|
||||||
|
static readonly Dictionary<string, ClusterView> clusterViews = new();
|
||||||
|
|
||||||
public static void Insepctor(SerializedObject serializedObject, string propertyName) {
|
public static void Insepctor(SerializedObject serializedObject, string propertyName) {
|
||||||
EditorGUILayout.PropertyField(serializedObject.FindProperty(propertyName));
|
EditorGUILayout.PropertyField(serializedObject.FindProperty(propertyName));
|
||||||
@ -26,12 +32,24 @@ namespace NanoBrain.Unity {
|
|||||||
private static ClusterView clusterView;
|
private static ClusterView clusterView;
|
||||||
private static UnityEngine.Object selectedTarget;
|
private static UnityEngine.Object selectedTarget;
|
||||||
|
|
||||||
|
public ClusterView GetClusterView(SerializedProperty property) {
|
||||||
|
string key = property.propertyPath + "_" + property.serializedObject.targetObject.GetInstanceID();//GetEntityId();
|
||||||
|
if (clusterViews.TryGetValue(key, out ClusterView view))
|
||||||
|
return view;
|
||||||
|
|
||||||
|
view = new ClusterView();
|
||||||
|
clusterViews[key] = view;
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
public override float GetPropertyHeight(SerializedProperty property, GUIContent label) {
|
public override float GetPropertyHeight(SerializedProperty property, GUIContent label) {
|
||||||
float height = EditorGUIUtility.singleLineHeight + padding;
|
float height = EditorGUIUtility.singleLineHeight + padding;
|
||||||
string key = property.propertyPath + "_" + property.serializedObject.targetObject.GetInstanceID();//GetEntityId();
|
// string key = property.propertyPath + "_" + property.serializedObject.targetObject.GetInstanceID();//GetEntityId();
|
||||||
s_foldouts.TryGetValue(key, out bool isOpen);
|
// //s_foldouts.TryGetValue(key, out bool isOpen);
|
||||||
|
// clusterViews.TryGetValue(key, out ClusterView view);
|
||||||
|
ClusterView view = GetClusterView(property);
|
||||||
SerializedProperty prefabProp = property.FindPropertyRelative(nameof(Cluster.prefab));
|
SerializedProperty prefabProp = property.FindPropertyRelative(nameof(Cluster.prefab));
|
||||||
if (prefabProp.objectReferenceValue != null && isOpen) {
|
if (prefabProp.objectReferenceValue != null && view.isOpen) {
|
||||||
height += padding + elementHeight;
|
height += padding + elementHeight;
|
||||||
height = 500;
|
height = 500;
|
||||||
}
|
}
|
||||||
@ -40,9 +58,10 @@ namespace NanoBrain.Unity {
|
|||||||
return height;
|
return height;
|
||||||
}
|
}
|
||||||
|
|
||||||
static readonly Dictionary<string, bool> s_foldouts = new();
|
|
||||||
|
|
||||||
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) {
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) {
|
||||||
|
ClusterView clusterView = GetClusterView(property);
|
||||||
|
|
||||||
label = EditorGUI.BeginProperty(position, label, property);
|
label = EditorGUI.BeginProperty(position, label, property);
|
||||||
|
|
||||||
// Begin indent block
|
// Begin indent block
|
||||||
@ -73,27 +92,40 @@ namespace NanoBrain.Unity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (prefabProp.objectReferenceValue is ClusterPrefab prefab) {
|
if (prefabProp.objectReferenceValue is ClusterPrefab prefab) {
|
||||||
|
// // Graph is not shown when multi-editing
|
||||||
if (property.serializedObject.targetObjects.Length == 1) {
|
if (property.serializedObject.targetObjects.Length == 1) {
|
||||||
// Graph is not shown when multi-editing
|
|
||||||
UnityEngine.Object targetObject = property.serializedObject.targetObject;
|
UnityEngine.Object targetObject = property.serializedObject.targetObject;
|
||||||
Cluster_Drawer.selectedTarget = targetObject;
|
Cluster_Drawer.selectedTarget = targetObject;
|
||||||
Cluster cluster = SerializedPropertyUtility.GetManagedObjectForProperty(targetObject, property.propertyPath) as Cluster;
|
|
||||||
|
Cluster cluster;
|
||||||
|
if (clusterView.initialized) {
|
||||||
|
cluster = SerializedPropertyUtility.GetManagedObjectForProperty(targetObject, property.propertyPath) as Cluster;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ClusterPrefab clusterPrefab = prefabProp.objectReferenceValue as ClusterPrefab;
|
||||||
|
cluster = new(clusterPrefab);
|
||||||
|
object parent = SerializedPropertyUtility.GetParentObjectAndMember(targetObject, property.propertyPath, out var memberInfo, out int outIndex);
|
||||||
|
if (parent != null && memberInfo is FieldInfo fieldInfo) {
|
||||||
|
fieldInfo.SetValue(parent, cluster);
|
||||||
|
EditorUtility.SetDirty(targetObject);
|
||||||
|
}
|
||||||
|
clusterView.initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
// key per field instance
|
// key per field instance
|
||||||
string key = property.propertyPath + "_" + property.serializedObject.targetObject.GetInstanceID();//GetEntityId();
|
string key = property.propertyPath + "_" + property.serializedObject.targetObject.GetInstanceID();//GetEntityId();
|
||||||
if (!s_foldouts.TryGetValue(key, out bool isOpen))
|
// if (!s_foldouts.TryGetValue(key, out bool isOpen))
|
||||||
isOpen = true;
|
// isOpen = true;
|
||||||
|
|
||||||
// foldout header rect
|
// foldout header rect
|
||||||
Rect headerRect = new(fieldRect.x, fieldRect.yMax + 4f, fieldRect.width, EditorGUIUtility.singleLineHeight);
|
Rect headerRect = new(fieldRect.x, fieldRect.yMax + 4f, fieldRect.width, EditorGUIUtility.singleLineHeight);
|
||||||
isOpen = EditorGUI.Foldout(headerRect, isOpen, "Graph", true);
|
clusterView.isOpen = EditorGUI.Foldout(headerRect, clusterView.isOpen, "Graph", true);
|
||||||
s_foldouts[key] = isOpen;
|
|
||||||
|
|
||||||
if (isOpen) {
|
if (clusterView.isOpen) {
|
||||||
// content rect below header
|
// content rect below header
|
||||||
Rect drawRect = new(fieldRect.x, headerRect.yMax + 2f, fieldRect.width, 450f);
|
Rect drawRect = new(fieldRect.x, headerRect.yMax + 2f, fieldRect.width, 450f);
|
||||||
|
|
||||||
Cluster_Drawer.clusterView = ClusterView.GetClusterView(property);
|
Cluster_Drawer.clusterView = clusterView;
|
||||||
ClusterView.Render(drawRect, cluster, property);
|
ClusterView.Render(drawRect, cluster, property);
|
||||||
//Debug.Log(prefab.cluster.defaultOutput.outputMagnitude);
|
//Debug.Log(prefab.cluster.defaultOutput.outputMagnitude);
|
||||||
}
|
}
|
||||||
@ -105,6 +137,9 @@ namespace NanoBrain.Unity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void OnSceneGUI(SceneView sceneView) {
|
private static void OnSceneGUI(SceneView sceneView) {
|
||||||
|
if (selectedTarget == null)
|
||||||
|
return;
|
||||||
|
|
||||||
GameObject gameObject = null;
|
GameObject gameObject = null;
|
||||||
if (selectedTarget is Component c)
|
if (selectedTarget is Component c)
|
||||||
gameObject = c.gameObject;
|
gameObject = c.gameObject;
|
||||||
@ -125,7 +160,12 @@ namespace NanoBrain.Unity {
|
|||||||
Handles.DrawLine(gameObject.transform.position, gameObject.transform.position + worldVector);
|
Handles.DrawLine(gameObject.transform.position, gameObject.transform.position + worldVector);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void OnSelectionChanged() {
|
||||||
|
foreach (ClusterView clusterView in clusterViews.Values) {
|
||||||
|
clusterView.initialized = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -176,7 +176,7 @@ namespace NanoBrain {
|
|||||||
};
|
};
|
||||||
for (int instanceIx = 1; instanceIx < clonedCluster.instanceCount; instanceIx++) {
|
for (int instanceIx = 1; instanceIx < clonedCluster.instanceCount; instanceIx++) {
|
||||||
// Create another sibling
|
// Create another sibling
|
||||||
Debug.Log($"create {clonedCluster.prefab.name} sibling");
|
// Debug.Log($"create {clonedCluster.prefab.name} sibling");
|
||||||
Cluster sibling = new(clonedCluster.prefab, this) {
|
Cluster sibling = new(clonedCluster.prefab, this) {
|
||||||
name = $"{clonedCluster.baseName}: {instanceIx}",
|
name = $"{clonedCluster.baseName}: {instanceIx}",
|
||||||
parent = this.parent,
|
parent = this.parent,
|
||||||
@ -241,7 +241,7 @@ namespace NanoBrain {
|
|||||||
}
|
}
|
||||||
|
|
||||||
clonedNeuron.AddReceiver(receiver, weight);
|
clonedNeuron.AddReceiver(receiver, weight);
|
||||||
Debug.Log($"external: {receiver.name} receives from {clonedNeuron.name} {clonedNeuron.GetHashCode()}");
|
// Debug.Log($"external: {receiver.name} receives from {clonedNeuron.name} {clonedNeuron.GetHashCode()}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user