/// <summary> /// Create a new Entity of a given type in the active DataSet. /// </summary> /// <param name="entityType">Type of the Entity to add.</param> public Data AddEntity(Type entityType, GenerateEntityNameDelegate generateName = null) { var instance = Activator.CreateInstance(entityType) as Data; if (generateName == null) { instance.Name = GenerateNameForType(entityType, this.activeDataSet); } else { uint index = 0; var instanceName = generateName(index); while (this.activeDataSet.GetDataList().ContainsKey(instanceName)) { index++; instanceName = generateName(index); } instance.Name = generateName(index); } var state = SingletonScriptableObject <DataListWindowState> .Instance; instance.DataSetGuid = state.ActiveDataSetGuid; this.activeDataSet.AddData(instance.Name, instance); // FIXME terrible hack DataSet.CreateSceneProxyForEntityDelegate createSceneProxy = entityName => state.CreateSceneProxyForEntity(this.activeDataSet.DataSetGuid, entityName); Entity.GetSceneProxyDelegate getSceneProxy = entityName => state.FindSceneProxyForEntity( this.activeDataSet.DataSetGuid, entityName); instance.OnLoaded(() => createSceneProxy(instance.Name)); instance.PostOnLoaded(getSceneProxy); // TODO // There must be a better way of doing this this.treeView = new DataListTreeView( this.treeViewState, this.openDataSetGuids, this.activeDataSet, state.FindSceneProxyForEntity); this.treeView.Reload(); return(instance); }
private void OnHierarchyChange() { var allModelsInScene = GameObject.FindObjectsOfType <FoxModel>(); foreach (var model in allModelsInScene) { if (this.openDataSetGuids.Count == 0) { if (SingletonScriptableObject <DataListWindowState> .Instance.IsModelIgnored(model)) { continue; } SingletonScriptableObject <DataListWindowState> .Instance.IgnoreModel(model); } if (SingletonScriptableObject <DataListWindowState> .Instance.IsModelIgnored(model)) { continue; } var parent = model.transform.parent; if (parent != null) { var sceneProxy = parent.GetComponent <SceneProxy>(); if (sceneProxy != null) { continue; } } var mouseEvent = Event.current; if (mouseEvent != null && mouseEvent.type == EventType.MouseDown && mouseEvent.button == 0) { return; } var prefab = PrefabUtility.GetCorrespondingObjectFromSource(model.gameObject); if (prefab == null) { return; } GenerateEntityNameDelegate generateName = id => $"{prefab.name}_{id:D4}"; // New model was added to the scene. Add it to the active DataSet. var staticModel = this.AddEntity(typeof(StaticModel), generateName) as StaticModel; var transformEntity = new TransformEntity { Owner = staticModel, Translation = model.transform.position, RotQuat = model.transform.rotation, Scale = model.transform.localScale }; staticModel.Transform = transformEntity; staticModel.ModelFile = prefab; var newSceneProxy = SingletonScriptableObject <DataListWindowState> .Instance.FindSceneProxyForEntity( staticModel.DataSetGuid, staticModel.Name); model.transform.SetParent(newSceneProxy.transform, true); var modelProxy = model.gameObject.AddComponent <SceneProxyChild>(); modelProxy.Owner = newSceneProxy; modelProxy.SetModel(staticModel.ModelFile); this.treeView.SelectItem(staticModel); } this.Repaint(); }