Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        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();
        }