public static void UnserializeAndPasteElements(VFXViewController viewController, Vector2 center, string data, VFXView view = null, VFXGroupNodeController groupNode = null) { var copyData = JsonUtility.FromJson <Data>(data); ScriptableObject[] allSerializedObjects = VFXMemorySerializer.ExtractObjects(copyData.serializedObjects, true); copyData.contexts = allSerializedObjects.OfType <VFXContext>().ToArray(); copyData.slotContainers = allSerializedObjects.OfType <IVFXSlotContainer>().Cast <VFXModel>().Where(t => !(t is VFXContext)).ToArray(); if (copyData.contexts.Length == 0 && copyData.slotContainers.Length == 0) { copyData.contexts = null; copyData.slotContainers = null; copyData.blocks = allSerializedObjects.OfType <VFXBlock>().ToArray(); } PasteCopy(viewController, center, copyData, allSerializedObjects, view, groupNode); }
static ScriptableObject[] PrepareSerializedObjects(Data copyData, VFXUI optionalUI) { var objects = new HashSet <ScriptableObject>(); copyData.CollectDependencies(objects); if (optionalUI != null) { objects.Add(optionalUI); } ScriptableObject[] allSerializedObjects = objects.OfType <ScriptableObject>().ToArray(); copyData.serializedObjects = VFXMemorySerializer.StoreObjects(allSerializedObjects); return(allSerializedObjects); }
static VFXBlock DuplicateBlock(VFXBlock block) { var dependencies = new HashSet <ScriptableObject>(); dependencies.Add(block); block.CollectDependencies(dependencies); var duplicated = VFXMemorySerializer.DuplicateObjects(dependencies.ToArray()); VFXBlock result = duplicated.OfType <VFXBlock>().First(); foreach (var slot in result.inputSlots) { slot.UnlinkAll(true, false); } foreach (var slot in result.outputSlots) { slot.UnlinkAll(true, false); } return(result); }
//[Test] //Not really a test but an helper to measure backup (for undo/redo) time for every existing asset public void MeasureBackupTime() { UnityEngine.Debug.unityLogger.logEnabled = false; var vfxAssets = new List <VisualEffectAsset>(); var vfxAssetsGuid = AssetDatabase.FindAssets("t:VisualEffectAsset"); foreach (var guid in vfxAssetsGuid) { string assetPath = AssetDatabase.GUIDToAssetPath(guid); var vfxAsset = AssetDatabase.LoadAssetAtPath <VisualEffectAsset>(assetPath); if (vfxAsset != null) { vfxAssets.Add(vfxAsset); } } //vfxAssets = vfxAssets.Take(1).ToList(); var dependenciesPerAsset = new List <ScriptableObject[]>(); foreach (var vfxAsset in vfxAssets) { AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(vfxAsset), ImportAssetOptions.ForceUpdate | ImportAssetOptions.ForceSynchronousImport); var graph = vfxAsset.GetResource().GetOrCreateGraph(); var hashset = new HashSet <ScriptableObject>(); hashset.Add(graph); graph.CollectDependencies(hashset); dependenciesPerAsset.Add(hashset.Cast <ScriptableObject>().ToArray()); } var report = new List <string>(); var levels = new[] { (CompressionLevel)int.MaxValue, CompressionLevel.None, CompressionLevel.Fastest }; foreach (var level in levels) { var data = new byte[vfxAssets.Count][]; var elapsedTimeCompression = new long[vfxAssets.Count]; var elapsedTimeDecompression = new long[vfxAssets.Count]; var watch = Enumerable.Repeat(0, vfxAssets.Count).Select(o => new Stopwatch()).ToArray(); uint processCount = 8; for (int pass = 0; pass < processCount; ++pass) { for (int i = 0; i < vfxAssets.Count; ++i) { var sw = watch[i]; if (level == (CompressionLevel)int.MaxValue) { sw.Start(); var currentData = VFXMemorySerializer.StoreObjects(dependenciesPerAsset[i]); sw.Stop(); data[i] = System.Text.Encoding.UTF8.GetBytes(currentData); } else { sw.Start(); var currentData = VFXMemorySerializer.StoreObjectsToByteArray(dependenciesPerAsset[i], level); sw.Stop(); data[i] = currentData; } elapsedTimeCompression[i] = sw.ElapsedMilliseconds; } } watch = Enumerable.Repeat(0, vfxAssets.Count).Select(o => new Stopwatch()).ToArray(); for (int pass = 0; pass < processCount; ++pass) { for (int i = 0; i < vfxAssets.Count; ++i) { var sw = watch[i]; if (level == (CompressionLevel)int.MaxValue) { var currentData = System.Text.Encoding.UTF8.GetString(data[i]); sw.Start(); VFXMemorySerializer.ExtractObjects(currentData, false); sw.Stop(); } else { sw.Start(); VFXMemorySerializer.ExtractObjects(data[i], false); sw.Stop(); } elapsedTimeDecompression[i] = sw.ElapsedMilliseconds; } } report.Add(level == (CompressionLevel)int.MaxValue ? "original" : level.ToString()); report.Add("asset;size;compression;decompression"); for (int i = 0; i < vfxAssets.Count; ++i) { var nameAsset = AssetDatabase.GetAssetPath(vfxAssets[i]); report.Add(string.Format("{0};{1}kb;{2}ms;{3}ms", nameAsset, data[i].Length / (1024), elapsedTimeCompression[i] / processCount, elapsedTimeDecompression[i] / processCount)); } } UnityEngine.Debug.unityLogger.logEnabled = true; foreach (var log in report) { UnityEngine.Debug.Log(log); } }