예제 #1
0
        protected override void OnInvalidate(VFXModel model, InvalidationCause cause)
        {
            if (cause == InvalidationCause.kSettingChanged || cause == InvalidationCause.kExpressionInvalidated)
            {
                if (cause == InvalidationCause.kSettingChanged)
                {
                    if (m_Subgraph != null)
                    {
                        var graph = GetGraph();
                        if (graph != null) // that case it will be checked in OnAdded
                        {
                            var otherGraph = m_Subgraph.GetResource().GetOrCreateGraph();
                            if (otherGraph == graph || otherGraph.subgraphDependencies.Contains(graph.GetResource().visualEffectObject))
                            {
                                m_Subgraph = null; // prevent cyclic dependencies.
                            }
                        }
                    }
                    if (m_Subgraph != null || object.ReferenceEquals(m_Subgraph, null) || m_UsedSubgraph == null || m_UsedSubgraph != m_Subgraph.GetResource().GetOrCreateGraph())  // do not recreate subchildren if the subgraph is not available but is not null
                    {
                        RecreateCopy();
                    }
                }

                base.OnInvalidate(model, cause);
                PatchInputExpressions();
            }
            else
            {
                base.OnInvalidate(model, cause);
            }
        }
예제 #2
0
        private void CheckAsset(VisualEffectAsset asset)
        {
            VisualEffectResource resource = asset.GetResource();
            var graph = resource.GetOrCreateGraph();

            Assert.AreEqual(6, graph.GetNbChildren());

            Assert.AreEqual(1, graph[0].GetNbChildren());
            Assert.AreEqual(1, graph[1].GetNbChildren());
            Assert.AreEqual(1, graph[2].GetNbChildren());
            Assert.AreEqual(0, graph[3].GetNbChildren());
            Assert.AreEqual(0, graph[4].GetNbChildren());
            Assert.AreEqual(0, graph[5].GetNbChildren());

            Assert.IsNotNull((graph[0])[0]);
            Assert.IsNotNull((graph[1])[0]);
            Assert.IsNotNull((graph[2])[0]);

            Assert.AreEqual(VFXContextType.Init, ((VFXContext)(graph[0])).contextType);
            Assert.AreEqual(VFXContextType.Update, ((VFXContext)(graph[1])).contextType);
            Assert.AreEqual(VFXContextType.Output, ((VFXContext)(graph[2])).contextType);
            Assert.AreEqual(VFXContextType.Init, ((VFXContext)(graph[3])).contextType);
            Assert.AreEqual(VFXContextType.Output, ((VFXContext)(graph[4])).contextType);

            Assert.IsNotNull(graph[5] as Operator.Add);
        }
        public override void OnInspectorGUI()
        {
            AssetField();
            bool reinit = SeedField();


            var component = (VisualEffect)target;
            //Display properties only if all the VisualEffects share the same graph
            VisualEffectAsset asset = component.visualEffectAsset;

            if (targets.Length > 1)
            {
                foreach (VisualEffect effect in targets)
                {
                    if (effect.visualEffectAsset != asset)
                    {
                        return;
                    }
                }
            }

            EditorModeInspectorButton();

            DrawRendererProperties();
            DrawParameters();

            serializedObject.ApplyModifiedProperties();
            if (reinit)
            {
                component.Reinit();
            }

            GUI.enabled = true;
        }
예제 #4
0
    VFXEffectTypeData RegisterImpactType(VisualEffectAsset template)
    {
        if (template == null)
        {
            throw new System.Exception("VFX Template is null");
        }
        if (mEffectTypeData.ContainsKey(template))
        {
            throw new System.Exception("mEffectTypeData Contains template");
        }

        GameObject go = new GameObject(template.name);

        go.transform.parent     = m_RootGameObject.transform;
        go.transform.position   = Vector3.zero;
        go.transform.rotation   = Quaternion.identity;
        go.transform.localScale = Vector3.one;
        var vfx = go.AddComponent <VisualEffect>();

        vfx.visualEffectAsset = template;
        vfx.Reinit();
        vfx.Stop();

        var data = new VFXEffectTypeData
        {
            Effect         = vfx,
            EventAttribute = vfx.CreateVFXEventAttribute(),
        };

        mEffectTypeData.Add(template, data);
        return(data);
    }
예제 #5
0
    EffectTypeData RegisterImpactType(VisualEffectAsset template)
    {
        GameDebug.Assert(!m_EffectTypeData.ContainsKey(template));
        GameDebug.Assert(!template != null);

        GameObject go = new GameObject(template.name);

        go.transform.parent     = m_rootGameObject.transform;
        go.transform.position   = Vector3.zero;
        go.transform.rotation   = Quaternion.identity;
        go.transform.localScale = Vector3.one;
        var vfx = go.AddComponent <VisualEffect>();

        vfx.visualEffectAsset = template;
        vfx.Reinit();
        vfx.Stop();

        var data = new EffectTypeData
        {
            visualEffect   = vfx,
            eventAttribute = vfx.CreateVFXEventAttribute(),
        };

        m_EffectTypeData.Add(template, data);

        return(data);
    }
        private void InnerSaveAndReloadTest(string suffixname, Action<VisualEffectAsset> write, Action<VisualEffectAsset> read)
        {
            var kTempAssetPathA = string.Format("{0}/Temp_{1}_A.vfx", kTestAssetDir, suffixname);
            var kTempAssetPathB = string.Format("{0}/Temp_{1}_B.vfx", kTestAssetDir, suffixname);
            AssetDatabase.DeleteAsset(kTempAssetPathA);
            AssetDatabase.DeleteAsset(kTempAssetPathB);

            int hashCodeAsset = 0; //check reference are different between load & reload
            {
                var asset = CreateAssetAtPath(kTempAssetPathA);

                hashCodeAsset = asset.GetHashCode();

                write(asset);
                asset.GetResource().UpdateSubAssets();

                AssetDatabase.SaveAssets();

                asset = null;
                EditorUtility.UnloadUnusedAssetsImmediate();
                AssetDatabase.CopyAsset(kTempAssetPathA, kTempAssetPathB);
                if (asset != null)
                    AssetDatabase.RemoveObjectFromAsset(asset);
            }
            AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
            EditorUtility.UnloadUnusedAssetsImmediate();
            {
                VisualEffectAsset asset = AssetDatabase.LoadAssetAtPath<VisualEffectAsset>(kTempAssetPathB);
                Assert.AreNotEqual(hashCodeAsset, asset.GetHashCode());

                read(asset);
            }
            AssetDatabase.DeleteAsset(kTempAssetPathA);
            AssetDatabase.DeleteAsset(kTempAssetPathB);
        }
예제 #7
0
 public void SpawnPointEffect(VisualEffectAsset asset, float3 position, float3 normal)
 {
     m_pointEffectRequests.Add(new PointEffectRequest
     {
         asset    = asset,
         position = position,
         normal   = normal,
     });
 }
예제 #8
0
 public void SpawnLineEffect(VisualEffectAsset asset, float3 start, float3 end)
 {
     m_lineEffectRequests.Add(new LineEffectRequest
     {
         asset = asset,
         start = start,
         end   = end,
     });
 }
예제 #9
0
 public void SpawnVFX(Vector3 position, VisualEffectAsset effectToSpawn)
 {
     if (visualEffect = null)
     {
         visualEffect = gameObject.AddComponent <VisualEffect>();
     }
     visualEffect.visualEffectAsset = effectToSpawn;
     Destroy(visualEffect, 1f);
 }
예제 #10
0
    public void UpdateEffect(VisualEffectAsset newEffect)
    {
        Debug.Log("Update Effect");

        effect.visualEffectAsset = newEffect;
        effect.SetTexture("PositionMap", positionMap);
        effect.SetTexture("ColorMap", colorMap);
        effect.Reinit();
    }
예제 #11
0
    public static VisualEffect SpawnOneShot(GameObject visualEffectGraphPrefab, VisualEffectAsset visualAsset, Vector3 posistion, Quaternion rotation, Transform parent = null)
    {
        VisualEffect vfx = ObjectPool.Instantiate(visualEffectGraphPrefab, posistion, rotation, parent).GetComponent <VisualEffect>();

        vfx.visualEffectAsset = visualAsset;

        _instance.StartCoroutine(PlayParticleOneShot(vfx));
        return(vfx);
    }
예제 #12
0
 public void SpawnPointEffect(VisualEffectAsset asset, float3 position, float3 direction)
 {
     m_pointEffectRequests.Add(new PointEffectRequest
     {
         asset     = asset,
         position  = position,
         direction = direction,
     });
 }
예제 #13
0
        void GraphParameterChanged(VFXGraph graph)
        {
            VisualEffectAsset asset = graph != null && graph.GetResource() != null?graph.GetResource().asset : null;

            if (m_Subgraph == asset && GetParent() != null)
            {
                RecreateCopy();
            }
        }
예제 #14
0
        public void OneTimeSetUpAttribute()
        {
            string[] guids = AssetDatabase.FindAssets(kTestAssetName, new string[] { kTestAssetDir });

            // If the asset does not exist, create it
            if (guids.Length == 0)
            {
                VisualEffectAsset asset = CreateAssetAtPath(kTestAssetPath);
                InitAsset(asset);
            }
        }
    GameObject SpawnEffectOnPlayer(VisualEffectAsset template)
    {
        GameObject effect = new GameObject(template.name);

        effect.transform.position = character.gameObject.transform.position;
        effect.transform.rotation = character.gameObject.transform.rotation;
        effect.transform.parent   = character.gameObject.transform;
        var vfx = effect.AddComponent <VisualEffect>();

        vfx.visualEffectAsset = template;
        return(effect);
    }
예제 #16
0
        void RefreshSubgraphObject()
        {
            if (m_Subgraph == null && !object.ReferenceEquals(m_Subgraph, null))
            {
                string assetPath = AssetDatabase.GetAssetPath(m_Subgraph.GetInstanceID());

                var newSubgraph = AssetDatabase.LoadAssetAtPath <VisualEffectAsset>(assetPath);
                if (newSubgraph != null)
                {
                    m_Subgraph = newSubgraph;
                }
            }
        }
예제 #17
0
        public void LoadAsset(VisualEffectAsset asset, VisualEffect effectToAttach)
        {
            string assetPath = AssetDatabase.GetAssetPath(asset);

            VisualEffectResource resource = VisualEffectResource.GetResourceAtPath(assetPath);

            //Transitionning code
            if (resource == null)
            {
                resource = new VisualEffectResource();
                resource.SetAssetPath(AssetDatabase.GetAssetPath(asset));
            }

            LoadResource(resource, effectToAttach);
        }
예제 #18
0
        public static VisualEffectResource GetResource(this VisualEffectAsset asset)
        {
            VisualEffectResource resource = VisualEffectResource.GetResourceAtPath(AssetDatabase.GetAssetPath(asset));

            if (resource == null)
            {
                string assetPath = AssetDatabase.GetAssetPath(asset);
                resource = VisualEffectResource.GetResourceAtPath(assetPath);
                if (resource == null)
                {
                    resource = new VisualEffectResource();
                    resource.SetAssetPath(assetPath);
                }
            }
            return(resource);
        }
예제 #19
0
    void SpawnPointEffect(VisualEffectAsset asset, Vector3 position, Vector3 normal)
    {
        VFXEffectTypeData effectData;

        if (!mEffectTypeData.TryGetValue(asset, out effectData))
        {
            effectData = RegisterImpactType(asset);
        }
        effectData.Effect.SetVector3(startPositionId, position);
        Quaternion Rotation = Quaternion.FromToRotation(Vector3.back, normal);
        Vector3    rot      = Rotation.eulerAngles;

        effectData.Effect.SetVector3("Direction", rot);
        effectData.Effect.Play(effectData.EventAttribute);
        effectData.Effect.pause = false;
    }
예제 #20
0
 protected override void OnAdded()
 {
     base.OnAdded();
     if (m_Subgraph != null)
     {
         var graph = GetGraph();
         if (graph != null)
         {
             var otherGraph = m_Subgraph.GetResource().GetOrCreateGraph();
             if (otherGraph == graph || otherGraph.subgraphDependencies.Contains(graph.GetResource().visualEffectObject))
             {
                 m_Subgraph = null; // prevent cyclic dependencies.
             }
         }
     }
 }
        VFXGraph MakeTemporaryGraph()
        {
            m_Asset = VisualEffectResource.CreateNewAsset(tempFilePath);
            VisualEffectResource resource = m_Asset.GetResource(); // force resource creation
            VFXGraph graph = ScriptableObject.CreateInstance<VFXGraph>();
            graph.visualEffectResource = resource;

            var window = EditorWindow.GetWindow<VFXViewWindow>();
            window.Close();
            window = EditorWindow.GetWindow<VFXViewWindow>();
            m_ViewController = VFXViewController.GetController(m_Asset.GetResource(), true);
            m_View = window.graphView;
            m_View.controller = m_ViewController;

            return graph;
        }
예제 #22
0
    public static void RebuildVisualEffectAsset(VisualEffectAsset vfx)
    {
        //We are in Assembly-CSharp-Editor, we don't want to be friend of this namespace
        var visualEffectAssetExt = AppDomain.CurrentDomain.GetAssemblies().Select(o => o.GetType("UnityEditor.VFX.VisualEffectAssetExtensions"))
                                   .Where(o => o != null)
                                   .FirstOrDefault();
        var fnGetResource = visualEffectAssetExt.GetMethod("GetResource");

        fnGetResource = fnGetResource.MakeGenericMethod(new Type[] { typeof(VisualEffectAsset) });
        var resource      = fnGetResource.Invoke(null, new object[] { vfx });
        var fnGetOrCreate = visualEffectAssetExt.GetMethod("GetOrCreateGraph");
        var graph         = fnGetOrCreate.Invoke(null, new object[] { resource });

        var fnRecompileIfNeeded = graph.GetType().GetMethod("RecompileIfNeeded");

        fnRecompileIfNeeded.Invoke(graph, new object[] { false, false });
    }
예제 #23
0
        public void CreateTestAsset(string name)
        {
            var filePath      = string.Format(testAssetName, name);
            var directoryPath = Path.GetDirectoryName(filePath);

            if (!Directory.Exists(directoryPath))
            {
                Directory.CreateDirectory(directoryPath);
            }


            m_Asset = VisualEffectResource.CreateNewAsset(filePath);
            VFXViewWindow window = EditorWindow.GetWindow <VFXViewWindow>();

            window.Close();
            window                      = EditorWindow.GetWindow <VFXViewWindow>();
            m_ViewController            = VFXViewController.GetController(m_Asset.GetResource(), true);
            window.graphView.controller = m_ViewController;
        }
예제 #24
0
    public static void MigrateComponentsCurrentScnene()
    {
        HashSet <GameObject> prefabs    = new HashSet <GameObject>();
        FileVFXComponents    components = FindComponentsInScene(prefabs);

        List <FileVFXComponents> prefabsInfos = new List <FileVFXComponents>();

        foreach (var prefab in prefabs)
        {
            prefabsInfos.Add(FindComponentsInPrefab(prefab));
            Debug.Log("Found prefab : " + AssetDatabase.GetAssetPath(prefab));
        }

        foreach (var path in components.componentPaths.Values.Union(prefabsInfos.SelectMany(t => t.componentPaths.Values)).Distinct())
        {
            VisualEffectAsset asset = AssetDatabase.LoadAssetAtPath <VisualEffectAsset>(path.assetPath);
            if (asset == null)
            {
                AssetDatabase.ImportAsset(path.assetPath);
                asset = AssetDatabase.LoadAssetAtPath <VisualEffectAsset>(path.assetPath);
            }

            if (asset != null)
            {
                var resource = asset.GetResource();
                resource.ValidateAsset();
                try
                {
                    var graph = resource.GetOrCreateGraph();
                    graph.RecompileIfNeeded();
                    EditorUtility.SetDirty(graph);
                }
                catch (System.Exception e)
                {
                    Debug.LogError("Couldn't resave vfx" + path.assetPath + " " + e.Message);
                }
            }
        }


        SetComponentsInScene(components);
        EditorSceneManager.SaveScene(EditorSceneManager.GetSceneByPath(components.path));
    }
        public void CreateTestAsset()
        {
            var directoryPath = Path.GetDirectoryName(testAssetName);

            if (!Directory.Exists(directoryPath))
            {
                Directory.CreateDirectory(directoryPath);
            }
            if (File.Exists(testAssetName))
            {
                AssetDatabase.DeleteAsset(testAssetName);
            }

            VisualEffectAsset    asset    = VisualEffectResource.CreateNewAsset(testAssetName);
            VisualEffectResource resource = asset.GetResource(); // force resource creation

            m_ViewController = VFXViewController.GetController(resource);
            m_ViewController.useCount++;

            m_StartUndoGroupId = Undo.GetCurrentGroup();
        }
            public override void Action(int instanceId, string pathName, string resourceFile)
            {
                try
                {
                    var templateString = System.IO.File.ReadAllText(templatePath + templateAssetName);
                    System.IO.File.WriteAllText(pathName, templateString);
                }
                catch (FileNotFoundException)
                {
                    CreateNewAsset(pathName);
                }

                AssetDatabase.ImportAsset(pathName);
                VisualEffectAsset vfxAsset = AssetDatabase.LoadAssetAtPath <VisualEffectAsset>(pathName);
                var graph = vfxAsset.GetResource().GetOrCreateGraph();

                graph.SetExpressionGraphDirty();
                graph.RecompileIfNeeded();

                ProjectWindowUtil.FrameObjectInProjectWindow(vfxAsset.GetInstanceID());
            }
예제 #27
0
        private void InitAsset(VisualEffectAsset asset)
        {
            VisualEffectResource resource = asset.GetResource();
            var graph = resource.GetOrCreateGraph();

            graph.RemoveAllChildren();

            var init0   = ScriptableObject.CreateInstance <VFXBasicInitialize>();
            var update0 = ScriptableObject.CreateInstance <VFXBasicUpdate>();
            var output0 = ScriptableObject.CreateInstance <VFXPointOutput>();

            graph.AddChild(init0);
            graph.AddChild(update0);
            graph.AddChild(output0);

            init0.LinkTo(update0);
            update0.LinkTo(output0);

            var init1   = ScriptableObject.CreateInstance <VFXBasicInitialize>();
            var output1 = ScriptableObject.CreateInstance <VFXPointOutput>();

            init1.LinkTo(output1);

            graph.AddChild(init1);
            graph.AddChild(output1);

            // Add some block
            var block0 = ScriptableObject.CreateInstance <InitBlockTest>();
            var block1 = ScriptableObject.CreateInstance <UpdateBlockTest>();
            var block2 = ScriptableObject.CreateInstance <OutputBlockTest>();

            // Add some operator
            VFXOperator add = ScriptableObject.CreateInstance <Operator.Add>();

            init0.AddChild(block0);
            update0.AddChild(block1);
            output0.AddChild(block2);

            graph.AddChild(add);
        }
예제 #28
0
    static void ResaveFolder(string dirPath)
    {
        foreach (var path in Directory.GetFiles(dirPath))
        {
            if (Path.GetExtension(path) == ".vfx")
            {
                VisualEffectAsset asset = AssetDatabase.LoadAssetAtPath <VisualEffectAsset>(path);
                if (asset == null)
                {
                    AssetDatabase.ImportAsset(path);
                    asset = AssetDatabase.LoadAssetAtPath <VisualEffectAsset>(path);
                }

                if (asset == null)
                {
                    Debug.LogError("Couldn't Import vfx" + path);
                }

                var resource = asset.GetResource();
                if (resource != null)
                {
                    resource.ValidateAsset();
                    try
                    {
                        var graph = resource.GetOrCreateGraph();
                        graph.RecompileIfNeeded();
                        EditorUtility.SetDirty(graph);
                    }
                    catch (System.Exception e)
                    {
                        Debug.LogError("Couldn't resave vfx" + path + " " + e.Message);
                    }
                }
            }
        }
        foreach (var path in Directory.GetDirectories(dirPath))
        {
            ResaveFolder(path);
        }
    }
예제 #29
0
        public void Initial_Space_Supposed_To_Be_Same_As_Context()
        {
            //Cover also case 1163442, this behavior only exists in controller
            var directoryPath = Path.GetDirectoryName(testAssetName);

            if (!Directory.Exists(directoryPath))
            {
                Directory.CreateDirectory(directoryPath);
            }
            if (File.Exists(testAssetName))
            {
                AssetDatabase.DeleteAsset(testAssetName);
            }

            VisualEffectAsset asset = VisualEffectAssetEditorUtility.CreateNewAsset(testAssetName);
            var resource            = asset.GetResource(); // force resource creation
            var viewController      = VFXViewController.GetController(resource);

            viewController.useCount++;
            var startUndoGroupId = Undo.GetCurrentGroup();

            var updateContext = ScriptableObject.CreateInstance <VFXBasicUpdate>();

            updateContext.space = VFXCoordinateSpace.World;
            viewController.AddVFXModel(Vector2.zero, updateContext);
            viewController.ApplyChanges();
            viewController.ForceReload();

            var collision         = ScriptableObject.CreateInstance <CollisionSphere>();
            var contextController = viewController.allChildren.OfType <VFXContextController>().First();

            contextController.AddBlock(0, collision, true);

            Assert.IsTrue(collision.inputSlots.Where(o => o.spaceable).All(o => o.space == VFXCoordinateSpace.World));

            viewController.useCount--;
            Undo.RevertAllDownToGroup(startUndoGroupId);
            AssetDatabase.DeleteAsset(testAssetName);
        }
        private void ReadBasicOperators(VisualEffectAsset asset, bool spawnAbs, bool linkAbs)
        {
            VisualEffectResource resource = asset.GetResource();
            var graph = resource.GetOrCreateGraph();
            Assert.AreEqual(spawnAbs ? 2 : 1, graph.GetNbChildren());
            Assert.IsNotNull((Operator.Add)graph[0]);
            var add = (Operator.Add)graph[0];
            CheckIsolatedOperatorAdd(add);

            if (spawnAbs)
            {
                Assert.IsNotNull((Operator.Absolute)graph[1]);
                var abs = (Operator.Absolute)graph[1];
                CheckIsolatedOperatorAbs(abs);
                Assert.AreEqual(abs.position.x, 64.0f);
                Assert.AreEqual(abs.position.y, 64.0f);
                if (linkAbs)
                {
                    CheckConnectedAbs(abs);
                }
            }
        }